~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/globbing.py

merged 376388 related changes for 2.0 patch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
215
215
                return patterns[match.lastindex -1]
216
216
        return None
217
217
 
 
218
class ExceptionGlobster(object):
 
219
    """A Globster that supports exception patterns.
 
220
    
 
221
    Exceptions are ignore patterns prefixed with '!'.  Exception
 
222
    patterns take precedence over regular patterns and cause a 
 
223
    matching filename to return None from the match() function.  
 
224
    Patterns using a '!!' prefix are highest precedence, and act 
 
225
    as regular ignores. '!!' patterns are useful to establish ignores
 
226
    that apply under paths specified by '!' exception patterns.
 
227
    """
 
228
    
 
229
    def __init__(self,patterns):
 
230
        ignores = [[], [], []]
 
231
        for p in patterns:
 
232
            if p.startswith(u'!!'):
 
233
                ignores[2].append(p[2:])
 
234
            elif p.startswith(u'!'):
 
235
                ignores[1].append(p[1:])
 
236
            else:
 
237
                ignores[0].append(p)
 
238
        self._ignores = [Globster(i) for i in ignores]
 
239
        
 
240
    def match(self, filename):
 
241
        """Searches for a pattern that matches the given filename.
 
242
 
 
243
        :return A matching pattern or None if there is no matching pattern.
 
244
        """
 
245
        double_neg = self._ignores[2].match(filename)
 
246
        if double_neg:
 
247
            return "!!%s" % double_neg
 
248
        elif self._ignores[1].match(filename):
 
249
            return None
 
250
        else:
 
251
            return self._ignores[0].match(filename)
218
252
 
219
253
class _OrderedGlobster(Globster):
220
254
    """A Globster that keeps pattern order."""
244
278
 
245
279
    Doesn't normalize regular expressions - they may contain escapes.
246
280
    """
247
 
 
248
 
    if not pattern.startswith('RE:'):
 
281
    if not (pattern.startswith('RE:') or pattern.startswith('!RE:')):
249
282
        pattern = _slashes.sub('/', pattern)
250
283
    if len(pattern) > 1:
251
284
        pattern = pattern.rstrip('/')