comparison 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
comparison
equal deleted inserted replaced
23591:414374cfb531 23602:a4679a74df14
1 import os, errno, stat 1 import os, errno, stat
2 2
3 import encoding
3 import util 4 import util
4 from i18n import _ 5 from i18n import _
6
7 def _lowerclean(s):
8 return encoding.hfsignoreclean(s.lower())
5 9
6 class pathauditor(object): 10 class pathauditor(object):
7 '''ensure that a filesystem path contains no banned components. 11 '''ensure that a filesystem path contains no banned components.
8 the following properties of a path are checked: 12 the following properties of a path are checked:
9 13
37 # AIX ignores "/" at end of path, others raise EISDIR. 41 # AIX ignores "/" at end of path, others raise EISDIR.
38 if util.endswithsep(path): 42 if util.endswithsep(path):
39 raise util.Abort(_("path ends in directory separator: %s") % path) 43 raise util.Abort(_("path ends in directory separator: %s") % path)
40 parts = util.splitpath(path) 44 parts = util.splitpath(path)
41 if (os.path.splitdrive(path)[0] 45 if (os.path.splitdrive(path)[0]
42 or parts[0].lower() in ('.hg', '.hg.', '') 46 or _lowerclean(parts[0]) in ('.hg', '.hg.', '')
43 or os.pardir in parts): 47 or os.pardir in parts):
44 raise util.Abort(_("path contains illegal component: %s") % path) 48 raise util.Abort(_("path contains illegal component: %s") % path)
45 if '.hg' in path.lower(): 49 # Windows shortname aliases
46 lparts = [p.lower() for p in parts] 50 for p in parts:
51 if "~" in p:
52 first, last = p.split("~", 1)
53 if last.isdigit() and first.upper() in ["HG", "HG8B6C"]:
54 raise util.Abort(_("path contains illegal component: %s")
55 % path)
56 if '.hg' in _lowerclean(path):
57 lparts = [_lowerclean(p.lower()) for p in parts]
47 for p in '.hg', '.hg.': 58 for p in '.hg', '.hg.':
48 if p in lparts[1:]: 59 if p in lparts[1:]:
49 pos = lparts.index(p) 60 pos = lparts.index(p)
50 base = os.path.join(*parts[:pos]) 61 base = os.path.join(*parts[:pos])
51 raise util.Abort(_("path '%s' is inside nested repo %r") 62 raise util.Abort(_("path '%s' is inside nested repo %r")