[PATCH] convert: normalize paths in filemaps (issue3612)

Huayang Guo huayang at fb.com
Wed Oct 17 16:01:44 CDT 2012


# HG changeset patch
# User Huayang <huayang at fb.com>
# Date 1349479654 25200
# Node ID be43ef5cd839673f76dd0b65a9f053a6e3ac76af
# Parent  fa714f3ed2989aff64c267c9935251d9fc4f31ee
convert: normalize paths in filemaps (issue3612)

convert doesn't normalise double slashes in paths. Path normalization
is applied when a path is loaded into filemap and when a file lookup
request is issued to filemap.

diff -r fa714f3ed298 -r be43ef5cd839 hgext/convert/filemap.py
--- a/hgext/convert/filemap.py	Mon Oct 01 23:05:02 2012 -0500
+++ b/hgext/convert/filemap.py	Fri Oct 05 16:27:34 2012 -0700
@@ -4,6 +4,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
+import posixpath
 import shlex
 from mercurial.i18n import _
 from mercurial import util
@@ -16,6 +17,13 @@
         e = name.rfind('/', 0, e)
     yield '.', name
 
+def normalize(path):
+    ''' We use posixpath.normpath to support cross-platform path format. 
+    However, it doesn't handle None input. So we wrap it up. '''
+    if path == None:
+        return None
+    return posixpath.normpath(path)
+
 class filemapper(object):
     '''Map and filter filenames when importing.
     A name can be mapped to itself, a new name, or None (omit from new
@@ -53,21 +61,21 @@
         cmd = lex.get_token()
         while cmd:
             if cmd == 'include':
-                name = lex.get_token()
+                name = normalize(lex.get_token())
                 errs += check(name, self.exclude, 'exclude')
                 self.include[name] = name
             elif cmd == 'exclude':
-                name = lex.get_token()
+                name = normalize(lex.get_token())
                 errs += check(name, self.include, 'include')
                 errs += check(name, self.rename, 'rename')
                 self.exclude[name] = name
             elif cmd == 'rename':
-                src = lex.get_token()
-                dest = lex.get_token()
+                src = normalize(lex.get_token())
+                dest = normalize(lex.get_token())
                 errs += check(src, self.exclude, 'exclude')
                 self.rename[src] = dest
             elif cmd == 'source':
-                errs += self.parse(lex.get_token())
+                errs += self.parse(normalize(lex.get_token()))
             else:
                 self.ui.warn(_('%s:%d: unknown directive %r\n') %
                              (lex.infile, lex.lineno, cmd))
@@ -76,6 +84,7 @@
         return errs
 
     def lookup(self, name, mapping):
+        name = normalize(name)
         for pre, suf in rpairs(name):
             try:
                 return mapping[pre], pre, suf
diff -r fa714f3ed298 -r be43ef5cd839 tests/test-convert-filemap.t
--- a/tests/test-convert-filemap.t	Mon Oct 01 23:05:02 2012 -0500
+++ b/tests/test-convert-filemap.t	Fri Oct 05 16:27:34 2012 -0700
@@ -229,11 +229,11 @@
   $ cat > renames.fmap <<EOF
   > include dir
   > exclude dir/file2
-  > rename dir dir2
+  > rename dir dir2//../dir2/
   > include foo
   > include copied
-  > rename foo foo2
-  > rename copied copied2
+  > rename foo foo2/
+  > rename copied ./copied2
   > exclude dir/subdir
   > include dir/subdir/file3
   > EOF
@@ -284,10 +284,8 @@
   > include
   > EOF
   $ hg -q convert --filemap errors.fmap source errors.repo
-  errors.fmap:1: superfluous / in exclude 'dir/'
   errors.fmap:3: superfluous / in include '/dir'
   errors.fmap:3: superfluous / in rename '/dir'
-  errors.fmap:3: superfluous / in exclude 'dir//dir'
   errors.fmap:4: unknown directive 'out of sync'
   errors.fmap:5: path to exclude is missing
   abort: errors in filemap
@@ -593,4 +591,4 @@
   | o  1:cda818e7219b at default "changea" files: a
   |/
   o  0:c334dc3be0da at default "add" files: a
-  
+


More information about the Mercurial-devel mailing list