/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.196 by Jelmer Vernooij
Add simple tests and docstrings for GraphWalker.
1
# Copyright (C) 2009 Jelmer Vernooij <jelmer@samba.org>
0.200.298 by Jelmer Vernooij
Add test for non-ascii characters.
2
# -*- coding: utf-8 -*-
0.200.196 by Jelmer Vernooij
Add simple tests and docstrings for GraphWalker.
3
#
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.
8
#
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.
13
#
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
17
0.200.264 by Jelmer Vernooij
Add more tests.
18
from dulwich.objects import (
19
    Blob,
0.200.265 by Jelmer Vernooij
Add more tests.
20
    Tree,
0.200.264 by Jelmer Vernooij
Add more tests.
21
    )
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
22
from dulwich.repo import (
23
    Repo as GitRepo,
24
    )
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
25
import os
0.200.817 by Jelmer Vernooij
Deal with all modes locally.
26
import stat
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
27
0.200.264 by Jelmer Vernooij
Add more tests.
28
from bzrlib import (
29
    knit,
0.200.265 by Jelmer Vernooij
Add more tests.
30
    osutils,
0.200.264 by Jelmer Vernooij
Add more tests.
31
    versionedfile,
32
    )
33
from bzrlib.bzrdir import (
34
    BzrDir,
35
    )
36
from bzrlib.inventory import (
37
    Inventory,
38
    )
39
from bzrlib.repository import (
40
    Repository,
41
    )
42
from bzrlib.tests import (
43
    TestCaseWithTransport,
44
    )
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
45
46
from bzrlib.plugins.git import (
47
    get_rich_root_format,
48
    )
0.200.264 by Jelmer Vernooij
Add more tests.
49
from bzrlib.plugins.git.fetch import (
50
    import_git_blob,
51
    import_git_tree,
52
    )
53
from bzrlib.plugins.git.mapping import (
54
    BzrGitMappingv1,
0.200.816 by Jelmer Vernooij
Leave mode handling for blobs to import_git_blob.
55
    DEFAULT_FILE_MODE,
0.200.264 by Jelmer Vernooij
Add more tests.
56
    )
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
57
from bzrlib.plugins.git.tests import (
58
    GitBranchBuilder,
59
    )
0.200.196 by Jelmer Vernooij
Add simple tests and docstrings for GraphWalker.
60
61
0.200.269 by Jelmer Vernooij
Prepare for testing remote repos.
62
class RepositoryFetchTests:
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
63
64
    def make_git_repo(self, path):
65
        os.mkdir(path)
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
66
        GitRepo.init(path)
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
67
0.200.268 by Jelmer Vernooij
Add more fetch tests.
68
    def clone_git_repo(self, from_url, to_url, revision_id=None):
69
        oldrepos = self.open_git_repo(from_url)
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
70
        dir = BzrDir.create(to_url, get_rich_root_format())
71
        newrepos = dir.create_repository()
0.200.268 by Jelmer Vernooij
Add more fetch tests.
72
        oldrepos.copy_content_into(newrepos, revision_id=revision_id)
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
73
        return newrepos
74
75
    def test_empty(self):
76
        self.make_git_repo("d")
77
        newrepos = self.clone_git_repo("d", "f")
78
        self.assertEquals([], newrepos.all_revision_ids())
79
0.200.268 by Jelmer Vernooij
Add more fetch tests.
80
    def make_onerev_branch(self):
81
        self.make_git_repo("d")
82
        os.chdir("d")
83
        bb = GitBranchBuilder()
84
        bb.set_file("foobar", "foo\nbar\n", False)
85
        mark = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
86
        gitsha = bb.finish()[mark]
87
        os.chdir("..")
88
        return "d", gitsha
89
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
90
    def test_single_rev(self):
0.200.268 by Jelmer Vernooij
Add more fetch tests.
91
        path, gitsha = self.make_onerev_branch()
92
        oldrepo = self.open_git_repo(path)
93
        newrepo = self.clone_git_repo(path, "f")
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
94
        self.assertEquals([oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)], newrepo.all_revision_ids())
95
0.200.268 by Jelmer Vernooij
Add more fetch tests.
96
    def test_single_rev_specific(self):
97
        path, gitsha = self.make_onerev_branch()
98
        oldrepo = self.open_git_repo(path)
99
        revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
100
        newrepo = self.clone_git_repo(path, "f", revision_id=revid)
101
        self.assertEquals([revid], newrepo.all_revision_ids())
102
103
    def test_incremental(self):
104
        self.make_git_repo("d")
105
        os.chdir("d")
106
        bb = GitBranchBuilder()
107
        bb.set_file("foobar", "foo\nbar\n", False)
108
        mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
109
        bb.set_file("foobar", "fooll\nbar\n", False)
110
        mark2 = bb.commit("Somebody <somebody@someorg.org>", "nextmsg")
111
        marks = bb.finish()
112
        gitsha1 = marks[mark1]
113
        gitsha2 = marks[mark2]
114
        os.chdir("..")
115
        oldrepo = self.open_git_repo("d")
116
        revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
117
        newrepo = self.clone_git_repo("d", "f", revision_id=revid1)
118
        self.assertEquals([revid1], newrepo.all_revision_ids())
119
        revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
120
        newrepo.fetch(oldrepo, revision_id=revid2)
0.200.269 by Jelmer Vernooij
Prepare for testing remote repos.
121
        self.assertEquals(set([revid1, revid2]), set(newrepo.all_revision_ids()))
0.200.268 by Jelmer Vernooij
Add more fetch tests.
122
0.200.552 by Jelmer Vernooij
Cope with directories becoming symlinks.
123
    def test_dir_becomes_symlink(self):
124
        self.make_git_repo("d")
125
        os.chdir("d")
126
        bb = GitBranchBuilder()
127
        bb.set_file("mylink/somefile", "foo\nbar\n", False)
128
        mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg1")
129
        bb.set_symlink("mylink", "target/")
130
        mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg2")
131
        marks = bb.finish()
132
        gitsha1 = marks[mark1]
133
        gitsha2 = marks[mark2]
134
        os.chdir("..")
135
        oldrepo = self.open_git_repo("d")
136
        newrepo = self.clone_git_repo("d", "f")
137
        revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
138
        revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
139
        tree1 = newrepo.revision_tree(revid1)
140
        tree2 = newrepo.revision_tree(revid2)
141
        fileid = tree1.path2id("mylink")
142
        ie1 = tree1.inventory[fileid]
143
        ie2 = tree2.inventory[fileid]
144
        self.assertEquals(revid1, ie1.revision)
145
        self.assertEquals("directory", ie1.kind)
146
        self.assertEquals(None, ie1.symlink_target)
147
        self.assertEquals(revid2, ie2.revision)
148
        self.assertEquals("symlink", ie2.kind)
149
        self.assertEquals("target/", ie2.symlink_target)
150
0.200.553 by Jelmer Vernooij
Support symlinks being turned into directories.
151
    def test_symlink_becomes_dir(self):
152
        self.make_git_repo("d")
153
        os.chdir("d")
154
        bb = GitBranchBuilder()
155
        bb.set_symlink("mylink", "target/")
156
        mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg1")
157
        bb.set_file("mylink/somefile", "foo\nbar\n", False)
158
        mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg2")
159
        marks = bb.finish()
160
        gitsha1 = marks[mark1]
161
        gitsha2 = marks[mark2]
162
        os.chdir("..")
163
        oldrepo = self.open_git_repo("d")
164
        newrepo = self.clone_git_repo("d", "f")
165
        revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
166
        revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
167
        tree1 = newrepo.revision_tree(revid1)
168
        tree2 = newrepo.revision_tree(revid2)
169
        fileid = tree1.path2id("mylink")
170
        ie1 = tree1.inventory[fileid]
171
        ie2 = tree2.inventory[fileid]
172
        self.assertEquals(revid1, ie1.revision)
173
        self.assertEquals("symlink", ie1.kind)
174
        self.assertEquals("target/", ie1.symlink_target)
175
        self.assertEquals(revid2, ie2.revision)
176
        self.assertEquals("directory", ie2.kind)
177
        self.assertEquals(None, ie2.symlink_target)
178
0.200.551 by Jelmer Vernooij
Properly set InventoryEntry revision when changing symlink targets.
179
    def test_changing_symlink(self):
180
        self.make_git_repo("d")
181
        os.chdir("d")
182
        bb = GitBranchBuilder()
183
        bb.set_symlink("mylink", "target")
184
        mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg1")
185
        bb.set_symlink("mylink", "target/")
186
        mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg2")
187
        marks = bb.finish()
188
        gitsha1 = marks[mark1]
189
        gitsha2 = marks[mark2]
190
        os.chdir("..")
191
        oldrepo = self.open_git_repo("d")
192
        newrepo = self.clone_git_repo("d", "f")
193
        revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
194
        revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
195
        tree1 = newrepo.revision_tree(revid1)
196
        tree2 = newrepo.revision_tree(revid2)
197
        fileid = tree1.path2id("mylink")
198
        ie1 = tree1.inventory[fileid]
199
        ie2 = tree2.inventory[fileid]
200
        self.assertEquals(revid1, ie1.revision)
201
        self.assertEquals("target", ie1.symlink_target)
202
        self.assertEquals(revid2, ie2.revision)
203
        self.assertEquals("target/", ie2.symlink_target)
204
0.228.2 by Jelmer Vernooij
Add test for fetching executables.
205
    def test_executable(self):
206
        self.make_git_repo("d")
207
        os.chdir("d")
208
        bb = GitBranchBuilder()
209
        bb.set_file("foobar", "foo\nbar\n", True)
210
        bb.set_file("notexec", "foo\nbar\n", False)
211
        mark = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
212
        gitsha = bb.finish()[mark]
213
        os.chdir("..")
0.200.268 by Jelmer Vernooij
Add more fetch tests.
214
        oldrepo = self.open_git_repo("d")
0.228.2 by Jelmer Vernooij
Add test for fetching executables.
215
        newrepo = self.clone_git_repo("d", "f")
216
        revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
217
        tree = newrepo.revision_tree(revid)
218
        self.assertTrue(tree.has_filename("foobar"))
219
        self.assertEquals(True, tree.inventory[tree.path2id("foobar")].executable)
220
        self.assertTrue(tree.has_filename("notexec"))
221
        self.assertEquals(False, tree.inventory[tree.path2id("notexec")].executable)
0.200.264 by Jelmer Vernooij
Add more tests.
222
0.200.537 by Jelmer Vernooij
Fix handling of not-executable files becoming executable without any other changes.
223
    def test_becomes_executable(self):
224
        self.make_git_repo("d")
225
        os.chdir("d")
226
        bb = GitBranchBuilder()
227
        bb.set_file("foobar", "foo\nbar\n", False)
228
        mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
229
        bb.set_file("foobar", "foo\nbar\n", True)
230
        mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
231
        gitsha2 = bb.finish()[mark2]
232
        os.chdir("..")
233
        oldrepo = self.open_git_repo("d")
234
        newrepo = self.clone_git_repo("d", "f")
235
        revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
236
        tree = newrepo.revision_tree(revid)
237
        self.assertTrue(tree.has_filename("foobar"))
238
        ie = tree.inventory[tree.path2id("foobar")]
239
        self.assertEquals(True, ie.executable)
240
        self.assertEquals(revid, ie.revision)
241
0.200.298 by Jelmer Vernooij
Add test for non-ascii characters.
242
    def test_non_ascii_characters(self):
243
        self.make_git_repo("d")
244
        os.chdir("d")
245
        bb = GitBranchBuilder()
246
        bb.set_file(u"foőbar", "foo\nbar\n", False)
247
        mark = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
248
        gitsha = bb.finish()[mark]
249
        os.chdir("..")
250
        oldrepo = self.open_git_repo("d")
251
        newrepo = self.clone_git_repo("d", "f")
252
        revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
253
        tree = newrepo.revision_tree(revid)
254
        self.assertTrue(tree.has_filename(u"foőbar"))
255
0.200.264 by Jelmer Vernooij
Add more tests.
256
0.200.269 by Jelmer Vernooij
Prepare for testing remote repos.
257
class LocalRepositoryFetchTests(RepositoryFetchTests, TestCaseWithTransport):
258
259
    def open_git_repo(self, path):
260
        return Repository.open(path)
261
262
0.200.264 by Jelmer Vernooij
Add more tests.
263
class ImportObjects(TestCaseWithTransport):
264
265
    def setUp(self):
266
        super(ImportObjects, self).setUp()
0.200.265 by Jelmer Vernooij
Add more tests.
267
        self._mapping = BzrGitMappingv1()
0.200.264 by Jelmer Vernooij
Add more tests.
268
        factory = knit.make_file_factory(True, versionedfile.PrefixMapper())
269
        self._texts = factory(self.get_transport('texts'))
270
271
    def test_import_blob_simple(self):
272
        blob = Blob.from_string("bar")
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
273
        base_inv = Inventory()
0.200.306 by Jelmer Vernooij
Fix tests, split up InterGitNonGitRepository.
274
        objs = { "blobname": blob}
0.200.818 by Jelmer Vernooij
Avoid decoding basename twice.
275
        ret, _= import_git_blob(self._texts, self._mapping, "bla", "bla",
0.200.815 by Jelmer Vernooij
Pass tuple with base_sha, sha to make the argument list for import_git_* a bit more understandable.
276
            (None, "blobname"), 
0.200.821 by Jelmer Vernooij
Remove last references to ID.children.
277
            base_inv, None, None, "somerevid", [], objs.__getitem__, 
0.200.816 by Jelmer Vernooij
Leave mode handling for blobs to import_git_blob.
278
            (None, DEFAULT_FILE_MODE))
0.200.264 by Jelmer Vernooij
Add more tests.
279
        self.assertEquals(set([('bla', 'somerevid')]), self._texts.keys())
0.200.265 by Jelmer Vernooij
Add more tests.
280
        self.assertEquals(self._texts.get_record_stream([('bla', 'somerevid')],
281
            "unordered", True).next().get_bytes_as("fulltext"), "bar")
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
282
        self.assertEquals(1, len(ret)) 
283
        self.assertEquals(None, ret[0][0])
284
        self.assertEquals("bla", ret[0][1])
285
        ie = ret[0][3]
286
        self.assertEquals(False, ie.executable)
287
        self.assertEquals("file", ie.kind)
288
        self.assertEquals("somerevid", ie.revision)
289
        self.assertEquals(osutils.sha_strings(["bar"]), ie.text_sha1)
0.200.265 by Jelmer Vernooij
Add more tests.
290
291
    def test_import_tree_empty_root(self):
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
292
        base_inv = Inventory(root_id=None)
0.200.265 by Jelmer Vernooij
Add more tests.
293
        tree = Tree()
294
        tree.serialize()
0.200.818 by Jelmer Vernooij
Avoid decoding basename twice.
295
        ret, _, _ = import_git_tree(self._texts, self._mapping, "", "",
0.200.821 by Jelmer Vernooij
Remove last references to ID.children.
296
               (None, tree.id), base_inv, None,
0.200.817 by Jelmer Vernooij
Deal with all modes locally.
297
               None, "somerevid", [], {tree.id: tree}.__getitem__,
298
               (None, stat.S_IFDIR))
0.200.265 by Jelmer Vernooij
Add more tests.
299
        self.assertEquals(set([("TREE_ROOT", 'somerevid')]), self._texts.keys())
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
300
        self.assertEquals(1, len(ret))
301
        self.assertEquals(None, ret[0][0])
302
        self.assertEquals("", ret[0][1])
303
        ie = ret[0][3]
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)
0.200.265 by Jelmer Vernooij
Add more tests.
309
310
    def test_import_tree_empty(self):
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
311
        base_inv = Inventory()
0.200.265 by Jelmer Vernooij
Add more tests.
312
        tree = Tree()
313
        tree.serialize()
0.200.818 by Jelmer Vernooij
Avoid decoding basename twice.
314
        ret, _, _ = import_git_tree(self._texts, self._mapping, "bla", "bla",
0.200.821 by Jelmer Vernooij
Remove last references to ID.children.
315
           (None, tree.id), base_inv, None, None, "somerevid", [], 
0.200.817 by Jelmer Vernooij
Deal with all modes locally.
316
           { tree.id: tree }.__getitem__,
317
           (None, stat.S_IFDIR))
0.200.265 by Jelmer Vernooij
Add more tests.
318
        self.assertEquals(set([("bla", 'somerevid')]), self._texts.keys())
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
319
        self.assertEquals(1, len(ret))
320
        self.assertEquals(None, ret[0][0])
321
        self.assertEquals("bla", ret[0][1])
322
        ie = ret[0][3]
323
        self.assertEquals("directory", ie.kind)
324
        self.assertEquals(False, ie.executable)
325
        self.assertEquals({}, ie.children)
326
        self.assertEquals("somerevid", ie.revision)
327
        self.assertEquals(None, ie.text_sha1)
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
328
329
    def test_import_tree_with_file(self):
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
330
        base_inv = Inventory()
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
331
        blob = Blob.from_string("bar1")
332
        tree = Tree()
333
        tree.add(0100600, "foo", blob.id)
334
        tree.serialize()
335
        objects = { blob.id: blob, tree.id: tree }
0.200.818 by Jelmer Vernooij
Avoid decoding basename twice.
336
        ret, _, _ = import_git_tree(self._texts, self._mapping, "bla", "bla",
0.200.821 by Jelmer Vernooij
Remove last references to ID.children.
337
                (None, tree.id), base_inv, None, None, "somerevid", [],
0.200.817 by Jelmer Vernooij
Deal with all modes locally.
338
            objects.__getitem__, (None, stat.S_IFDIR))
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
339
        self.assertEquals(2, len(ret))
340
        self.assertEquals(None, ret[0][0])
341
        self.assertEquals("bla", ret[0][1])
342
        self.assertEquals(None, ret[1][0])
343
        self.assertEquals("bla/foo", ret[1][1])
344
        ie = ret[0][3]
345
        self.assertEquals("directory", ie.kind)
346
        ie = ret[1][3]
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
347
        self.assertEquals("file", ie.kind)
348
        self.assertEquals("bla/foo", ie.file_id)
349
        self.assertEquals("somerevid", ie.revision)
350
        self.assertEquals(osutils.sha_strings(["bar1"]), ie.text_sha1)
351
        self.assertEquals(False, ie.executable)
352
353
    def test_import_tree_with_file_exe(self):
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
354
        base_inv = Inventory(root_id=None)
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
355
        blob = Blob.from_string("bar")
356
        tree = Tree()
357
        tree.add(0100755, "foo", blob.id)
358
        tree.serialize()
359
        objects = { blob.id: blob, tree.id: tree }
0.200.818 by Jelmer Vernooij
Avoid decoding basename twice.
360
        ret, _, _ = import_git_tree(self._texts, self._mapping, "", "",
0.200.821 by Jelmer Vernooij
Remove last references to ID.children.
361
                (None, tree.id), base_inv, None, None, "somerevid", [],
0.200.817 by Jelmer Vernooij
Deal with all modes locally.
362
            objects.__getitem__, (None, stat.S_IFDIR))
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
363
        self.assertEquals(2, len(ret))
364
        self.assertEquals(None, ret[0][0])
365
        self.assertEquals("", ret[0][1])
366
        self.assertEquals(None, ret[1][0])
367
        self.assertEquals("foo", ret[1][1])
368
        ie = ret[0][3]
369
        self.assertEquals("directory", ie.kind)
370
        ie = ret[1][3]
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
371
        self.assertEquals("file", ie.kind)
372
        self.assertEquals(True, ie.executable)