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