/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
4232.1.1 by Ian Clatworthy
Integrated EOL conversion support (Ian Clatworthy)
1
# Copyright (C) 2009 Canonical Ltd
4208.4.1 by Ian Clatworthy
eol conversion support
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
4232.1.1 by Ian Clatworthy
Integrated EOL conversion support (Ian Clatworthy)
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
4208.4.1 by Ian Clatworthy
eol conversion support
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
4232.1.1 by Ian Clatworthy
Integrated EOL conversion support (Ian Clatworthy)
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
4208.4.1 by Ian Clatworthy
eol conversion support
17
"""Tests for eol conversion."""
18
19
import sys
4393.3.3 by Ian Clatworthy
add round-trip checking to eol tests
20
from cStringIO import StringIO
4208.4.1 by Ian Clatworthy
eol conversion support
21
4393.3.3 by Ian Clatworthy
add round-trip checking to eol tests
22
from bzrlib import rules, status
4208.4.1 by Ian Clatworthy
eol conversion support
23
from bzrlib.tests import TestSkipped
24
from bzrlib.tests.workingtree_implementations import TestCaseWithWorkingTree
25
from bzrlib.workingtree import WorkingTree
26
27
28
# Sample files
4208.4.3 by Ian Clatworthy
rename dos to windows
29
_sample_text         = """hello\nworld\r\n"""
30
_sample_text_on_win  = """hello\r\nworld\r\n"""
31
_sample_text_on_unix = """hello\nworld\n"""
32
_sample_binary       = """hello\nworld\r\n\x00"""
4393.3.4 by Ian Clatworthy
add eol roundtripping tests
33
_sample_clean_lf     = _sample_text_on_unix
34
_sample_clean_crlf   = _sample_text_on_win
35
36
37
# Lists of formats for each storage policy
38
_LF_IN_REPO = ['native', 'lf', 'crlf']
39
_CRLF_IN_REPO = [ '%s-with-crlf-in-repo' % (f,) for f in _LF_IN_REPO]
4208.4.1 by Ian Clatworthy
eol conversion support
40
41
42
class TestEolConversion(TestCaseWithWorkingTree):
43
44
    def setUp(self):
45
        # formats that don't support content filtering can skip these tests
46
        fmt = self.workingtree_format
47
        f = getattr(fmt, 'supports_content_filtering')
48
        if f is None:
49
            raise TestSkipped("format %s doesn't declare whether it "
50
                "supports content filtering, assuming not" % fmt)
51
        if not f():
52
            raise TestSkipped("format %s doesn't support content filtering"
53
                % fmt)
54
        TestCaseWithWorkingTree.setUp(self)
55
56
    def patch_rules_searcher(self, eol):
57
        """Patch in a custom rules searcher with a given eol setting."""
58
        if eol is None:
59
            WorkingTree._get_rules_searcher = self.real_rules_searcher
60
        else:
61
            def custom_eol_rules_searcher(tree, default_searcher):
62
                return rules._IniBasedRulesSearcher([
63
                    '[name *]\n',
64
                    'eol=%s\n' % eol,
65
                    ])
66
            WorkingTree._get_rules_searcher = custom_eol_rules_searcher
67
68
    def prepare_tree(self, content, eol=None):
69
        """Prepare a working tree and commit some content."""
70
        def restore_real_rules_searcher():
71
            WorkingTree._get_rules_searcher = self.real_rules_searcher
72
        self.real_rules_searcher = WorkingTree._get_rules_searcher
73
        self.addCleanup(restore_real_rules_searcher)
74
        self.patch_rules_searcher(eol)
75
        t = self.make_branch_and_tree('tree1')
76
        self.build_tree_contents([('tree1/file1', content)])
77
        t.add('file1', 'file1-id')
78
        t.commit("add file1")
79
        basis = t.basis_tree()
80
        basis.lock_read()
81
        self.addCleanup(basis.unlock)
82
        return t, basis
83
4208.4.5 by Ian Clatworthy
add lf-always and crlf-always
84
    def assertNewContentForSetting(self, wt, eol, expected_unix,
4393.3.3 by Ian Clatworthy
add round-trip checking to eol tests
85
        expected_win, roundtrip):
86
        """Clone a working tree and check the convenience content.
87
        
88
        If roundtrip is True, status and commit should see no changes.
89
        """
4208.4.5 by Ian Clatworthy
add lf-always and crlf-always
90
        if expected_win is None:
91
            expected_win = expected_unix
4208.4.1 by Ian Clatworthy
eol conversion support
92
        self.patch_rules_searcher(eol)
93
        wt2 = wt.bzrdir.sprout('tree-%s' % eol).open_workingtree()
94
        # To see exactly what got written to disk, we need an unfiltered read
95
        content = wt2.get_file('file1-id', filtered=False).read()
96
        if sys.platform == 'win32':
4208.4.3 by Ian Clatworthy
rename dos to windows
97
            self.assertEqual(expected_win, content)
4208.4.1 by Ian Clatworthy
eol conversion support
98
        else:
99
            self.assertEqual(expected_unix, content)
4393.3.3 by Ian Clatworthy
add round-trip checking to eol tests
100
        # Confirm that status thinks nothing has changed if the text roundtrips
101
        if roundtrip:
102
            status_io = StringIO()
103
            status.show_tree_status(wt2, to_file=status_io)
104
            self.assertEqual('', status_io.getvalue())
4208.4.1 by Ian Clatworthy
eol conversion support
105
106
    def assertContent(self, wt, basis, expected_raw, expected_unix,
4393.3.4 by Ian Clatworthy
add eol roundtripping tests
107
        expected_win, roundtrip_to=None):
108
        """Check the committed content and content in cloned trees.
109
        
110
        :param roundtrip_to: the set of formats (excluding exact) we
111
          can round-trip to or None for all
112
        """
4208.4.1 by Ian Clatworthy
eol conversion support
113
        basis_content = basis.get_file('file1-id').read()
114
        self.assertEqual(expected_raw, basis_content)
4393.3.4 by Ian Clatworthy
add eol roundtripping tests
115
4393.3.3 by Ian Clatworthy
add round-trip checking to eol tests
116
        # No setting and exact should always roundtrip
117
        self.assertNewContentForSetting(wt, None,
118
            expected_raw, expected_raw, roundtrip=True)
119
        self.assertNewContentForSetting(wt, 'exact',
120
            expected_raw, expected_raw, roundtrip=True)
4393.3.4 by Ian Clatworthy
add eol roundtripping tests
121
122
        # Roundtripping is otherwise dependent on whether the original
123
        # text is clean - mixed line endings will prevent it. It also
124
        # depends on whether the format in the repository is being changed.
125
        if roundtrip_to is None:
126
            roundtrip_to = _LF_IN_REPO + _CRLF_IN_REPO
4208.4.7 by Ian Clatworthy
tweak eol names based on mailing list discussion
127
        self.assertNewContentForSetting(wt, 'native',
4393.3.4 by Ian Clatworthy
add eol roundtripping tests
128
            expected_unix, expected_win, 'native' in roundtrip_to)
4208.4.7 by Ian Clatworthy
tweak eol names based on mailing list discussion
129
        self.assertNewContentForSetting(wt, 'lf',
4393.3.4 by Ian Clatworthy
add eol roundtripping tests
130
            expected_unix, expected_unix, 'lf' in roundtrip_to)
4208.4.7 by Ian Clatworthy
tweak eol names based on mailing list discussion
131
        self.assertNewContentForSetting(wt, 'crlf',
4393.3.4 by Ian Clatworthy
add eol roundtripping tests
132
            expected_win, expected_win, 'crlf' in roundtrip_to)
4208.4.7 by Ian Clatworthy
tweak eol names based on mailing list discussion
133
        self.assertNewContentForSetting(wt, 'native-with-crlf-in-repo',
4393.3.4 by Ian Clatworthy
add eol roundtripping tests
134
            expected_unix, expected_win,
135
            'native-with-crlf-in-repo' in roundtrip_to)
4208.4.7 by Ian Clatworthy
tweak eol names based on mailing list discussion
136
        self.assertNewContentForSetting(wt, 'lf-with-crlf-in-repo',
4393.3.4 by Ian Clatworthy
add eol roundtripping tests
137
            expected_unix, expected_unix,
138
            'lf-with-crlf-in-repo' in roundtrip_to)
4208.4.7 by Ian Clatworthy
tweak eol names based on mailing list discussion
139
        self.assertNewContentForSetting(wt, 'crlf-with-crlf-in-repo',
4393.3.4 by Ian Clatworthy
add eol roundtripping tests
140
            expected_win, expected_win,
141
            'crlf-with-crlf-in-repo' in roundtrip_to)
142
143
    # Test binary files. These always roundtrip.
144
145
    def test_eol_no_rules_binary(self):
146
        wt, basis = self.prepare_tree(_sample_binary)
147
        self.assertContent(wt, basis, _sample_binary, _sample_binary,
148
            _sample_binary)
149
150
    def test_eol_exact_binary(self):
151
        wt, basis = self.prepare_tree(_sample_binary, eol='exact')
152
        self.assertContent(wt, basis, _sample_binary, _sample_binary,
153
            _sample_binary)
4208.4.7 by Ian Clatworthy
tweak eol names based on mailing list discussion
154
155
    def test_eol_native_binary(self):
156
        wt, basis = self.prepare_tree(_sample_binary, eol='native')
157
        self.assertContent(wt, basis, _sample_binary, _sample_binary,
158
            _sample_binary)
159
4208.4.4 by Ian Clatworthy
unix/window -> cr/crlf based on mailing list feedback
160
    def test_eol_lf_binary(self):
161
        wt, basis = self.prepare_tree(_sample_binary, eol='lf')
4208.4.3 by Ian Clatworthy
rename dos to windows
162
        self.assertContent(wt, basis, _sample_binary, _sample_binary,
163
            _sample_binary)
164
4208.4.4 by Ian Clatworthy
unix/window -> cr/crlf based on mailing list feedback
165
    def test_eol_crlf_binary(self):
166
        wt, basis = self.prepare_tree(_sample_binary, eol='crlf')
4208.4.3 by Ian Clatworthy
rename dos to windows
167
        self.assertContent(wt, basis, _sample_binary, _sample_binary,
168
            _sample_binary)
4208.4.1 by Ian Clatworthy
eol conversion support
169
4208.4.7 by Ian Clatworthy
tweak eol names based on mailing list discussion
170
    def test_eol_native_with_crlf_in_repo_binary(self):
171
        wt, basis = self.prepare_tree(_sample_binary,
172
            eol='native-with-crlf-in-repo')
173
        self.assertContent(wt, basis, _sample_binary, _sample_binary,
174
            _sample_binary)
175
176
    def test_eol_lf_with_crlf_in_repo_binary(self):
4393.3.4 by Ian Clatworthy
add eol roundtripping tests
177
        wt, basis = self.prepare_tree(_sample_binary,
178
            eol='lf-with-crlf-in-repo')
4208.4.7 by Ian Clatworthy
tweak eol names based on mailing list discussion
179
        self.assertContent(wt, basis, _sample_binary, _sample_binary,
180
            _sample_binary)
181
182
    def test_eol_crlf_with_crlf_in_repo_binary(self):
4393.3.4 by Ian Clatworthy
add eol roundtripping tests
183
        wt, basis = self.prepare_tree(_sample_binary,
184
            eol='crlf-with-crlf-in-repo')
4208.4.5 by Ian Clatworthy
add lf-always and crlf-always
185
        self.assertContent(wt, basis, _sample_binary, _sample_binary,
186
            _sample_binary)
187
4393.3.4 by Ian Clatworthy
add eol roundtripping tests
188
    # Test text with mixed line endings ("dirty text").
189
    # This doesn't roundtrip so status always thinks something has changed.
190
191
    def test_eol_no_rules_dirty(self):
192
        wt, basis = self.prepare_tree(_sample_text)
193
        self.assertContent(wt, basis, _sample_text,
194
            _sample_text_on_unix, _sample_text_on_win, roundtrip_to=[])
195
196
    def test_eol_exact_dirty(self):
4208.4.3 by Ian Clatworthy
rename dos to windows
197
        wt, basis = self.prepare_tree(_sample_text, eol='exact')
198
        self.assertContent(wt, basis, _sample_text,
4393.3.4 by Ian Clatworthy
add eol roundtripping tests
199
            _sample_text_on_unix, _sample_text_on_win, roundtrip_to=[])
200
201
    def test_eol_native_dirty(self):
202
        wt, basis = self.prepare_tree(_sample_text, eol='native')
203
        self.assertContent(wt, basis, _sample_text_on_unix,
204
            _sample_text_on_unix, _sample_text_on_win, roundtrip_to=[])
205
206
    def test_eol_lf_dirty(self):
207
        wt, basis = self.prepare_tree(_sample_text, eol='lf')
208
        self.assertContent(wt, basis, _sample_text_on_unix,
209
            _sample_text_on_unix, _sample_text_on_win, roundtrip_to=[])
210
211
    def test_eol_crlf_dirty(self):
212
        wt, basis = self.prepare_tree(_sample_text, eol='crlf')
213
        self.assertContent(wt, basis, _sample_text_on_unix,
214
            _sample_text_on_unix, _sample_text_on_win, roundtrip_to=[])
215
216
    def test_eol_native_with_crlf_in_repo_dirty(self):
217
        wt, basis = self.prepare_tree(_sample_text,
218
            eol='native-with-crlf-in-repo')
219
        self.assertContent(wt, basis, _sample_text_on_win,
220
            _sample_text_on_unix, _sample_text_on_win, roundtrip_to=[])
221
222
    def test_eol_lf_with_crlf_in_repo_dirty(self):
223
        wt, basis = self.prepare_tree(_sample_text,
224
            eol='lf-with-crlf-in-repo')
225
        self.assertContent(wt, basis, _sample_text_on_win,
226
            _sample_text_on_unix, _sample_text_on_win, roundtrip_to=[])
227
228
    def test_eol_crlf_with_crlf_in_repo_dirty(self):
229
        wt, basis = self.prepare_tree(_sample_text,
230
            eol='crlf-with-crlf-in-repo')
231
        self.assertContent(wt, basis, _sample_text_on_win,
232
            _sample_text_on_unix, _sample_text_on_win, roundtrip_to=[])
233
234
    # Test text with clean line endings, either always lf or always crlf.
235
    # This selectively roundtrips (based on what's stored in the repo).
236
237
    def test_eol_no_rules_clean_lf(self):
238
        wt, basis = self.prepare_tree(_sample_clean_lf)
239
        self.assertContent(wt, basis, _sample_clean_lf,
240
            _sample_text_on_unix, _sample_text_on_win,
241
            roundtrip_to=_LF_IN_REPO)
242
243
    def test_eol_no_rules_clean_crlf(self):
244
        wt, basis = self.prepare_tree(_sample_clean_crlf)
245
        self.assertContent(wt, basis, _sample_clean_crlf,
246
            _sample_text_on_unix, _sample_text_on_win,
247
            roundtrip_to=_CRLF_IN_REPO)
248
249
    def test_eol_exact_clean_lf(self):
250
        wt, basis = self.prepare_tree(_sample_clean_lf, eol='exact')
251
        self.assertContent(wt, basis, _sample_clean_lf,
252
            _sample_text_on_unix, _sample_text_on_win,
253
            roundtrip_to=_LF_IN_REPO)
254
255
    def test_eol_exact_clean_crlf(self):
256
        wt, basis = self.prepare_tree(_sample_clean_crlf, eol='exact')
257
        self.assertContent(wt, basis, _sample_clean_crlf,
258
            _sample_text_on_unix, _sample_text_on_win,
259
            roundtrip_to=_CRLF_IN_REPO)
260
261
    def test_eol_native_clean_lf(self):
262
        wt, basis = self.prepare_tree(_sample_clean_lf, eol='native')
263
        self.assertContent(wt, basis, _sample_text_on_unix,
264
            _sample_text_on_unix, _sample_text_on_win,
265
            roundtrip_to=_LF_IN_REPO)
266
267
    def test_eol_native_clean_crlf(self):
268
        wt, basis = self.prepare_tree(_sample_clean_crlf, eol='native')
269
        self.assertContent(wt, basis, _sample_text_on_unix,
270
            _sample_text_on_unix, _sample_text_on_win,
271
            roundtrip_to=_LF_IN_REPO)
272
273
    def test_eol_lf_clean_lf(self):
274
        wt, basis = self.prepare_tree(_sample_clean_lf, eol='lf')
275
        self.assertContent(wt, basis, _sample_text_on_unix,
276
            _sample_text_on_unix, _sample_text_on_win,
277
            roundtrip_to=_LF_IN_REPO)
278
279
    def test_eol_lf_clean_crlf(self):
280
        wt, basis = self.prepare_tree(_sample_clean_crlf, eol='lf')
281
        self.assertContent(wt, basis, _sample_text_on_unix,
282
            _sample_text_on_unix, _sample_text_on_win,
283
            roundtrip_to=_LF_IN_REPO)
284
285
    def test_eol_crlf_clean_lf(self):
286
        wt, basis = self.prepare_tree(_sample_clean_lf, eol='crlf')
287
        self.assertContent(wt, basis, _sample_text_on_unix,
288
            _sample_text_on_unix, _sample_text_on_win,
289
            roundtrip_to=_LF_IN_REPO)
290
291
    def test_eol_crlf_clean_crlf(self):
292
        wt, basis = self.prepare_tree(_sample_clean_crlf, eol='crlf')
293
        self.assertContent(wt, basis, _sample_text_on_unix,
294
            _sample_text_on_unix, _sample_text_on_win,
295
            roundtrip_to=_LF_IN_REPO)
296
297
    def test_eol_native_with_crlf_in_repo_clean_lf(self):
298
        wt, basis = self.prepare_tree(_sample_clean_lf,
299
            eol='native-with-crlf-in-repo')
300
        self.assertContent(wt, basis, _sample_text_on_win,
301
            _sample_text_on_unix, _sample_text_on_win,
302
            roundtrip_to=_CRLF_IN_REPO)
303
304
    def test_eol_native_with_crlf_in_repo_clean_crlf(self):
305
        wt, basis = self.prepare_tree(_sample_clean_crlf,
306
            eol='native-with-crlf-in-repo')
307
        self.assertContent(wt, basis, _sample_text_on_win,
308
            _sample_text_on_unix, _sample_text_on_win,
309
            roundtrip_to=_CRLF_IN_REPO)
310
311
    def test_eol_lf_with_crlf_in_repo_clean_lf(self):
312
        wt, basis = self.prepare_tree(_sample_clean_lf,
313
            eol='lf-with-crlf-in-repo')
314
        self.assertContent(wt, basis, _sample_text_on_win,
315
            _sample_text_on_unix, _sample_text_on_win,
316
            roundtrip_to=_CRLF_IN_REPO)
317
318
    def test_eol_lf_with_crlf_in_repo_clean_crlf(self):
319
        wt, basis = self.prepare_tree(_sample_clean_crlf,
320
            eol='lf-with-crlf-in-repo')
321
        self.assertContent(wt, basis, _sample_text_on_win,
322
            _sample_text_on_unix, _sample_text_on_win,
323
            roundtrip_to=_CRLF_IN_REPO)
324
325
    def test_eol_crlf_with_crlf_in_repo_clean_lf(self):
326
        wt, basis = self.prepare_tree(_sample_clean_lf,
327
            eol='crlf-with-crlf-in-repo')
328
        self.assertContent(wt, basis, _sample_text_on_win,
329
            _sample_text_on_unix, _sample_text_on_win,
330
            roundtrip_to=_CRLF_IN_REPO)
331
332
    def test_eol_crlf_with_crlf_in_repo_clean_crlf(self):
333
        wt, basis = self.prepare_tree(_sample_clean_crlf,
334
            eol='crlf-with-crlf-in-repo')
335
        self.assertContent(wt, basis, _sample_text_on_win,
336
            _sample_text_on_unix, _sample_text_on_win,
337
            roundtrip_to=_CRLF_IN_REPO)