Mercurial > hg
comparison mercurial/match.py @ 32401:284b18303f61
match: replace icasefsmatch() function by flag to regular match()
match() will soon gain more logic and we don't want to duplicate that
in icasefsmatch(), so merge the two functions instead and use a flag
to get case-insensitive behavior.
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Thu, 18 May 2017 22:20:59 -0700 |
parents | 8802c63599e1 |
children | 952017471f93 |
comparison
equal
deleted
inserted
replaced
32400:8802c63599e1 | 32401:284b18303f61 |
---|---|
84 return False | 84 return False |
85 return True | 85 return True |
86 | 86 |
87 def match(root, cwd, patterns, include=None, exclude=None, default='glob', | 87 def match(root, cwd, patterns, include=None, exclude=None, default='glob', |
88 exact=False, auditor=None, ctx=None, listsubrepos=False, warn=None, | 88 exact=False, auditor=None, ctx=None, listsubrepos=False, warn=None, |
89 badfn=None): | 89 badfn=None, icasefs=False): |
90 """build an object to match a set of file patterns | 90 """build an object to match a set of file patterns |
91 | 91 |
92 arguments: | 92 arguments: |
93 root - the canonical root of the tree you're matching against | 93 root - the canonical root of the tree you're matching against |
94 cwd - the current working directory, if relevant | 94 cwd - the current working directory, if relevant |
97 exclude - patterns to exclude (even if they are included) | 97 exclude - patterns to exclude (even if they are included) |
98 default - if a pattern in patterns has no explicit type, assume this one | 98 default - if a pattern in patterns has no explicit type, assume this one |
99 exact - patterns are actually filenames (include/exclude still apply) | 99 exact - patterns are actually filenames (include/exclude still apply) |
100 warn - optional function used for printing warnings | 100 warn - optional function used for printing warnings |
101 badfn - optional bad() callback for this matcher instead of the default | 101 badfn - optional bad() callback for this matcher instead of the default |
102 icasefs - make a matcher for wdir on case insensitive filesystems, which | |
103 normalizes the given patterns to the case in the filesystem | |
102 | 104 |
103 a pattern is one of: | 105 a pattern is one of: |
104 'glob:<glob>' - a glob relative to cwd | 106 'glob:<glob>' - a glob relative to cwd |
105 're:<regexp>' - a regular expression | 107 're:<regexp>' - a regular expression |
106 'path:<path>' - a path relative to repository root, which is matched | 108 'path:<path>' - a path relative to repository root, which is matched |
114 'include:<path>' - a file of patterns to read and include | 116 'include:<path>' - a file of patterns to read and include |
115 'subinclude:<path>' - a file of patterns to match against files under | 117 'subinclude:<path>' - a file of patterns to match against files under |
116 the same directory | 118 the same directory |
117 '<something>' - a pattern of the specified default type | 119 '<something>' - a pattern of the specified default type |
118 """ | 120 """ |
119 return matcher(root, cwd, _donormalize, patterns, include=include, | 121 normalize = _donormalize |
122 if icasefs: | |
123 dirstate = ctx.repo().dirstate | |
124 dsnormalize = dirstate.normalize | |
125 | |
126 def normalize(patterns, default, root, cwd, auditor, warn): | |
127 kp = _donormalize(patterns, default, root, cwd, auditor, warn) | |
128 kindpats = [] | |
129 for kind, pats, source in kp: | |
130 if kind not in ('re', 'relre'): # regex can't be normalized | |
131 p = pats | |
132 pats = dsnormalize(pats) | |
133 | |
134 # Preserve the original to handle a case only rename. | |
135 if p != pats and p in dirstate: | |
136 kindpats.append((kind, p, source)) | |
137 | |
138 kindpats.append((kind, pats, source)) | |
139 return kindpats | |
140 | |
141 return matcher(root, cwd, normalize, patterns, include=include, | |
120 exclude=exclude, default=default, exact=exact, | 142 exclude=exclude, default=default, exact=exact, |
121 auditor=auditor, ctx=ctx, listsubrepos=listsubrepos, | 143 auditor=auditor, ctx=ctx, listsubrepos=listsubrepos, |
122 warn=warn, badfn=badfn) | 144 warn=warn, badfn=badfn) |
123 | |
124 def icasefsmatch(root, cwd, patterns, include=None, exclude=None, | |
125 default='glob', auditor=None, ctx=None, | |
126 listsubrepos=False, badfn=None): | |
127 """A matcher for wdir on case insensitive filesystems, which normalizes the | |
128 given patterns to the case in the filesystem. | |
129 """ | |
130 dirstate = ctx.repo().dirstate | |
131 dsnormalize = dirstate.normalize | |
132 | |
133 def normalize(patterns, default, root, cwd, auditor, warn): | |
134 kp = _donormalize(patterns, default, root, cwd, auditor, warn) | |
135 kindpats = [] | |
136 for kind, pats, source in kp: | |
137 if kind not in ('re', 'relre'): # regex can't be normalized | |
138 p = pats | |
139 pats = dsnormalize(pats) | |
140 | |
141 # Preserve the original to handle a case only rename. | |
142 if p != pats and p in dirstate: | |
143 kindpats.append((kind, p, source)) | |
144 | |
145 kindpats.append((kind, pats, source)) | |
146 return kindpats | |
147 | |
148 return matcher(root, cwd, normalize, patterns=patterns, include=include, | |
149 exclude=exclude, default=default, auditor=auditor, ctx=ctx, | |
150 listsubrepos=listsubrepos, badfn=badfn) | |
151 | 145 |
152 def exact(root, cwd, files, badfn=None): | 146 def exact(root, cwd, files, badfn=None): |
153 return match(root, cwd, files, exact=True, badfn=badfn) | 147 return match(root, cwd, files, exact=True, badfn=badfn) |
154 | 148 |
155 def always(root, cwd): | 149 def always(root, cwd): |