/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1
# Copyright (C) 2006-2012, 2016 Canonical Ltd
1836.1.13 by John Arbash Meinel
Adding functions for getting user ignores.
2
#
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.
7
#
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.
12
#
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1836.1.13 by John Arbash Meinel
Adding functions for getting user ignores.
16
17
"""Tests for handling of ignore files"""
18
7479.2.1 by Jelmer Vernooij
Drop python2 support.
19
from io import BytesIO
7290.37.1 by Jelmer Vernooij
Don't fail when unable to write per-user ignore list due to one of the intermediate directories not existing
20
import os
21
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
22
from .. import (
7336.2.1 by Martin
Split non-ini config methods to bedding
23
    bedding,
5579.3.1 by Jelmer Vernooij
Remove unused imports.
24
    ignores,
25
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
26
from . import (
5579.3.1 by Jelmer Vernooij
Remove unused imports.
27
    TestCase,
28
    TestCaseInTempDir,
29
    TestCaseWithTransport,
30
    )
1836.1.13 by John Arbash Meinel
Adding functions for getting user ignores.
31
32
33
class TestParseIgnoreFile(TestCase):
34
35
    def test_parse_fancy(self):
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
36
        ignored = ignores.parse_ignore_file(BytesIO(
7143.15.2 by Jelmer Vernooij
Run autopep8.
37
            b'./rootdir\n'
38
            b'randomfile*\n'
39
            b'path/from/ro?t\n'
40
            b'unicode\xc2\xb5\n'  # u'\xb5'.encode('utf8')
41
            b'dos\r\n'
42
            b'\n'  # empty line
43
            b'#comment\n'
44
            b' xx \n'  # whitespace
45
            b'!RE:^\\.z.*\n'
46
            b'!!./.zcompdump\n'
47
            ))
6809.2.1 by Martin
Make most of test_ignores pass on Python 3
48
        self.assertEqual({u'./rootdir',
49
                          u'randomfile*',
50
                          u'path/from/ro?t',
1836.1.25 by John Arbash Meinel
cleanups suggested by Martin.
51
                          u'unicode\xb5',
6809.2.1 by Martin
Make most of test_ignores pass on Python 3
52
                          u'dos',
53
                          u' xx ',
54
                          u'!RE:^\\.z.*',
55
                          u'!!./.zcompdump',
7143.15.2 by Jelmer Vernooij
Run autopep8.
56
                          }, ignored)
1836.1.25 by John Arbash Meinel
cleanups suggested by Martin.
57
1836.1.13 by John Arbash Meinel
Adding functions for getting user ignores.
58
    def test_parse_empty(self):
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
59
        ignored = ignores.parse_ignore_file(BytesIO(b''))
1836.1.30 by John Arbash Meinel
Change ignore functions to use sets instead of lists.
60
        self.assertEqual(set([]), ignored)
7143.15.2 by Jelmer Vernooij
Run autopep8.
61
5119.1.4 by Jason Spashett
Add test for parsing non utf8
62
    def test_parse_non_utf8(self):
63
        """Lines with non utf 8 characters should be discarded."""
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
64
        ignored = ignores.parse_ignore_file(BytesIO(
7143.15.2 by Jelmer Vernooij
Run autopep8.
65
            b'utf8filename_a\n'
66
            b'invalid utf8\x80\n'
67
            b'utf8filename_b\n'
68
            ))
6619.3.12 by Jelmer Vernooij
Use 2to3 set_literal fixer.
69
        self.assertEqual({
7143.15.2 by Jelmer Vernooij
Run autopep8.
70
            u'utf8filename_a',
71
            u'utf8filename_b',
72
            }, ignored)
1836.1.13 by John Arbash Meinel
Adding functions for getting user ignores.
73
74
1836.1.15 by John Arbash Meinel
Updated WorkingTree to use the new user-level ignores.
75
class TestUserIgnores(TestCaseInTempDir):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
76
1836.1.13 by John Arbash Meinel
Adding functions for getting user ignores.
77
    def test_create_if_missing(self):
78
        # $HOME should be set to '.'
7336.2.1 by Martin
Split non-ini config methods to bedding
79
        ignore_path = bedding.user_ignore_config_path()
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
80
        self.assertPathDoesNotExist(ignore_path)
1836.1.13 by John Arbash Meinel
Adding functions for getting user ignores.
81
        user_ignores = ignores.get_user_ignores()
1836.1.30 by John Arbash Meinel
Change ignore functions to use sets instead of lists.
82
        self.assertEqual(set(ignores.USER_DEFAULTS), user_ignores)
1836.1.13 by John Arbash Meinel
Adding functions for getting user ignores.
83
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
84
        self.assertPathExists(ignore_path)
6809.2.1 by Martin
Make most of test_ignores pass on Python 3
85
        with open(ignore_path, 'rb') as f:
1836.1.13 by John Arbash Meinel
Adding functions for getting user ignores.
86
            entries = ignores.parse_ignore_file(f)
1836.1.30 by John Arbash Meinel
Change ignore functions to use sets instead of lists.
87
        self.assertEqual(set(ignores.USER_DEFAULTS), entries)
1836.1.13 by John Arbash Meinel
Adding functions for getting user ignores.
88
7290.37.1 by Jelmer Vernooij
Don't fail when unable to write per-user ignore list due to one of the intermediate directories not existing
89
    def test_create_with_intermediate_missing(self):
90
        # $HOME should be set to '.'
7413.1.2 by Vincent Ladeuil
Fix test failures caused by divergence between lp:brz and lp:brz/3.0
91
        ignore_path = bedding.user_ignore_config_path()
7290.37.1 by Jelmer Vernooij
Don't fail when unable to write per-user ignore list due to one of the intermediate directories not existing
92
        self.assertPathDoesNotExist(ignore_path)
93
        os.mkdir('empty-home')
94
7490.38.2 by Jelmer Vernooij
Fix ignore test.
95
        config_path = os.path.join(
96
            self.test_dir, 'empty-home', 'foo', '.config')
7290.37.1 by Jelmer Vernooij
Don't fail when unable to write per-user ignore list due to one of the intermediate directories not existing
97
        self.overrideEnv('BRZ_HOME', config_path)
98
        self.assertPathDoesNotExist(config_path)
99
100
        user_ignores = ignores.get_user_ignores()
101
        self.assertEqual(set(ignores.USER_DEFAULTS), user_ignores)
102
7413.1.2 by Vincent Ladeuil
Fix test failures caused by divergence between lp:brz and lp:brz/3.0
103
        ignore_path = bedding.user_ignore_config_path()
7290.37.1 by Jelmer Vernooij
Don't fail when unable to write per-user ignore list due to one of the intermediate directories not existing
104
        self.assertPathDoesNotExist(ignore_path)
105
1836.1.13 by John Arbash Meinel
Adding functions for getting user ignores.
106
    def test_use_existing(self):
6809.2.1 by Martin
Make most of test_ignores pass on Python 3
107
        patterns = [u'*.o', u'*.py[co]', u'\xe5*']
1836.1.31 by John Arbash Meinel
Make set_user_ignores a private function, and update the doc string to recommend it isn't used.
108
        ignores._set_user_ignores(patterns)
1836.1.13 by John Arbash Meinel
Adding functions for getting user ignores.
109
110
        user_ignores = ignores.get_user_ignores()
1836.1.30 by John Arbash Meinel
Change ignore functions to use sets instead of lists.
111
        self.assertEqual(set(patterns), user_ignores)
1836.1.14 by John Arbash Meinel
Adding a helper function that will only add patterns if they are missing.
112
113
    def test_use_empty(self):
1836.1.31 by John Arbash Meinel
Make set_user_ignores a private function, and update the doc string to recommend it isn't used.
114
        ignores._set_user_ignores([])
7336.2.1 by Martin
Split non-ini config methods to bedding
115
        ignore_path = bedding.user_ignore_config_path()
6973.10.4 by Jelmer Vernooij
Update python3.passing.
116
        self.check_file_contents(ignore_path, b'')
1836.1.14 by John Arbash Meinel
Adding a helper function that will only add patterns if they are missing.
117
1836.1.30 by John Arbash Meinel
Change ignore functions to use sets instead of lists.
118
        self.assertEqual(set([]), ignores.get_user_ignores())
1836.1.14 by John Arbash Meinel
Adding a helper function that will only add patterns if they are missing.
119
1836.1.15 by John Arbash Meinel
Updated WorkingTree to use the new user-level ignores.
120
    def test_set(self):
121
        patterns = ['*.py[co]', '*.py[oc]']
1836.1.31 by John Arbash Meinel
Make set_user_ignores a private function, and update the doc string to recommend it isn't used.
122
        ignores._set_user_ignores(patterns)
1836.1.15 by John Arbash Meinel
Updated WorkingTree to use the new user-level ignores.
123
1836.1.30 by John Arbash Meinel
Change ignore functions to use sets instead of lists.
124
        self.assertEqual(set(patterns), ignores.get_user_ignores())
1836.1.15 by John Arbash Meinel
Updated WorkingTree to use the new user-level ignores.
125
126
        patterns = ['vim', '*.swp']
1836.1.31 by John Arbash Meinel
Make set_user_ignores a private function, and update the doc string to recommend it isn't used.
127
        ignores._set_user_ignores(patterns)
1836.1.30 by John Arbash Meinel
Change ignore functions to use sets instead of lists.
128
        self.assertEqual(set(patterns), ignores.get_user_ignores())
1836.1.15 by John Arbash Meinel
Updated WorkingTree to use the new user-level ignores.
129
1836.1.14 by John Arbash Meinel
Adding a helper function that will only add patterns if they are missing.
130
    def test_add(self):
131
        """Test that adding will not duplicate ignores"""
132
        # Create an empty file
1836.1.31 by John Arbash Meinel
Make set_user_ignores a private function, and update the doc string to recommend it isn't used.
133
        ignores._set_user_ignores([])
1836.1.14 by John Arbash Meinel
Adding a helper function that will only add patterns if they are missing.
134
135
        patterns = ['foo', './bar', u'b\xe5z']
136
        added = ignores.add_unique_user_ignores(patterns)
137
        self.assertEqual(patterns, added)
1836.1.30 by John Arbash Meinel
Change ignore functions to use sets instead of lists.
138
        self.assertEqual(set(patterns), ignores.get_user_ignores())
1836.1.14 by John Arbash Meinel
Adding a helper function that will only add patterns if they are missing.
139
2077.1.2 by Kent Gibson
Strip trailing slashes from ignore patterns (#4559).
140
    def test_add_directory(self):
141
        """Test that adding a directory will strip any trailing slash"""
142
        # Create an empty file
143
        ignores._set_user_ignores([])
144
2298.8.3 by Kent Gibson
Extended test cases to test bug 86451.
145
        in_patterns = ['foo/', 'bar/', 'baz\\']
2077.1.2 by Kent Gibson
Strip trailing slashes from ignore patterns (#4559).
146
        added = ignores.add_unique_user_ignores(in_patterns)
7143.15.2 by Jelmer Vernooij
Run autopep8.
147
        out_patterns = [x.rstrip('/\\') for x in in_patterns]
2077.1.2 by Kent Gibson
Strip trailing slashes from ignore patterns (#4559).
148
        self.assertEqual(out_patterns, added)
149
        self.assertEqual(set(out_patterns), ignores.get_user_ignores())
150
1836.1.14 by John Arbash Meinel
Adding a helper function that will only add patterns if they are missing.
151
    def test_add_unique(self):
152
        """Test that adding will not duplicate ignores"""
2298.8.3 by Kent Gibson
Extended test cases to test bug 86451.
153
        ignores._set_user_ignores(
154
            ['foo', './bar', u'b\xe5z', 'dir1/', 'dir3\\'])
1836.1.14 by John Arbash Meinel
Adding a helper function that will only add patterns if they are missing.
155
2077.1.2 by Kent Gibson
Strip trailing slashes from ignore patterns (#4559).
156
        added = ignores.add_unique_user_ignores(
2298.8.3 by Kent Gibson
Extended test cases to test bug 86451.
157
            ['xxx', './bar', 'xxx', 'dir1/', 'dir2/', 'dir3\\'])
2077.1.2 by Kent Gibson
Strip trailing slashes from ignore patterns (#4559).
158
        self.assertEqual(['xxx', 'dir2'], added)
6619.3.12 by Jelmer Vernooij
Use 2to3 set_literal fixer.
159
        self.assertEqual({'foo', './bar', u'b\xe5z',
7143.15.2 by Jelmer Vernooij
Run autopep8.
160
                          'xxx', 'dir1', 'dir2', 'dir3'},
1836.1.14 by John Arbash Meinel
Adding a helper function that will only add patterns if they are missing.
161
                         ignores.get_user_ignores())
1836.1.28 by John Arbash Meinel
Add a function for adding runtime ignores.
162
163
164
class TestRuntimeIgnores(TestCase):
165
166
    def setUp(self):
6552.1.4 by Vincent Ladeuil
Remaining tests matching setup(self) that can be rewritten with super().
167
        super(TestRuntimeIgnores, self).setUp()
1836.1.28 by John Arbash Meinel
Add a function for adding runtime ignores.
168
169
        # For the purposes of these tests, we must have no
170
        # runtime ignores
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
171
        self.overrideAttr(ignores, '_runtime_ignores', set())
1836.1.28 by John Arbash Meinel
Add a function for adding runtime ignores.
172
173
    def test_add(self):
174
        """Test that we can add an entry to the list."""
175
        self.assertEqual(set(), ignores.get_runtime_ignores())
176
177
        ignores.add_runtime_ignores(['foo'])
6619.3.12 by Jelmer Vernooij
Use 2to3 set_literal fixer.
178
        self.assertEqual({'foo'}, ignores.get_runtime_ignores())
1836.1.28 by John Arbash Meinel
Add a function for adding runtime ignores.
179
180
    def test_add_duplicate(self):
181
        """Adding the same ignore twice shouldn't add a new entry."""
182
        ignores.add_runtime_ignores(['foo', 'bar'])
6619.3.12 by Jelmer Vernooij
Use 2to3 set_literal fixer.
183
        self.assertEqual({'foo', 'bar'}, ignores.get_runtime_ignores())
1836.1.28 by John Arbash Meinel
Add a function for adding runtime ignores.
184
185
        ignores.add_runtime_ignores(['bar'])
6619.3.12 by Jelmer Vernooij
Use 2to3 set_literal fixer.
186
        self.assertEqual({'foo', 'bar'}, ignores.get_runtime_ignores())
3528.2.1 by Jelmer Vernooij
Move functionality to add ignores to the ignore file into a separate function.
187
188
189
class TestTreeIgnores(TestCaseWithTransport):
6809.2.1 by Martin
Make most of test_ignores pass on Python 3
190
5195.2.1 by Gordon Tyler
Fixed tree_ignores_add_patterns to not duplicate existing patterns in the ignore file.
191
    def assertPatternsEquals(self, patterns):
6809.2.1 by Martin
Make most of test_ignores pass on Python 3
192
        with open(".bzrignore", "rb") as f:
193
            contents = f.read().decode("utf-8").splitlines()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
194
        self.assertEqual(sorted(patterns), sorted(contents))
3528.2.1 by Jelmer Vernooij
Move functionality to add ignores to the ignore file into a separate function.
195
196
    def test_new_file(self):
197
        tree = self.make_branch_and_tree(".")
6809.2.1 by Martin
Make most of test_ignores pass on Python 3
198
        ignores.tree_ignores_add_patterns(tree, [u"myentry"])
3528.2.1 by Jelmer Vernooij
Move functionality to add ignores to the ignore file into a separate function.
199
        self.assertTrue(tree.has_filename(".bzrignore"))
5195.2.1 by Gordon Tyler
Fixed tree_ignores_add_patterns to not duplicate existing patterns in the ignore file.
200
        self.assertPatternsEquals(["myentry"])
3528.2.1 by Jelmer Vernooij
Move functionality to add ignores to the ignore file into a separate function.
201
202
    def test_add_to_existing(self):
203
        tree = self.make_branch_and_tree(".")
6809.2.1 by Martin
Make most of test_ignores pass on Python 3
204
        self.build_tree_contents([('.bzrignore', b"myentry1\n")])
3528.2.1 by Jelmer Vernooij
Move functionality to add ignores to the ignore file into a separate function.
205
        tree.add([".bzrignore"])
6809.2.1 by Martin
Make most of test_ignores pass on Python 3
206
        ignores.tree_ignores_add_patterns(tree, [u"myentry2", u"foo"])
5195.2.1 by Gordon Tyler
Fixed tree_ignores_add_patterns to not duplicate existing patterns in the ignore file.
207
        self.assertPatternsEquals(["myentry1", "myentry2", "foo"])
3528.2.1 by Jelmer Vernooij
Move functionality to add ignores to the ignore file into a separate function.
208
209
    def test_adds_ending_newline(self):
210
        tree = self.make_branch_and_tree(".")
6809.2.1 by Martin
Make most of test_ignores pass on Python 3
211
        self.build_tree_contents([('.bzrignore', b"myentry1")])
3528.2.1 by Jelmer Vernooij
Move functionality to add ignores to the ignore file into a separate function.
212
        tree.add([".bzrignore"])
6809.2.1 by Martin
Make most of test_ignores pass on Python 3
213
        ignores.tree_ignores_add_patterns(tree, [u"myentry2"])
5195.2.1 by Gordon Tyler
Fixed tree_ignores_add_patterns to not duplicate existing patterns in the ignore file.
214
        self.assertPatternsEquals(["myentry1", "myentry2"])
6809.2.1 by Martin
Make most of test_ignores pass on Python 3
215
        with open(".bzrignore") as f:
216
            text = f.read()
217
        self.assertTrue(text.endswith(('\r\n', '\n', '\r')))
3528.2.1 by Jelmer Vernooij
Move functionality to add ignores to the ignore file into a separate function.
218
5195.2.1 by Gordon Tyler
Fixed tree_ignores_add_patterns to not duplicate existing patterns in the ignore file.
219
    def test_does_not_add_dupe(self):
220
        tree = self.make_branch_and_tree(".")
6809.2.1 by Martin
Make most of test_ignores pass on Python 3
221
        self.build_tree_contents([('.bzrignore', b"myentry\n")])
5195.2.1 by Gordon Tyler
Fixed tree_ignores_add_patterns to not duplicate existing patterns in the ignore file.
222
        tree.add([".bzrignore"])
6809.2.1 by Martin
Make most of test_ignores pass on Python 3
223
        ignores.tree_ignores_add_patterns(tree, [u"myentry"])
5195.2.1 by Gordon Tyler
Fixed tree_ignores_add_patterns to not duplicate existing patterns in the ignore file.
224
        self.assertPatternsEquals(["myentry"])
5195.2.8 by Gordon Tyler
Fixed preservation of existing line endings and added tests for that and Unicode handling.
225
226
    def test_non_ascii(self):
227
        tree = self.make_branch_and_tree(".")
228
        self.build_tree_contents([('.bzrignore',
229
                                   u"myentry\u1234\n".encode('utf-8'))])
230
        tree.add([".bzrignore"])
231
        ignores.tree_ignores_add_patterns(tree, [u"myentry\u5678"])
6809.2.1 by Martin
Make most of test_ignores pass on Python 3
232
        self.assertPatternsEquals([u"myentry\u1234", u"myentry\u5678"])
5195.2.8 by Gordon Tyler
Fixed preservation of existing line endings and added tests for that and Unicode handling.
233
234
    def test_crlf(self):
235
        tree = self.make_branch_and_tree(".")
6809.2.1 by Martin
Make most of test_ignores pass on Python 3
236
        self.build_tree_contents([('.bzrignore', b"myentry1\r\n")])
5195.2.8 by Gordon Tyler
Fixed preservation of existing line endings and added tests for that and Unicode handling.
237
        tree.add([".bzrignore"])
238
        ignores.tree_ignores_add_patterns(tree, ["myentry2", "foo"])
7067.12.1 by Jelmer Vernooij
Fix an ignore test. Make AtomicFile a contextmanager.
239
        with open('.bzrignore', 'rb') as f:
240
            self.assertEqual(f.read(), b'myentry1\r\nmyentry2\r\nfoo\r\n')
5195.2.8 by Gordon Tyler
Fixed preservation of existing line endings and added tests for that and Unicode handling.
241
        self.assertPatternsEquals(["myentry1", "myentry2", "foo"])