/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.39 by David Allouche
Black-box text for "bzr log" in a git tree. Further simplification of GitRevisionTree.
1
# Copyright (C) 2007 David Allouche <ddaa@ddaa.net>
0.358.2 by Jelmer Vernooij
Refresh copyright headers, add my email.
2
# Copyright (C) 2007-2018 Jelmer Vernooij <jelmer@jelmer.uk>
0.200.39 by David Allouche
Black-box text for "bzr log" in a git tree. Further simplification of GitRevisionTree.
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
0.358.1 by Jelmer Vernooij
Fix FSF address.
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0.200.39 by David Allouche
Black-box text for "bzr log" in a git tree. Further simplification of GitRevisionTree.
17
18
"""Black-box tests for bzr-git."""
19
0.200.444 by Jelmer Vernooij
Stop running git in blackbox tests.
20
from dulwich.repo import (
21
    Repo as GitRepo,
22
    )
23
0.200.89 by Jelmer Vernooij
Support sprouting branches.
24
import os
25
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
26
from ...controldir import (
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
27
    ControlDir,
0.200.769 by Jelmer Vernooij
Cope with open_branch() actually checking whether there is a branch present.
28
    )
29
6986.2.1 by Jelmer Vernooij
Move breezy.plugins.git to breezy.git.
30
from ...tests.blackbox import ExternalBase
7143.18.1 by Jelmer Vernooij
Fix 'bzr switch' in git repositories.
31
from ...workingtree import WorkingTree
0.200.39 by David Allouche
Black-box text for "bzr log" in a git tree. Further simplification of GitRevisionTree.
32
0.200.1642 by Jelmer Vernooij
Use relative imports in tests.
33
from .. import (
0.200.39 by David Allouche
Black-box text for "bzr log" in a git tree. Further simplification of GitRevisionTree.
34
    tests,
35
    )
7290.26.1 by Jelmer Vernooij
Fix switching in git repositories.
36
from ...tests.script import TestCaseWithTransportAndScript
7211.8.1 by Jelmer Vernooij
Fix stats in Python3 git repositories.
37
from ...tests.features import PluginLoadedFeature
0.200.39 by David Allouche
Black-box text for "bzr log" in a git tree. Further simplification of GitRevisionTree.
38
39
40
class TestGitBlackBox(ExternalBase):
41
0.200.76 by Jelmer Vernooij
Add blackbox test for info -v
42
    def simple_commit(self):
43
        # Create a git repository with a revision.
0.200.444 by Jelmer Vernooij
Stop running git in blackbox tests.
44
        repo = GitRepo.init(self.test_dir)
0.200.76 by Jelmer Vernooij
Add blackbox test for info -v
45
        builder = tests.GitBranchBuilder()
7018.3.2 by Jelmer Vernooij
Fix some git tests.
46
        builder.set_file('a', b'text for a\n', False)
47
        r1 = builder.commit(b'Joe Foo <joe@foo.com>', u'<The commit message>')
0.200.444 by Jelmer Vernooij
Stop running git in blackbox tests.
48
        return repo, builder.finish()[r1]
0.200.76 by Jelmer Vernooij
Add blackbox test for info -v
49
7473.1.1 by Jelmer Vernooij
Ignore --file-ids-from for trees that do not support file ids.
50
    def test_add(self):
51
        r = GitRepo.init(self.test_dir)
52
        dir = ControlDir.open(self.test_dir)
53
        dir.create_branch()
54
        self.build_tree(['a', 'b'])
55
        output, error = self.run_bzr(['add', 'a'])
56
        self.assertEqual('adding a\n', output)
57
        self.assertEqual('', error)
58
        output, error = self.run_bzr(
59
            ['add', '--file-ids-from=../othertree', 'b'])
60
        self.assertEqual('adding b\n', output)
61
        self.assertEqual(
62
            'Ignoring --file-ids-from, since the tree does not support '
63
            'setting file ids.\n', error)
64
0.200.294 by Jelmer Vernooij
Add test for nick.
65
    def test_nick(self):
0.200.1559 by Jelmer Vernooij
Fix compatibility with bzr 2.5.
66
        r = GitRepo.init(self.test_dir)
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
67
        dir = ControlDir.open(self.test_dir)
0.200.769 by Jelmer Vernooij
Cope with open_branch() actually checking whether there is a branch present.
68
        dir.create_branch()
0.200.294 by Jelmer Vernooij
Add test for nick.
69
        output, error = self.run_bzr(['nick'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
70
        self.assertEqual("master\n", output)
0.200.294 by Jelmer Vernooij
Add test for nick.
71
0.327.1 by Jelmer Vernooij
Add test for branches command.
72
    def test_branches(self):
73
        self.simple_commit()
74
        output, error = self.run_bzr(['branches'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
75
        self.assertEqual("* master\n", output)
0.327.1 by Jelmer Vernooij
Add test for branches command.
76
0.200.68 by Jelmer Vernooij
Add blackbox test for info.
77
    def test_info(self):
0.200.76 by Jelmer Vernooij
Add blackbox test for info -v
78
        self.simple_commit()
0.200.68 by Jelmer Vernooij
Add blackbox test for info.
79
        output, error = self.run_bzr(['info'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
80
        self.assertEqual(error, '')
7211.9.1 by Jelmer Vernooij
Report colocated branch name in 'brz info'.
81
        self.assertEqual(
7211.9.2 by Jelmer Vernooij
Fix formatting.
82
            output,
83
            'Standalone tree (format: git)\n'
84
            'Location:\n'
85
            '            light checkout root: .\n'
86
            '  checkout of co-located branch: master\n')
0.200.68 by Jelmer Vernooij
Add blackbox test for info.
87
7199.4.1 by Jelmer Vernooij
Fix 'brz ignore' in Git working trees.
88
    def test_ignore(self):
89
        self.simple_commit()
90
        output, error = self.run_bzr(['ignore', 'foo'])
91
        self.assertEqual(error, '')
92
        self.assertEqual(output, '')
93
        self.assertFileEqual("foo\n", ".gitignore")
94
7290.7.1 by Jelmer Vernooij
Print proper error when running `brz cat-revision` on Git repositories.
95
    def test_cat_revision(self):
96
        self.simple_commit()
97
        output, error = self.run_bzr(['cat-revision', '-r-1'], retcode=3)
98
        self.assertContainsRe(
99
            error,
100
            'brz: ERROR: Repository .* does not support access to raw '
101
            'revision texts')
102
        self.assertEqual(output, '')
103
0.200.89 by Jelmer Vernooij
Support sprouting branches.
104
    def test_branch(self):
105
        os.mkdir("gitbranch")
0.200.444 by Jelmer Vernooij
Stop running git in blackbox tests.
106
        GitRepo.init(os.path.join(self.test_dir, "gitbranch"))
107
        os.chdir('gitbranch')
0.200.89 by Jelmer Vernooij
Support sprouting branches.
108
        builder = tests.GitBranchBuilder()
6964.2.1 by Jelmer Vernooij
Initial work to support brz-git on python3.
109
        builder.set_file(b'a', b'text for a\n', False)
110
        builder.commit(b'Joe Foo <joe@foo.com>', b'<The commit message>')
0.200.89 by Jelmer Vernooij
Support sprouting branches.
111
        builder.finish()
0.200.444 by Jelmer Vernooij
Stop running git in blackbox tests.
112
        os.chdir('..')
0.200.89 by Jelmer Vernooij
Support sprouting branches.
113
114
        output, error = self.run_bzr(['branch', 'gitbranch', 'bzrbranch'])
0.200.1382 by Jelmer Vernooij
Fix test after i18n fixes in bzr.dev.
115
        self.assertTrue(
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
116
            (error == 'Branched 1 revision(s).\n') or
117
            (error == 'Branched 1 revision.\n'),
0.200.1382 by Jelmer Vernooij
Fix test after i18n fixes in bzr.dev.
118
            error)
0.200.89 by Jelmer Vernooij
Support sprouting branches.
119
0.200.1151 by Jelmer Vernooij
Update NEWS, add test for bug fixed earlier.
120
    def test_checkout(self):
121
        os.mkdir("gitbranch")
122
        GitRepo.init(os.path.join(self.test_dir, "gitbranch"))
123
        os.chdir('gitbranch')
124
        builder = tests.GitBranchBuilder()
6964.2.1 by Jelmer Vernooij
Initial work to support brz-git on python3.
125
        builder.set_file(b'a', b'text for a\n', False)
126
        builder.commit(b'Joe Foo <joe@foo.com>', b'<The commit message>')
0.200.1151 by Jelmer Vernooij
Update NEWS, add test for bug fixed earlier.
127
        builder.finish()
128
        os.chdir('..')
129
130
        output, error = self.run_bzr(['checkout', 'gitbranch', 'bzrbranch'])
0.375.1 by Jelmer Vernooij
Fix remote tests, warn when fetching git->bzr and bzr->git.
131
        self.assertEqual(error,
7143.15.2 by Jelmer Vernooij
Run autopep8.
132
                         'Fetching from Git to Bazaar repository. '
133
                         'For better performance, fetch into a Git repository.\n')
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
134
        self.assertEqual(output, '')
0.200.1151 by Jelmer Vernooij
Update NEWS, add test for bug fixed earlier.
135
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
136
    def test_branch_ls(self):
0.200.78 by Jelmer Vernooij
Add blackbox test for ls.
137
        self.simple_commit()
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
138
        output, error = self.run_bzr(['ls', '-r-1'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
139
        self.assertEqual(error, '')
140
        self.assertEqual(output, "a\n")
0.200.78 by Jelmer Vernooij
Add blackbox test for ls.
141
0.200.108 by Jelmer Vernooij
Support bzr init --git.
142
    def test_init(self):
0.200.1653 by Jelmer Vernooij
--git is now --format=git.
143
        self.run_bzr("init --format=git repo")
0.200.108 by Jelmer Vernooij
Support bzr init --git.
144
0.200.76 by Jelmer Vernooij
Add blackbox test for info -v
145
    def test_info_verbose(self):
146
        self.simple_commit()
147
148
        output, error = self.run_bzr(['info', '-v'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
149
        self.assertEqual(error, '')
150
        self.assertTrue("Standalone tree (format: git)" in output)
151
        self.assertTrue("control: Local Git Repository" in output)
152
        self.assertTrue("branch: Local Git Branch" in output)
153
        self.assertTrue("repository: Git Repository" in output)
0.200.76 by Jelmer Vernooij
Add blackbox test for info -v
154
0.200.1325 by Jelmer Vernooij
More test fixes.
155
    def test_push_roundtripping(self):
0.267.1 by Martin
Don't raise the deprecated KnownFailure from tests
156
        self.knownFailure("roundtripping is not yet supported")
0.200.1325 by Jelmer Vernooij
More test fixes.
157
        self.with_roundtripping()
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
158
        os.mkdir("bla")
0.200.444 by Jelmer Vernooij
Stop running git in blackbox tests.
159
        GitRepo.init(os.path.join(self.test_dir, "bla"))
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
160
        self.run_bzr(['init', 'foo'])
161
        self.run_bzr(['commit', '--unchanged', '-m', 'bla', 'foo'])
0.200.1156 by Jelmer Vernooij
Disable push.
162
        # when roundtripping is supported
0.252.12 by Jelmer Vernooij
Fix push blackbox test.
163
        output, error = self.run_bzr(['push', '-d', 'foo', 'bla'])
7018.3.7 by Jelmer Vernooij
Fix remaining git tests.
164
        self.assertEqual(b"", output)
165
        self.assertTrue(error.endswith(b"Created new branch.\n"))
0.200.291 by Jelmer Vernooij
Print proper error about not supporting push.
166
7339.1.6 by Jelmer Vernooij
Also support revno-less push/pull operations.
167
    def test_push_without_calculate_revnos(self):
168
        self.run_bzr(['init', '--git', 'bla'])
169
        self.run_bzr(['init', '--git', 'foo'])
170
        self.run_bzr(['commit', '--unchanged', '-m', 'bla', 'foo'])
171
        output, error = self.run_bzr(
172
            ['push', '-Ocalculate_revnos=no', '-d', 'foo', 'bla'])
173
        self.assertEqual("", output)
174
        self.assertContainsRe(
175
            error,
7339.1.10 by Jelmer Vernooij
Fix test.
176
            'Pushed up to revision id git(.*).\n')
7339.1.6 by Jelmer Vernooij
Also support revno-less push/pull operations.
177
7490.139.1 by Jelmer Vernooij
add test for git file merge.
178
    def test_merge(self):
179
        self.run_bzr(['init', '--git', 'orig'])
180
        self.build_tree_contents([('orig/a', 'orig contents\n')])
181
        self.run_bzr(['add', 'orig/a'])
182
        self.run_bzr(['commit', '-m', 'add orig', 'orig'])
183
        self.run_bzr(['clone', 'orig', 'other'])
184
        self.build_tree_contents([('other/a', 'new contents\n')])
185
        self.run_bzr(['commit', '-m', 'modify', 'other'])
186
        self.build_tree_contents([('orig/b', 'more\n')])
187
        self.run_bzr(['add', 'orig/b'])
188
        self.build_tree_contents([('orig/a', 'new contents\n')])
189
        self.run_bzr(['commit', '-m', 'more', 'orig'])
190
        self.run_bzr(['merge', '-d', 'orig', 'other'])
191
7296.4.1 by Jelmer Vernooij
Fix pushing non-mainline revisions from bzr to git.
192
    def test_push_lossy_non_mainline(self):
193
        self.run_bzr(['init', '--git', 'bla'])
194
        self.run_bzr(['init', 'foo'])
195
        self.run_bzr(['commit', '--unchanged', '-m', 'bla', 'foo'])
196
        self.run_bzr(['branch', 'foo', 'foo1'])
197
        self.run_bzr(['commit', '--unchanged', '-m', 'bla', 'foo1'])
198
        self.run_bzr(['commit', '--unchanged', '-m', 'bla', 'foo'])
199
        self.run_bzr(['merge', '-d', 'foo', 'foo1'])
200
        self.run_bzr(['commit', '--unchanged', '-m', 'merge', 'foo'])
201
        output, error = self.run_bzr(['push', '--lossy', '-r1.1.1', '-d', 'foo', 'bla'])
7296.4.2 by Jelmer Vernooij
Fix test.
202
        self.assertEqual("", output)
7296.4.1 by Jelmer Vernooij
Fix pushing non-mainline revisions from bzr to git.
203
        self.assertEqual(
7296.4.2 by Jelmer Vernooij
Fix test.
204
            'Pushing from a Bazaar to a Git repository. For better '
205
            'performance, push into a Bazaar repository.\n'
7350.1.3 by Vincent Ladeuil
Fix test_push_lossy_non_mainline failure.
206
            'All changes applied successfully.\n'
7296.4.2 by Jelmer Vernooij
Fix test.
207
            'Pushed up to revision 2.\n', error)
7296.4.1 by Jelmer Vernooij
Fix pushing non-mainline revisions from bzr to git.
208
7446.1.2 by Jelmer Vernooij
Fix working tree update of incremental lossy push.
209
    def test_push_lossy_non_mainline_incremental(self):
210
        self.run_bzr(['init', '--git', 'bla'])
211
        self.run_bzr(['init', 'foo'])
212
        self.run_bzr(['commit', '--unchanged', '-m', 'bla', 'foo'])
213
        self.run_bzr(['commit', '--unchanged', '-m', 'bla', 'foo'])
214
        output, error = self.run_bzr(['push', '--lossy', '-d', 'foo', 'bla'])
215
        self.assertEqual("", output)
216
        self.assertEqual(
217
            'Pushing from a Bazaar to a Git repository. For better '
218
            'performance, push into a Bazaar repository.\n'
219
            'All changes applied successfully.\n'
220
            'Pushed up to revision 2.\n', error)
221
        self.run_bzr(['commit', '--unchanged', '-m', 'bla', 'foo'])
222
        output, error = self.run_bzr(['push', '--lossy', '-d', 'foo', 'bla'])
223
        self.assertEqual("", output)
224
        self.assertEqual(
225
            'Pushing from a Bazaar to a Git repository. For better '
226
            'performance, push into a Bazaar repository.\n'
227
            'All changes applied successfully.\n'
228
            'Pushed up to revision 3.\n', error)
229
0.200.39 by David Allouche
Black-box text for "bzr log" in a git tree. Further simplification of GitRevisionTree.
230
    def test_log(self):
231
        # Smoke test for "bzr log" in a git repository.
0.200.76 by Jelmer Vernooij
Add blackbox test for info -v
232
        self.simple_commit()
0.200.39 by David Allouche
Black-box text for "bzr log" in a git tree. Further simplification of GitRevisionTree.
233
234
        # Check that bzr log does not fail and includes the revision.
235
        output, error = self.run_bzr(['log'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
236
        self.assertEqual(error, '')
0.200.39 by David Allouche
Black-box text for "bzr log" in a git tree. Further simplification of GitRevisionTree.
237
        self.assertTrue(
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
238
            '<The commit message>' in output,
239
            "Commit message was not found in output:\n%s" % (output,))
0.200.80 by Jelmer Vernooij
Add blackbox test for bzr log -v.
240
241
    def test_log_verbose(self):
242
        # Smoke test for "bzr log -v" in a git repository.
243
        self.simple_commit()
244
245
        # Check that bzr log does not fail and includes the revision.
246
        output, error = self.run_bzr(['log', '-v'])
7339.1.3 by Jelmer Vernooij
Support calculate_revnos option.
247
        self.assertContainsRe(output, 'revno: 1')
248
249
    def test_log_without_revno(self):
250
        # Smoke test for "bzr log -v" in a git repository.
251
        self.simple_commit()
252
253
        # Check that bzr log does not fail and includes the revision.
254
        output, error = self.run_bzr(['log', '-Ocalculate_revnos=no'])
255
        self.assertNotContainsRe(output, 'revno: 1')
7018.3.7 by Jelmer Vernooij
Fix remaining git tests.
256
7339.1.4 by Jelmer Vernooij
Only display revnos in commit if calculate_revnos is enabled.
257
    def test_commit_without_revno(self):
258
        repo = GitRepo.init(self.test_dir)
259
        output, error = self.run_bzr(
260
            ['commit', '-Ocalculate_revnos=yes', '--unchanged', '-m', 'one'])
261
        self.assertContainsRe(error, 'Committed revision 1.')
262
        output, error = self.run_bzr(
263
            ['commit', '-Ocalculate_revnos=no', '--unchanged', '-m', 'two'])
264
        self.assertNotContainsRe(error, 'Committed revision 2.')
265
        self.assertContainsRe(error, 'Committed revid .*.')
266
7290.36.1 by Jelmer Vernooij
Fix filegraph operations on Git.
267
    def test_log_file(self):
268
        # Smoke test for "bzr log" in a git repository.
269
        repo = GitRepo.init(self.test_dir)
270
        builder = tests.GitBranchBuilder()
271
        builder.set_file('a', b'text for a\n', False)
272
        r1 = builder.commit(b'Joe Foo <joe@foo.com>', u'First')
273
        builder.set_file('a', b'text 3a for a\n', False)
274
        r2a = builder.commit(b'Joe Foo <joe@foo.com>', u'Second a', base=r1)
275
        builder.set_file('a', b'text 3b for a\n', False)
276
        r2b = builder.commit(b'Joe Foo <joe@foo.com>', u'Second b', base=r1)
277
        builder.set_file('a', b'text 4 for a\n', False)
278
        builder.commit(b'Joe Foo <joe@foo.com>', u'Third', merge=[r2a], base=r2b)
279
        builder.finish()
280
281
        # Check that bzr log does not fail and includes the revision.
282
        output, error = self.run_bzr(['log', '-n2', 'a'])
283
        self.assertEqual(error, '')
284
        self.assertIn('Second a', output)
285
        self.assertIn('Second b', output)
286
        self.assertIn('First', output)
287
        self.assertIn('Third', output)
288
0.200.83 by Jelmer Vernooij
Add blackbox test for 'bzr tags'
289
    def test_tags(self):
0.200.444 by Jelmer Vernooij
Stop running git in blackbox tests.
290
        git_repo, commit_sha1 = self.simple_commit()
7018.3.7 by Jelmer Vernooij
Fix remaining git tests.
291
        git_repo.refs[b"refs/tags/foo"] = commit_sha1
0.200.83 by Jelmer Vernooij
Add blackbox test for 'bzr tags'
292
293
        output, error = self.run_bzr(['tags'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
294
        self.assertEqual(error, '')
295
        self.assertEqual(output, "foo                  1\n")
0.200.83 by Jelmer Vernooij
Add blackbox test for 'bzr tags'
296
0.200.85 by Jelmer Vernooij
Add test for creating new tags.
297
    def test_tag(self):
298
        self.simple_commit()
299
300
        output, error = self.run_bzr(["tag", "bar"])
301
0.258.1 by Max Bowsher
Make tests tolerant to bzr <= 2.2.
302
        # bzr <= 2.2 emits this message in the output stream
303
        # bzr => 2.3 emits this message in the error stream
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
304
        self.assertEqual(error + output, 'Created tag bar.\n')
0.200.85 by Jelmer Vernooij
Add test for creating new tags.
305
0.200.288 by Jelmer Vernooij
Add test for init-repo.
306
    def test_init_repo(self):
0.200.1653 by Jelmer Vernooij
--git is now --format=git.
307
        output, error = self.run_bzr(["init", "--format=git", "bla.git"])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
308
        self.assertEqual(error, '')
309
        self.assertEqual(output, 'Created a standalone tree (format: git)\n')
0.200.288 by Jelmer Vernooij
Add test for init-repo.
310
0.200.1332 by Jelmer Vernooij
Add smoke test for 'bzr diff --format=git'.
311
    def test_diff_format(self):
312
        tree = self.make_branch_and_tree('.')
313
        self.build_tree(['a'])
314
        tree.add(['a'])
315
        output, error = self.run_bzr(['diff', '--format=git'], retcode=1)
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
316
        self.assertEqual(error, '')
7290.27.1 by Vincent Ladeuil
Backport dulwich fix.
317
        # Some older versions of Dulwich (< 0.19.12) formatted diffs slightly
318
        # differently.
7324.1.1 by Jelmer Vernooij
Fix compatibility with pre-0.19.12 versions of Dulwich.
319
        from dulwich import __version__ as dulwich_version
320
        if dulwich_version < (0, 19, 12):
321
            self.assertEqual(output,
322
                             'diff --git /dev/null b/a\n'
323
                             'old mode 0\n'
324
                             'new mode 100644\n'
325
                             'index 0000000..c197bd8 100644\n'
326
                             '--- /dev/null\n'
327
                             '+++ b/a\n'
328
                             '@@ -0,0 +1 @@\n'
329
                             '+contents of a\n')
330
        else:
331
            self.assertEqual(output,
332
                             'diff --git a/a b/a\n'
333
                             'old file mode 0\n'
334
                             'new file mode 100644\n'
335
                             'index 0000000..c197bd8 100644\n'
336
                             '--- /dev/null\n'
337
                             '+++ b/a\n'
338
                             '@@ -0,0 +1 @@\n'
339
                             '+contents of a\n')
0.200.1450 by Jelmer Vernooij
Fix git-import after branch refactoring.
340
0.200.1609 by Jelmer Vernooij
Only create colocated branches in git-import if the --colocated option is specified.
341
    def test_git_import_uncolocated(self):
342
        r = GitRepo.init("a", mkdir=True)
343
        self.build_tree(["a/file"])
344
        r.stage("file")
7143.15.2 by Jelmer Vernooij
Run autopep8.
345
        r.do_commit(ref=b"refs/heads/abranch",
346
                    committer=b"Joe <joe@example.com>", message=b"Dummy")
347
        r.do_commit(ref=b"refs/heads/bbranch",
348
                    committer=b"Joe <joe@example.com>", message=b"Dummy")
0.200.1609 by Jelmer Vernooij
Only create colocated branches in git-import if the --colocated option is specified.
349
        self.run_bzr(["git-import", "a", "b"])
7143.15.2 by Jelmer Vernooij
Run autopep8.
350
        self.assertEqual(
351
            set([".bzr", "abranch", "bbranch"]), set(os.listdir("b")))
0.200.1609 by Jelmer Vernooij
Only create colocated branches in git-import if the --colocated option is specified.
352
0.200.1450 by Jelmer Vernooij
Fix git-import after branch refactoring.
353
    def test_git_import(self):
354
        r = GitRepo.init("a", mkdir=True)
355
        self.build_tree(["a/file"])
356
        r.stage("file")
7143.15.2 by Jelmer Vernooij
Run autopep8.
357
        r.do_commit(ref=b"refs/heads/abranch",
358
                    committer=b"Joe <joe@example.com>", message=b"Dummy")
359
        r.do_commit(ref=b"refs/heads/bbranch",
360
                    committer=b"Joe <joe@example.com>", message=b"Dummy")
0.200.1609 by Jelmer Vernooij
Only create colocated branches in git-import if the --colocated option is specified.
361
        self.run_bzr(["git-import", "--colocated", "a", "b"])
6964.2.3 by Jelmer Vernooij
Review comments.
362
        self.assertEqual(set([".bzr"]), set(os.listdir("b")))
363
        self.assertEqual(set(["abranch", "bbranch"]),
7490.13.2 by Jelmer Vernooij
Fix reference handling.
364
                         set(ControlDir.open("b").branch_names()))
0.200.1451 by Jelmer Vernooij
Add some more tests for git-import.
365
366
    def test_git_import_incremental(self):
367
        r = GitRepo.init("a", mkdir=True)
368
        self.build_tree(["a/file"])
369
        r.stage("file")
7143.15.2 by Jelmer Vernooij
Run autopep8.
370
        r.do_commit(ref=b"refs/heads/abranch",
371
                    committer=b"Joe <joe@example.com>", message=b"Dummy")
0.200.1609 by Jelmer Vernooij
Only create colocated branches in git-import if the --colocated option is specified.
372
        self.run_bzr(["git-import", "--colocated", "a", "b"])
373
        self.run_bzr(["git-import", "--colocated", "a", "b"])
6964.2.3 by Jelmer Vernooij
Review comments.
374
        self.assertEqual(set([".bzr"]), set(os.listdir("b")))
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
375
        b = ControlDir.open("b")
7490.13.2 by Jelmer Vernooij
Fix reference handling.
376
        self.assertEqual(["abranch"], b.branch_names())
0.200.1451 by Jelmer Vernooij
Add some more tests for git-import.
377
378
    def test_git_import_tags(self):
379
        r = GitRepo.init("a", mkdir=True)
380
        self.build_tree(["a/file"])
381
        r.stage("file")
7143.15.2 by Jelmer Vernooij
Run autopep8.
382
        cid = r.do_commit(ref=b"refs/heads/abranch",
383
                          committer=b"Joe <joe@example.com>", message=b"Dummy")
7018.3.7 by Jelmer Vernooij
Fix remaining git tests.
384
        r[b"refs/tags/atag"] = cid
0.200.1609 by Jelmer Vernooij
Only create colocated branches in git-import if the --colocated option is specified.
385
        self.run_bzr(["git-import", "--colocated", "a", "b"])
6964.2.3 by Jelmer Vernooij
Review comments.
386
        self.assertEqual(set([".bzr"]), set(os.listdir("b")))
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
387
        b = ControlDir.open("b")
7490.13.6 by Jelmer Vernooij
Fix tests.
388
        self.assertEqual(["abranch"], b.branch_names())
6964.2.3 by Jelmer Vernooij
Review comments.
389
        self.assertEqual(["atag"],
7143.15.2 by Jelmer Vernooij
Run autopep8.
390
                         list(b.open_branch("abranch").tags.get_tag_dict().keys()))
0.200.1452 by Jelmer Vernooij
Support colocated branches in 'bzr git-import', flatten namespace.
391
392
    def test_git_import_colo(self):
393
        r = GitRepo.init("a", mkdir=True)
394
        self.build_tree(["a/file"])
395
        r.stage("file")
7143.15.2 by Jelmer Vernooij
Run autopep8.
396
        r.do_commit(ref=b"refs/heads/abranch",
397
                    committer=b"Joe <joe@example.com>", message=b"Dummy")
398
        r.do_commit(ref=b"refs/heads/bbranch",
399
                    committer=b"Joe <joe@example.com>", message=b"Dummy")
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
400
        self.make_controldir("b", format="development-colo")
0.200.1609 by Jelmer Vernooij
Only create colocated branches in git-import if the --colocated option is specified.
401
        self.run_bzr(["git-import", "--colocated", "a", "b"])
6964.2.3 by Jelmer Vernooij
Review comments.
402
        self.assertEqual(
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
403
            set([b.name for b in ControlDir.open("b").list_branches()]),
0.200.1501 by Jelmer Vernooij
Provide ControlDir.get_branches.
404
            set(["abranch", "bbranch"]))
0.200.1521 by Jelmer Vernooij
Fix git-refs command.
405
406
    def test_git_refs_from_git(self):
407
        r = GitRepo.init("a", mkdir=True)
408
        self.build_tree(["a/file"])
409
        r.stage("file")
7143.15.2 by Jelmer Vernooij
Run autopep8.
410
        cid = r.do_commit(ref=b"refs/heads/abranch",
411
                          committer=b"Joe <joe@example.com>", message=b"Dummy")
7018.3.7 by Jelmer Vernooij
Fix remaining git tests.
412
        r[b"refs/tags/atag"] = cid
0.200.1521 by Jelmer Vernooij
Fix git-refs command.
413
        (stdout, stderr) = self.run_bzr(["git-refs", "a"])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
414
        self.assertEqual(stderr, "")
6964.2.3 by Jelmer Vernooij
Review comments.
415
        self.assertEqual(stdout,
7143.15.2 by Jelmer Vernooij
Run autopep8.
416
                         'refs/heads/abranch -> ' + cid.decode('ascii') + '\n'
417
                         'refs/tags/atag -> ' + cid.decode('ascii') + '\n')
0.200.1521 by Jelmer Vernooij
Fix git-refs command.
418
419
    def test_git_refs_from_bzr(self):
420
        tree = self.make_branch_and_tree('a')
421
        self.build_tree(["a/file"])
422
        tree.add(["file"])
7143.15.2 by Jelmer Vernooij
Run autopep8.
423
        revid = tree.commit(
424
            committer=b"Joe <joe@example.com>", message=b"Dummy")
0.200.1521 by Jelmer Vernooij
Fix git-refs command.
425
        tree.branch.tags.set_tag("atag", revid)
426
        (stdout, stderr) = self.run_bzr(["git-refs", "a"])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
427
        self.assertEqual(stderr, "")
428
        self.assertTrue("refs/tags/atag -> " in stdout)
429
        self.assertTrue("HEAD -> " in stdout)
0.200.1591 by Jelmer Vernooij
Add basic test for dpush.
430
0.425.1 by Jelmer Vernooij
Add really basic check implementation.
431
    def test_check(self):
432
        r = GitRepo.init("gitr", mkdir=True)
7018.3.7 by Jelmer Vernooij
Fix remaining git tests.
433
        self.build_tree_contents([("gitr/foo", b"hello from git")])
0.425.1 by Jelmer Vernooij
Add really basic check implementation.
434
        r.stage("foo")
7018.3.7 by Jelmer Vernooij
Fix remaining git tests.
435
        r.do_commit(b"message", committer=b"Somebody <user@example.com>")
0.425.1 by Jelmer Vernooij
Add really basic check implementation.
436
        out, err = self.run_bzr(["check", "gitr"])
437
        self.maxDiff = None
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
438
        self.assertEqual(out, '')
439
        self.assertTrue(err.endswith, '3 objects\n')
6965.1.2 by Jelmer Vernooij
Add test.
440
7490.11.1 by Jelmer Vernooij
Support reading user identity from .git/config in git repositories.
441
    def test_local_whoami(self):
442
        r = GitRepo.init("gitr", mkdir=True)
443
        self.build_tree_contents([('gitr/.git/config', """\
444
[user]
445
  email = some@example.com
446
  name = Test User
447
""")])
448
        out, err = self.run_bzr(["whoami", "-d", "gitr"])
449
        self.assertEqual(out, "Test User <some@example.com>\n")
450
        self.assertEqual(err, "")
451
452
        self.build_tree_contents([('gitr/.git/config', """\
453
[user]
454
  email = some@example.com
455
""")])
456
        out, err = self.run_bzr(["whoami", "-d", "gitr"])
457
        self.assertEqual(out, "some@example.com\n")
458
        self.assertEqual(err, "")
459
7490.12.1 by Jelmer Vernooij
Support user.signingkey.
460
    def test_local_signing_key(self):
461
        r = GitRepo.init("gitr", mkdir=True)
462
        self.build_tree_contents([('gitr/.git/config', """\
463
[user]
464
  email = some@example.com
465
  name = Test User
466
  signingkey = D729A457
467
""")])
468
        out, err = self.run_bzr(["config", "-d", "gitr", "gpg_signing_key"])
469
        self.assertEqual(out, "D729A457\n")
470
        self.assertEqual(err, "")
471
6968.1.1 by Jelmer Vernooij
Support 'bzr version-info' in horizon branches.
472
473
class ShallowTests(ExternalBase):
474
475
    def setUp(self):
476
        super(ShallowTests, self).setUp()
477
        # Smoke test for "bzr log" in a git repository with shallow depth.
478
        self.repo = GitRepo.init('gitr', mkdir=True)
7018.3.2 by Jelmer Vernooij
Fix some git tests.
479
        self.build_tree_contents([("gitr/foo", b"hello from git")])
6968.1.1 by Jelmer Vernooij
Support 'bzr version-info' in horizon branches.
480
        self.repo.stage("foo")
481
        self.repo.do_commit(
7143.15.2 by Jelmer Vernooij
Run autopep8.
482
            b"message", committer=b"Somebody <user@example.com>",
7268.1.1 by Jelmer Vernooij
Fix compatibility with newer versions of Dulwich.
483
            author=b"Somebody <user@example.com>",
7143.15.2 by Jelmer Vernooij
Run autopep8.
484
            commit_timestamp=1526330165, commit_timezone=0,
485
            author_timestamp=1526330165, author_timezone=0,
486
            merge_heads=[b'aa' * 20])
6968.1.1 by Jelmer Vernooij
Support 'bzr version-info' in horizon branches.
487
6965.1.2 by Jelmer Vernooij
Add test.
488
    def test_log_shallow(self):
489
        # Check that bzr log does not fail and includes the revision.
490
        output, error = self.run_bzr(['log', 'gitr'], retcode=3)
7143.15.2 by Jelmer Vernooij
Run autopep8.
491
        self.assertEqual(
492
            error, 'brz: ERROR: Further revision history missing.\n')
6965.1.2 by Jelmer Vernooij
Add test.
493
        self.assertEqual(output,
7143.15.2 by Jelmer Vernooij
Run autopep8.
494
                         '------------------------------------------------------------\n'
495
                         'revision-id: git-v1:' + self.repo.head().decode('ascii') + '\n'
496
                         'git commit: ' + self.repo.head().decode('ascii') + '\n'
497
                         'committer: Somebody <user@example.com>\n'
498
                         'timestamp: Mon 2018-05-14 20:36:05 +0000\n'
499
                         'message:\n'
500
                         '  message\n')
6968.1.1 by Jelmer Vernooij
Support 'bzr version-info' in horizon branches.
501
502
    def test_version_info_rio(self):
503
        output, error = self.run_bzr(['version-info', '--rio', 'gitr'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
504
        self.assertEqual(error, '')
505
        self.assertNotIn('revno:', output)
6968.1.1 by Jelmer Vernooij
Support 'bzr version-info' in horizon branches.
506
507
    def test_version_info_python(self):
508
        output, error = self.run_bzr(['version-info', '--python', 'gitr'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
509
        self.assertEqual(error, '')
510
        self.assertNotIn('revno:', output)
6968.1.1 by Jelmer Vernooij
Support 'bzr version-info' in horizon branches.
511
512
    def test_version_info_custom_with_revno(self):
513
        output, error = self.run_bzr(
7143.15.2 by Jelmer Vernooij
Run autopep8.
514
            ['version-info', '--custom',
515
             '--template=VERSION_INFO r{revno})\n', 'gitr'], retcode=3)
516
        self.assertEqual(
517
            error, 'brz: ERROR: Variable {revno} is not available.\n')
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
518
        self.assertEqual(output, 'VERSION_INFO r')
6968.1.1 by Jelmer Vernooij
Support 'bzr version-info' in horizon branches.
519
520
    def test_version_info_custom_without_revno(self):
521
        output, error = self.run_bzr(
7143.15.2 by Jelmer Vernooij
Run autopep8.
522
            ['version-info', '--custom', '--template=VERSION_INFO \n',
523
             'gitr'])
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
524
        self.assertEqual(error, '')
525
        self.assertEqual(output, 'VERSION_INFO \n')
7143.17.1 by Jelmer Vernooij
Fix grep in git working trees.
526
527
7143.18.1 by Jelmer Vernooij
Fix 'bzr switch' in git repositories.
528
class SwitchTests(ExternalBase):
529
530
    def test_switch_branch(self):
531
        # Create a git repository with a revision.
532
        repo = GitRepo.init(self.test_dir)
533
        builder = tests.GitBranchBuilder()
534
        builder.set_branch(b'refs/heads/oldbranch')
535
        builder.set_file('a', b'text for a\n', False)
536
        builder.commit(b'Joe Foo <joe@foo.com>', u'<The commit message>')
537
        builder.set_branch(b'refs/heads/newbranch')
538
        builder.reset()
539
        builder.set_file('a', b'text for new a\n', False)
540
        builder.commit(b'Joe Foo <joe@foo.com>', u'<The commit message>')
541
        builder.finish()
542
543
        repo.refs.set_symbolic_ref(b'HEAD', b'refs/heads/newbranch')
544
545
        repo.reset_index()
546
547
        output, error = self.run_bzr('switch oldbranch')
548
        self.assertEqual(output, '')
549
        self.assertTrue(error.startswith('Updated to revision 1.\n'), error)
550
551
        self.assertFileEqual("text for a\n", 'a')
552
        tree = WorkingTree.open('.')
553
        with tree.lock_read():
554
            basis_tree = tree.basis_tree()
555
            with basis_tree.lock_read():
556
                self.assertEqual([], list(tree.iter_changes(basis_tree)))
7143.18.2 by Jelmer Vernooij
Merge trunk.
557
7404.5.1 by Jelmer Vernooij
Support checking out nested trees, including for git repositories.
558
    def test_branch_with_nested_trees(self):
559
        orig = self.make_branch_and_tree('source', format='git')
560
        subtree = self.make_branch_and_tree('source/subtree', format='git')
561
        self.build_tree(['source/subtree/a'])
562
        self.build_tree_contents([('source/.gitmodules', """\
563
[submodule "subtree"]
564
    path = subtree
565
    url = %s
566
""" % subtree.user_url)])
567
        subtree.add(['a'])
568
        subtree.commit('add subtree contents')
569
        orig.add_reference(subtree)
570
        orig.add(['.gitmodules'])
571
        orig.commit('add subtree')
572
573
        self.run_bzr('branch source target')
574
575
        target = WorkingTree.open('target')
576
        target_subtree = WorkingTree.open('target/subtree')
577
        self.assertTreesEqual(orig, target)
578
        self.assertTreesEqual(subtree, target_subtree)
579
7143.18.2 by Jelmer Vernooij
Merge trunk.
580
7290.26.1 by Jelmer Vernooij
Fix switching in git repositories.
581
class SwitchScriptTests(TestCaseWithTransportAndScript):
582
583
    def test_switch_preserves(self):
584
        # See https://bugs.launchpad.net/brz/+bug/1820606
585
        self.run_script("""
586
$ brz init --git r
587
Created a standalone tree (format: git)
588
$ cd r
589
$ echo original > file.txt
590
$ brz add
591
adding file.txt
592
$ brz ci -q -m "Initial"
593
$ echo "entered on master branch" > file.txt
594
$ brz stat
595
modified:
596
  file.txt
597
$ brz switch -b other
598
2>Tree is up to date at revision 1.
599
2>Switched to branch other
600
$ cat file.txt
601
entered on master branch
602
""")
603
604
7143.17.1 by Jelmer Vernooij
Fix grep in git working trees.
605
class GrepTests(ExternalBase):
606
607
    def test_simple_grep(self):
608
        tree = self.make_branch_and_tree('.', format='git')
609
        self.build_tree_contents([('a', 'text for a\n')])
610
        tree.add(['a'])
611
        output, error = self.run_bzr('grep text')
612
        self.assertEqual(output, 'a:text for a\n')
613
        self.assertEqual(error, '')
7211.8.1 by Jelmer Vernooij
Fix stats in Python3 git repositories.
614
615
7206.6.4 by Jelmer Vernooij
Move reconcile logic to breezy.bzr.reconcile.
616
class ReconcileTests(ExternalBase):
617
618
    def test_simple_reconcile(self):
619
        tree = self.make_branch_and_tree('.', format='git')
620
        self.build_tree_contents([('a', 'text for a\n')])
621
        tree.add(['a'])
622
        output, error = self.run_bzr('reconcile')
623
        self.assertContainsRe(
624
            output,
625
            'Reconciling branch file://.*\n'
626
            'Reconciling repository file://.*\n'
627
            'Reconciliation complete.\n')
628
        self.assertEqual(error, '')
7206.6.6 by Jelmer Vernooij
Merge trunk.
629
630
7211.10.1 by Jelmer Vernooij
Add test for status with an empty dir.
631
class StatusTests(ExternalBase):
632
633
    def test_empty_dir(self):
634
        tree = self.make_branch_and_tree('.', format='git')
635
        self.build_tree(['a/', 'a/foo'])
636
        self.build_tree_contents([('.gitignore', 'foo\n')])
637
        tree.add(['.gitignore'])
638
        tree.commit('add ignore')
639
        output, error = self.run_bzr('st')
7211.10.5 by Jelmer Vernooij
Fix handling of directories.
640
        self.assertEqual(output, '')
7211.10.1 by Jelmer Vernooij
Add test for status with an empty dir.
641
        self.assertEqual(error, '')
7211.10.6 by Jelmer Vernooij
Merge trunk.
642
643
7211.8.1 by Jelmer Vernooij
Fix stats in Python3 git repositories.
644
class StatsTests(ExternalBase):
645
646
    def test_simple_stats(self):
647
        self.requireFeature(PluginLoadedFeature('stats'))
648
        tree = self.make_branch_and_tree('.', format='git')
649
        self.build_tree_contents([('a', 'text for a\n')])
650
        tree.add(['a'])
651
        tree.commit('a commit', committer='Somebody <somebody@example.com>')
652
        output, error = self.run_bzr('stats')
653
        self.assertEqual(output, '   1 Somebody <somebody@example.com>\n')
7233.2.1 by Jelmer Vernooij
Fix import for git-objects.
654
655
656
class GitObjectsTests(ExternalBase):
657
658
    def run_simple(self, format):
659
        tree = self.make_branch_and_tree('.', format=format)
660
        self.build_tree(['a/', 'a/foo'])
661
        tree.add(['a'])
662
        tree.commit('add a')
663
        output, error = self.run_bzr('git-objects')
664
        shas = list(output.splitlines())
665
        self.assertEqual([40, 40], [len(s) for s in shas])
666
        self.assertEqual(error, '')
667
668
        output, error = self.run_bzr('git-object %s' % shas[0])
669
        self.assertEqual('', error)
670
671
    def test_in_native(self):
672
        self.run_simple(format='git')
673
674
    def test_in_bzr(self):
675
        self.run_simple(format='2a')
7268.7.1 by Jelmer Vernooij
Fix git-apply.
676
677
678
class GitApplyTests(ExternalBase):
679
680
    def test_apply(self):
681
        b = self.make_branch_and_tree('.')
682
683
        with open('foo.patch', 'w') as f:
684
            f.write("""\
685
From bdefb25fab801e6af0a70e965f60cb48f2b759fa Mon Sep 17 00:00:00 2001
686
From: Dmitry Bogatov <KAction@debian.org>
687
Date: Fri, 8 Feb 2019 23:28:30 +0000
688
Subject: [PATCH] Add fixed for out-of-date-standards-version
689
690
---
691
 message           | 3 +++
692
 1 files changed, 14 insertions(+)
693
 create mode 100644 message
694
695
diff --git a/message b/message
696
new file mode 100644
697
index 0000000..05ec0b1
698
--- /dev/null
699
+++ b/message
700
@@ -0,0 +1,3 @@
701
+Update standards version, no changes needed.
702
+Certainty: certain
703
+Fixed-Lintian-Tags: out-of-date-standards-version
704
""")
705
        output, error = self.run_bzr('git-apply foo.patch')
706
        self.assertContainsRe(
707
            error,
708
            'Committing to: .*\n'
709
            'Committed revision 1.\n')