Mercurial > hg-stable
comparison mercurial/util.py @ 814:0902ffece4b4
Merge with BOS
author | mpm@selenic.com |
---|---|
date | Sat, 30 Jul 2005 09:00:14 -0800 |
parents | 8f5637f0a0c0 b65af904d6d7 |
children | 89985a1b3427 0932bc2fb2be 1fe3b14c7044 |
comparison
equal
deleted
inserted
replaced
808:8f5637f0a0c0 | 814:0902ffece4b4 |
---|---|
64 res += '|' | 64 res += '|' |
65 else: | 65 else: |
66 res += re.escape(c) | 66 res += re.escape(c) |
67 return head + res + tail | 67 return head + res + tail |
68 | 68 |
69 def matcher(cwd, pats, inc, exc, head = ''): | 69 _globchars = {'[': 1, '{': 1, '*': 1, '?': 1} |
70 | |
71 def matcher(cwd, names, inc, exc, head = ''): | |
72 def patlike(name): | |
73 for prefix in 're:', 'glob:', 'path:': | |
74 if name.startswith(prefix): return True | |
75 for c in name: | |
76 if c in _globchars: return True | |
77 | |
70 def regex(name, tail): | 78 def regex(name, tail): |
71 '''convert a pattern into a regular expression''' | 79 '''convert a pattern into a regular expression''' |
72 if name.startswith('re:'): | 80 if name.startswith('re:'): |
73 return name[3:] | 81 return name[3:] |
74 elif name.startswith('path:'): | 82 elif name.startswith('path:'): |
75 return '^' + re.escape(name[5:]) + '$' | 83 return '^' + re.escape(name[5:]) + '$' |
76 elif name.startswith('glob:'): | 84 elif name.startswith('glob:'): |
77 return head + globre(name[5:], '', tail) | 85 return head + globre(name[5:], '', tail) |
78 return head + globre(name, '', tail) | 86 return head + globre(name, '', tail) |
79 | 87 |
88 cwdsep = cwd + os.sep | |
89 | |
80 def under(fn): | 90 def under(fn): |
81 """check if fn is under our cwd""" | 91 """check if fn is under our cwd""" |
82 return not cwd or fn.startswith(cwdsep) | 92 return not cwd or fn.startswith(cwdsep) |
83 | 93 |
84 def matchfn(pats, tail): | 94 def matchfn(pats, tail): |
85 """build a matching function from a set of patterns""" | 95 """build a matching function from a set of patterns""" |
86 if pats: | 96 if pats: |
87 pat = '(?:%s)' % '|'.join([regex(p, tail) for p in pats]) | 97 pat = '(?:%s)' % '|'.join([regex(p, tail) for p in pats]) |
88 if cwd: | 98 if cwd: |
89 pat = re.escape(cwd + os.sep) + pat | 99 pat = re.escape(cwdsep) + pat |
90 return re.compile(pat).match | 100 return re.compile(pat).match |
91 | 101 |
92 cwdsep = cwd + os.sep | 102 pats = filter(patlike, names) |
93 patmatch = matchfn(pats, '$') or (lambda fn: True) | 103 files = [n for n in names if not patlike(n)] |
104 if pats: plain = [] | |
105 elif cwd: plain = [cwdsep + f for f in files] | |
106 else: plain = files | |
107 | |
108 patmatch = matchfn(pats, '$') | |
109 filematch = matchfn(files, '(?:/|$)') | |
94 incmatch = matchfn(inc, '(?:/|$)') or under | 110 incmatch = matchfn(inc, '(?:/|$)') or under |
95 excmatch = matchfn(exc, '(?:/|$)') or (lambda fn: False) | 111 excmatch = matchfn(exc, '(?:/|$)') or (lambda fn: False) |
96 | 112 |
97 return lambda fn: (incmatch(fn) and not excmatch(fn) and | 113 return plain, lambda fn: (incmatch(fn) and not excmatch(fn) and |
98 (fn.endswith('/') or patmatch(fn))) | 114 (fn.endswith('/') or |
115 (not pats and not files) or | |
116 (pats and patmatch(fn)) or | |
117 (files and filematch(fn)))) | |
99 | 118 |
100 def system(cmd, errprefix=None): | 119 def system(cmd, errprefix=None): |
101 """execute a shell command that must succeed""" | 120 """execute a shell command that must succeed""" |
102 rc = os.system(cmd) | 121 rc = os.system(cmd) |
103 if rc: | 122 if rc: |