/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/globbing.py

  • Committer: Jelmer Vernooij
  • Date: 2018-05-06 11:48:54 UTC
  • mto: This revision was merged to the branch mainline in revision 6960.
  • Revision ID: jelmer@jelmer.uk-20180506114854-h4qd9ojaqy8wxjsd
Move .mailmap to root.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
import re
26
26
 
27
27
from . import (
 
28
    errors,
28
29
    lazy_regex,
29
30
    )
30
31
from .trace import (
79
80
    def __call__(self, text):
80
81
        if not self._pat:
81
82
            self._pat = lazy_regex.lazy_compile(
82
 
                u'|'.join([u'(%s)' % p for p in self._pats]),
83
 
                re.UNICODE)
 
83
                    u'|'.join([u'(%s)' % p for p in self._pats]),
 
84
                    re.UNICODE)
84
85
        return self._pat.sub(self._do_sub, text)
85
86
 
86
87
    def _do_sub(self, m):
136
137
 
137
138
 
138
139
_sub_fullpath = Replacer()
139
 
_sub_fullpath.add(r'^RE:.*', _sub_re)  # RE:<anything> is a regex
140
 
_sub_fullpath.add(r'\[\^?\]?(?:[^][]|\[:[^]]+:\])+\]',
141
 
                  _sub_group)  # char group
142
 
_sub_fullpath.add(r'(?:(?<=/)|^)(?:\.?/)+', u'')  # canonicalize path
143
 
_sub_fullpath.add(r'\\.', r'\&')  # keep anything backslashed
144
 
_sub_fullpath.add(r'[(){}|^$+.]', r'\\&')  # escape specials
145
 
_sub_fullpath.add(r'(?:(?<=/)|^)\*\*+/', r'(?:.*/)?')  # **/ after ^ or /
146
 
_sub_fullpath.add(r'\*+', r'[^/]*')  # * elsewhere
147
 
_sub_fullpath.add(r'\?', r'[^/]')  # ? everywhere
 
140
_sub_fullpath.add(r'^RE:.*', _sub_re) # RE:<anything> is a regex
 
141
_sub_fullpath.add(r'\[\^?\]?(?:[^][]|\[:[^]]+:\])+\]', _sub_group) # char group
 
142
_sub_fullpath.add(r'(?:(?<=/)|^)(?:\.?/)+', u'') # canonicalize path
 
143
_sub_fullpath.add(r'\\.', r'\&') # keep anything backslashed
 
144
_sub_fullpath.add(r'[(){}|^$+.]', r'\\&') # escape specials
 
145
_sub_fullpath.add(r'(?:(?<=/)|^)\*\*+/', r'(?:.*/)?') # **/ after ^ or /
 
146
_sub_fullpath.add(r'\*+', r'[^/]*') # * elsewhere
 
147
_sub_fullpath.add(r'\?', r'[^/]') # ? everywhere
148
148
 
149
149
 
150
150
_sub_basename = Replacer()
151
 
_sub_basename.add(r'\[\^?\]?(?:[^][]|\[:[^]]+:\])+\]',
152
 
                  _sub_group)  # char group
153
 
_sub_basename.add(r'\\.', r'\&')  # keep anything backslashed
154
 
_sub_basename.add(r'[(){}|^$+.]', r'\\&')  # escape specials
155
 
_sub_basename.add(r'\*+', r'.*')  # * everywhere
156
 
_sub_basename.add(r'\?', r'.')  # ? everywhere
 
151
_sub_basename.add(r'\[\^?\]?(?:[^][]|\[:[^]]+:\])+\]', _sub_group) # char group
 
152
_sub_basename.add(r'\\.', r'\&') # keep anything backslashed
 
153
_sub_basename.add(r'[(){}|^$+.]', r'\\&') # escape specials
 
154
_sub_basename.add(r'\*+', r'.*') # * everywhere
 
155
_sub_basename.add(r'\?', r'.') # ? everywhere
157
156
 
158
157
 
159
158
def _sub_extension(pattern):
189
188
    # starting with the shortest and going to the longest.
190
189
    # As some Python version don't support ordered dicts the list below is
191
190
    # used to select inputs for _add_pattern in a specific order.
192
 
    pattern_types = ["extension", "basename", "fullpath"]
 
191
    pattern_types = [ "extension", "basename", "fullpath" ]
193
192
 
194
193
    pattern_info = {
195
194
        "extension": {
196
 
            "translator": _sub_extension,
197
 
            "prefix": r'(?:.*/)?(?!.*/)(?:.*\.)'
 
195
            "translator" : _sub_extension,
 
196
            "prefix" : r'(?:.*/)?(?!.*/)(?:.*\.)'
198
197
        },
199
198
        "basename": {
200
 
            "translator": _sub_basename,
201
 
            "prefix": r'(?:.*/)?(?!.*/)'
 
199
            "translator" : _sub_basename,
 
200
            "prefix" : r'(?:.*/)?(?!.*/)'
202
201
        },
203
202
        "fullpath": {
204
 
            "translator": _sub_fullpath,
205
 
            "prefix": r''
 
203
            "translator" : _sub_fullpath,
 
204
            "prefix" : r''
206
205
        },
207
206
    }
208
207
 
219
218
        pi = Globster.pattern_info
220
219
        for t in Globster.pattern_types:
221
220
            self._add_patterns(pattern_lists[t], pi[t]["translator"],
222
 
                               pi[t]["prefix"])
 
221
                pi[t]["prefix"])
223
222
 
224
223
    def _add_patterns(self, patterns, translator, prefix=''):
225
224
        while patterns:
242
241
            for regex, patterns in self._regex_patterns:
243
242
                match = regex.match(filename)
244
243
                if match:
245
 
                    return patterns[match.lastindex - 1]
 
244
                    return patterns[match.lastindex -1]
246
245
        except lazy_regex.InvalidPattern as e:
247
246
            # We can't show the default e.msg to the user as thats for
248
247
            # the combined pattern we sent to regex. Instead we indicate to
249
248
            # the user that an ignore file needs fixing.
250
249
            mutter('Invalid pattern found in regex: %s.', e.msg)
251
 
            e.msg = (
252
 
                "File ~/.config/breezy/ignore or "
253
 
                ".bzrignore contains error(s).")
 
250
            e.msg = "File ~/.bazaar/ignore or .bzrignore contains error(s)."
254
251
            bad_patterns = ''
255
252
            for _, patterns in self._regex_patterns:
256
253
                for p in patterns:
284
281
        see: globbing.normalize_pattern
285
282
        """
286
283
        result = True
287
 
        translator = Globster.pattern_info[Globster.identify(
288
 
            pattern)]["translator"]
 
284
        translator = Globster.pattern_info[Globster.identify(pattern)]["translator"]
289
285
        tpattern = '(%s)' % translator(pattern)
290
286
        try:
291
287
            re_obj = lazy_regex.lazy_compile(tpattern, re.UNICODE)
292
 
            re_obj.search("")  # force compile
293
 
        except lazy_regex.InvalidPattern:
 
288
            re_obj.search("") # force compile
 
289
        except lazy_regex.InvalidPattern as e:
294
290
            result = False
295
291
        return result
296
292
 
297
293
 
298
294
class ExceptionGlobster(object):
299
295
    """A Globster that supports exception patterns.
300
 
 
 
296
    
301
297
    Exceptions are ignore patterns prefixed with '!'.  Exception
302
 
    patterns take precedence over regular patterns and cause a
303
 
    matching filename to return None from the match() function.
304
 
    Patterns using a '!!' prefix are highest precedence, and act
 
298
    patterns take precedence over regular patterns and cause a 
 
299
    matching filename to return None from the match() function.  
 
300
    Patterns using a '!!' prefix are highest precedence, and act 
305
301
    as regular ignores. '!!' patterns are useful to establish ignores
306
302
    that apply under paths specified by '!' exception patterns.
307
303
    """
308
 
 
 
304
    
309
305
    def __init__(self, patterns):
310
306
        ignores = [[], [], []]
311
307
        for p in patterns:
316
312
            else:
317
313
                ignores[0].append(p)
318
314
        self._ignores = [Globster(i) for i in ignores]
319
 
 
 
315
        
320
316
    def match(self, filename):
321
317
        """Searches for a pattern that matches the given filename.
322
318
 
330
326
        else:
331
327
            return self._ignores[0].match(filename)
332
328
 
333
 
 
334
329
class _OrderedGlobster(Globster):
335
330
    """A Globster that keeps pattern order."""
336
331
 
345
340
            pat = normalize_pattern(pat)
346
341
            t = Globster.identify(pat)
347
342
            self._add_patterns([pat], Globster.pattern_info[t]["translator"],
348
 
                               Globster.pattern_info[t]["prefix"])
 
343
                Globster.pattern_info[t]["prefix"])
349
344
 
350
345
 
351
346
_slashes = lazy_regex.lazy_compile(r'[\\/]+')
352
 
 
353
 
 
354
347
def normalize_pattern(pattern):
355
348
    """Converts backslashes in path patterns to forward slashes.
356
349