# HG changeset patch # User Matt Mackall # Date 1322087717 21600 # Node ID 7786b7dfbc4688d2ef639cbf3beedda11e36f940 # Parent a82b6038ff08e5a46b86c8a997bf831af06ca72c# Parent 3992c7df85f2e404ae24af721c9ef09d1cc830f4 merge with stable diff -r a82b6038ff08 -r 7786b7dfbc46 hgext/convert/filemap.py --- a/hgext/convert/filemap.py Wed Nov 23 02:44:11 2011 +0100 +++ b/hgext/convert/filemap.py Wed Nov 23 16:35:17 2011 -0600 @@ -99,6 +99,8 @@ if newpre == '.': return suf if suf: + if newpre.endswith('/'): + return newpre + suf return newpre + '/' + suf return newpre return name diff -r a82b6038ff08 -r 7786b7dfbc46 mercurial/posix.py --- a/mercurial/posix.py Wed Nov 23 02:44:11 2011 +0100 +++ b/mercurial/posix.py Wed Nov 23 16:35:17 2011 -0600 @@ -176,13 +176,15 @@ u = path.decode('utf-8') except UnicodeDecodeError: # percent-encode any characters that don't round-trip - p2 = path.decode('utf-8', 'replace').encode('utf-8') + p2 = path.decode('utf-8', 'ignore').encode('utf-8') s = "" - for a, b in zip(path, p2): - if a != b: - s += "%%%02X" % ord(a) + pos = 0 + for c in path: + if p2[pos:pos + 1] == c: + s += c + pos += 1 else: - s += a + s += "%%%02X" % ord(c) u = s.decode('utf-8') # Decompose then lowercase (HFS+ technote specifies lower) diff -r a82b6038ff08 -r 7786b7dfbc46 tests/test-casecollision-i18n.t --- a/tests/test-casecollision-i18n.t Wed Nov 23 02:44:11 2011 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -run only on case-insensitive filesystems, because collision check at -"hg update" is done only on case-insensitive filesystems - - $ "$TESTDIR/hghave" icasefs || exit 80 - -setup repository, and target files - - $ HGENCODING=cp932 - $ export HGENCODING - $ hg init t - $ cd t - $ python << EOF - > names = ["\x83\x41", # cp932(0x83, 0x41='A'), UNICODE(0x30a2) - > "\x83\x5A", # cp932(0x83, 0x5A='Z'), UNICODE(0x30bb) - > "\x83\x61", # cp932(0x83, 0x61='a'), UNICODE(0x30c2) - > "\x83\x7A", # cp932(0x83, 0x7A='z'), UNICODE(0x30db) - > ] - > for num, name in zip(range(len(names)), names): - > # file for getting target filename of "hg add" - > f = file(str(num), 'w'); f.write(name); f.close() - > # target file of "hg add" - > f = file(name, 'w'); f.write(name); f.close() - > EOF - -test filename collison check at "hg add" - - $ hg add --config ui.portablefilenames=abort `cat 0` - $ hg add --config ui.portablefilenames=abort `cat 1` - $ hg add --config ui.portablefilenames=abort `cat 2` - $ hg add --config ui.portablefilenames=abort `cat 3` - $ hg status -a - A \x83A (esc) - A \x83Z (esc) - A \x83a (esc) - A \x83z (esc) - -test filename collision check at "hg update" - - $ hg commit -m 'revision 0' - $ hg update null - 0 files updated, 0 files merged, 4 files removed, 0 files unresolved - $ hg update tip - 4 files updated, 0 files merged, 0 files removed, 0 files unresolved