[PATCH v3] convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov
eug.baranov at gmail.com
Wed Jul 15 04:51:32 CDT 2015
# HG changeset patch
# User Eugene Baranov <eug.baranov at gmail.com>
# Date 1436887437 -3600
# Tue Jul 14 16:23:57 2015 +0100
# Node ID 528c1d146a0d2f079f01b81771140e3d8ed066e6
# Parent 35fa7c77c754aa4d156c42abfdb61ca178468872
convert: unescape Perforce-escaped special characters in filenames
diff -r 35fa7c77c754 -r 528c1d146a0d hgext/convert/p4.py
--- a/hgext/convert/p4.py Sun Jul 12 17:59:25 2015 +0900
+++ b/hgext/convert/p4.py Tue Jul 14 16:23:57 2015 +0100
@@ -23,6 +23,20 @@
except EOFError:
pass
+def decodefilename(filename):
+ """Perforce escapes special characters @, #, *, or %
+ with %40, %23, %2A, or %25 respectively
+
+ >>> decodefilename('portable-net45%252Bnetcore45%252Bwp8%252BMonoAndroid')
+ 'portable-net45%2Bnetcore45%2Bwp8%2BMonoAndroid'
+ >>> decodefilename('//Depot/Directory/%2525/%2523/%23%40.%2A')
+ '//Depot/Directory/%25/%23/#@.*'
+ """
+ replacements = [('%2A', '*'), ('%23', '#'), ('%40', '@'), ('%25', '%')]
+ for k, v in replacements:
+ filename = filename.replace(k, v)
+ return filename
+
class p4_source(converter_source):
def __init__(self, ui, path, revs=None):
super(p4_source, self).__init__(ui, path, revs=revs)
@@ -138,7 +152,7 @@
filename = None
for v in vieworder:
if oldname.lower().startswith(v.lower()):
- filename = views[v] + oldname[len(v):]
+ filename = decodefilename(views[v] + oldname[len(v):])
break
if filename:
files.append((filename, d["rev%d" % i]))
diff -r 35fa7c77c754 -r 528c1d146a0d tests/test-doctest.py
--- a/tests/test-doctest.py Sun Jul 12 17:59:25 2015 +0900
+++ b/tests/test-doctest.py Tue Jul 14 16:23:57 2015 +0100
@@ -33,5 +33,6 @@
testmod('mercurial.util', testtarget='platform')
testmod('hgext.convert.cvsps')
testmod('hgext.convert.filemap')
+testmod('hgext.convert.p4')
testmod('hgext.convert.subversion')
testmod('hgext.mq')
More information about the Mercurial-devel
mailing list