filter-repo: specify sorting order in greater detail

The sorting order of entries written to files in the analysis directory
didn't specify a secondary sort, thus making the order dependent on the
random-ish sorting order of dictionaries and making it inconsistent
between python versions.  While the secondary order didn't matter much,
having a defined order makes it slightly easier to define a single
testcase that can work across versions.

Signed-off-by: Elijah Newren <newren@gmail.com>
This commit is contained in:
Elijah Newren 2019-04-01 10:58:16 -07:00
parent 4cb3bc3459
commit 0ca3988953
2 changed files with 11 additions and 11 deletions

View File

@ -2441,7 +2441,7 @@ class RepoAnalyze(object):
with open(os.path.join(reportdir, "renames.txt"), 'w') as f:
seen = set()
for pathname,equiv_group in sorted(stats['equivalence'].iteritems(),
key=lambda x:x[1]):
key=lambda x:(x[1], x[0])):
if equiv_group in seen:
continue
seen.add(equiv_group)
@ -2454,7 +2454,7 @@ class RepoAnalyze(object):
f.write("=== %s ===\n" % _("Deleted directories by reverse size"))
f.write(_("Format: unpacked size, packed size, date deleted, directory name\n"))
for dirname, size in sorted(dir_size['packed'].iteritems(),
key=lambda x:x[1], reverse=True):
key=lambda x:(x[1],x[0]), reverse=True):
if (dir_deleted_data[dirname]):
f.write(" {:10d} {:10d} {:10s} {}\n"
.format(dir_size['unpacked'][dirname],
@ -2466,7 +2466,7 @@ class RepoAnalyze(object):
f.write("=== %s ===\n" % _("All directories by reverse size"))
f.write(_("Format: unpacked size, packed size, date deleted, directory name\n"))
for dirname, size in sorted(dir_size['packed'].iteritems(),
key=lambda x:x[1], reverse=True):
key=lambda x:(x[1],x[0]), reverse=True):
f.write(" {:10d} {:10d} {:10s} {}\n"
.format(dir_size['unpacked'][dirname],
size,
@ -2478,7 +2478,7 @@ class RepoAnalyze(object):
f.write("=== %s ===\n" % _("Deleted extensions by reverse size"))
f.write(_("Format: unpacked size, packed size, date deleted, extension name\n"))
for extname, size in sorted(ext_size['packed'].iteritems(),
key=lambda x:x[1], reverse=True):
key=lambda x:(x[1],x[0]), reverse=True):
if (ext_deleted_data[extname]):
f.write(" {:10d} {:10d} {:10s} {}\n"
.format(ext_size['unpacked'][extname],
@ -2490,7 +2490,7 @@ class RepoAnalyze(object):
f.write("=== %s ===\n" % _("All extensions by reverse size"))
f.write(_("Format: unpacked size, packed size, date deleted, extension name\n"))
for extname, size in sorted(ext_size['packed'].iteritems(),
key=lambda x:x[1], reverse=True):
key=lambda x:(x[1],x[0]), reverse=True):
f.write(" {:10d} {:10d} {:10s} {}\n"
.format(ext_size['unpacked'][extname],
size,
@ -2502,7 +2502,7 @@ class RepoAnalyze(object):
f.write("=== %s ===\n" % _("Deleted paths by reverse accumulated size"))
f.write(_("Format: unpacked size, packed size, date deleted, path name(s)\n"))
for pathname, size in sorted(path_size['packed'].iteritems(),
key=lambda x:x[1], reverse=True):
key=lambda x:(x[1],x[0]), reverse=True):
when = stats['file_deletions'].get(pathname, None)
if when:
f.write(" {:10d} {:10d} {:10s} {}\n"
@ -2515,7 +2515,7 @@ class RepoAnalyze(object):
f.write("=== %s ===\n" % _("All paths by reverse accumulated size"))
f.write(_("Format: unpacked size, packed size, date deleted, pathectory name\n"))
for pathname, size in sorted(path_size['packed'].iteritems(),
key=lambda x:x[1], reverse=True):
key=lambda x:(x[1],x[0]), reverse=True):
when = stats['file_deletions'].get(pathname, None)
f.write(" {:10d} {:10d} {:10s} {}\n"
.format(path_size['unpacked'][pathname],
@ -2528,7 +2528,7 @@ class RepoAnalyze(object):
f.write("=== %s ===\n" % _("Files by sha and associated pathnames in reverse size"))
f.write(_("Format: sha, unpacked size, packed size, filename(s) object stored as\n"))
for sha, size in sorted(stats['packed_size'].iteritems(),
key=lambda x:x[1], reverse=True):
key=lambda x:(x[1],x[0]), reverse=True):
if sha not in stats['names']:
# Some objects in the repository might not be referenced, or not
# referenced by the branches/tags the user cares about; skip them.

View File

@ -457,8 +457,8 @@ test_expect_success C_LOCALE_OUTPUT '--analyze' '
f00c965d8307308469e537302baa73048488f162 21 37 numbers/small.num
2aa69a2a708eed00cb390e30f6bcc3eed773f390 20 36 whatever
51b95456de9274c9a95f756742808dfd480b9b35 13 29 [QcapriciousQ, QfickleQ, QmercurialQ]
34b6a0c9d02cb6ef7f409f248c0c1224ce9dd373 5 20 [Qsequence/toQ, Qwords/toQ]
732c85a1b3d7ce40ec8f78fd9ffea32e9f45fae0 5 20 [Qsequence/knowQ, Qwords/knowQ]
34b6a0c9d02cb6ef7f409f248c0c1224ce9dd373 5 20 [Qsequence/toQ, Qwords/toQ]
7ecb56eb3fa3fa6f19dd48bca9f971950b119ede 3 18 words/know
EOF
test_cmp expect blob-shas-and-paths.txt &&
@ -502,12 +502,12 @@ test_expect_success C_LOCALE_OUTPUT '--analyze' '
8 38 <present> words/know
21 37 2005-04-07 numbers/small.num
20 36 <present> whatever
13 29 <present> fickle
13 29 <present> mercurial
13 29 <present> fickle
13 29 <present> capricious
5 20 <present> words/to
5 20 <present> sequence/know
5 20 <present> sequence/to
5 20 <present> sequence/know
EOF
test_cmp expect path-all-sizes.txt &&