1
# Copyright (C) 2009 Jelmer Vernooij <jelmer@samba.org>
2
# -*- coding: utf-8 -*-
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.
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.
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
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
from dulwich.objects import (
29
from bzrlib.bzrdir import (
32
from bzrlib.inventory import (
35
from bzrlib.repository import (
38
from bzrlib.tests import (
39
TestCaseWithTransport,
41
from bzrlib.transport import (
45
from bzrlib.plugins.git import (
48
from bzrlib.plugins.git.fetch import (
53
from bzrlib.plugins.git.mapping import (
57
from bzrlib.plugins.git.shamap import (
60
from bzrlib.plugins.git.tests import (
66
class FetchGraphWalkerTests(TestCaseWithTransport):
69
TestCaseWithTransport.setUp(self)
70
self.mapping = default_mapping
73
tree = self.make_branch_and_tree("wt")
74
graphwalker = BzrFetchGraphWalker(tree.branch.repository, self.mapping)
75
self.assertEquals(None, graphwalker.next())
78
class RepositoryFetchTests:
80
def make_git_repo(self, path):
86
def clone_git_repo(self, from_url, to_url, revision_id=None):
87
oldrepos = self.open_git_repo(from_url)
88
dir = BzrDir.create(to_url, get_rich_root_format())
89
newrepos = dir.create_repository()
90
oldrepos.copy_content_into(newrepos, revision_id=revision_id)
94
self.make_git_repo("d")
95
newrepos = self.clone_git_repo("d", "f")
96
self.assertEquals([], newrepos.all_revision_ids())
98
def make_onerev_branch(self):
99
self.make_git_repo("d")
101
bb = GitBranchBuilder()
102
bb.set_file("foobar", "foo\nbar\n", False)
103
mark = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
104
gitsha = bb.finish()[mark]
108
def test_single_rev(self):
109
path, gitsha = self.make_onerev_branch()
110
oldrepo = self.open_git_repo(path)
111
newrepo = self.clone_git_repo(path, "f")
112
self.assertEquals([oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)], newrepo.all_revision_ids())
114
def test_single_rev_specific(self):
115
path, gitsha = self.make_onerev_branch()
116
oldrepo = self.open_git_repo(path)
117
revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
118
newrepo = self.clone_git_repo(path, "f", revision_id=revid)
119
self.assertEquals([revid], newrepo.all_revision_ids())
121
def test_incremental(self):
122
self.make_git_repo("d")
124
bb = GitBranchBuilder()
125
bb.set_file("foobar", "foo\nbar\n", False)
126
mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
127
bb.set_file("foobar", "fooll\nbar\n", False)
128
mark2 = bb.commit("Somebody <somebody@someorg.org>", "nextmsg")
130
gitsha1 = marks[mark1]
131
gitsha2 = marks[mark2]
133
oldrepo = self.open_git_repo("d")
134
revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
135
newrepo = self.clone_git_repo("d", "f", revision_id=revid1)
136
self.assertEquals([revid1], newrepo.all_revision_ids())
137
revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
138
newrepo.fetch(oldrepo, revision_id=revid2)
139
self.assertEquals(set([revid1, revid2]), set(newrepo.all_revision_ids()))
141
def test_executable(self):
142
self.make_git_repo("d")
144
bb = GitBranchBuilder()
145
bb.set_file("foobar", "foo\nbar\n", True)
146
bb.set_file("notexec", "foo\nbar\n", False)
147
mark = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
148
gitsha = bb.finish()[mark]
150
oldrepo = self.open_git_repo("d")
151
newrepo = self.clone_git_repo("d", "f")
152
revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
153
tree = newrepo.revision_tree(revid)
154
self.assertTrue(tree.has_filename("foobar"))
155
self.assertEquals(True, tree.inventory[tree.path2id("foobar")].executable)
156
self.assertTrue(tree.has_filename("notexec"))
157
self.assertEquals(False, tree.inventory[tree.path2id("notexec")].executable)
159
def test_non_ascii_characters(self):
160
self.make_git_repo("d")
162
bb = GitBranchBuilder()
163
bb.set_file(u"foőbar", "foo\nbar\n", False)
164
mark = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
165
gitsha = bb.finish()[mark]
167
oldrepo = self.open_git_repo("d")
168
newrepo = self.clone_git_repo("d", "f")
169
revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
170
tree = newrepo.revision_tree(revid)
171
self.assertTrue(tree.has_filename(u"foőbar"))
174
class LocalRepositoryFetchTests(RepositoryFetchTests, TestCaseWithTransport):
176
def open_git_repo(self, path):
177
return Repository.open(path)
180
class ImportObjects(TestCaseWithTransport):
183
super(ImportObjects, self).setUp()
184
self._map = DictGitShaMap()
185
self._mapping = BzrGitMappingv1()
186
factory = knit.make_file_factory(True, versionedfile.PrefixMapper())
187
self._texts = factory(self.get_transport('texts'))
189
def test_import_blob_simple(self):
190
blob = Blob.from_string("bar")
191
base_inv = Inventory()
192
ret = import_git_blob(self._texts, self._mapping, "bla", blob,
193
base_inv, None, "somerevid", [], self._map, False)
194
self.assertEquals(set([('bla', 'somerevid')]), self._texts.keys())
195
self.assertEquals(self._texts.get_record_stream([('bla', 'somerevid')],
196
"unordered", True).next().get_bytes_as("fulltext"), "bar")
197
self.assertEquals(1, len(ret))
198
self.assertEquals(None, ret[0][0])
199
self.assertEquals("bla", ret[0][1])
201
self.assertEquals(False, ie.executable)
202
self.assertEquals("file", ie.kind)
203
self.assertEquals("somerevid", ie.revision)
204
self.assertEquals(osutils.sha_strings(["bar"]), ie.text_sha1)
206
def test_import_tree_empty_root(self):
207
base_inv = Inventory(root_id=None)
210
ret = import_git_tree(self._texts, self._mapping, "", tree, base_inv,
211
None, "somerevid", [], self._map, {}.__getitem__)
212
self.assertEquals(set([("TREE_ROOT", 'somerevid')]), self._texts.keys())
213
self.assertEquals(1, len(ret))
214
self.assertEquals(None, ret[0][0])
215
self.assertEquals("", ret[0][1])
217
self.assertEquals(False, ie.executable)
218
self.assertEquals("directory", ie.kind)
219
self.assertEquals({}, ie.children)
220
self.assertEquals("somerevid", ie.revision)
221
self.assertEquals(None, ie.text_sha1)
223
def test_import_tree_empty(self):
224
base_inv = Inventory()
227
ret = import_git_tree(self._texts, self._mapping, "bla", tree,
228
base_inv, None, "somerevid", [], self._map, {}.__getitem__)
229
self.assertEquals(set([("bla", 'somerevid')]), self._texts.keys())
230
self.assertEquals(1, len(ret))
231
self.assertEquals(None, ret[0][0])
232
self.assertEquals("bla", ret[0][1])
234
self.assertEquals("directory", ie.kind)
235
self.assertEquals(False, ie.executable)
236
self.assertEquals({}, ie.children)
237
self.assertEquals("somerevid", ie.revision)
238
self.assertEquals(None, ie.text_sha1)
240
def test_import_tree_with_file(self):
241
base_inv = Inventory()
242
blob = Blob.from_string("bar1")
244
tree.add(0100600, "foo", blob.id)
246
objects = { blob.id: blob, tree.id: tree }
247
ret = import_git_tree(self._texts, self._mapping, "bla", tree,
248
base_inv, None, "somerevid", [], self._map, objects.__getitem__)
249
self.assertEquals(2, len(ret))
250
self.assertEquals(None, ret[0][0])
251
self.assertEquals("bla", ret[0][1])
252
self.assertEquals(None, ret[1][0])
253
self.assertEquals("bla/foo", ret[1][1])
255
self.assertEquals("directory", ie.kind)
257
self.assertEquals("file", ie.kind)
258
self.assertEquals("bla/foo", ie.file_id)
259
self.assertEquals("somerevid", ie.revision)
260
self.assertEquals(osutils.sha_strings(["bar1"]), ie.text_sha1)
261
self.assertEquals(False, ie.executable)
263
def test_import_tree_with_file_exe(self):
264
base_inv = Inventory(root_id=None)
265
blob = Blob.from_string("bar")
267
tree.add(0100755, "foo", blob.id)
269
objects = { blob.id: blob, tree.id: tree }
270
ret = import_git_tree(self._texts, self._mapping, "", tree,
271
base_inv, None, "somerevid", [], self._map, objects.__getitem__)
272
self.assertEquals(2, len(ret))
273
self.assertEquals(None, ret[0][0])
274
self.assertEquals("", ret[0][1])
275
self.assertEquals(None, ret[1][0])
276
self.assertEquals("foo", ret[1][1])
278
self.assertEquals("directory", ie.kind)
280
self.assertEquals("file", ie.kind)
281
self.assertEquals(True, ie.executable)