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
objs = { "blobname": blob}
193
ret = import_git_blob(self._texts, self._mapping, "bla", "blobname",
194
base_inv, None, "somerevid", [], self._map, objs.__getitem__, False)
195
self.assertEquals(set([('bla', 'somerevid')]), self._texts.keys())
196
self.assertEquals(self._texts.get_record_stream([('bla', 'somerevid')],
197
"unordered", True).next().get_bytes_as("fulltext"), "bar")
198
self.assertEquals(1, len(ret))
199
self.assertEquals(None, ret[0][0])
200
self.assertEquals("bla", ret[0][1])
202
self.assertEquals(False, ie.executable)
203
self.assertEquals("file", ie.kind)
204
self.assertEquals("somerevid", ie.revision)
205
self.assertEquals(osutils.sha_strings(["bar"]), ie.text_sha1)
207
def test_import_tree_empty_root(self):
208
base_inv = Inventory(root_id=None)
211
ret = import_git_tree(self._texts, self._mapping, "",
213
None, "somerevid", [], self._map, {tree.id: tree}.__getitem__)
214
self.assertEquals(set([("TREE_ROOT", 'somerevid')]), self._texts.keys())
215
self.assertEquals(1, len(ret))
216
self.assertEquals(None, ret[0][0])
217
self.assertEquals("", ret[0][1])
219
self.assertEquals(False, ie.executable)
220
self.assertEquals("directory", ie.kind)
221
self.assertEquals({}, ie.children)
222
self.assertEquals("somerevid", ie.revision)
223
self.assertEquals(None, ie.text_sha1)
225
def test_import_tree_empty(self):
226
base_inv = Inventory()
229
ret = import_git_tree(self._texts, self._mapping, "bla",
230
tree.id, base_inv, None, "somerevid", [],
231
self._map, { tree.id: tree }.__getitem__)
232
self.assertEquals(set([("bla", 'somerevid')]), self._texts.keys())
233
self.assertEquals(1, len(ret))
234
self.assertEquals(None, ret[0][0])
235
self.assertEquals("bla", ret[0][1])
237
self.assertEquals("directory", ie.kind)
238
self.assertEquals(False, ie.executable)
239
self.assertEquals({}, ie.children)
240
self.assertEquals("somerevid", ie.revision)
241
self.assertEquals(None, ie.text_sha1)
243
def test_import_tree_with_file(self):
244
base_inv = Inventory()
245
blob = Blob.from_string("bar1")
247
tree.add(0100600, "foo", blob.id)
249
objects = { blob.id: blob, tree.id: tree }
250
ret = import_git_tree(self._texts, self._mapping, "bla", tree.id,
251
base_inv, None, "somerevid", [], self._map, objects.__getitem__)
252
self.assertEquals(2, len(ret))
253
self.assertEquals(None, ret[0][0])
254
self.assertEquals("bla", ret[0][1])
255
self.assertEquals(None, ret[1][0])
256
self.assertEquals("bla/foo", ret[1][1])
258
self.assertEquals("directory", ie.kind)
260
self.assertEquals("file", ie.kind)
261
self.assertEquals("bla/foo", ie.file_id)
262
self.assertEquals("somerevid", ie.revision)
263
self.assertEquals(osutils.sha_strings(["bar1"]), ie.text_sha1)
264
self.assertEquals(False, ie.executable)
266
def test_import_tree_with_file_exe(self):
267
base_inv = Inventory(root_id=None)
268
blob = Blob.from_string("bar")
270
tree.add(0100755, "foo", blob.id)
272
objects = { blob.id: blob, tree.id: tree }
273
ret = import_git_tree(self._texts, self._mapping, "", tree.id,
274
base_inv, None, "somerevid", [], self._map, objects.__getitem__)
275
self.assertEquals(2, len(ret))
276
self.assertEquals(None, ret[0][0])
277
self.assertEquals("", ret[0][1])
278
self.assertEquals(None, ret[1][0])
279
self.assertEquals("foo", ret[1][1])
281
self.assertEquals("directory", ie.kind)
283
self.assertEquals("file", ie.kind)
284
self.assertEquals(True, ie.executable)