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')
40
self.assertEqual(set(['./rootdir',
50
def test_parse_empty(self):
51
ignored = ignores.parse_ignore_file(StringIO(''))
52
self.assertEqual(set([]), ignored)
55
class TestUserIgnores(TestCaseInTempDir):
57
def test_create_if_missing(self):
58
# $HOME should be set to '.'
59
ignore_path = config.user_ignore_config_filename()
60
self.failIfExists(ignore_path)
61
user_ignores = ignores.get_user_ignores()
62
self.assertEqual(set(ignores.USER_DEFAULTS), user_ignores)
64
self.failUnlessExists(ignore_path)
65
f = open(ignore_path, 'rb')
67
entries = ignores.parse_ignore_file(f)
70
self.assertEqual(set(ignores.USER_DEFAULTS), entries)
72
def test_use_existing(self):
73
patterns = ['*.o', '*.py[co]', u'\xe5*']
74
ignores._set_user_ignores(patterns)
76
user_ignores = ignores.get_user_ignores()
77
self.assertEqual(set(patterns), user_ignores)
79
def test_use_empty(self):
80
ignores._set_user_ignores([])
81
ignore_path = config.user_ignore_config_filename()
82
self.check_file_contents(ignore_path, '')
84
self.assertEqual(set([]), ignores.get_user_ignores())
87
patterns = ['*.py[co]', '*.py[oc]']
88
ignores._set_user_ignores(patterns)
90
self.assertEqual(set(patterns), ignores.get_user_ignores())
92
patterns = ['vim', '*.swp']
93
ignores._set_user_ignores(patterns)
94
self.assertEqual(set(patterns), ignores.get_user_ignores())
97
"""Test that adding will not duplicate ignores"""
98
# Create an empty file
99
ignores._set_user_ignores([])
101
patterns = ['foo', './bar', u'b\xe5z']
102
added = ignores.add_unique_user_ignores(patterns)
103
self.assertEqual(patterns, added)
104
self.assertEqual(set(patterns), ignores.get_user_ignores())
106
def test_add_directory(self):
107
"""Test that adding a directory will strip any trailing slash"""
108
# Create an empty file
109
ignores._set_user_ignores([])
111
in_patterns = ['foo/', 'bar/', 'baz\\']
112
added = ignores.add_unique_user_ignores(in_patterns)
113
out_patterns = [ x.rstrip('/\\') for x in in_patterns ]
114
self.assertEqual(out_patterns, added)
115
self.assertEqual(set(out_patterns), ignores.get_user_ignores())
117
def test_add_unique(self):
118
"""Test that adding will not duplicate ignores"""
119
ignores._set_user_ignores(
120
['foo', './bar', u'b\xe5z', 'dir1/', 'dir3\\'])
122
added = ignores.add_unique_user_ignores(
123
['xxx', './bar', 'xxx', 'dir1/', 'dir2/', 'dir3\\'])
124
self.assertEqual(['xxx', 'dir2'], added)
125
self.assertEqual(set(['foo', './bar', u'b\xe5z',
126
'xxx', 'dir1', 'dir2', 'dir3']),
127
ignores.get_user_ignores())
130
class TestRuntimeIgnores(TestCase):
135
# For the purposes of these tests, we must have no
137
self.overrideAttr(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())