83 while a and b and a[-1] == b[-1]: |
83 while a and b and a[-1] == b[-1]: |
84 a.pop(), b.pop() |
84 a.pop(), b.pop() |
85 b.reverse() |
85 b.reverse() |
86 return os.sep.join((['..'] * len(a)) + b) |
86 return os.sep.join((['..'] * len(a)) + b) |
87 |
87 |
88 def canonpath(repo, cwd, myname): |
88 def canonpath(root, cwd, myname): |
89 rootsep = repo.root + os.sep |
89 rootsep = root + os.sep |
90 name = myname |
90 name = myname |
91 if not name.startswith(os.sep): |
91 if not name.startswith(os.sep): |
92 name = os.path.join(repo.root, cwd, name) |
92 name = os.path.join(root, cwd, name) |
93 name = os.path.normpath(name) |
93 name = os.path.normpath(name) |
94 if name.startswith(rootsep): |
94 if name.startswith(rootsep): |
95 return pconvert(name[len(rootsep):]) |
95 return pconvert(name[len(rootsep):]) |
96 elif name == repo.root: |
96 elif name == root: |
97 return '' |
97 return '' |
98 else: |
98 else: |
99 raise Abort('%s not under repository root' % myname) |
99 raise Abort('%s not under root' % myname) |
100 |
100 |
101 def matcher(repo, cwd, names, inc, exc, head=''): |
101 def matcher(canonroot, cwd, names, inc, exc, head=''): |
102 def patkind(name): |
102 def patkind(name): |
103 for prefix in 're:', 'glob:', 'path:', 'relpath:': |
103 for prefix in 're:', 'glob:', 'path:', 'relpath:': |
104 if name.startswith(prefix): return name.split(':', 1) |
104 if name.startswith(prefix): return name.split(':', 1) |
105 for c in name: |
105 for c in name: |
106 if c in _globchars: return 'glob', name |
106 if c in _globchars: return 'glob', name |
133 pats = [] |
133 pats = [] |
134 files = [] |
134 files = [] |
135 roots = [] |
135 roots = [] |
136 for kind, name in map(patkind, names): |
136 for kind, name in map(patkind, names): |
137 if kind in ('glob', 'relpath'): |
137 if kind in ('glob', 'relpath'): |
138 name = canonpath(repo, cwd, name) |
138 name = canonpath(canonroot, cwd, name) |
139 if name == '': |
139 if name == '': |
140 kind, name = 'glob', '**' |
140 kind, name = 'glob', '**' |
141 if kind in ('glob', 'path', 're'): |
141 if kind in ('glob', 'path', 're'): |
142 pats.append((kind, name)) |
142 pats.append((kind, name)) |
143 if kind == 'glob': |
143 if kind == 'glob': |