13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
"""Tests for handling of ignore files"""
19
19
from cStringIO import StringIO
21
from bzrlib import config, errors, ignores
22
from bzrlib.tests import TestCase, TestCaseInTempDir
25
from bzrlib.tests import (
28
TestCaseWithTransport,
25
32
class TestParseIgnoreFile(TestCase):
46
57
def test_parse_empty(self):
47
58
ignored = ignores.parse_ignore_file(StringIO(''))
48
59
self.assertEqual(set([]), ignored)
61
def test_parse_non_utf8(self):
62
"""Lines with non utf 8 characters should be discarded."""
63
ignored = ignores.parse_ignore_file(StringIO(
68
self.assertEqual(set([
51
74
class TestUserIgnores(TestCaseInTempDir):
53
76
def test_create_if_missing(self):
54
77
# $HOME should be set to '.'
55
78
ignore_path = config.user_ignore_config_filename()
56
self.failIfExists(ignore_path)
79
self.assertPathDoesNotExist(ignore_path)
57
80
user_ignores = ignores.get_user_ignores()
58
81
self.assertEqual(set(ignores.USER_DEFAULTS), user_ignores)
60
self.failUnlessExists(ignore_path)
83
self.assertPathExists(ignore_path)
61
84
f = open(ignore_path, 'rb')
63
86
entries = ignores.parse_ignore_file(f)
104
127
# Create an empty file
105
128
ignores._set_user_ignores([])
107
in_patterns = ['foo/', 'bar/']
130
in_patterns = ['foo/', 'bar/', 'baz\\']
108
131
added = ignores.add_unique_user_ignores(in_patterns)
109
out_patterns = [ x.rstrip('/') for x in in_patterns ]
132
out_patterns = [ x.rstrip('/\\') for x in in_patterns ]
110
133
self.assertEqual(out_patterns, added)
111
134
self.assertEqual(set(out_patterns), ignores.get_user_ignores())
113
136
def test_add_unique(self):
114
137
"""Test that adding will not duplicate ignores"""
115
ignores._set_user_ignores(['foo', './bar', u'b\xe5z', 'dir1/'])
138
ignores._set_user_ignores(
139
['foo', './bar', u'b\xe5z', 'dir1/', 'dir3\\'])
117
141
added = ignores.add_unique_user_ignores(
118
['xxx', './bar', 'xxx', 'dir1/', 'dir2/'])
142
['xxx', './bar', 'xxx', 'dir1/', 'dir2/', 'dir3\\'])
119
143
self.assertEqual(['xxx', 'dir2'], added)
120
self.assertEqual(set(['foo', './bar', u'b\xe5z',
121
'xxx', 'dir1', 'dir2']),
144
self.assertEqual(set(['foo', './bar', u'b\xe5z',
145
'xxx', 'dir1', 'dir2', 'dir3']),
122
146
ignores.get_user_ignores())
128
152
TestCase.setUp(self)
130
orig = ignores._runtime_ignores
132
ignores._runtime_ignores = orig
133
self.addCleanup(restore)
134
154
# For the purposes of these tests, we must have no
135
155
# runtime ignores
136
ignores._runtime_ignores = set()
156
self.overrideAttr(ignores, '_runtime_ignores', set())
138
158
def test_add(self):
139
159
"""Test that we can add an entry to the list."""
150
170
ignores.add_runtime_ignores(['bar'])
151
171
self.assertEqual(set(['foo', 'bar']), ignores.get_runtime_ignores())
174
class TestTreeIgnores(TestCaseWithTransport):
176
def assertPatternsEquals(self, patterns):
177
contents = open(".bzrignore", 'rU').read().strip().split('\n')
178
self.assertEquals(sorted(patterns), sorted(contents))
180
def test_new_file(self):
181
tree = self.make_branch_and_tree(".")
182
ignores.tree_ignores_add_patterns(tree, ["myentry"])
183
self.assertTrue(tree.has_filename(".bzrignore"))
184
self.assertPatternsEquals(["myentry"])
186
def test_add_to_existing(self):
187
tree = self.make_branch_and_tree(".")
188
self.build_tree_contents([('.bzrignore', "myentry1\n")])
189
tree.add([".bzrignore"])
190
ignores.tree_ignores_add_patterns(tree, ["myentry2", "foo"])
191
self.assertPatternsEquals(["myentry1", "myentry2", "foo"])
193
def test_adds_ending_newline(self):
194
tree = self.make_branch_and_tree(".")
195
self.build_tree_contents([('.bzrignore', "myentry1")])
196
tree.add([".bzrignore"])
197
ignores.tree_ignores_add_patterns(tree, ["myentry2"])
198
self.assertPatternsEquals(["myentry1", "myentry2"])
199
text = open(".bzrignore", 'r').read()
200
self.assertTrue(text.endswith('\r\n') or
201
text.endswith('\n') or
204
def test_does_not_add_dupe(self):
205
tree = self.make_branch_and_tree(".")
206
self.build_tree_contents([('.bzrignore', "myentry\n")])
207
tree.add([".bzrignore"])
208
ignores.tree_ignores_add_patterns(tree, ["myentry"])
209
self.assertPatternsEquals(["myentry"])
211
def test_non_ascii(self):
212
tree = self.make_branch_and_tree(".")
213
self.build_tree_contents([('.bzrignore',
214
u"myentry\u1234\n".encode('utf-8'))])
215
tree.add([".bzrignore"])
216
ignores.tree_ignores_add_patterns(tree, [u"myentry\u5678"])
217
self.assertPatternsEquals([u"myentry\u1234".encode('utf-8'),
218
u"myentry\u5678".encode('utf-8')])
221
tree = self.make_branch_and_tree(".")
222
self.build_tree_contents([('.bzrignore', "myentry1\r\n")])
223
tree.add([".bzrignore"])
224
ignores.tree_ignores_add_patterns(tree, ["myentry2", "foo"])
225
self.assertEquals(open('.bzrignore', 'rb').read(), 'myentry1\r\nmyentry2\r\nfoo\r\n')
226
self.assertPatternsEquals(["myentry1", "myentry2", "foo"])