59
class RepositoryFetchTests:
66
class RepositoryFetchTests(object):
61
68
def make_git_repo(self, path):
70
return GitRepo.init(os.path.abspath(path))
65
72
def clone_git_repo(self, from_url, to_url, revision_id=None):
66
73
oldrepos = self.open_git_repo(from_url)
88
95
path, gitsha = self.make_onerev_branch()
89
96
oldrepo = self.open_git_repo(path)
90
97
newrepo = self.clone_git_repo(path, "f")
91
self.assertEquals([oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)], newrepo.all_revision_ids())
98
revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
99
self.assertEquals([revid], newrepo.all_revision_ids())
93
101
def test_single_rev_specific(self):
94
102
path, gitsha = self.make_onerev_branch()
136
144
tree1 = newrepo.revision_tree(revid1)
137
145
tree2 = newrepo.revision_tree(revid2)
138
146
fileid = tree1.path2id("mylink")
139
ie1 = tree1.inventory[fileid]
140
ie2 = tree2.inventory[fileid]
141
self.assertEquals(revid1, ie1.revision)
142
self.assertEquals("directory", ie1.kind)
143
self.assertEquals(None, ie1.symlink_target)
144
self.assertEquals(revid2, ie2.revision)
145
self.assertEquals("symlink", ie2.kind)
146
self.assertEquals("target/", ie2.symlink_target)
147
self.assertEquals(revid1, tree1.get_file_revision(fileid))
148
self.assertEquals("directory", tree1.kind(fileid))
149
self.assertEquals(None, tree1.get_symlink_target(fileid))
150
self.assertEquals(revid2, tree2.get_file_revision(fileid))
151
self.assertEquals("symlink", tree2.kind(fileid))
152
self.assertEquals("target/", tree2.get_symlink_target(fileid))
148
154
def test_symlink_becomes_dir(self):
149
155
self.make_git_repo("d")
164
170
tree1 = newrepo.revision_tree(revid1)
165
171
tree2 = newrepo.revision_tree(revid2)
166
172
fileid = tree1.path2id("mylink")
167
ie1 = tree1.inventory[fileid]
168
ie2 = tree2.inventory[fileid]
169
self.assertEquals(revid1, ie1.revision)
170
self.assertEquals("symlink", ie1.kind)
171
self.assertEquals("target/", ie1.symlink_target)
172
self.assertEquals(revid2, ie2.revision)
173
self.assertEquals("directory", ie2.kind)
174
self.assertEquals(None, ie2.symlink_target)
173
self.assertEquals(revid1, tree1.get_file_revision(fileid))
174
self.assertEquals("symlink", tree1.kind(fileid))
175
self.assertEquals("target/", tree1.get_symlink_target(fileid))
176
self.assertEquals(revid2, tree2.get_file_revision(fileid))
177
self.assertEquals("directory", tree2.kind(fileid))
178
self.assertEquals(None, tree2.get_symlink_target(fileid))
176
180
def test_changing_symlink(self):
177
181
self.make_git_repo("d")
192
196
tree1 = newrepo.revision_tree(revid1)
193
197
tree2 = newrepo.revision_tree(revid2)
194
198
fileid = tree1.path2id("mylink")
195
ie1 = tree1.inventory[fileid]
196
ie2 = tree2.inventory[fileid]
197
self.assertEquals(revid1, ie1.revision)
198
self.assertEquals("target", ie1.symlink_target)
199
self.assertEquals(revid2, ie2.revision)
200
self.assertEquals("target/", ie2.symlink_target)
199
self.assertEquals(revid1, tree1.get_file_revision(fileid))
200
self.assertEquals("target", tree1.get_symlink_target(fileid))
201
self.assertEquals(revid2, tree2.get_file_revision(fileid))
202
self.assertEquals("target/", tree2.get_symlink_target(fileid))
202
204
def test_executable(self):
203
205
self.make_git_repo("d")
213
215
revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
214
216
tree = newrepo.revision_tree(revid)
215
217
self.assertTrue(tree.has_filename("foobar"))
216
self.assertEquals(True, tree.inventory[tree.path2id("foobar")].executable)
218
self.assertEquals(True, tree.is_executable(tree.path2id("foobar")))
217
219
self.assertTrue(tree.has_filename("notexec"))
218
self.assertEquals(False, tree.inventory[tree.path2id("notexec")].executable)
220
self.assertEquals(False, tree.is_executable(tree.path2id("notexec")))
220
222
def test_becomes_executable(self):
221
223
self.make_git_repo("d")
232
234
revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
233
235
tree = newrepo.revision_tree(revid)
234
236
self.assertTrue(tree.has_filename("foobar"))
235
ie = tree.inventory[tree.path2id("foobar")]
236
self.assertEquals(True, ie.executable)
237
self.assertEquals(revid, ie.revision)
237
fileid = tree.path2id("foobar")
238
self.assertEquals(True, tree.is_executable(fileid))
239
self.assertEquals(revid, tree.get_file_revision(fileid))
241
def test_into_stacked_on(self):
242
r = self.make_git_repo("d")
244
bb = GitBranchBuilder()
245
bb.set_file(u"foobar", "foo\n", False)
246
mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg1")
247
gitsha1 = bb.finish()[mark1]
249
stacked_on = self.clone_git_repo("d", "stacked-on")
250
oldrepo = Repository.open("d")
251
revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
252
self.assertEquals([revid1], stacked_on.all_revision_ids())
253
b = stacked_on.bzrdir.create_branch()
254
b.generate_revision_history(revid1)
255
self.assertEquals(b.last_revision(), revid1)
256
tree = self.make_branch_and_tree("stacked")
257
tree.branch.set_stacked_on_url(b.user_url)
259
bb = GitBranchBuilder()
260
bb.set_file(u"barbar", "bar\n", False)
261
bb.set_file(u"foo/blie/bla", "bla\n", False)
262
mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg2")
263
gitsha2 = bb.finish()[mark2]
264
revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
266
tree.branch.fetch(Branch.open("d"))
267
tree.branch.repository.check()
268
self.addCleanup(tree.lock_read().unlock)
271
tree.branch.repository.revisions.without_fallbacks().keys())
273
set([revid1, revid2]),
274
set(tree.branch.repository.all_revision_ids()))
239
276
def test_non_ascii_characters(self):
240
277
self.make_git_repo("d")
250
287
tree = newrepo.revision_tree(revid)
251
288
self.assertTrue(tree.has_filename(u"foőbar"))
290
def test_tagged_tree(self):
291
r = self.make_git_repo("d")
293
bb = GitBranchBuilder()
294
bb.set_file("foobar", "fooll\nbar\n", False)
295
mark = bb.commit("Somebody <somebody@someorg.org>", "nextmsg")
300
tag.tag_time = time.time()
302
tag.tagger = "Somebody <somebody@example.com>"
303
tag.message = "Created tag pointed at tree"
304
tag.object = (Tree, r[gitsha].tree)
305
r.object_store.add_object(tag)
306
r["refs/tags/sometag"] = tag
308
oldrepo = self.open_git_repo("d")
309
revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
310
newrepo = self.clone_git_repo("d", "f")
311
self.assertEquals(set([revid]), set(newrepo.all_revision_ids()))
254
314
class LocalRepositoryFetchTests(RepositoryFetchTests, TestCaseWithTransport):
339
399
base_inv = Inventory()
340
400
blob = Blob.from_string("bar1")
342
tree.add(stat.S_IFREG | 0644, "foo", blob.id)
402
tree.add("foo", stat.S_IFREG | 0644, blob.id)
343
403
objects = { blob.id: blob, tree.id: tree }
344
404
ret, child_modes = import_git_tree(self._texts, self._mapping, "bla", "bla",
345
405
(None, tree.id), base_inv, None, "somerevid", [],
364
424
base_inv = Inventory()
365
425
blob = Blob.from_string("bar1")
367
tree.add(stat.S_IFREG | 0664, "foo", blob.id)
427
tree.add("foo", stat.S_IFREG | 0664, blob.id)
368
428
objects = { blob.id: blob, tree.id: tree }
369
ret, child_modes = import_git_tree(self._texts, self._mapping, "bla", "bla",
370
(None, tree.id), base_inv, None, "somerevid", [],
429
ret, child_modes = import_git_tree(self._texts, self._mapping,
430
"bla", "bla", (None, tree.id), base_inv, None, "somerevid", [],
371
431
objects.__getitem__, (None, stat.S_IFDIR), DummyStoreUpdater(),
372
432
self._mapping.generate_file_id)
373
433
self.assertEquals(child_modes, { "bla/foo": stat.S_IFREG | 0664 })
376
436
base_inv = Inventory(root_id=None)
377
437
blob = Blob.from_string("bar")
379
tree.add(0100755, "foo", blob.id)
439
tree.add("foo", 0100755, blob.id)
380
440
objects = { blob.id: blob, tree.id: tree }
381
441
ret, child_modes = import_git_tree(self._texts, self._mapping, "", "",
382
442
(None, tree.id), base_inv, None, "somerevid", [],
394
454
self.assertEquals("file", ie.kind)
395
455
self.assertEquals(True, ie.executable)
457
def test_directory_converted_to_submodule(self):
458
base_inv = Inventory()
459
base_inv.add_path("foo", "directory")
460
base_inv.add_path("foo/bar", "file")
461
othertree = Blob.from_string("someotherthing")
462
blob = Blob.from_string("bar")
464
tree.add("bar", 0160000, blob.id)
465
objects = { tree.id: tree }
466
ret, child_modes = import_git_submodule(self._texts, self._mapping, "foo", "foo",
467
(tree.id, othertree.id), base_inv, base_inv.root.file_id, "somerevid", [],
468
objects.__getitem__, (stat.S_IFDIR | 0755, S_IFGITLINK), DummyStoreUpdater(),
469
self._mapping.generate_file_id)
470
self.assertEquals(child_modes, {})
471
self.assertEquals(2, len(ret))
472
self.assertEquals(ret[0], ("foo/bar", None, base_inv.path2id("foo/bar"), None))
473
self.assertEquals(ret[1][:3], ("foo", "foo", self._mapping.generate_file_id("foo")))
475
self.assertEquals(ie.kind, "tree-reference")