Merge lp:~parthm/bzr/300062-2.2-bad-pattern-error-part-2 into lp:bzr/2.2
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Vincent Ladeuil | ||||
Approved revision: | no longer in the source branch. | ||||
Merged at revision: | 5065 | ||||
Proposed branch: | lp:~parthm/bzr/300062-2.2-bad-pattern-error-part-2 | ||||
Merge into: | lp:bzr/2.2 | ||||
Diff against target: |
279 lines (+135/-39) 6 files modified
NEWS (+5/-0) bzrlib/builtins.py (+8/-0) bzrlib/globbing.py (+75/-23) bzrlib/tests/blackbox/test_ignore.py (+16/-0) bzrlib/tests/per_workingtree/test_is_ignored.py (+25/-13) bzrlib/tests/test_globbing.py (+6/-3) |
||||
To merge this branch: | bzr merge lp:~parthm/bzr/300062-2.2-bad-pattern-error-part-2 | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Vincent Ladeuil | Approve | ||
John A Meinel | Needs Fixing | ||
Review via email: mp+29949@code.launchpad.net |
Commit message
'bzr ignore' fails on bad pattern. bad pattern error messages now shows the faulting pattern.
Description of the change
This fix is towards bug #300062
It does the following:
1. `bzr ignore PATTERNS` now fails with an error if an invalid pattern is provided.
2. For pattern errors, the faulting pattern is displayed to the user.
E.g.
[a1234]% ~/src/bzr.
bzr: ERROR: Invalid pattern(s) found. File ~/.bazaar/ignore or .bzrignore contains error(s).
RE:[
[a1234]% ~/src/bzr.
bzr: error: Invalid ignore pattern(s) found.
RE:*.cpp
bzr: ERROR: Invalid pattern(s) found.
[a1234]%
This patch is the same as the https:/
If also contains update for e.message -> e.msg fix that came up since the previous patch was created.
79 - self._add_ patterns( ext_patterns, _sub_extension, r'(?:.* /)?(?!. */)(?:. *\.)') patterns( base_patterns, _sub_basename, r'(?:.* /)?(?!. */)') patterns( path_patterns, _sub_fullpath) lists[Globster. identify( pat)].append( pat) lists.iteritems (): patterns( patterns, translators[ pattern_ type], prefixes[ pattern_ type])
80 - prefix=
81 - self._add_
82 - prefix=
83 - self._add_
84 + pattern_
85 + for pattern_type, patterns in pattern_
86 + self._add_
87 + Globster.
88 + Globster.
^- I think factoring the patterns into a dict indirected code is interesting. I'm a bit concerned about: lists.iteritems ():
for pattern_type, patterns in pattern_
I'm pretty sure we explicitly intended the order of 'check extensions' then 'check basename' then 'check fullpath'. So that we can do checks on just the little bit of the content before we have to check against the whole content. I don't have any explicit proof of this, but turning the current deterministic ordering with a random one doesn't seem ideal.
otherwise the change seems fine to me. I may be over-concerned, but I do believe that 'is_ignored()' is a fair amount of overhead in the 'initial add of 30k files', and I'd like us to at least be aware of it. I do wonder about changing the internals so that instead of using '?:.*/)?(?!.*/)) to filter out everything but the basename for some patterns, if we wouldn't be better off knowing that this is a basename-only pattern and just supply that to the match.
I'm certainly willing to discuss it, but the easiest way to move forward is to just make the order of _add_patterns deterministic by iterating over a fixed ordering.