bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
|
2052.3.1
by John Arbash Meinel
Add tests to cleanup the copyright of all source files |
1 |
# Copyright (C) 2006 Canonical Ltd
|
|
1713.2.1
by Robert Collins
Some tests for WorkingTree.is_ignored so it can be refactored with confidence. |
2 |
# Authors: Robert Collins <robert.collins@canonical.com>
|
3 |
#
|
|
4 |
# This program is free software; you can redistribute it and/or modify
|
|
5 |
# it under the terms of the GNU General Public License as published by
|
|
6 |
# the Free Software Foundation; either version 2 of the License, or
|
|
7 |
# (at your option) any later version.
|
|
8 |
#
|
|
9 |
# This program is distributed in the hope that it will be useful,
|
|
10 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12 |
# GNU General Public License for more details.
|
|
13 |
#
|
|
14 |
# You should have received a copy of the GNU General Public License
|
|
15 |
# along with this program; if not, write to the Free Software
|
|
16 |
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
17 |
||
|
1836.1.21
by John Arbash Meinel
Restore the ability to ignore items by modifying DEFAULT_IGNORE |
18 |
import bzrlib |
|
1836.1.20
by John Arbash Meinel
Make sure that mixing global and local ignores work |
19 |
from bzrlib import config, ignores, osutils |
|
1713.2.1
by Robert Collins
Some tests for WorkingTree.is_ignored so it can be refactored with confidence. |
20 |
from bzrlib.tests.workingtree_implementations import TestCaseWithWorkingTree |
21 |
||
22 |
||
23 |
class TestIsIgnored(TestCaseWithWorkingTree): |
|
24 |
||
25 |
def test_is_ignored(self): |
|
26 |
tree = self.make_branch_and_tree('.') |
|
27 |
# this will break if a tree changes the ignored format. That is fine
|
|
28 |
# because at the moment tree format is orthogonal to user data, and
|
|
29 |
# .bzrignore is user data so must not be changed by a tree format.
|
|
30 |
self.build_tree_contents([ |
|
|
1836.1.4
by John Arbash Meinel
Cleanup is_ignored to handle comment lines, and a global ignore pattern |
31 |
('.bzrignore', './rootdir\n' |
32 |
'randomfile*\n' |
|
|
2135.2.1
by Kent Gibson
Added glob module to replace broken fnmatch based ignore pattern matching (#57637) |
33 |
'*bar\n' |
34 |
'?foo\n' |
|
35 |
'*.~*\n' |
|
36 |
'dir1/*f1\n' |
|
37 |
'dir1/?f2\n' |
|
|
1836.1.4
by John Arbash Meinel
Cleanup is_ignored to handle comment lines, and a global ignore pattern |
38 |
'path/from/ro?t\n' |
39 |
'unicode\xc2\xb5\n' # u'\xb5'.encode('utf8') |
|
40 |
'dos\r\n' |
|
41 |
'\n' # empty line |
|
42 |
'#comment\n' |
|
43 |
' xx \n' # whitespace |
|
44 |
)])
|
|
|
1713.2.1
by Robert Collins
Some tests for WorkingTree.is_ignored so it can be refactored with confidence. |
45 |
# is_ignored returns the matching ignore regex when a path is ignored.
|
46 |
# we check some expected matches for each rule, and one or more
|
|
47 |
# relevant not-matches that look plausible as cases for bugs.
|
|
48 |
self.assertEqual('./rootdir', tree.is_ignored('rootdir')) |
|
49 |
self.assertEqual(None, tree.is_ignored('foo/rootdir')) |
|
|
1713.2.3
by Robert Collins
Combine ignore rules into a single regex preventing pathological behaviour during add. |
50 |
self.assertEqual(None, tree.is_ignored('rootdirtrailer')) |
|
1836.1.4
by John Arbash Meinel
Cleanup is_ignored to handle comment lines, and a global ignore pattern |
51 |
|
|
1713.2.1
by Robert Collins
Some tests for WorkingTree.is_ignored so it can be refactored with confidence. |
52 |
self.assertEqual('randomfile*', tree.is_ignored('randomfile')) |
53 |
self.assertEqual('randomfile*', tree.is_ignored('randomfiles')) |
|
54 |
self.assertEqual('randomfile*', tree.is_ignored('foo/randomfiles')) |
|
55 |
self.assertEqual(None, tree.is_ignored('randomfil')) |
|
56 |
self.assertEqual(None, tree.is_ignored('foo/randomfil')) |
|
|
1836.1.4
by John Arbash Meinel
Cleanup is_ignored to handle comment lines, and a global ignore pattern |
57 |
|
|
1713.2.1
by Robert Collins
Some tests for WorkingTree.is_ignored so it can be refactored with confidence. |
58 |
self.assertEqual("path/from/ro?t", tree.is_ignored('path/from/root')) |
59 |
self.assertEqual("path/from/ro?t", tree.is_ignored('path/from/roat')) |
|
60 |
self.assertEqual(None, tree.is_ignored('roat')) |
|
|
1836.1.4
by John Arbash Meinel
Cleanup is_ignored to handle comment lines, and a global ignore pattern |
61 |
|
62 |
self.assertEqual(u'unicode\xb5', tree.is_ignored(u'unicode\xb5')) |
|
63 |
self.assertEqual(u'unicode\xb5', tree.is_ignored(u'subdir/unicode\xb5')) |
|
64 |
self.assertEqual(None, tree.is_ignored(u'unicode\xe5')) |
|
65 |
self.assertEqual(None, tree.is_ignored(u'unicode')) |
|
66 |
self.assertEqual(None, tree.is_ignored(u'\xb5')) |
|
67 |
||
68 |
self.assertEqual('dos', tree.is_ignored('dos')) |
|
69 |
self.assertEqual(None, tree.is_ignored('dosfoo')) |
|
70 |
||
|
2135.2.1
by Kent Gibson
Added glob module to replace broken fnmatch based ignore pattern matching (#57637) |
71 |
self.assertEqual('*bar', tree.is_ignored('foobar')) |
72 |
self.assertEqual('*bar', tree.is_ignored(r'foo\nbar')) |
|
73 |
self.assertEqual('*bar', tree.is_ignored('bar')) |
|
|
2135.2.2
by Kent Gibson
Ignore pattern matcher (glob.py) patches: |
74 |
self.assertEqual('*bar', tree.is_ignored('.bar')) |
|
2135.2.1
by Kent Gibson
Added glob module to replace broken fnmatch based ignore pattern matching (#57637) |
75 |
|
76 |
self.assertEqual('?foo', tree.is_ignored('afoo')) |
|
|
2135.2.2
by Kent Gibson
Ignore pattern matcher (glob.py) patches: |
77 |
self.assertEqual('?foo', tree.is_ignored('.foo')) |
|
2135.2.1
by Kent Gibson
Added glob module to replace broken fnmatch based ignore pattern matching (#57637) |
78 |
|
79 |
self.assertEqual('*.~*', tree.is_ignored('blah.py.~1~')) |
|
80 |
||
81 |
self.assertEqual('dir1/*f1', tree.is_ignored('dir1/foof1')) |
|
82 |
self.assertEqual('dir1/*f1', tree.is_ignored('dir1/f1')) |
|
|
2135.2.2
by Kent Gibson
Ignore pattern matcher (glob.py) patches: |
83 |
self.assertEqual('dir1/*f1', tree.is_ignored('dir1/.f1')) |
|
2135.2.1
by Kent Gibson
Added glob module to replace broken fnmatch based ignore pattern matching (#57637) |
84 |
|
85 |
self.assertEqual('dir1/?f2', tree.is_ignored('dir1/ff2')) |
|
|
2135.2.2
by Kent Gibson
Ignore pattern matcher (glob.py) patches: |
86 |
self.assertEqual('dir1/?f2', tree.is_ignored('dir1/.f2')) |
|
2135.2.1
by Kent Gibson
Added glob module to replace broken fnmatch based ignore pattern matching (#57637) |
87 |
|
|
1836.1.4
by John Arbash Meinel
Cleanup is_ignored to handle comment lines, and a global ignore pattern |
88 |
# Blank lines and comments should be ignored
|
89 |
self.assertEqual(None, tree.is_ignored('')) |
|
90 |
self.assertEqual(None, tree.is_ignored('test/')) |
|
91 |
||
92 |
self.assertEqual(None, tree.is_ignored('#comment')) |
|
93 |
||
94 |
# Whitespace should not be stripped
|
|
95 |
self.assertEqual(' xx ', tree.is_ignored(' xx ')) |
|
96 |
self.assertEqual(' xx ', tree.is_ignored('subdir/ xx ')) |
|
97 |
self.assertEqual(None, tree.is_ignored('xx')) |
|
98 |
self.assertEqual(None, tree.is_ignored('xx ')) |
|
99 |
self.assertEqual(None, tree.is_ignored(' xx')) |
|
100 |
self.assertEqual(None, tree.is_ignored('subdir/xx ')) |
|
101 |
||
102 |
def test_global_ignored(self): |
|
103 |
tree = self.make_branch_and_tree('.') |
|
104 |
||
105 |
config.ensure_config_dir_exists() |
|
|
1836.1.6
by John Arbash Meinel
Creating a helper function for getting the user ignore filename |
106 |
user_ignore_file = config.user_ignore_config_filename() |
|
1836.1.4
by John Arbash Meinel
Cleanup is_ignored to handle comment lines, and a global ignore pattern |
107 |
f = open(user_ignore_file, 'wb') |
108 |
try: |
|
109 |
f.write('*.py[co]\n' |
|
110 |
'./.shelf\n' |
|
111 |
'# comment line\n' |
|
112 |
'\n' #Blank line |
|
113 |
'\r\n' #Blank dos line |
|
114 |
' * \n' #Trailing and suffix spaces |
|
115 |
'crlf\r\n' # dos style line |
|
116 |
'*\xc3\xa5*\n' # u'\xe5'.encode('utf8') |
|
117 |
)
|
|
118 |
finally: |
|
119 |
f.close() |
|
120 |
||
121 |
# Rooted
|
|
122 |
self.assertEqual('./.shelf', tree.is_ignored('.shelf')) |
|
123 |
self.assertEqual(None, tree.is_ignored('foo/.shelf')) |
|
124 |
||
125 |
# Glob style
|
|
126 |
self.assertEqual('*.py[co]', tree.is_ignored('foo.pyc')) |
|
127 |
self.assertEqual('*.py[co]', tree.is_ignored('foo.pyo')) |
|
128 |
self.assertEqual(None, tree.is_ignored('foo.py')) |
|
129 |
||
130 |
# Glob in subdir
|
|
131 |
self.assertEqual('*.py[co]', tree.is_ignored('bar/foo.pyc')) |
|
132 |
self.assertEqual('*.py[co]', tree.is_ignored('bar/foo.pyo')) |
|
133 |
self.assertEqual(None, tree.is_ignored('bar/foo.py')) |
|
134 |
||
135 |
# Unicode
|
|
136 |
self.assertEqual(u'*\xe5*', tree.is_ignored(u'b\xe5gfors')) |
|
137 |
self.assertEqual(u'*\xe5*', tree.is_ignored(u'\xe5gfors')) |
|
138 |
self.assertEqual(u'*\xe5*', tree.is_ignored(u'\xe5')) |
|
139 |
self.assertEqual(u'*\xe5*', tree.is_ignored(u'b\xe5')) |
|
140 |
self.assertEqual(u'*\xe5*', tree.is_ignored(u'b/\xe5')) |
|
141 |
||
142 |
# Whitespace
|
|
143 |
self.assertEqual(' * ', tree.is_ignored(' bbb ')) |
|
144 |
self.assertEqual(' * ', tree.is_ignored('subdir/ bbb ')) |
|
145 |
self.assertEqual(None, tree.is_ignored('bbb ')) |
|
146 |
self.assertEqual(None, tree.is_ignored(' bbb')) |
|
147 |
||
148 |
# Dos lines
|
|
149 |
self.assertEqual('crlf', tree.is_ignored('crlf')) |
|
150 |
self.assertEqual('crlf', tree.is_ignored('subdir/crlf')) |
|
151 |
||
152 |
# Comment line should be ignored
|
|
153 |
self.assertEqual(None, tree.is_ignored('# comment line')) |
|
154 |
||
155 |
# Blank line should also be ignored
|
|
156 |
self.assertEqual(None, tree.is_ignored('')) |
|
157 |
self.assertEqual(None, tree.is_ignored('baz/')) |
|
|
1836.1.20
by John Arbash Meinel
Make sure that mixing global and local ignores work |
158 |
|
159 |
def test_mixed_is_ignored(self): |
|
160 |
tree = self.make_branch_and_tree('.') |
|
|
1836.1.31
by John Arbash Meinel
Make set_user_ignores a private function, and update the doc string to recommend it isn't used. |
161 |
ignores._set_user_ignores(['*.py[co]', './.shelf']) |
|
2135.2.3
by Kent Gibson
Revert unnecessary change to test_mixed_is_ignored. |
162 |
self.build_tree_contents([('.bzrignore', './rootdir\n*.swp\n')]) |
|
1836.1.20
by John Arbash Meinel
Make sure that mixing global and local ignores work |
163 |
|
164 |
self.assertEqual('*.py[co]', tree.is_ignored('foo.pyc')) |
|
165 |
self.assertEqual('./.shelf', tree.is_ignored('.shelf')) |
|
166 |
self.assertEqual('./rootdir', tree.is_ignored('rootdir')) |
|
|
2135.2.3
by Kent Gibson
Revert unnecessary change to test_mixed_is_ignored. |
167 |
self.assertEqual('*.swp', tree.is_ignored('foo.py.swp')) |
168 |
self.assertEqual('*.swp', tree.is_ignored('.foo.py.swp')) |
|
|
1836.1.20
by John Arbash Meinel
Make sure that mixing global and local ignores work |
169 |
self.assertEqual(None, tree.is_ignored('.foo.py.swo')) |
|
1836.1.21
by John Arbash Meinel
Restore the ability to ignore items by modifying DEFAULT_IGNORE |
170 |
|
|
1836.1.28
by John Arbash Meinel
Add a function for adding runtime ignores. |
171 |
def test_runtime_ignores(self): |
172 |
tree = self.make_branch_and_tree('.') |
|
173 |
self.build_tree_contents([('.bzrignore', '')]) |
|
|
1836.1.31
by John Arbash Meinel
Make set_user_ignores a private function, and update the doc string to recommend it isn't used. |
174 |
ignores._set_user_ignores([]) |
|
1836.1.28
by John Arbash Meinel
Add a function for adding runtime ignores. |
175 |
|
176 |
orig_runtime = ignores._runtime_ignores |
|
177 |
try: |
|
178 |
ignores._runtime_ignores = set() |
|
|
1836.1.30
by John Arbash Meinel
Change ignore functions to use sets instead of lists. |
179 |
self.assertEqual(None, tree.is_ignored('foobar.py')) |
|
1836.1.28
by John Arbash Meinel
Add a function for adding runtime ignores. |
180 |
|
|
2135.2.7
by Kent Gibson
Implement JAM's review suggestions. |
181 |
tree._flush_ignore_list_cache() |
|
1836.1.30
by John Arbash Meinel
Change ignore functions to use sets instead of lists. |
182 |
ignores.add_runtime_ignores(['./foobar.py']) |
183 |
self.assertEqual(set(['./foobar.py']), ignores.get_runtime_ignores()) |
|
184 |
self.assertEqual('./foobar.py', tree.is_ignored('foobar.py')) |
|
|
1836.1.28
by John Arbash Meinel
Add a function for adding runtime ignores. |
185 |
finally: |
186 |
ignores._runtime_ignores = orig_runtime |
|
|
2665.3.1
by Daniel Watkins
Added test to ensure that WorkingTree.unknowns() will return an accurate list of unknown files (by way of ensuring that the cached list of ignore definitions in WorkingTree is kept up to date). |
187 |
|
188 |
def test_ignore_caching(self): |
|
189 |
tree = self.make_branch_and_tree('.') |
|
190 |
self.build_tree(['ignoreme']) |
|
191 |
||
192 |
self.assertEqual(None, tree.is_ignored('ignoreme')) |
|
193 |
||
194 |
# Bug #129694 specifically references WorkingTree.unknowns()
|
|
195 |
tree.unknowns() |
|
196 |
||
197 |
self.build_tree_contents([('.bzrignore', 'ignoreme')]) |
|
198 |
self.assertEqual('ignoreme', tree.is_ignored('ignoreme')) |