tests/test-hybridencode.py
changeset 28750 2b0d7be90fc4
parent 28749 2fa5c7c1df8c
child 37871 6574c81b6831
equal deleted inserted replaced
28749:2fa5c7c1df8c 28750:2b0d7be90fc4
     1 from __future__ import absolute_import
     1 from __future__ import absolute_import, print_function
     2 from mercurial import (
     2 from mercurial import (
     3     store,
     3     store,
     4 )
     4 )
     5 
     5 
     6 def show(s):
     6 def show(s):
     7     # show test input
     7     # show test input
     8     print "A = '%s'" % s.encode("string_escape")
     8     print("A = '%s'" % s.encode("string_escape"))
     9 
     9 
    10     # show the result of the C implementation, if available
    10     # show the result of the C implementation, if available
    11     h = store._pathencode(s)
    11     h = store._pathencode(s)
    12     print "B = '%s'" % h.encode("string_escape")
    12     print("B = '%s'" % h.encode("string_escape"))
    13 
    13 
    14     # compare it with reference implementation in Python
    14     # compare it with reference implementation in Python
    15     r = store._hybridencode(s, True)
    15     r = store._hybridencode(s, True)
    16     if h != r:
    16     if h != r:
    17         print "R = '%s'" % r.encode("string_escape")
    17         print("R = '%s'" % r.encode("string_escape"))
    18     print
    18     print()
    19 
    19 
    20 show("data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&'()+,-.;=[]^`{}")
    20 show("data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&'()+,-.;=[]^`{}")
    21 
    21 
    22 print "uppercase char X is encoded as _x"
    22 print("uppercase char X is encoded as _x")
    23 show("data/ABCDEFGHIJKLMNOPQRSTUVWXYZ")
    23 show("data/ABCDEFGHIJKLMNOPQRSTUVWXYZ")
    24 
    24 
    25 print "underbar is doubled"
    25 print("underbar is doubled")
    26 show("data/_")
    26 show("data/_")
    27 
    27 
    28 print "tilde is character-encoded"
    28 print("tilde is character-encoded")
    29 show("data/~")
    29 show("data/~")
    30 
    30 
    31 print "characters in ASCII code range 1..31"
    31 print("characters in ASCII code range 1..31")
    32 show('data/\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'
    32 show('data/\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'
    33           '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f')
    33           '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f')
    34 
    34 
    35 print "characters in ASCII code range 126..255"
    35 print("characters in ASCII code range 126..255")
    36 show('data/\x7e\x7f'
    36 show('data/\x7e\x7f'
    37           '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f'
    37           '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f'
    38           '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f')
    38           '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f')
    39 show('data/\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf'
    39 show('data/\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf'
    40           '\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf')
    40           '\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf')
    41 show('data/\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf'
    41 show('data/\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf'
    42           '\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf')
    42           '\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf')
    43 show('data/\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef'
    43 show('data/\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef'
    44           '\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff')
    44           '\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff')
    45 
    45 
    46 print "Windows reserved characters"
    46 print("Windows reserved characters")
    47 show('data/less <, greater >, colon :, double-quote ", backslash \\'
    47 show('data/less <, greater >, colon :, double-quote ", backslash \\'
    48            ', pipe |, question-mark ?, asterisk *')
    48            ', pipe |, question-mark ?, asterisk *')
    49 
    49 
    50 print "encoding directories ending in .hg, .i or .d with '.hg' suffix"
    50 print("encoding directories ending in .hg, .i or .d with '.hg' suffix")
    51 show('data/x.h.i/x.hg/x.i/x.d/foo')
    51 show('data/x.h.i/x.hg/x.i/x.d/foo')
    52 show('data/a.hg/a.i/a.d/foo')
    52 show('data/a.hg/a.i/a.d/foo')
    53 show('data/au.hg/au.i/au.d/foo')
    53 show('data/au.hg/au.i/au.d/foo')
    54 show('data/aux.hg/aux.i/aux.d/foo')
    54 show('data/aux.hg/aux.i/aux.d/foo')
    55 show('data/auxy.hg/auxy.i/auxy.d/foo')
    55 show('data/auxy.hg/auxy.i/auxy.d/foo')
    56 
    56 
    57 print "but these are not encoded on *filenames*"
    57 print("but these are not encoded on *filenames*")
    58 show('data/foo/x.hg')
    58 show('data/foo/x.hg')
    59 show('data/foo/x.i')
    59 show('data/foo/x.i')
    60 show('data/foo/x.d')
    60 show('data/foo/x.d')
    61 show('data/foo/a.hg')
    61 show('data/foo/a.hg')
    62 show('data/foo/a.i')
    62 show('data/foo/a.i')
    69 show('data/foo/aux.d')
    69 show('data/foo/aux.d')
    70 show('data/foo/auxy.hg')
    70 show('data/foo/auxy.hg')
    71 show('data/foo/auxy.i')
    71 show('data/foo/auxy.i')
    72 show('data/foo/auxy.d')
    72 show('data/foo/auxy.d')
    73 
    73 
    74 print "plain .hg, .i and .d directories have the leading dot encoded"
    74 print("plain .hg, .i and .d directories have the leading dot encoded")
    75 show('data/.hg/.i/.d/foo')
    75 show('data/.hg/.i/.d/foo')
    76 
    76 
    77 show('data/aux.bla/bla.aux/prn/PRN/lpt/com3/nul/coma/foo.NUL/normal.c.i')
    77 show('data/aux.bla/bla.aux/prn/PRN/lpt/com3/nul/coma/foo.NUL/normal.c.i')
    78 
    78 
    79 show('data/AUX/SECOND/X.PRN/FOURTH/FI:FTH/SIXTH/SEVENTH/EIGHTH/NINETH/'
    79 show('data/AUX/SECOND/X.PRN/FOURTH/FI:FTH/SIXTH/SEVENTH/EIGHTH/NINETH/'
   127 show('data/com./com1./com1y./com1.')
   127 show('data/com./com1./com1y./com1.')
   128 show('data/com9./com9y./com9.')
   128 show('data/com9./com9y./com9.')
   129 
   129 
   130 show('data/a /au /aux /auxy /aux ')
   130 show('data/a /au /aux /auxy /aux ')
   131 
   131 
   132 print "largest unhashed path"
   132 print("largest unhashed path")
   133 show('data/123456789-123456789-123456789-123456789-123456789-'
   133 show('data/123456789-123456789-123456789-123456789-123456789-'
   134           'unhashed--xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   134           'unhashed--xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   135           '123456789-12345')
   135           '123456789-12345')
   136 
   136 
   137 print "shortest hashed path"
   137 print("shortest hashed path")
   138 show('data/123456789-123456789-123456789-123456789-123456789-'
   138 show('data/123456789-123456789-123456789-123456789-123456789-'
   139           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   139           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   140           '123456789-123456')
   140           '123456789-123456')
   141 
   141 
   142 print "changing one char in part that's hashed away produces a different hash"
   142 print("changing one char in part that's hashed away produces a different hash")
   143 show('data/123456789-123456789-123456789-123456789-123456789-'
   143 show('data/123456789-123456789-123456789-123456789-123456789-'
   144           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxy-'
   144           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxy-'
   145           '123456789-123456')
   145           '123456789-123456')
   146 
   146 
   147 print "uppercase hitting length limit due to encoding"
   147 print("uppercase hitting length limit due to encoding")
   148 show('data/A23456789-123456789-123456789-123456789-123456789-'
   148 show('data/A23456789-123456789-123456789-123456789-123456789-'
   149           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   149           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   150           '123456789-12345')
   150           '123456789-12345')
   151 show('data/Z23456789-123456789-123456789-123456789-123456789-'
   151 show('data/Z23456789-123456789-123456789-123456789-123456789-'
   152           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   152           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   153           '123456789-12345')
   153           '123456789-12345')
   154 
   154 
   155 print "compare with lowercase not hitting limit"
   155 print("compare with lowercase not hitting limit")
   156 show('data/a23456789-123456789-123456789-123456789-123456789-'
   156 show('data/a23456789-123456789-123456789-123456789-123456789-'
   157           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   157           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   158           '123456789-12345')
   158           '123456789-12345')
   159 show('data/z23456789-123456789-123456789-123456789-123456789-'
   159 show('data/z23456789-123456789-123456789-123456789-123456789-'
   160           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   160           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   161           '123456789-12345')
   161           '123456789-12345')
   162 
   162 
   163 print "not hitting limit with any of these"
   163 print("not hitting limit with any of these")
   164 show("data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&'()+,-.;="
   164 show("data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&'()+,-.;="
   165           "[]^`{}xxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-"
   165           "[]^`{}xxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-"
   166           "123456789-12345")
   166           "123456789-12345")
   167 
   167 
   168 print "underbar hitting length limit due to encoding"
   168 print("underbar hitting length limit due to encoding")
   169 show('data/_23456789-123456789-123456789-123456789-123456789-'
   169 show('data/_23456789-123456789-123456789-123456789-123456789-'
   170           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   170           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   171           '123456789-12345')
   171           '123456789-12345')
   172 
   172 
   173 print "tilde hitting length limit due to encoding"
   173 print("tilde hitting length limit due to encoding")
   174 show('data/~23456789-123456789-123456789-123456789-123456789-'
   174 show('data/~23456789-123456789-123456789-123456789-123456789-'
   175           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   175           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   176           '123456789-12345')
   176           '123456789-12345')
   177 
   177 
   178 print "Windows reserved characters hitting length limit"
   178 print("Windows reserved characters hitting length limit")
   179 show('data/<23456789-123456789-123456789-123456789-123456789-'
   179 show('data/<23456789-123456789-123456789-123456789-123456789-'
   180           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   180           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   181           '123456789-12345')
   181           '123456789-12345')
   182 show('data/>23456789-123456789-123456789-123456789-123456789-'
   182 show('data/>23456789-123456789-123456789-123456789-123456789-'
   183           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   183           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   199           '123456789-12345')
   199           '123456789-12345')
   200 show('data/*23456789-123456789-123456789-123456789-123456789-'
   200 show('data/*23456789-123456789-123456789-123456789-123456789-'
   201           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   201           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   202           '123456789-12345')
   202           '123456789-12345')
   203 
   203 
   204 print "initial space hitting length limit"
   204 print("initial space hitting length limit")
   205 show('data/ 23456789-123456789-123456789-123456789-123456789-'
   205 show('data/ 23456789-123456789-123456789-123456789-123456789-'
   206           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   206           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   207           '123456789-12345')
   207           '123456789-12345')
   208 
   208 
   209 print "initial dot hitting length limit"
   209 print("initial dot hitting length limit")
   210 show('data/.23456789-123456789-123456789-123456789-123456789-'
   210 show('data/.23456789-123456789-123456789-123456789-123456789-'
   211           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   211           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   212           '123456789-12345')
   212           '123456789-12345')
   213 
   213 
   214 print "trailing space in filename hitting length limit"
   214 print("trailing space in filename hitting length limit")
   215 show('data/123456789-123456789-123456789-123456789-123456789-'
   215 show('data/123456789-123456789-123456789-123456789-123456789-'
   216           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   216           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   217           '123456789-1234 ')
   217           '123456789-1234 ')
   218 
   218 
   219 print "trailing dot in filename hitting length limit"
   219 print("trailing dot in filename hitting length limit")
   220 show('data/123456789-123456789-123456789-123456789-123456789-'
   220 show('data/123456789-123456789-123456789-123456789-123456789-'
   221           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   221           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   222           '123456789-1234.')
   222           '123456789-1234.')
   223 
   223 
   224 print "initial space in directory hitting length limit"
   224 print("initial space in directory hitting length limit")
   225 show('data/ x/456789-123456789-123456789-123456789-123456789-'
   225 show('data/ x/456789-123456789-123456789-123456789-123456789-'
   226           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   226           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   227           '123456789-12345')
   227           '123456789-12345')
   228 
   228 
   229 print "initial dot in directory hitting length limit"
   229 print("initial dot in directory hitting length limit")
   230 show('data/.x/456789-123456789-123456789-123456789-123456789-'
   230 show('data/.x/456789-123456789-123456789-123456789-123456789-'
   231           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   231           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   232           '123456789-12345')
   232           '123456789-12345')
   233 
   233 
   234 print "trailing space in directory hitting length limit"
   234 print("trailing space in directory hitting length limit")
   235 show('data/x /456789-123456789-123456789-123456789-123456789-'
   235 show('data/x /456789-123456789-123456789-123456789-123456789-'
   236           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   236           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   237           '123456789-12345')
   237           '123456789-12345')
   238 
   238 
   239 print "trailing dot in directory hitting length limit"
   239 print("trailing dot in directory hitting length limit")
   240 show('data/x./456789-123456789-123456789-123456789-123456789-'
   240 show('data/x./456789-123456789-123456789-123456789-123456789-'
   241           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   241           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   242           '123456789-12345')
   242           '123456789-12345')
   243 
   243 
   244 print "with directories that need direncoding, hitting length limit"
   244 print("with directories that need direncoding, hitting length limit")
   245 show('data/x.i/56789-123456789-123456789-123456789-123456789-'
   245 show('data/x.i/56789-123456789-123456789-123456789-123456789-'
   246           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   246           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   247           '123456789-12345')
   247           '123456789-12345')
   248 show('data/x.d/56789-123456789-123456789-123456789-123456789-'
   248 show('data/x.d/56789-123456789-123456789-123456789-123456789-'
   249           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   249           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   250           '123456789-12345')
   250           '123456789-12345')
   251 show('data/x.hg/5789-123456789-123456789-123456789-123456789-'
   251 show('data/x.hg/5789-123456789-123456789-123456789-123456789-'
   252           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   252           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   253           '123456789-12345')
   253           '123456789-12345')
   254 
   254 
   255 print "Windows reserved filenames, hitting length limit"
   255 print("Windows reserved filenames, hitting length limit")
   256 show('data/con/56789-123456789-123456789-123456789-123456789-'
   256 show('data/con/56789-123456789-123456789-123456789-123456789-'
   257           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   257           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   258           '123456789-12345')
   258           '123456789-12345')
   259 show('data/prn/56789-123456789-123456789-123456789-123456789-'
   259 show('data/prn/56789-123456789-123456789-123456789-123456789-'
   260           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   260           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   276           '123456789-12345')
   276           '123456789-12345')
   277 show('data/lpt9/6789-123456789-123456789-123456789-123456789-'
   277 show('data/lpt9/6789-123456789-123456789-123456789-123456789-'
   278           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   278           'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   279           '123456789-12345')
   279           '123456789-12345')
   280 
   280 
   281 print "non-reserved names, just not hitting limit"
   281 print("non-reserved names, just not hitting limit")
   282 show('data/123456789-123456789-123456789-123456789-123456789-'
   282 show('data/123456789-123456789-123456789-123456789-123456789-'
   283           '/com/com0/lpt/lpt0/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   283           '/com/com0/lpt/lpt0/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   284           '123456789-12345')
   284           '123456789-12345')
   285 
   285 
   286 print "hashed path with largest untruncated 1st dir"
   286 print("hashed path with largest untruncated 1st dir")
   287 show('data/12345678/-123456789-123456789-123456789-123456789-'
   287 show('data/12345678/-123456789-123456789-123456789-123456789-'
   288           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   288           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   289           '123456789-123456')
   289           '123456789-123456')
   290 
   290 
   291 print "hashed path with smallest truncated 1st dir"
   291 print("hashed path with smallest truncated 1st dir")
   292 show('data/123456789/123456789-123456789-123456789-123456789-'
   292 show('data/123456789/123456789-123456789-123456789-123456789-'
   293           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   293           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   294           '123456789-123456')
   294           '123456789-123456')
   295 
   295 
   296 print "hashed path with largest untruncated two dirs"
   296 print("hashed path with largest untruncated two dirs")
   297 show('data/12345678/12345678/9-123456789-123456789-123456789-'
   297 show('data/12345678/12345678/9-123456789-123456789-123456789-'
   298           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   298           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   299           '123456789-123456')
   299           '123456789-123456')
   300 
   300 
   301 print "hashed path with smallest truncated two dirs"
   301 print("hashed path with smallest truncated two dirs")
   302 show('data/123456789/123456789/123456789-123456789-123456789-'
   302 show('data/123456789/123456789/123456789-123456789-123456789-'
   303           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   303           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   304           '123456789-123456')
   304           '123456789-123456')
   305 
   305 
   306 print "hashed path with largest untruncated three dirs"
   306 print("hashed path with largest untruncated three dirs")
   307 show('data/12345678/12345678/12345678/89-123456789-123456789-'
   307 show('data/12345678/12345678/12345678/89-123456789-123456789-'
   308           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   308           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   309           '123456789-123456')
   309           '123456789-123456')
   310 
   310 
   311 print "hashed path with smallest truncated three dirs"
   311 print("hashed path with smallest truncated three dirs")
   312 show('data/123456789/123456789/123456789/123456789-123456789-'
   312 show('data/123456789/123456789/123456789/123456789-123456789-'
   313           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   313           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   314           '123456789-123456')
   314           '123456789-123456')
   315 
   315 
   316 print "hashed path with largest untruncated four dirs"
   316 print("hashed path with largest untruncated four dirs")
   317 show('data/12345678/12345678/12345678/12345678/789-123456789-'
   317 show('data/12345678/12345678/12345678/12345678/789-123456789-'
   318           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   318           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   319           '123456789-123456')
   319           '123456789-123456')
   320 
   320 
   321 print "hashed path with smallest truncated four dirs"
   321 print("hashed path with smallest truncated four dirs")
   322 show('data/123456789/123456789/123456789/123456789/123456789-'
   322 show('data/123456789/123456789/123456789/123456789/123456789-'
   323           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   323           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   324           '123456789-123456')
   324           '123456789-123456')
   325 
   325 
   326 print "hashed path with largest untruncated five dirs"
   326 print("hashed path with largest untruncated five dirs")
   327 show('data/12345678/12345678/12345678/12345678/12345678/6789-'
   327 show('data/12345678/12345678/12345678/12345678/12345678/6789-'
   328           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   328           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   329           '123456789-123456')
   329           '123456789-123456')
   330 
   330 
   331 print "hashed path with smallest truncated five dirs"
   331 print("hashed path with smallest truncated five dirs")
   332 show('data/123456789/123456789/123456789/123456789/123456789/'
   332 show('data/123456789/123456789/123456789/123456789/123456789/'
   333           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   333           'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   334           '123456789-123456')
   334           '123456789-123456')
   335 
   335 
   336 print "hashed path with largest untruncated six dirs"
   336 print("hashed path with largest untruncated six dirs")
   337 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   337 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   338           '678/ed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   338           '678/ed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   339           '123456789-123456')
   339           '123456789-123456')
   340 
   340 
   341 print "hashed path with smallest truncated six dirs"
   341 print("hashed path with smallest truncated six dirs")
   342 show('data/123456789/123456789/123456789/123456789/123456789/'
   342 show('data/123456789/123456789/123456789/123456789/123456789/'
   343           '123456789/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   343           '123456789/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   344           '123456789-123456')
   344           '123456789-123456')
   345 
   345 
   346 print "hashed path with largest untruncated seven dirs"
   346 print("hashed path with largest untruncated seven dirs")
   347 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   347 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   348           '678/12345678/xxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   348           '678/12345678/xxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   349           '123456789-123456')
   349           '123456789-123456')
   350 
   350 
   351 print "hashed path with smallest truncated seven dirs"
   351 print("hashed path with smallest truncated seven dirs")
   352 show('data/123456789/123456789/123456789/123456789/123456789/'
   352 show('data/123456789/123456789/123456789/123456789/123456789/'
   353           '123456789/123456789/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   353           '123456789/123456789/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   354           '123456789-123456')
   354           '123456789-123456')
   355 
   355 
   356 print "hashed path with largest untruncated eight dirs"
   356 print("hashed path with largest untruncated eight dirs")
   357 print "(directory 8 is dropped because it hits _maxshortdirslen)"
   357 print("(directory 8 is dropped because it hits _maxshortdirslen)")
   358 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   358 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   359           '678/12345678/12345678/xxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   359           '678/12345678/12345678/xxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   360           '123456789-123456')
   360           '123456789-123456')
   361 
   361 
   362 print "hashed path with smallest truncated eight dirs"
   362 print("hashed path with smallest truncated eight dirs")
   363 print "(directory 8 is dropped because it hits _maxshortdirslen)"
   363 print("(directory 8 is dropped because it hits _maxshortdirslen)")
   364 show('data/123456789/123456789/123456789/123456789/123456789/'
   364 show('data/123456789/123456789/123456789/123456789/123456789/'
   365           '123456789/123456789/123456789/xxxxxxxxx-xxxxxxxxx-'
   365           '123456789/123456789/123456789/xxxxxxxxx-xxxxxxxxx-'
   366           '123456789-123456')
   366           '123456789-123456')
   367 
   367 
   368 print "hashed path with largest non-dropped directory 8"
   368 print("hashed path with largest non-dropped directory 8")
   369 print "(just not hitting the _maxshortdirslen boundary)"
   369 print("(just not hitting the _maxshortdirslen boundary)")
   370 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   370 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   371           '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   371           '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   372           '123456789-123456')
   372           '123456789-123456')
   373 
   373 
   374 print "...adding one truncated char to dir 1..7 won't drop dir 8"
   374 print("...adding one truncated char to dir 1..7 won't drop dir 8")
   375 show('data/12345678x/12345678/12345678/12345678/12345678/12345'
   375 show('data/12345678x/12345678/12345678/12345678/12345678/12345'
   376           '678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   376           '678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   377           '123456789-123456')
   377           '123456789-123456')
   378 show('data/12345678/12345678x/12345678/12345678/12345678/12345'
   378 show('data/12345678/12345678x/12345678/12345678/12345678/12345'
   379           '678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   379           '678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   392           '123456789-123456')
   392           '123456789-123456')
   393 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   393 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   394           '678/12345678x/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   394           '678/12345678x/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   395           '123456789-123456')
   395           '123456789-123456')
   396 
   396 
   397 print "hashed path with shortest dropped directory 8"
   397 print("hashed path with shortest dropped directory 8")
   398 print "(just hitting the _maxshortdirslen boundary)"
   398 print("(just hitting the _maxshortdirslen boundary)")
   399 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   399 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   400           '678/12345678/123456/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   400           '678/12345678/123456/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   401           '123456789-123456')
   401           '123456789-123456')
   402 
   402 
   403 print "hashed path that drops dir 8 due to dot or space at end is"
   403 print("hashed path that drops dir 8 due to dot or space at end is")
   404 print "encoded, and thus causing to hit _maxshortdirslen"
   404 print("encoded, and thus causing to hit _maxshortdirslen")
   405 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   405 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   406           '678/12345678/1234./-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   406           '678/12345678/1234./-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   407           '123456789-123456')
   407           '123456789-123456')
   408 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   408 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   409           '678/12345678/1234 /-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   409           '678/12345678/1234 /-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   410           '123456789-123456')
   410           '123456789-123456')
   411 
   411 
   412 print "... with dir 8 short enough for encoding"
   412 print("... with dir 8 short enough for encoding")
   413 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   413 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   414           '678/12345678/12./xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   414           '678/12345678/12./xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   415           '123456789-123456')
   415           '123456789-123456')
   416 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   416 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   417           '678/12345678/12 /xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   417           '678/12345678/12 /xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   418           '123456789-123456')
   418           '123456789-123456')
   419 
   419 
   420 print '''Extensions are replicated on hashed paths. Note that
   420 print('''Extensions are replicated on hashed paths. Note that
   421 we only get to encode files that end in .i or .d inside the
   421 we only get to encode files that end in .i or .d inside the
   422 store. Encoded filenames are thus bound in length.'''
   422 store. Encoded filenames are thus bound in length.''')
   423 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   423 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   424           '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   424           '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   425           '123456789-12.345.i')
   425           '123456789-12.345.i')
   426 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   426 show('data/12345678/12345678/12345678/12345678/12345678/12345'
   427           '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   427           '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   462           'YZ-abcdefghjiklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPRSTU'
   462           'YZ-abcdefghjiklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPRSTU'
   463           'VWXYZ-1234567890-xxxxxxxxx-xxxxxxxxx-xxxxxxxx-xxxx'
   463           'VWXYZ-1234567890-xxxxxxxxx-xxxxxxxxx-xxxxxxxx-xxxx'
   464           'xxxxx-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwww'
   464           'xxxxx-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwww'
   465           'wwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww.i')
   465           'wwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww.i')
   466 
   466 
   467 print "paths outside data/ can be encoded"
   467 print("paths outside data/ can be encoded")
   468 show('metadata/dir/00manifest.i')
   468 show('metadata/dir/00manifest.i')
   469 show('metadata/12345678/12345678/12345678/12345678/12345678/'
   469 show('metadata/12345678/12345678/12345678/12345678/12345678/'
   470           '12345678/12345678/12345678/12345678/12345678/12345678/'
   470           '12345678/12345678/12345678/12345678/12345678/12345678/'
   471           '12345678/12345678/00manifest.i')
   471           '12345678/12345678/00manifest.i')