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, TestCaseWithTransport
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."""
155
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))
157
180
def test_new_file(self):
158
181
tree = self.make_branch_and_tree(".")
159
182
ignores.tree_ignores_add_patterns(tree, ["myentry"])
160
183
self.assertTrue(tree.has_filename(".bzrignore"))
161
self.assertEquals("myentry\n",
162
open(".bzrignore", 'r').read())
184
self.assertPatternsEquals(["myentry"])
164
186
def test_add_to_existing(self):
165
187
tree = self.make_branch_and_tree(".")
166
self.build_tree_contents([('.bzrignore', "myentry1\n")])
188
self.build_tree_contents([('.bzrignore', "myentry1\n")])
167
189
tree.add([".bzrignore"])
168
190
ignores.tree_ignores_add_patterns(tree, ["myentry2", "foo"])
169
self.assertEquals("myentry1\nmyentry2\nfoo\n",
170
open(".bzrignore", 'r').read())
191
self.assertPatternsEquals(["myentry1", "myentry2", "foo"])
172
193
def test_adds_ending_newline(self):
173
194
tree = self.make_branch_and_tree(".")
174
self.build_tree_contents([('.bzrignore', "myentry1")])
195
self.build_tree_contents([('.bzrignore', "myentry1")])
175
196
tree.add([".bzrignore"])
176
197
ignores.tree_ignores_add_patterns(tree, ["myentry2"])
177
self.assertEquals("myentry1\nmyentry2\n",
178
open(".bzrignore", 'r').read())
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"])