Mercurial > public > mercurial-scm > hg
comparison tests/test-pathencode.py @ 37880:1b230e19d044
tests: port test-pathencode.py to Python 3
# skip-blame uninteresting changes, mainly b prefixes
Differential Revision: https://phab.mercurial-scm.org/D3475
author | Augie Fackler <augie@google.com> |
---|---|
date | Fri, 27 Apr 2018 00:24:45 -0400 |
parents | 58c1368ab629 |
children | 2372284d9457 |
comparison
equal
deleted
inserted
replaced
37879:81455f482478 | 37880:1b230e19d044 |
---|---|
14 import os | 14 import os |
15 import random | 15 import random |
16 import sys | 16 import sys |
17 import time | 17 import time |
18 from mercurial import ( | 18 from mercurial import ( |
19 pycompat, | |
19 store, | 20 store, |
20 ) | 21 ) |
21 | 22 |
22 try: | 23 try: |
23 xrange | 24 xrange |
24 except NameError: | 25 except NameError: |
25 xrange = range | 26 xrange = range |
26 | 27 |
27 validchars = set(map(chr, range(0, 256))) | 28 validchars = set(map(pycompat.bytechr, range(0, 256))) |
28 alphanum = range(ord('A'), ord('Z')) | 29 alphanum = range(ord('A'), ord('Z')) |
29 | 30 |
30 for c in '\0/': | 31 for c in (b'\0', b'/'): |
31 validchars.remove(c) | 32 validchars.remove(c) |
32 | 33 |
33 winreserved = ('aux con prn nul'.split() + | 34 winreserved = (b'aux con prn nul'.split() + |
34 ['com%d' % i for i in xrange(1, 10)] + | 35 [b'com%d' % i for i in xrange(1, 10)] + |
35 ['lpt%d' % i for i in xrange(1, 10)]) | 36 [b'lpt%d' % i for i in xrange(1, 10)]) |
36 | 37 |
37 def casecombinations(names): | 38 def casecombinations(names): |
38 '''Build all case-diddled combinations of names.''' | 39 '''Build all case-diddled combinations of names.''' |
39 | 40 |
40 combos = set() | 41 combos = set() |
42 for r in names: | 43 for r in names: |
43 for i in xrange(len(r) + 1): | 44 for i in xrange(len(r) + 1): |
44 for c in itertools.combinations(xrange(len(r)), i): | 45 for c in itertools.combinations(xrange(len(r)), i): |
45 d = r | 46 d = r |
46 for j in c: | 47 for j in c: |
47 d = ''.join((d[:j], d[j].upper(), d[j + 1:])) | 48 d = b''.join((d[:j], d[j:j + 1].upper(), d[j + 1:])) |
48 combos.add(d) | 49 combos.add(d) |
49 return sorted(combos) | 50 return sorted(combos) |
50 | 51 |
51 def buildprobtable(fp, cmd='hg manifest tip'): | 52 def buildprobtable(fp, cmd='hg manifest tip'): |
52 '''Construct and print a table of probabilities for path name | 53 '''Construct and print a table of probabilities for path name |
76 | 77 |
77 # A table of character frequencies (as percentages), gleaned by | 78 # A table of character frequencies (as percentages), gleaned by |
78 # looking at filelog names from a real-world, very large repo. | 79 # looking at filelog names from a real-world, very large repo. |
79 | 80 |
80 probtable = ( | 81 probtable = ( |
81 ('t', 9.828), ('e', 9.042), ('s', 8.011), ('a', 6.801), ('i', 6.618), | 82 (b't', 9.828), (b'e', 9.042), (b's', 8.011), (b'a', 6.801), (b'i', 6.618), |
82 ('g', 5.053), ('r', 5.030), ('o', 4.887), ('p', 4.363), ('n', 4.258), | 83 (b'g', 5.053), (b'r', 5.030), (b'o', 4.887), (b'p', 4.363), (b'n', 4.258), |
83 ('l', 3.830), ('h', 3.693), ('_', 3.659), ('.', 3.377), ('m', 3.194), | 84 (b'l', 3.830), (b'h', 3.693), (b'_', 3.659), (b'.', 3.377), (b'm', 3.194), |
84 ('u', 2.364), ('d', 2.296), ('c', 2.163), ('b', 1.739), ('f', 1.625), | 85 (b'u', 2.364), (b'd', 2.296), (b'c', 2.163), (b'b', 1.739), (b'f', 1.625), |
85 ('6', 0.666), ('j', 0.610), ('y', 0.554), ('x', 0.487), ('w', 0.477), | 86 (b'6', 0.666), (b'j', 0.610), (b'y', 0.554), (b'x', 0.487), (b'w', 0.477), |
86 ('k', 0.476), ('v', 0.473), ('3', 0.336), ('1', 0.335), ('2', 0.326), | 87 (b'k', 0.476), (b'v', 0.473), (b'3', 0.336), (b'1', 0.335), (b'2', 0.326), |
87 ('4', 0.310), ('5', 0.305), ('9', 0.302), ('8', 0.300), ('7', 0.299), | 88 (b'4', 0.310), (b'5', 0.305), (b'9', 0.302), (b'8', 0.300), (b'7', 0.299), |
88 ('q', 0.298), ('0', 0.250), ('z', 0.223), ('-', 0.118), ('C', 0.095), | 89 (b'q', 0.298), (b'0', 0.250), (b'z', 0.223), (b'-', 0.118), (b'C', 0.095), |
89 ('T', 0.087), ('F', 0.085), ('B', 0.077), ('S', 0.076), ('P', 0.076), | 90 (b'T', 0.087), (b'F', 0.085), (b'B', 0.077), (b'S', 0.076), (b'P', 0.076), |
90 ('L', 0.059), ('A', 0.058), ('N', 0.051), ('D', 0.049), ('M', 0.046), | 91 (b'L', 0.059), (b'A', 0.058), (b'N', 0.051), (b'D', 0.049), (b'M', 0.046), |
91 ('E', 0.039), ('I', 0.035), ('R', 0.035), ('G', 0.028), ('U', 0.026), | 92 (b'E', 0.039), (b'I', 0.035), (b'R', 0.035), (b'G', 0.028), (b'U', 0.026), |
92 ('W', 0.025), ('O', 0.017), ('V', 0.015), ('H', 0.013), ('Q', 0.011), | 93 (b'W', 0.025), (b'O', 0.017), (b'V', 0.015), (b'H', 0.013), (b'Q', 0.011), |
93 ('J', 0.007), ('K', 0.005), ('+', 0.004), ('X', 0.003), ('Y', 0.001), | 94 (b'J', 0.007), (b'K', 0.005), (b'+', 0.004), (b'X', 0.003), (b'Y', 0.001), |
94 ) | 95 ) |
95 | 96 |
96 for c, _ in probtable: | 97 for c, _ in probtable: |
97 validchars.remove(c) | 98 validchars.remove(c) |
98 validchars = list(validchars) | 99 validchars = list(validchars) |
119 | 120 |
120 resttable = firsttable[:-1] | 121 resttable = firsttable[:-1] |
121 | 122 |
122 # Special suffixes. | 123 # Special suffixes. |
123 | 124 |
124 internalsuffixcombos = casecombinations('.hg .i .d'.split()) | 125 internalsuffixcombos = casecombinations(b'.hg .i .d'.split()) |
125 | 126 |
126 # The last component of a path, before a slash or at the end of a name. | 127 # The last component of a path, before a slash or at the end of a name. |
127 | 128 |
128 lasttable = resttable + ( | 129 lasttable = resttable + ( |
129 (lambda rng: '', 95), | 130 (lambda rng: b'', 95), |
130 (lambda rng: rng.choice(internalsuffixcombos), 5), | 131 (lambda rng: rng.choice(internalsuffixcombos), 5), |
131 ) | 132 ) |
132 | 133 |
133 def makepart(rng, k): | 134 def makepart(rng, k): |
134 '''Construct a part of a pathname, without slashes.''' | 135 '''Construct a part of a pathname, without slashes.''' |
140 while l < maxl: | 141 while l < maxl: |
141 p = pickfrom(rng, resttable)(rng) | 142 p = pickfrom(rng, resttable)(rng) |
142 l += len(p) | 143 l += len(p) |
143 ps.append(p) | 144 ps.append(p) |
144 ps.append(pickfrom(rng, lasttable)(rng)) | 145 ps.append(pickfrom(rng, lasttable)(rng)) |
145 return ''.join(ps) | 146 return b''.join(ps) |
146 | 147 |
147 def makepath(rng, j, k): | 148 def makepath(rng, j, k): |
148 '''Construct a complete pathname.''' | 149 '''Construct a complete pathname.''' |
149 | 150 |
150 return ('data/' + '/'.join(makepart(rng, k) for _ in xrange(j)) + | 151 return (b'data/' + b'/'.join(makepart(rng, k) for _ in xrange(j)) + |
151 rng.choice(['.d', '.i'])) | 152 rng.choice([b'.d', b'.i'])) |
152 | 153 |
153 def genpath(rng, count): | 154 def genpath(rng, count): |
154 '''Generate random pathnames with gradually increasing lengths.''' | 155 '''Generate random pathnames with gradually increasing lengths.''' |
155 | 156 |
156 mink, maxk = 1, 4096 | 157 mink, maxk = 1, 4096 |