diff mercurial/pathutil.py @ 23602:a4679a74df14

merge with stable
author Matt Mackall <mpm@selenic.com>
date Thu, 18 Dec 2014 16:41:59 -0600
parents e53f6b72a0e4 6dad422ecc5a
children 7d6a507a4c53
line wrap: on
line diff
--- a/mercurial/pathutil.py	Wed Dec 17 15:11:26 2014 -0800
+++ b/mercurial/pathutil.py	Thu Dec 18 16:41:59 2014 -0600
@@ -1,8 +1,12 @@
 import os, errno, stat
 
+import encoding
 import util
 from i18n import _
 
+def _lowerclean(s):
+    return encoding.hfsignoreclean(s.lower())
+
 class pathauditor(object):
     '''ensure that a filesystem path contains no banned components.
     the following properties of a path are checked:
@@ -39,11 +43,18 @@
             raise util.Abort(_("path ends in directory separator: %s") % path)
         parts = util.splitpath(path)
         if (os.path.splitdrive(path)[0]
-            or parts[0].lower() in ('.hg', '.hg.', '')
+            or _lowerclean(parts[0]) in ('.hg', '.hg.', '')
             or os.pardir in parts):
             raise util.Abort(_("path contains illegal component: %s") % path)
-        if '.hg' in path.lower():
-            lparts = [p.lower() for p in parts]
+        # Windows shortname aliases
+        for p in parts:
+            if "~" in p:
+                first, last = p.split("~", 1)
+                if last.isdigit() and first.upper() in ["HG", "HG8B6C"]:
+                    raise util.Abort(_("path contains illegal component: %s")
+                                     % path)
+        if '.hg' in _lowerclean(path):
+            lparts = [_lowerclean(p.lower()) for p in parts]
             for p in '.hg', '.hg.':
                 if p in lparts[1:]:
                     pos = lparts.index(p)