25
from bzrlib import ignores
30
27
from bzrlib.branch import Branch
31
28
import bzrlib.bzrdir as bzrdir
32
29
from bzrlib.errors import BzrCommandError
33
30
from bzrlib.osutils import (
36
from bzrlib.tests.HTTPTestUtil import TestCaseWithWebserver
36
37
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
37
from bzrlib.tests import TestCaseWithTransport
38
from bzrlib.tests.blackbox import ExternalBase
38
39
from bzrlib.workingtree import WorkingTree
41
class TestCommands(TestCaseWithTransport):
43
def test_ignore_absolutes(self):
44
"""'ignore' with an absolute path returns an error"""
45
self.make_branch_and_tree('.')
46
self.run_bzr_error(('bzr: ERROR: NAME_PATTERN should not '
47
'be an absolute path\n',),
50
def test_ignore_directories(self):
51
"""ignoring a directory should ignore directory tree.
53
Also check that trailing slashes on directories are stripped.
56
self.build_tree(['dir1/', 'dir1/foo',
59
self.run_bzr(['ignore', 'dir1', 'dir2/', 'dir4\\'])
60
self.check_file_contents('.bzrignore', 'dir1\ndir2\ndir4\n')
61
self.assertEquals(self.run_bzr('unknowns')[0], 'dir3\n')
42
class TestCommands(ExternalBase):
63
44
def test_ignore_patterns(self):
64
tree = self.make_branch_and_tree('.')
66
self.assertEquals(list(tree.unknowns()), [])
46
self.assertEquals(self.capture('unknowns'), '')
68
48
# is_ignored() will now create the user global ignore file
69
49
# if it doesn't exist, so make sure we ignore it in our tests
70
ignores._set_user_ignores(['*.tmp'])
50
ignores._set_user_ignores(['*.tmp', './.bazaar'])
72
52
self.build_tree_contents(
73
[('foo.tmp', '.tmp files are ignored by default')])
74
self.assertEquals(list(tree.unknowns()), [])
76
self.build_tree_contents([('foo.c', 'int main() {}')])
77
self.assertEquals(list(tree.unknowns()), ['foo.c'])
80
self.assertEquals(list(tree.unknowns()), [])
53
[('foo.tmp', '.tmp files are ignored by default'),
55
self.assertEquals(self.capture('unknowns'), '')
57
file('foo.c', 'wt').write('int main() {}')
58
self.assertEquals(self.capture('unknowns'), 'foo.c\n')
60
self.runbzr(['add', 'foo.c'])
61
self.assertEquals(self.capture('unknowns'), '')
82
63
# 'ignore' works when creating the .bzrignore file
83
self.build_tree_contents([('foo.blah', 'blah')])
84
self.assertEquals(list(tree.unknowns()), ['foo.blah'])
85
self.run_bzr('ignore *.blah')
86
self.assertEquals(list(tree.unknowns()), [])
87
self.check_file_contents('.bzrignore', '*.blah\n')
64
file('foo.blah', 'wt').write('blah')
65
self.assertEquals(self.capture('unknowns'), 'foo.blah\n')
66
self.runbzr('ignore *.blah')
67
self.assertEquals(self.capture('unknowns'), '')
68
self.assertEquals('*.blah\n', open('.bzrignore', 'rU').read())
89
70
# 'ignore' works when then .bzrignore file already exists
90
self.build_tree_contents([('garh', 'garh')])
91
self.assertEquals(list(tree.unknowns()), ['garh'])
92
self.run_bzr('ignore garh')
93
self.assertEquals(list(tree.unknowns()), [])
94
self.check_file_contents('.bzrignore', '*.blah\ngarh\n')
96
def test_ignore_multiple_arguments(self):
97
"""'ignore' works with multiple arguments"""
98
tree = self.make_branch_and_tree('.')
99
self.build_tree(['a','b','c','d'])
100
self.assertEquals(list(tree.unknowns()), ['a', 'b', 'c', 'd'])
101
self.run_bzr('ignore a b c')
102
self.assertEquals(list(tree.unknowns()), ['d'])
103
self.check_file_contents('.bzrignore', 'a\nb\nc\n')
105
def test_ignore_no_arguments(self):
106
"""'ignore' with no arguments returns an error"""
107
self.make_branch_and_tree('.')
108
self.run_bzr_error(('bzr: ERROR: ignore requires at least one '
109
'NAME_PATTERN or --default-rules.\n',),
112
def test_ignore_default_rules(self):
113
out, err = self.run_bzr(['ignore', '--default-rules'])
114
reference_set = set(ignores.USER_DEFAULTS)
115
output_set = set(out.rstrip().split('\n'))
116
self.assertEqual(reference_set, output_set)
71
file('garh', 'wt').write('garh')
72
self.assertEquals(self.capture('unknowns'), 'garh\n')
73
self.runbzr('ignore garh')
74
self.assertEquals(self.capture('unknowns'), '')
75
self.assertEquals(file('.bzrignore', 'rU').read(), '*.blah\ngarh\n')
77
def test_ignore_old_defaults(self):
78
out, err = self.run_bzr('ignore', '--old-default-rules')
79
self.assertContainsRe(out, 'CVS')
117
80
self.assertEqual('', err)
119
def test_ignore_versioned_file(self):
120
tree = self.make_branch_and_tree('.')
121
self.build_tree(['a','b'])
124
# test a single versioned file
125
out, err = self.run_bzr('ignore a')
126
self.assertEqual(out,
127
"Warning: the following files are version controlled"\
128
" and match your ignore pattern:\na\n"\
129
"These files will continue to be version controlled"\
130
" unless you 'bzr remove' them.\n")
132
# test a single unversioned file
133
out, err = self.run_bzr('ignore b')
134
self.assertEqual(out, '')
138
out, err = self.run_bzr('ignore *')
139
self.assertEqual(out,
140
"Warning: the following files are version controlled"\
141
" and match your ignore pattern:\n.bzrignore\na\nb\n"\
142
"These files will continue to be version controlled"\
143
" unless you 'bzr remove' them.\n")
145
def test_ignored_versioned_file_matching_new_pattern(self):
146
tree = self.make_branch_and_tree('.')
147
self.build_tree(['a', 'b'])
149
self.run_bzr('ignore *')
151
# If only the given pattern is used then only 'b' should match in
153
out, err = self.run_bzr('ignore b')
154
self.assertEqual(out,
155
"Warning: the following files are version controlled"\
156
" and match your ignore pattern:\nb\n"\
157
"These files will continue to be version controlled"\
158
" unless you 'bzr remove' them.\n")
160
def test_ignore_directory(self):
161
"""Test --directory option"""
162
tree = self.make_branch_and_tree('a')
163
self.run_bzr(['ignore', '--directory=a', 'README'])
164
self.check_file_contents('a/.bzrignore', 'README\n')
166
def test_ignored_invalid_pattern(self):
167
"""Ensure graceful handling for invalid ignore pattern.
169
Test case for #300062.
170
Invalid pattern should show clear error message.
171
Invalid pattern should not be added to .bzrignore file.
173
tree = self.make_branch_and_tree('.')
174
out, err = self.run_bzr(['ignore', 'RE:*.cpp', 'foo', 'RE:['], 3)
175
self.assertEqual(out, '')
176
self.assertContainsRe(err,
177
'Invalid ignore pattern.*RE:\*\.cpp.*RE:\[', re.DOTALL)
178
self.assertNotContainsRe(err, 'foo', re.DOTALL)
179
self.assertFalse(os.path.isfile('.bzrignore'))