/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
1
# Copyright (C) 2007 Canonical Ltd
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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
0.200.411 by Jelmer Vernooij
Stop pretending dulwich has the same api as python-git.
17
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
18
"""Tests for interfacing with a Git Branch"""
19
0.200.411 by Jelmer Vernooij
Stop pretending dulwich has the same api as python-git.
20
21
import dulwich
0.200.992 by Jelmer Vernooij
Avoid invoking git directly.
22
from dulwich.objects import (
23
    Commit,
24
    Tag,
25
    )
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
26
from dulwich.repo import (
27
    Repo as GitRepo,
28
    )
29
0.200.270 by Jelmer Vernooij
add tests for branch sprouting.
30
import os
0.200.1361 by Jelmer Vernooij
Support branches where the ref can't be mapped back to a branch name.
31
import urllib
0.200.270 by Jelmer Vernooij
add tests for branch sprouting.
32
33
from bzrlib import (
0.200.633 by Jelmer Vernooij
Fix Branch.get_stacked_on_url() test.
34
    errors,
0.200.270 by Jelmer Vernooij
add tests for branch sprouting.
35
    revision,
0.266.1 by Martin
Expect native-style file urls in branch object reprs
36
    urlutils,
0.200.270 by Jelmer Vernooij
add tests for branch sprouting.
37
    )
38
from bzrlib.branch import (
39
    Branch,
0.247.1 by Michael Hudson
test
40
    InterBranch,
0.200.270 by Jelmer Vernooij
add tests for branch sprouting.
41
    )
0.200.1014 by Jelmer Vernooij
Fix tests.
42
from bzrlib.bzrdir import (
43
    BzrDir,
44
    )
0.200.270 by Jelmer Vernooij
add tests for branch sprouting.
45
from bzrlib.repository import (
46
    Repository,
47
    )
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
48
0.200.27 by David Allouche
Flat is better than nested, remove the gitlib hierarchy.
49
from bzrlib.plugins.git import (
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
50
    branch,
0.200.97 by Jelmer Vernooij
use mapping object.
51
    tests,
0.200.20 by John Arbash Meinel
All tests are passing again
52
    )
0.200.1140 by Jelmer Vernooij
Update now that the control dir formats are no longer in __init__.
53
from bzrlib.plugins.git.dir import (
54
    LocalGitControlDirFormat,
55
    )
0.243.1 by Jelmer Vernooij
Use foreign branch testing infrastructure.
56
from bzrlib.plugins.git.mapping import (
57
    default_mapping,
58
    )
0.200.123 by Jelmer Vernooij
Use central git module.
59
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
60
61
class TestGitBranch(tests.TestCaseInTempDir):
62
0.200.1361 by Jelmer Vernooij
Support branches where the ref can't be mapped back to a branch name.
63
    def test_open_by_ref(self):
64
        GitRepo.init('.')
65
        d = BzrDir.open("%s,ref=%s" % (
66
            urlutils.local_path_to_url(self.test_dir),
67
            urllib.quote("refs/remotes/origin/unstable", safe='')
68
            ))
69
        b = d.create_branch()
70
        self.assertEquals(b.ref, "refs/remotes/origin/unstable")
71
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
72
    def test_open_existing(self):
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
73
        GitRepo.init('.')
0.200.1014 by Jelmer Vernooij
Fix tests.
74
        d = BzrDir.open('.')
0.200.769 by Jelmer Vernooij
Cope with open_branch() actually checking whether there is a branch present.
75
        thebranch = d.create_branch()
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
76
        self.assertIsInstance(thebranch, branch.GitBranch)
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
77
0.200.412 by Jelmer Vernooij
Implement GitBranch.__repr__.
78
    def test_repr(self):
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
79
        GitRepo.init('.')
0.200.1014 by Jelmer Vernooij
Fix tests.
80
        d = BzrDir.open('.')
0.200.769 by Jelmer Vernooij
Cope with open_branch() actually checking whether there is a branch present.
81
        thebranch = d.create_branch()
0.200.1311 by Jelmer Vernooij
More work on colocated branch support.
82
        self.assertEquals(
0.200.1371 by Jelmer Vernooij
Fix test.
83
            "<LocalGitBranch('%s/', u'master')>" % (
0.266.1 by Martin
Expect native-style file urls in branch object reprs
84
                urlutils.local_path_to_url(self.test_dir),),
85
            repr(thebranch))
0.200.412 by Jelmer Vernooij
Implement GitBranch.__repr__.
86
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
87
    def test_last_revision_is_null(self):
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
88
        GitRepo.init('.')
0.200.1014 by Jelmer Vernooij
Fix tests.
89
        thedir = BzrDir.open('.')
0.200.769 by Jelmer Vernooij
Cope with open_branch() actually checking whether there is a branch present.
90
        thebranch = thedir.create_branch()
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
91
        self.assertEqual(revision.NULL_REVISION, thebranch.last_revision())
92
        self.assertEqual((0, revision.NULL_REVISION),
93
                         thebranch.last_revision_info())
0.200.20 by John Arbash Meinel
All tests are passing again
94
0.200.82 by Jelmer Vernooij
Support listing tags.
95
    def simple_commit_a(self):
0.200.992 by Jelmer Vernooij
Avoid invoking git directly.
96
        r = GitRepo.init('.')
0.200.82 by Jelmer Vernooij
Support listing tags.
97
        self.build_tree(['a'])
0.200.992 by Jelmer Vernooij
Avoid invoking git directly.
98
        r.stage(["a"])
99
        return r.do_commit("a", committer="Somebody <foo@example.com>")
0.200.82 by Jelmer Vernooij
Support listing tags.
100
0.200.20 by John Arbash Meinel
All tests are passing again
101
    def test_last_revision_is_valid(self):
0.200.992 by Jelmer Vernooij
Avoid invoking git directly.
102
        head = self.simple_commit_a()
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
103
        thebranch = Branch.open('.')
0.200.104 by Jelmer Vernooij
Use bzr-foreign function names for converting between git and bzr revids.
104
        self.assertEqual(default_mapping.revision_id_foreign_to_bzr(head),
0.200.20 by John Arbash Meinel
All tests are passing again
105
                         thebranch.last_revision())
0.200.58 by Jelmer Vernooij
Fix remaining tests.
106
107
    def test_revision_history(self):
0.200.992 by Jelmer Vernooij
Avoid invoking git directly.
108
        reva = self.simple_commit_a()
0.200.59 by Jelmer Vernooij
Add more tests, fix revision history.
109
        self.build_tree(['b'])
0.200.992 by Jelmer Vernooij
Avoid invoking git directly.
110
        r = GitRepo(".")
111
        r.stage("b")
112
        revb = r.do_commit("b", committer="Somebody <foo@example.com>")
0.200.58 by Jelmer Vernooij
Fix remaining tests.
113
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
114
        thebranch = Branch.open('.')
0.200.104 by Jelmer Vernooij
Use bzr-foreign function names for converting between git and bzr revids.
115
        self.assertEqual([default_mapping.revision_id_foreign_to_bzr(r) for r in (reva, revb)],
0.200.58 by Jelmer Vernooij
Fix remaining tests.
116
                         thebranch.revision_history())
0.200.82 by Jelmer Vernooij
Support listing tags.
117
0.200.271 by Jelmer Vernooij
Stop importing tags as branches as part of git-import.
118
    def test_tag_annotated(self):
0.200.992 by Jelmer Vernooij
Avoid invoking git directly.
119
        reva = self.simple_commit_a()
120
        o = Tag()
121
        o.name = "foo"
122
        o.tagger = "Jelmer <foo@example.com>"
123
        o.message = "add tag"
124
        o.object = (Commit, reva)
125
        o.tag_timezone = 0
126
        o.tag_time = 42
127
        r = GitRepo(".")
128
        r.object_store.add_object(o)
129
        r['refs/tags/foo'] = o.id
0.200.271 by Jelmer Vernooij
Stop importing tags as branches as part of git-import.
130
        thebranch = Branch.open('.')
131
        self.assertEquals({"foo": default_mapping.revision_id_foreign_to_bzr(reva)},
132
                          thebranch.tags.get_tag_dict())
133
134
    def test_tag(self):
0.200.992 by Jelmer Vernooij
Avoid invoking git directly.
135
        reva = self.simple_commit_a()
136
        r = GitRepo(".")
137
        r.refs["refs/tags/foo"] = reva
0.200.271 by Jelmer Vernooij
Stop importing tags as branches as part of git-import.
138
        thebranch = Branch.open('.')
139
        self.assertEquals({"foo": default_mapping.revision_id_foreign_to_bzr(reva)},
140
                          thebranch.tags.get_tag_dict())
141
0.200.956 by Jelmer Vernooij
Add some more format tests.
142
0.200.66 by Jelmer Vernooij
Implement branch.get_parent().
143
144
class TestWithGitBranch(tests.TestCaseWithTransport):
145
146
    def setUp(self):
147
        tests.TestCaseWithTransport.setUp(self)
0.200.411 by Jelmer Vernooij
Stop pretending dulwich has the same api as python-git.
148
        dulwich.repo.Repo.create(self.test_dir)
0.200.1014 by Jelmer Vernooij
Fix tests.
149
        d = BzrDir.open(self.test_dir)
0.200.769 by Jelmer Vernooij
Cope with open_branch() actually checking whether there is a branch present.
150
        self.git_branch = d.create_branch()
0.200.66 by Jelmer Vernooij
Implement branch.get_parent().
151
152
    def test_get_parent(self):
153
        self.assertIs(None, self.git_branch.get_parent())
0.200.67 by Jelmer Vernooij
Implement Branch.get_stacked_on_url.
154
155
    def test_get_stacked_on_url(self):
0.200.956 by Jelmer Vernooij
Add some more format tests.
156
        self.assertRaises(errors.UnstackableBranchFormat,
0.200.633 by Jelmer Vernooij
Fix Branch.get_stacked_on_url() test.
157
            self.git_branch.get_stacked_on_url)
0.200.70 by Jelmer Vernooij
Implement GitBranchFormat.get_format_description.
158
0.200.72 by Jelmer Vernooij
Implement Branch.get_physical_lock_status.
159
    def test_get_physical_lock_status(self):
160
        self.assertFalse(self.git_branch.get_physical_lock_status())
161
0.200.70 by Jelmer Vernooij
Implement GitBranchFormat.get_format_description.
162
163
class TestGitBranchFormat(tests.TestCase):
164
165
    def setUp(self):
166
        super(TestGitBranchFormat, self).setUp()
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
167
        self.format = branch.GitBranchFormat()
0.200.70 by Jelmer Vernooij
Implement GitBranchFormat.get_format_description.
168
169
    def test_get_format_description(self):
170
        self.assertEquals("Git Branch", self.format.get_format_description())
0.200.270 by Jelmer Vernooij
add tests for branch sprouting.
171
0.200.956 by Jelmer Vernooij
Add some more format tests.
172
    def test_get_network_name(self):
173
        self.assertEquals("git", self.format.network_name())
174
175
    def test_supports_tags(self):
176
        self.assertTrue(self.format.supports_tags())
0.200.270 by Jelmer Vernooij
add tests for branch sprouting.
177
178
0.200.271 by Jelmer Vernooij
Stop importing tags as branches as part of git-import.
179
class BranchTests(tests.TestCaseInTempDir):
0.200.270 by Jelmer Vernooij
add tests for branch sprouting.
180
181
    def make_onerev_branch(self):
182
        os.mkdir("d")
183
        os.chdir("d")
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
184
        GitRepo.init('.')
0.200.270 by Jelmer Vernooij
add tests for branch sprouting.
185
        bb = tests.GitBranchBuilder()
186
        bb.set_file("foobar", "foo\nbar\n", False)
187
        mark = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
188
        gitsha = bb.finish()[mark]
189
        os.chdir("..")
0.200.1373 by Jelmer Vernooij
Prevent accidentally removing branch.
190
        return os.path.abspath("d"), gitsha
0.200.270 by Jelmer Vernooij
add tests for branch sprouting.
191
0.247.1 by Michael Hudson
test
192
    def make_tworev_branch(self):
193
        os.mkdir("d")
194
        os.chdir("d")
195
        GitRepo.init('.')
196
        bb = tests.GitBranchBuilder()
197
        bb.set_file("foobar", "foo\nbar\n", False)
198
        mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
199
        mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
200
        marks = bb.finish()
201
        os.chdir("..")
202
        return "d", (marks[mark1], marks[mark2])
203
0.200.270 by Jelmer Vernooij
add tests for branch sprouting.
204
    def clone_git_branch(self, from_url, to_url):
0.200.1014 by Jelmer Vernooij
Fix tests.
205
        from_dir = BzrDir.open(from_url)
0.200.270 by Jelmer Vernooij
add tests for branch sprouting.
206
        to_dir = from_dir.sprout(to_url)
207
        return to_dir.open_branch()
208
209
    def test_single_rev(self):
210
        path, gitsha = self.make_onerev_branch()
211
        oldrepo = Repository.open(path)
212
        revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
0.200.1373 by Jelmer Vernooij
Prevent accidentally removing branch.
213
        self.assertEquals(gitsha, oldrepo._git.get_refs()["refs/heads/master"])
0.200.270 by Jelmer Vernooij
add tests for branch sprouting.
214
        newbranch = self.clone_git_branch(path, "f")
215
        self.assertEquals([revid], newbranch.repository.all_revision_ids())
0.200.271 by Jelmer Vernooij
Stop importing tags as branches as part of git-import.
216
217
    def test_sprouted_tags(self):
218
        path, gitsha = self.make_onerev_branch()
0.200.992 by Jelmer Vernooij
Avoid invoking git directly.
219
        r = GitRepo(path)
220
        r.refs["refs/tags/lala"] = r.head()
0.200.271 by Jelmer Vernooij
Stop importing tags as branches as part of git-import.
221
        oldrepo = Repository.open(path)
222
        revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
223
        newbranch = self.clone_git_branch(path, "f")
224
        self.assertEquals({"lala": revid}, newbranch.tags.get_tag_dict())
225
        self.assertEquals([revid], newbranch.repository.all_revision_ids())
0.243.1 by Jelmer Vernooij
Use foreign branch testing infrastructure.
226
0.247.1 by Michael Hudson
test
227
    def test_interbranch_pull(self):
228
        path, (gitsha1, gitsha2) = self.make_tworev_branch()
229
        oldrepo = Repository.open(path)
230
        revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
231
        newbranch = self.make_branch('g')
232
        inter_branch = InterBranch.get(Branch.open(path), newbranch)
233
        inter_branch.pull()
234
        self.assertEquals(revid2, newbranch.last_revision())
235
0.247.5 by Michael Hudson
test and fix for noop pull case
236
    def test_interbranch_pull_noop(self):
237
        path, (gitsha1, gitsha2) = self.make_tworev_branch()
238
        oldrepo = Repository.open(path)
239
        revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
240
        newbranch = self.make_branch('g')
241
        inter_branch = InterBranch.get(Branch.open(path), newbranch)
242
        inter_branch.pull()
243
        # This is basically "assertNotRaises"
244
        inter_branch.pull()
245
        self.assertEquals(revid2, newbranch.last_revision())
246
0.247.3 by Michael Hudson
oh, so it wasn't (particularly) wrong, but it was a bit obscure
247
    def test_interbranch_pull_stop_revision(self):
248
        path, (gitsha1, gitsha2) = self.make_tworev_branch()
249
        oldrepo = Repository.open(path)
250
        revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
251
        newbranch = self.make_branch('g')
252
        inter_branch = InterBranch.get(Branch.open(path), newbranch)
253
        inter_branch.pull(stop_revision=revid1)
254
        self.assertEquals(revid1, newbranch.last_revision())
255
0.259.8 by Jelmer Vernooij
Add test.
256
    def test_interbranch_pull_with_tags(self):
257
        path, (gitsha1, gitsha2) = self.make_tworev_branch()
258
        gitrepo = GitRepo(path)
259
        gitrepo.refs["refs/tags/sometag"] = gitsha2
260
        oldrepo = Repository.open(path)
261
        revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
262
        revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
263
        newbranch = self.make_branch('g')
0.200.1305 by Jelmer Vernooij
Only actually fetch tags if "branch.fetch_tags" is set to true.
264
        source_branch = Branch.open(path)
265
        source_branch.get_config().set_user_option("branch.fetch_tags", True)
266
        inter_branch = InterBranch.get(source_branch, newbranch)
0.259.8 by Jelmer Vernooij
Add test.
267
        inter_branch.pull(stop_revision=revid1)
268
        self.assertEquals(revid1, newbranch.last_revision())
269
        self.assertTrue(newbranch.repository.has_revision(revid2))
270
0.243.1 by Jelmer Vernooij
Use foreign branch testing infrastructure.
271
272
class ForeignTestsBranchFactory(object):
273
274
    def make_empty_branch(self, transport):
0.200.1012 by Jelmer Vernooij
Rename BzrDir to ControlDir.
275
        d = LocalGitControlDirFormat().initialize_on_transport(transport)
0.200.769 by Jelmer Vernooij
Cope with open_branch() actually checking whether there is a branch present.
276
        return d.create_branch()
0.243.1 by Jelmer Vernooij
Use foreign branch testing infrastructure.
277
278
    make_branch = make_empty_branch