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 (
22
from dulwich.repo import (
32
from bzrlib.bzrdir import (
35
from bzrlib.inventory import (
38
from bzrlib.repository import (
41
from bzrlib.tests import (
42
TestCaseWithTransport,
45
from bzrlib.plugins.git import (
48
from bzrlib.plugins.git.fetch import (
52
from bzrlib.plugins.git.mapping import (
55
from bzrlib.plugins.git.tests import (
60
class RepositoryFetchTests:
62
def make_git_repo(self, path):
66
def clone_git_repo(self, from_url, to_url, revision_id=None):
67
oldrepos = self.open_git_repo(from_url)
68
dir = BzrDir.create(to_url, get_rich_root_format())
69
newrepos = dir.create_repository()
70
oldrepos.copy_content_into(newrepos, revision_id=revision_id)
74
self.make_git_repo("d")
75
newrepos = self.clone_git_repo("d", "f")
76
self.assertEquals([], newrepos.all_revision_ids())
78
def make_onerev_branch(self):
79
self.make_git_repo("d")
81
bb = GitBranchBuilder()
82
bb.set_file("foobar", "foo\nbar\n", False)
83
mark = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
84
gitsha = bb.finish()[mark]
88
def test_single_rev(self):
89
path, gitsha = self.make_onerev_branch()
90
oldrepo = self.open_git_repo(path)
91
newrepo = self.clone_git_repo(path, "f")
92
self.assertEquals([oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)], newrepo.all_revision_ids())
94
def test_single_rev_specific(self):
95
path, gitsha = self.make_onerev_branch()
96
oldrepo = self.open_git_repo(path)
97
revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
98
newrepo = self.clone_git_repo(path, "f", revision_id=revid)
99
self.assertEquals([revid], newrepo.all_revision_ids())
101
def test_incremental(self):
102
self.make_git_repo("d")
104
bb = GitBranchBuilder()
105
bb.set_file("foobar", "foo\nbar\n", False)
106
mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
107
bb.set_file("foobar", "fooll\nbar\n", False)
108
mark2 = bb.commit("Somebody <somebody@someorg.org>", "nextmsg")
110
gitsha1 = marks[mark1]
111
gitsha2 = marks[mark2]
113
oldrepo = self.open_git_repo("d")
114
revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
115
newrepo = self.clone_git_repo("d", "f", revision_id=revid1)
116
self.assertEquals([revid1], newrepo.all_revision_ids())
117
revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
118
newrepo.fetch(oldrepo, revision_id=revid2)
119
self.assertEquals(set([revid1, revid2]), set(newrepo.all_revision_ids()))
121
def test_dir_becomes_symlink(self):
122
self.make_git_repo("d")
124
bb = GitBranchBuilder()
125
bb.set_file("mylink/somefile", "foo\nbar\n", False)
126
mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg1")
127
bb.set_symlink("mylink", "target/")
128
mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg2")
130
gitsha1 = marks[mark1]
131
gitsha2 = marks[mark2]
133
oldrepo = self.open_git_repo("d")
134
newrepo = self.clone_git_repo("d", "f")
135
revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
136
revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
137
tree1 = newrepo.revision_tree(revid1)
138
tree2 = newrepo.revision_tree(revid2)
139
fileid = tree1.path2id("mylink")
140
ie1 = tree1.inventory[fileid]
141
ie2 = tree2.inventory[fileid]
142
self.assertEquals(revid1, ie1.revision)
143
self.assertEquals("directory", ie1.kind)
144
self.assertEquals(None, ie1.symlink_target)
145
self.assertEquals(revid2, ie2.revision)
146
self.assertEquals("symlink", ie2.kind)
147
self.assertEquals("target/", ie2.symlink_target)
149
def test_symlink_becomes_dir(self):
150
self.make_git_repo("d")
152
bb = GitBranchBuilder()
153
bb.set_symlink("mylink", "target/")
154
mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg1")
155
bb.set_file("mylink/somefile", "foo\nbar\n", False)
156
mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg2")
158
gitsha1 = marks[mark1]
159
gitsha2 = marks[mark2]
161
oldrepo = self.open_git_repo("d")
162
newrepo = self.clone_git_repo("d", "f")
163
revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
164
revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
165
tree1 = newrepo.revision_tree(revid1)
166
tree2 = newrepo.revision_tree(revid2)
167
fileid = tree1.path2id("mylink")
168
ie1 = tree1.inventory[fileid]
169
ie2 = tree2.inventory[fileid]
170
self.assertEquals(revid1, ie1.revision)
171
self.assertEquals("symlink", ie1.kind)
172
self.assertEquals("target/", ie1.symlink_target)
173
self.assertEquals(revid2, ie2.revision)
174
self.assertEquals("directory", ie2.kind)
175
self.assertEquals(None, ie2.symlink_target)
177
def test_changing_symlink(self):
178
self.make_git_repo("d")
180
bb = GitBranchBuilder()
181
bb.set_symlink("mylink", "target")
182
mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg1")
183
bb.set_symlink("mylink", "target/")
184
mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg2")
186
gitsha1 = marks[mark1]
187
gitsha2 = marks[mark2]
189
oldrepo = self.open_git_repo("d")
190
newrepo = self.clone_git_repo("d", "f")
191
revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
192
revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
193
tree1 = newrepo.revision_tree(revid1)
194
tree2 = newrepo.revision_tree(revid2)
195
fileid = tree1.path2id("mylink")
196
ie1 = tree1.inventory[fileid]
197
ie2 = tree2.inventory[fileid]
198
self.assertEquals(revid1, ie1.revision)
199
self.assertEquals("target", ie1.symlink_target)
200
self.assertEquals(revid2, ie2.revision)
201
self.assertEquals("target/", ie2.symlink_target)
203
def test_executable(self):
204
self.make_git_repo("d")
206
bb = GitBranchBuilder()
207
bb.set_file("foobar", "foo\nbar\n", True)
208
bb.set_file("notexec", "foo\nbar\n", False)
209
mark = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
210
gitsha = bb.finish()[mark]
212
oldrepo = self.open_git_repo("d")
213
newrepo = self.clone_git_repo("d", "f")
214
revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
215
tree = newrepo.revision_tree(revid)
216
self.assertTrue(tree.has_filename("foobar"))
217
self.assertEquals(True, tree.inventory[tree.path2id("foobar")].executable)
218
self.assertTrue(tree.has_filename("notexec"))
219
self.assertEquals(False, tree.inventory[tree.path2id("notexec")].executable)
221
def test_becomes_executable(self):
222
self.make_git_repo("d")
224
bb = GitBranchBuilder()
225
bb.set_file("foobar", "foo\nbar\n", False)
226
mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
227
bb.set_file("foobar", "foo\nbar\n", True)
228
mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
229
gitsha2 = bb.finish()[mark2]
231
oldrepo = self.open_git_repo("d")
232
newrepo = self.clone_git_repo("d", "f")
233
revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
234
tree = newrepo.revision_tree(revid)
235
self.assertTrue(tree.has_filename("foobar"))
236
ie = tree.inventory[tree.path2id("foobar")]
237
self.assertEquals(True, ie.executable)
238
self.assertEquals(revid, ie.revision)
240
def test_non_ascii_characters(self):
241
self.make_git_repo("d")
243
bb = GitBranchBuilder()
244
bb.set_file(u"foőbar", "foo\nbar\n", False)
245
mark = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
246
gitsha = bb.finish()[mark]
248
oldrepo = self.open_git_repo("d")
249
newrepo = self.clone_git_repo("d", "f")
250
revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
251
tree = newrepo.revision_tree(revid)
252
self.assertTrue(tree.has_filename(u"foőbar"))
255
class LocalRepositoryFetchTests(RepositoryFetchTests, TestCaseWithTransport):
257
def open_git_repo(self, path):
258
return Repository.open(path)
261
class ImportObjects(TestCaseWithTransport):
264
super(ImportObjects, self).setUp()
265
self._mapping = BzrGitMappingv1()
266
factory = knit.make_file_factory(True, versionedfile.PrefixMapper())
267
self._texts = factory(self.get_transport('texts'))
269
def test_import_blob_simple(self):
270
blob = Blob.from_string("bar")
271
base_inv = Inventory()
272
objs = { "blobname": blob}
273
ret, _= import_git_blob(self._texts, self._mapping, "bla", "blobname",
274
None, base_inv, None, None, None, "somerevid", [], objs.__getitem__, False,
276
self.assertEquals(set([('bla', 'somerevid')]), self._texts.keys())
277
self.assertEquals(self._texts.get_record_stream([('bla', 'somerevid')],
278
"unordered", True).next().get_bytes_as("fulltext"), "bar")
279
self.assertEquals(1, len(ret))
280
self.assertEquals(None, ret[0][0])
281
self.assertEquals("bla", ret[0][1])
283
self.assertEquals(False, ie.executable)
284
self.assertEquals("file", ie.kind)
285
self.assertEquals("somerevid", ie.revision)
286
self.assertEquals(osutils.sha_strings(["bar"]), ie.text_sha1)
288
def test_import_tree_empty_root(self):
289
base_inv = Inventory(root_id=None)
292
ret, _, _ = import_git_tree(self._texts, self._mapping, "",
293
tree.id, None, base_inv, None, None,
294
None, "somerevid", [], {tree.id: tree}.__getitem__)
295
self.assertEquals(set([("TREE_ROOT", 'somerevid')]), self._texts.keys())
296
self.assertEquals(1, len(ret))
297
self.assertEquals(None, ret[0][0])
298
self.assertEquals("", ret[0][1])
300
self.assertEquals(False, ie.executable)
301
self.assertEquals("directory", ie.kind)
302
self.assertEquals({}, ie.children)
303
self.assertEquals("somerevid", ie.revision)
304
self.assertEquals(None, ie.text_sha1)
306
def test_import_tree_empty(self):
307
base_inv = Inventory()
310
ret, _, _ = import_git_tree(self._texts, self._mapping, "bla",
311
tree.id, None, base_inv, None, None, None, "somerevid", [],
312
{ tree.id: tree }.__getitem__)
313
self.assertEquals(set([("bla", 'somerevid')]), self._texts.keys())
314
self.assertEquals(1, len(ret))
315
self.assertEquals(None, ret[0][0])
316
self.assertEquals("bla", ret[0][1])
318
self.assertEquals("directory", ie.kind)
319
self.assertEquals(False, ie.executable)
320
self.assertEquals({}, ie.children)
321
self.assertEquals("somerevid", ie.revision)
322
self.assertEquals(None, ie.text_sha1)
324
def test_import_tree_with_file(self):
325
base_inv = Inventory()
326
blob = Blob.from_string("bar1")
328
tree.add(0100600, "foo", blob.id)
330
objects = { blob.id: blob, tree.id: tree }
331
ret, _, _ = import_git_tree(self._texts, self._mapping, "bla", tree.id,
332
None, base_inv, None, None, None, "somerevid", [],
334
self.assertEquals(2, len(ret))
335
self.assertEquals(None, ret[0][0])
336
self.assertEquals("bla", ret[0][1])
337
self.assertEquals(None, ret[1][0])
338
self.assertEquals("bla/foo", ret[1][1])
340
self.assertEquals("directory", ie.kind)
342
self.assertEquals("file", ie.kind)
343
self.assertEquals("bla/foo", ie.file_id)
344
self.assertEquals("somerevid", ie.revision)
345
self.assertEquals(osutils.sha_strings(["bar1"]), ie.text_sha1)
346
self.assertEquals(False, ie.executable)
348
def test_import_tree_with_file_exe(self):
349
base_inv = Inventory(root_id=None)
350
blob = Blob.from_string("bar")
352
tree.add(0100755, "foo", blob.id)
354
objects = { blob.id: blob, tree.id: tree }
355
ret, _, _ = import_git_tree(self._texts, self._mapping, "", tree.id,
356
None, base_inv, None, None, None, "somerevid", [],
358
self.assertEquals(2, len(ret))
359
self.assertEquals(None, ret[0][0])
360
self.assertEquals("", ret[0][1])
361
self.assertEquals(None, ret[1][0])
362
self.assertEquals("foo", ret[1][1])
364
self.assertEquals("directory", ie.kind)
366
self.assertEquals("file", ie.kind)
367
self.assertEquals(True, ie.executable)