1
# Copyright (C) 2006 Canonical Ltd
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
"""Tests for handling of ignore files"""
19
from cStringIO import StringIO
21
from bzrlib import config, errors, ignores
22
from bzrlib.tests import TestCase, TestCaseInTempDir, TestCaseWithTransport
25
class TestParseIgnoreFile(TestCase):
27
def test_parse_fancy(self):
28
ignored = ignores.parse_ignore_file(StringIO(
32
'unicode\xc2\xb5\n' # u'\xb5'.encode('utf8')
38
self.assertEqual(set(['./rootdir',
46
def test_parse_empty(self):
47
ignored = ignores.parse_ignore_file(StringIO(''))
48
self.assertEqual(set([]), ignored)
51
class TestUserIgnores(TestCaseInTempDir):
53
def test_create_if_missing(self):
54
# $HOME should be set to '.'
55
ignore_path = config.user_ignore_config_filename()
56
self.failIfExists(ignore_path)
57
user_ignores = ignores.get_user_ignores()
58
self.assertEqual(set(ignores.USER_DEFAULTS), user_ignores)
60
self.failUnlessExists(ignore_path)
61
f = open(ignore_path, 'rb')
63
entries = ignores.parse_ignore_file(f)
66
self.assertEqual(set(ignores.USER_DEFAULTS), entries)
68
def test_use_existing(self):
69
patterns = ['*.o', '*.py[co]', u'\xe5*']
70
ignores._set_user_ignores(patterns)
72
user_ignores = ignores.get_user_ignores()
73
self.assertEqual(set(patterns), user_ignores)
75
def test_use_empty(self):
76
ignores._set_user_ignores([])
77
ignore_path = config.user_ignore_config_filename()
78
self.check_file_contents(ignore_path, '')
80
self.assertEqual(set([]), ignores.get_user_ignores())
83
patterns = ['*.py[co]', '*.py[oc]']
84
ignores._set_user_ignores(patterns)
86
self.assertEqual(set(patterns), ignores.get_user_ignores())
88
patterns = ['vim', '*.swp']
89
ignores._set_user_ignores(patterns)
90
self.assertEqual(set(patterns), ignores.get_user_ignores())
93
"""Test that adding will not duplicate ignores"""
94
# Create an empty file
95
ignores._set_user_ignores([])
97
patterns = ['foo', './bar', u'b\xe5z']
98
added = ignores.add_unique_user_ignores(patterns)
99
self.assertEqual(patterns, added)
100
self.assertEqual(set(patterns), ignores.get_user_ignores())
102
def test_add_directory(self):
103
"""Test that adding a directory will strip any trailing slash"""
104
# Create an empty file
105
ignores._set_user_ignores([])
107
in_patterns = ['foo/', 'bar/', 'baz\\']
108
added = ignores.add_unique_user_ignores(in_patterns)
109
out_patterns = [ x.rstrip('/\\') for x in in_patterns ]
110
self.assertEqual(out_patterns, added)
111
self.assertEqual(set(out_patterns), ignores.get_user_ignores())
113
def test_add_unique(self):
114
"""Test that adding will not duplicate ignores"""
115
ignores._set_user_ignores(
116
['foo', './bar', u'b\xe5z', 'dir1/', 'dir3\\'])
118
added = ignores.add_unique_user_ignores(
119
['xxx', './bar', 'xxx', 'dir1/', 'dir2/', 'dir3\\'])
120
self.assertEqual(['xxx', 'dir2'], added)
121
self.assertEqual(set(['foo', './bar', u'b\xe5z',
122
'xxx', 'dir1', 'dir2', 'dir3']),
123
ignores.get_user_ignores())
126
class TestRuntimeIgnores(TestCase):
131
orig = ignores._runtime_ignores
133
ignores._runtime_ignores = orig
134
self.addCleanup(restore)
135
# For the purposes of these tests, we must have no
137
ignores._runtime_ignores = set()
140
"""Test that we can add an entry to the list."""
141
self.assertEqual(set(), ignores.get_runtime_ignores())
143
ignores.add_runtime_ignores(['foo'])
144
self.assertEqual(set(['foo']), ignores.get_runtime_ignores())
146
def test_add_duplicate(self):
147
"""Adding the same ignore twice shouldn't add a new entry."""
148
ignores.add_runtime_ignores(['foo', 'bar'])
149
self.assertEqual(set(['foo', 'bar']), ignores.get_runtime_ignores())
151
ignores.add_runtime_ignores(['bar'])
152
self.assertEqual(set(['foo', 'bar']), ignores.get_runtime_ignores())
155
class TestTreeIgnores(TestCaseWithTransport):
157
def test_new_file(self):
158
tree = self.make_branch_and_tree(".")
159
ignores.tree_ignores_add_patterns(tree, ["myentry"])
160
self.assertTrue(tree.has_filename(".bzrignore"))
161
self.assertEquals("myentry\n",
162
open(".bzrignore", 'r').read())
164
def test_add_to_existing(self):
165
tree = self.make_branch_and_tree(".")
166
self.build_tree_contents([('.bzrignore', "myentry1\n")])
167
tree.add([".bzrignore"])
168
ignores.tree_ignores_add_patterns(tree, ["myentry2", "foo"])
169
self.assertEquals("myentry1\nmyentry2\nfoo\n",
170
open(".bzrignore", 'r').read())
172
def test_adds_ending_newline(self):
173
tree = self.make_branch_and_tree(".")
174
self.build_tree_contents([('.bzrignore', "myentry1")])
175
tree.add([".bzrignore"])
176
ignores.tree_ignores_add_patterns(tree, ["myentry2"])
177
self.assertEquals("myentry1\nmyentry2\n",
178
open(".bzrignore", 'r').read())