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)
118
141
added = ignores.add_unique_user_ignores(
119
142
['xxx', './bar', 'xxx', 'dir1/', 'dir2/', 'dir3\\'])
120
143
self.assertEqual(['xxx', 'dir2'], added)
121
self.assertEqual(set(['foo', './bar', u'b\xe5z',
144
self.assertEqual(set(['foo', './bar', u'b\xe5z',
122
145
'xxx', 'dir1', 'dir2', 'dir3']),
123
146
ignores.get_user_ignores())
126
149
class TestRuntimeIgnores(TestCase):
152
super(TestRuntimeIgnores, self).setUp()
131
orig = ignores._runtime_ignores
133
ignores._runtime_ignores = orig
134
self.addCleanup(restore)
135
154
# For the purposes of these tests, we must have no
136
155
# runtime ignores
137
ignores._runtime_ignores = set()
156
self.overrideAttr(ignores, '_runtime_ignores', set())
139
158
def test_add(self):
140
159
"""Test that we can add an entry to the list."""
151
170
ignores.add_runtime_ignores(['bar'])
152
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"])