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 (
56
from bzrlib.plugins.git.shamap import (
59
from bzrlib.plugins.git.tests import (
64
class RepositoryFetchTests:
66
def make_git_repo(self, path):
70
def clone_git_repo(self, from_url, to_url, revision_id=None):
71
oldrepos = self.open_git_repo(from_url)
72
dir = BzrDir.create(to_url, get_rich_root_format())
73
newrepos = dir.create_repository()
74
oldrepos.copy_content_into(newrepos, revision_id=revision_id)
78
self.make_git_repo("d")
79
newrepos = self.clone_git_repo("d", "f")
80
self.assertEquals([], newrepos.all_revision_ids())
82
def make_onerev_branch(self):
83
self.make_git_repo("d")
85
bb = GitBranchBuilder()
86
bb.set_file("foobar", "foo\nbar\n", False)
87
mark = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
88
gitsha = bb.finish()[mark]
92
def test_single_rev(self):
93
path, gitsha = self.make_onerev_branch()
94
oldrepo = self.open_git_repo(path)
95
newrepo = self.clone_git_repo(path, "f")
96
self.assertEquals([oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)], newrepo.all_revision_ids())
98
def test_single_rev_specific(self):
99
path, gitsha = self.make_onerev_branch()
100
oldrepo = self.open_git_repo(path)
101
revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
102
newrepo = self.clone_git_repo(path, "f", revision_id=revid)
103
self.assertEquals([revid], newrepo.all_revision_ids())
105
def test_incremental(self):
106
self.make_git_repo("d")
108
bb = GitBranchBuilder()
109
bb.set_file("foobar", "foo\nbar\n", False)
110
mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
111
bb.set_file("foobar", "fooll\nbar\n", False)
112
mark2 = bb.commit("Somebody <somebody@someorg.org>", "nextmsg")
114
gitsha1 = marks[mark1]
115
gitsha2 = marks[mark2]
117
oldrepo = self.open_git_repo("d")
118
revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
119
newrepo = self.clone_git_repo("d", "f", revision_id=revid1)
120
self.assertEquals([revid1], newrepo.all_revision_ids())
121
revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
122
newrepo.fetch(oldrepo, revision_id=revid2)
123
self.assertEquals(set([revid1, revid2]), set(newrepo.all_revision_ids()))
125
def test_dir_becomes_symlink(self):
126
self.make_git_repo("d")
128
bb = GitBranchBuilder()
129
bb.set_file("mylink/somefile", "foo\nbar\n", False)
130
mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg1")
131
bb.set_symlink("mylink", "target/")
132
mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg2")
134
gitsha1 = marks[mark1]
135
gitsha2 = marks[mark2]
137
oldrepo = self.open_git_repo("d")
138
newrepo = self.clone_git_repo("d", "f")
139
revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
140
revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
141
tree1 = newrepo.revision_tree(revid1)
142
tree2 = newrepo.revision_tree(revid2)
143
fileid = tree1.path2id("mylink")
144
ie1 = tree1.inventory[fileid]
145
ie2 = tree2.inventory[fileid]
146
self.assertEquals(revid1, ie1.revision)
147
self.assertEquals("directory", ie1.kind)
148
self.assertEquals(None, ie1.symlink_target)
149
self.assertEquals(revid2, ie2.revision)
150
self.assertEquals("symlink", ie2.kind)
151
self.assertEquals("target/", ie2.symlink_target)
153
def test_symlink_becomes_dir(self):
154
self.make_git_repo("d")
156
bb = GitBranchBuilder()
157
bb.set_symlink("mylink", "target/")
158
mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg1")
159
bb.set_file("mylink/somefile", "foo\nbar\n", False)
160
mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg2")
162
gitsha1 = marks[mark1]
163
gitsha2 = marks[mark2]
165
oldrepo = self.open_git_repo("d")
166
newrepo = self.clone_git_repo("d", "f")
167
revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
168
revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
169
tree1 = newrepo.revision_tree(revid1)
170
tree2 = newrepo.revision_tree(revid2)
171
fileid = tree1.path2id("mylink")
172
ie1 = tree1.inventory[fileid]
173
ie2 = tree2.inventory[fileid]
174
self.assertEquals(revid1, ie1.revision)
175
self.assertEquals("symlink", ie1.kind)
176
self.assertEquals("target/", ie1.symlink_target)
177
self.assertEquals(revid2, ie2.revision)
178
self.assertEquals("directory", ie2.kind)
179
self.assertEquals(None, ie2.symlink_target)
181
def test_changing_symlink(self):
182
self.make_git_repo("d")
184
bb = GitBranchBuilder()
185
bb.set_symlink("mylink", "target")
186
mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg1")
187
bb.set_symlink("mylink", "target/")
188
mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg2")
190
gitsha1 = marks[mark1]
191
gitsha2 = marks[mark2]
193
oldrepo = self.open_git_repo("d")
194
newrepo = self.clone_git_repo("d", "f")
195
revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
196
revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
197
tree1 = newrepo.revision_tree(revid1)
198
tree2 = newrepo.revision_tree(revid2)
199
fileid = tree1.path2id("mylink")
200
ie1 = tree1.inventory[fileid]
201
ie2 = tree2.inventory[fileid]
202
self.assertEquals(revid1, ie1.revision)
203
self.assertEquals("target", ie1.symlink_target)
204
self.assertEquals(revid2, ie2.revision)
205
self.assertEquals("target/", ie2.symlink_target)
207
def test_executable(self):
208
self.make_git_repo("d")
210
bb = GitBranchBuilder()
211
bb.set_file("foobar", "foo\nbar\n", True)
212
bb.set_file("notexec", "foo\nbar\n", False)
213
mark = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
214
gitsha = bb.finish()[mark]
216
oldrepo = self.open_git_repo("d")
217
newrepo = self.clone_git_repo("d", "f")
218
revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
219
tree = newrepo.revision_tree(revid)
220
self.assertTrue(tree.has_filename("foobar"))
221
self.assertEquals(True, tree.inventory[tree.path2id("foobar")].executable)
222
self.assertTrue(tree.has_filename("notexec"))
223
self.assertEquals(False, tree.inventory[tree.path2id("notexec")].executable)
225
def test_becomes_executable(self):
226
self.make_git_repo("d")
228
bb = GitBranchBuilder()
229
bb.set_file("foobar", "foo\nbar\n", False)
230
mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
231
bb.set_file("foobar", "foo\nbar\n", True)
232
mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
233
gitsha2 = bb.finish()[mark2]
235
oldrepo = self.open_git_repo("d")
236
newrepo = self.clone_git_repo("d", "f")
237
revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
238
tree = newrepo.revision_tree(revid)
239
self.assertTrue(tree.has_filename("foobar"))
240
ie = tree.inventory[tree.path2id("foobar")]
241
self.assertEquals(True, ie.executable)
242
self.assertEquals(revid, ie.revision)
244
def test_non_ascii_characters(self):
245
self.make_git_repo("d")
247
bb = GitBranchBuilder()
248
bb.set_file(u"foőbar", "foo\nbar\n", False)
249
mark = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
250
gitsha = bb.finish()[mark]
252
oldrepo = self.open_git_repo("d")
253
newrepo = self.clone_git_repo("d", "f")
254
revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
255
tree = newrepo.revision_tree(revid)
256
self.assertTrue(tree.has_filename(u"foőbar"))
259
class LocalRepositoryFetchTests(RepositoryFetchTests, TestCaseWithTransport):
261
def open_git_repo(self, path):
262
return Repository.open(path)
265
class ImportObjects(TestCaseWithTransport):
268
super(ImportObjects, self).setUp()
269
self._mapping = BzrGitMappingv1()
270
factory = knit.make_file_factory(True, versionedfile.PrefixMapper())
271
self._texts = factory(self.get_transport('texts'))
273
def test_import_blob_simple(self):
274
blob = Blob.from_string("bar")
275
base_inv = Inventory()
276
objs = { "blobname": blob}
277
ret, _= import_git_blob(self._texts, self._mapping, "bla", "blobname",
278
base_inv, None, None, None, "somerevid", [], objs.__getitem__, False,
280
self.assertEquals(set([('bla', 'somerevid')]), self._texts.keys())
281
self.assertEquals(self._texts.get_record_stream([('bla', 'somerevid')],
282
"unordered", True).next().get_bytes_as("fulltext"), "bar")
283
self.assertEquals(1, len(ret))
284
self.assertEquals(None, ret[0][0])
285
self.assertEquals("bla", ret[0][1])
287
self.assertEquals(False, ie.executable)
288
self.assertEquals("file", ie.kind)
289
self.assertEquals("somerevid", ie.revision)
290
self.assertEquals(osutils.sha_strings(["bar"]), ie.text_sha1)
292
def test_import_tree_empty_root(self):
293
base_inv = Inventory(root_id=None)
296
ret, _, _ = import_git_tree(self._texts, self._mapping, "",
297
tree.id, base_inv, None, None,
298
None, "somerevid", [], {tree.id: tree}.__getitem__)
299
self.assertEquals(set([("TREE_ROOT", 'somerevid')]), self._texts.keys())
300
self.assertEquals(1, len(ret))
301
self.assertEquals(None, ret[0][0])
302
self.assertEquals("", ret[0][1])
304
self.assertEquals(False, ie.executable)
305
self.assertEquals("directory", ie.kind)
306
self.assertEquals({}, ie.children)
307
self.assertEquals("somerevid", ie.revision)
308
self.assertEquals(None, ie.text_sha1)
310
def test_import_tree_empty(self):
311
base_inv = Inventory()
314
ret, _, _ = import_git_tree(self._texts, self._mapping, "bla",
315
tree.id, base_inv, None, None, None, "somerevid", [],
316
{ tree.id: tree }.__getitem__)
317
self.assertEquals(set([("bla", 'somerevid')]), self._texts.keys())
318
self.assertEquals(1, len(ret))
319
self.assertEquals(None, ret[0][0])
320
self.assertEquals("bla", ret[0][1])
322
self.assertEquals("directory", ie.kind)
323
self.assertEquals(False, ie.executable)
324
self.assertEquals({}, ie.children)
325
self.assertEquals("somerevid", ie.revision)
326
self.assertEquals(None, ie.text_sha1)
328
def test_import_tree_with_file(self):
329
base_inv = Inventory()
330
blob = Blob.from_string("bar1")
332
tree.add(0100600, "foo", blob.id)
334
objects = { blob.id: blob, tree.id: tree }
335
ret, _, _ = import_git_tree(self._texts, self._mapping, "bla", tree.id,
336
base_inv, None, None, None, "somerevid", [], objects.__getitem__)
337
self.assertEquals(2, len(ret))
338
self.assertEquals(None, ret[0][0])
339
self.assertEquals("bla", ret[0][1])
340
self.assertEquals(None, ret[1][0])
341
self.assertEquals("bla/foo", ret[1][1])
343
self.assertEquals("directory", ie.kind)
345
self.assertEquals("file", ie.kind)
346
self.assertEquals("bla/foo", ie.file_id)
347
self.assertEquals("somerevid", ie.revision)
348
self.assertEquals(osutils.sha_strings(["bar1"]), ie.text_sha1)
349
self.assertEquals(False, ie.executable)
351
def test_import_tree_with_file_exe(self):
352
base_inv = Inventory(root_id=None)
353
blob = Blob.from_string("bar")
355
tree.add(0100755, "foo", blob.id)
357
objects = { blob.id: blob, tree.id: tree }
358
ret, _, _ = import_git_tree(self._texts, self._mapping, "", tree.id,
359
base_inv, None, None, None, "somerevid", [], objects.__getitem__)
360
self.assertEquals(2, len(ret))
361
self.assertEquals(None, ret[0][0])
362
self.assertEquals("", ret[0][1])
363
self.assertEquals(None, ret[1][0])
364
self.assertEquals("foo", ret[1][1])
366
self.assertEquals("directory", ie.kind)
368
self.assertEquals("file", ie.kind)
369
self.assertEquals(True, ie.executable)