Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/util.py @ 1270:fc3b41570082
Switch to new syntax for .hgignore files.
Here is the new syntax, in summary.
Trailing white space is dropped.
The escape character is "\".
Comments start with #.
Empty lines are skipped.
Lines can be of the following formats:
syntax: regexp # defaults following lines to non-rooted regexps
syntax: glob # defaults following lines to non-rooted globs
re:pattern # non-rooted regular expression
glob:pattern # non-rooted glob
pattern # pattern of the current default type
The default pattern type is regexp, which is completely backwards
compatible with the old hgignore syntax.
In the dirstate class, the ignore method has been reworked to be based
on the util.matcher function, by way of a new dirstate.hgignore
method.
author | Bryan O'Sullivan <bos@serpentine.com> |
---|---|
date | Sat, 17 Sep 2005 00:27:27 -0700 |
parents | 1945754e466b |
children | 1546c2aa6b30 |
comparison
equal
deleted
inserted
replaced
1269:5e9816decbb7 | 1270:fc3b41570082 |
---|---|
120 elif name == root: | 120 elif name == root: |
121 return '' | 121 return '' |
122 else: | 122 else: |
123 raise Abort('%s not under root' % myname) | 123 raise Abort('%s not under root' % myname) |
124 | 124 |
125 def matcher(canonroot, cwd, names, inc, exc, head=''): | 125 def matcher(canonroot, cwd='', names=['.'], inc=[], exc=[], head=''): |
126 """build a function to match a set of file patterns | 126 """build a function to match a set of file patterns |
127 | 127 |
128 arguments: | 128 arguments: |
129 canonroot - the canonical root of the tree you're matching against | 129 canonroot - the canonical root of the tree you're matching against |
130 cwd - the current working directory, if relevant | 130 cwd - the current working directory, if relevant |
132 inc - patterns to include | 132 inc - patterns to include |
133 exc - patterns to exclude | 133 exc - patterns to exclude |
134 head - a regex to prepend to patterns to control whether a match is rooted | 134 head - a regex to prepend to patterns to control whether a match is rooted |
135 | 135 |
136 a pattern is one of: | 136 a pattern is one of: |
137 're:<regex>' | 137 'glob:<rooted glob>' |
138 'glob:<shellglob>' | 138 're:<rooted regexp>' |
139 'path:<explicit path>' | 139 'path:<rooted path>' |
140 'relglob:<relative glob>' | |
140 'relpath:<relative path>' | 141 'relpath:<relative path>' |
141 '<relative path>' | 142 'relre:<relative regexp>' |
143 '<rooted path or regexp>' | |
142 | 144 |
143 returns: | 145 returns: |
144 a 3-tuple containing | 146 a 3-tuple containing |
145 - list of explicit non-pattern names passed in | 147 - list of explicit non-pattern names passed in |
146 - a bool match(filename) function | 148 - a bool match(filename) function |
149 todo: | 151 todo: |
150 make head regex a rooted bool | 152 make head regex a rooted bool |
151 """ | 153 """ |
152 | 154 |
153 def patkind(name): | 155 def patkind(name): |
154 for prefix in 're:', 'glob:', 'path:', 'relpath:': | 156 for prefix in 're', 'glob', 'path', 'relglob', 'relpath', 'relre': |
155 if name.startswith(prefix): return name.split(':', 1) | 157 if name.startswith(prefix + ':'): return name.split(':', 1) |
156 for c in name: | 158 for c in name: |
157 if c in _globchars: return 'glob', name | 159 if c in _globchars: return 'glob', name |
158 return 'relpath', name | 160 return 'relpath', name |
159 | 161 |
160 def regex(kind, name, tail): | 162 def regex(kind, name, tail): |
161 '''convert a pattern into a regular expression''' | 163 '''convert a pattern into a regular expression''' |
162 if kind == 're': | 164 if kind == 're': |
163 return name | 165 return name |
164 elif kind == 'path': | 166 elif kind == 'path': |
165 return '^' + re.escape(name) + '(?:/|$)' | 167 return '^' + re.escape(name) + '(?:/|$)' |
168 elif kind == 'relglob': | |
169 return head + globre(name, '(?:|.*/)', tail) | |
166 elif kind == 'relpath': | 170 elif kind == 'relpath': |
167 return head + re.escape(name) + tail | 171 return head + re.escape(name) + tail |
172 elif kind == 'relre': | |
173 if name.startswith('^'): | |
174 return name | |
175 return '.*' + name | |
168 return head + globre(name, '', tail) | 176 return head + globre(name, '', tail) |
169 | 177 |
170 def matchfn(pats, tail): | 178 def matchfn(pats, tail): |
171 """build a matching function from a set of patterns""" | 179 """build a matching function from a set of patterns""" |
172 if pats: | 180 if pats: |