/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.1403 by Jelmer Vernooij
Cope with tags pointing at tree objects when cloning local git repositories.
20
    Tag,
0.200.265 by Jelmer Vernooij
Add more tests.
21
    Tree,
0.200.1408 by Jelmer Vernooij
Remove old ie children when converting directory into tree reference.
22
    S_IFGITLINK,
0.200.264 by Jelmer Vernooij
Add more tests.
23
    )
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
24
from dulwich.repo import (
25
    Repo as GitRepo,
26
    )
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
27
import os
0.200.817 by Jelmer Vernooij
Deal with all modes locally.
28
import stat
0.200.1403 by Jelmer Vernooij
Cope with tags pointing at tree objects when cloning local git repositories.
29
import time
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
30
0.200.1642 by Jelmer Vernooij
Use relative imports in tests.
31
from .... import (
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
32
    osutils,
33
    )
34
from ....bzr import (
0.200.264 by Jelmer Vernooij
Add more tests.
35
    knit,
36
    versionedfile,
37
    )
0.200.1642 by Jelmer Vernooij
Use relative imports in tests.
38
from ....branch import (
0.200.1404 by jelmer at samba
Add test for stacked on.
39
    Branch,
40
    )
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
41
from ....controldir import (
42
    ControlDir,
0.200.264 by Jelmer Vernooij
Add more tests.
43
    )
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
44
from ....bzr.inventory import (
0.200.264 by Jelmer Vernooij
Add more tests.
45
    Inventory,
46
    )
0.200.1642 by Jelmer Vernooij
Use relative imports in tests.
47
from ....repository import (
0.200.264 by Jelmer Vernooij
Add more tests.
48
    Repository,
49
    )
0.200.1642 by Jelmer Vernooij
Use relative imports in tests.
50
from ....tests import (
0.200.264 by Jelmer Vernooij
Add more tests.
51
    TestCaseWithTransport,
52
    )
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
53
0.200.1642 by Jelmer Vernooij
Use relative imports in tests.
54
from ..fetch import (
0.200.264 by Jelmer Vernooij
Add more tests.
55
    import_git_blob,
56
    import_git_tree,
0.200.1408 by Jelmer Vernooij
Remove old ie children when converting directory into tree reference.
57
    import_git_submodule,
0.200.264 by Jelmer Vernooij
Add more tests.
58
    )
0.200.1642 by Jelmer Vernooij
Use relative imports in tests.
59
from ..mapping import (
0.200.264 by Jelmer Vernooij
Add more tests.
60
    BzrGitMappingv1,
0.200.816 by Jelmer Vernooij
Leave mode handling for blobs to import_git_blob.
61
    DEFAULT_FILE_MODE,
0.200.264 by Jelmer Vernooij
Add more tests.
62
    )
0.200.1642 by Jelmer Vernooij
Use relative imports in tests.
63
from . import (
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
64
    GitBranchBuilder,
65
    )
0.200.196 by Jelmer Vernooij
Add simple tests and docstrings for GraphWalker.
66
67
0.259.8 by Jelmer Vernooij
Add test.
68
class RepositoryFetchTests(object):
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
69
70
    def make_git_repo(self, path):
71
        os.mkdir(path)
0.200.1403 by Jelmer Vernooij
Cope with tags pointing at tree objects when cloning local git repositories.
72
        return GitRepo.init(os.path.abspath(path))
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
73
0.200.268 by Jelmer Vernooij
Add more fetch tests.
74
    def clone_git_repo(self, from_url, to_url, revision_id=None):
75
        oldrepos = self.open_git_repo(from_url)
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
76
        dir = ControlDir.create(to_url)
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
77
        newrepos = dir.create_repository()
0.200.268 by Jelmer Vernooij
Add more fetch tests.
78
        oldrepos.copy_content_into(newrepos, revision_id=revision_id)
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
79
        return newrepos
80
81
    def test_empty(self):
82
        self.make_git_repo("d")
83
        newrepos = self.clone_git_repo("d", "f")
84
        self.assertEquals([], newrepos.all_revision_ids())
85
0.200.268 by Jelmer Vernooij
Add more fetch tests.
86
    def make_onerev_branch(self):
87
        self.make_git_repo("d")
88
        os.chdir("d")
89
        bb = GitBranchBuilder()
90
        bb.set_file("foobar", "foo\nbar\n", False)
91
        mark = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
92
        gitsha = bb.finish()[mark]
93
        os.chdir("..")
94
        return "d", gitsha
95
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
96
    def test_single_rev(self):
0.200.268 by Jelmer Vernooij
Add more fetch tests.
97
        path, gitsha = self.make_onerev_branch()
98
        oldrepo = self.open_git_repo(path)
99
        newrepo = self.clone_git_repo(path, "f")
0.200.1404 by jelmer at samba
Add test for stacked on.
100
        revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
101
        self.assertEquals([revid], newrepo.all_revision_ids())
0.228.1 by Jelmer Vernooij
Add basic tests for local fetch.
102
0.200.268 by Jelmer Vernooij
Add more fetch tests.
103
    def test_single_rev_specific(self):
104
        path, gitsha = self.make_onerev_branch()
105
        oldrepo = self.open_git_repo(path)
106
        revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
107
        newrepo = self.clone_git_repo(path, "f", revision_id=revid)
108
        self.assertEquals([revid], newrepo.all_revision_ids())
109
110
    def test_incremental(self):
111
        self.make_git_repo("d")
112
        os.chdir("d")
113
        bb = GitBranchBuilder()
114
        bb.set_file("foobar", "foo\nbar\n", False)
115
        mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
116
        bb.set_file("foobar", "fooll\nbar\n", False)
117
        mark2 = bb.commit("Somebody <somebody@someorg.org>", "nextmsg")
118
        marks = bb.finish()
119
        gitsha1 = marks[mark1]
120
        gitsha2 = marks[mark2]
121
        os.chdir("..")
122
        oldrepo = self.open_git_repo("d")
123
        revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
124
        newrepo = self.clone_git_repo("d", "f", revision_id=revid1)
125
        self.assertEquals([revid1], newrepo.all_revision_ids())
126
        revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
127
        newrepo.fetch(oldrepo, revision_id=revid2)
0.200.269 by Jelmer Vernooij
Prepare for testing remote repos.
128
        self.assertEquals(set([revid1, revid2]), set(newrepo.all_revision_ids()))
0.200.268 by Jelmer Vernooij
Add more fetch tests.
129
0.200.552 by Jelmer Vernooij
Cope with directories becoming symlinks.
130
    def test_dir_becomes_symlink(self):
131
        self.make_git_repo("d")
132
        os.chdir("d")
133
        bb = GitBranchBuilder()
134
        bb.set_file("mylink/somefile", "foo\nbar\n", False)
135
        mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg1")
136
        bb.set_symlink("mylink", "target/")
137
        mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg2")
138
        marks = bb.finish()
139
        gitsha1 = marks[mark1]
140
        gitsha2 = marks[mark2]
141
        os.chdir("..")
142
        oldrepo = self.open_git_repo("d")
143
        newrepo = self.clone_git_repo("d", "f")
144
        revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
145
        revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
146
        tree1 = newrepo.revision_tree(revid1)
147
        tree2 = newrepo.revision_tree(revid2)
148
        fileid = tree1.path2id("mylink")
0.200.1194 by Jelmer Vernooij
Use get_file_revision.
149
        self.assertEquals(revid1, tree1.get_file_revision(fileid))
150
        self.assertEquals("directory", tree1.kind(fileid))
151
        self.assertEquals(None, tree1.get_symlink_target(fileid))
152
        self.assertEquals(revid2, tree2.get_file_revision(fileid))
153
        self.assertEquals("symlink", tree2.kind(fileid))
154
        self.assertEquals("target/", tree2.get_symlink_target(fileid))
0.200.552 by Jelmer Vernooij
Cope with directories becoming symlinks.
155
0.200.553 by Jelmer Vernooij
Support symlinks being turned into directories.
156
    def test_symlink_becomes_dir(self):
157
        self.make_git_repo("d")
158
        os.chdir("d")
159
        bb = GitBranchBuilder()
160
        bb.set_symlink("mylink", "target/")
161
        mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg1")
162
        bb.set_file("mylink/somefile", "foo\nbar\n", False)
163
        mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg2")
164
        marks = bb.finish()
165
        gitsha1 = marks[mark1]
166
        gitsha2 = marks[mark2]
167
        os.chdir("..")
168
        oldrepo = self.open_git_repo("d")
169
        newrepo = self.clone_git_repo("d", "f")
170
        revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
171
        revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
172
        tree1 = newrepo.revision_tree(revid1)
173
        tree2 = newrepo.revision_tree(revid2)
174
        fileid = tree1.path2id("mylink")
0.200.1194 by Jelmer Vernooij
Use get_file_revision.
175
        self.assertEquals(revid1, tree1.get_file_revision(fileid))
176
        self.assertEquals("symlink", tree1.kind(fileid))
177
        self.assertEquals("target/", tree1.get_symlink_target(fileid))
178
        self.assertEquals(revid2, tree2.get_file_revision(fileid))
179
        self.assertEquals("directory", tree2.kind(fileid))
180
        self.assertEquals(None, tree2.get_symlink_target(fileid))
0.200.553 by Jelmer Vernooij
Support symlinks being turned into directories.
181
0.200.551 by Jelmer Vernooij
Properly set InventoryEntry revision when changing symlink targets.
182
    def test_changing_symlink(self):
183
        self.make_git_repo("d")
184
        os.chdir("d")
185
        bb = GitBranchBuilder()
186
        bb.set_symlink("mylink", "target")
187
        mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg1")
188
        bb.set_symlink("mylink", "target/")
189
        mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg2")
190
        marks = bb.finish()
191
        gitsha1 = marks[mark1]
192
        gitsha2 = marks[mark2]
193
        os.chdir("..")
194
        oldrepo = self.open_git_repo("d")
195
        newrepo = self.clone_git_repo("d", "f")
196
        revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
197
        revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
198
        tree1 = newrepo.revision_tree(revid1)
199
        tree2 = newrepo.revision_tree(revid2)
200
        fileid = tree1.path2id("mylink")
0.200.1194 by Jelmer Vernooij
Use get_file_revision.
201
        self.assertEquals(revid1, tree1.get_file_revision(fileid))
202
        self.assertEquals("target", tree1.get_symlink_target(fileid))
203
        self.assertEquals(revid2, tree2.get_file_revision(fileid))
204
        self.assertEquals("target/", tree2.get_symlink_target(fileid))
0.200.551 by Jelmer Vernooij
Properly set InventoryEntry revision when changing symlink targets.
205
0.228.2 by Jelmer Vernooij
Add test for fetching executables.
206
    def test_executable(self):
207
        self.make_git_repo("d")
208
        os.chdir("d")
209
        bb = GitBranchBuilder()
210
        bb.set_file("foobar", "foo\nbar\n", True)
211
        bb.set_file("notexec", "foo\nbar\n", False)
212
        mark = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
213
        gitsha = bb.finish()[mark]
214
        os.chdir("..")
0.200.268 by Jelmer Vernooij
Add more fetch tests.
215
        oldrepo = self.open_git_repo("d")
0.228.2 by Jelmer Vernooij
Add test for fetching executables.
216
        newrepo = self.clone_git_repo("d", "f")
217
        revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
218
        tree = newrepo.revision_tree(revid)
219
        self.assertTrue(tree.has_filename("foobar"))
0.200.1194 by Jelmer Vernooij
Use get_file_revision.
220
        self.assertEquals(True, tree.is_executable(tree.path2id("foobar")))
0.228.2 by Jelmer Vernooij
Add test for fetching executables.
221
        self.assertTrue(tree.has_filename("notexec"))
0.200.1194 by Jelmer Vernooij
Use get_file_revision.
222
        self.assertEquals(False, tree.is_executable(tree.path2id("notexec")))
0.200.264 by Jelmer Vernooij
Add more tests.
223
0.200.537 by Jelmer Vernooij
Fix handling of not-executable files becoming executable without any other changes.
224
    def test_becomes_executable(self):
225
        self.make_git_repo("d")
226
        os.chdir("d")
227
        bb = GitBranchBuilder()
228
        bb.set_file("foobar", "foo\nbar\n", False)
229
        mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
230
        bb.set_file("foobar", "foo\nbar\n", True)
231
        mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
232
        gitsha2 = bb.finish()[mark2]
233
        os.chdir("..")
234
        oldrepo = self.open_git_repo("d")
235
        newrepo = self.clone_git_repo("d", "f")
236
        revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
237
        tree = newrepo.revision_tree(revid)
238
        self.assertTrue(tree.has_filename("foobar"))
0.200.1194 by Jelmer Vernooij
Use get_file_revision.
239
        fileid = tree.path2id("foobar")
240
        self.assertEquals(True, tree.is_executable(fileid))
241
        self.assertEquals(revid, tree.get_file_revision(fileid))
0.200.537 by Jelmer Vernooij
Fix handling of not-executable files becoming executable without any other changes.
242
0.200.1404 by jelmer at samba
Add test for stacked on.
243
    def test_into_stacked_on(self):
244
        r = self.make_git_repo("d")
245
        os.chdir("d")
246
        bb = GitBranchBuilder()
247
        bb.set_file(u"foobar", "foo\n", False)
248
        mark1 = bb.commit("Somebody <somebody@someorg.org>", "mymsg1")
249
        gitsha1 = bb.finish()[mark1]
250
        os.chdir("..")
251
        stacked_on = self.clone_git_repo("d", "stacked-on")
252
        oldrepo = Repository.open("d")
253
        revid1 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha1)
254
        self.assertEquals([revid1], stacked_on.all_revision_ids())
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
255
        b = stacked_on.controldir.create_branch()
0.200.1404 by jelmer at samba
Add test for stacked on.
256
        b.generate_revision_history(revid1)
257
        self.assertEquals(b.last_revision(), revid1)
258
        tree = self.make_branch_and_tree("stacked")
259
        tree.branch.set_stacked_on_url(b.user_url)
260
        os.chdir("d")
261
        bb = GitBranchBuilder()
262
        bb.set_file(u"barbar", "bar\n", False)
263
        bb.set_file(u"foo/blie/bla", "bla\n", False)
264
        mark2 = bb.commit("Somebody <somebody@someorg.org>", "mymsg2")
265
        gitsha2 = bb.finish()[mark2]
266
        revid2 = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha2)
267
        os.chdir("..")
268
        tree.branch.fetch(Branch.open("d"))
269
        tree.branch.repository.check()
270
        self.addCleanup(tree.lock_read().unlock)
271
        self.assertEquals(
272
            set([(revid2,)]),
273
            tree.branch.repository.revisions.without_fallbacks().keys())
274
        self.assertEquals(
275
            set([revid1, revid2]),
276
            set(tree.branch.repository.all_revision_ids()))
277
0.200.298 by Jelmer Vernooij
Add test for non-ascii characters.
278
    def test_non_ascii_characters(self):
279
        self.make_git_repo("d")
280
        os.chdir("d")
281
        bb = GitBranchBuilder()
282
        bb.set_file(u"foőbar", "foo\nbar\n", False)
283
        mark = bb.commit("Somebody <somebody@someorg.org>", "mymsg")
284
        gitsha = bb.finish()[mark]
285
        os.chdir("..")
286
        oldrepo = self.open_git_repo("d")
287
        newrepo = self.clone_git_repo("d", "f")
288
        revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
289
        tree = newrepo.revision_tree(revid)
290
        self.assertTrue(tree.has_filename(u"foőbar"))
291
0.200.1403 by Jelmer Vernooij
Cope with tags pointing at tree objects when cloning local git repositories.
292
    def test_tagged_tree(self):
293
        r = self.make_git_repo("d")
294
        os.chdir("d")
295
        bb = GitBranchBuilder()
296
        bb.set_file("foobar", "fooll\nbar\n", False)
297
        mark = bb.commit("Somebody <somebody@someorg.org>", "nextmsg")
298
        marks = bb.finish()
299
        gitsha = marks[mark]
300
        tag = Tag()
301
        tag.name = "sometag"
0.281.6 by William Grant
Fix test_tagged_tree to not create a non-integral tag timestamp.
302
        tag.tag_time = int(time.time())
0.200.1403 by Jelmer Vernooij
Cope with tags pointing at tree objects when cloning local git repositories.
303
        tag.tag_timezone = 0
304
        tag.tagger = "Somebody <somebody@example.com>"
305
        tag.message = "Created tag pointed at tree"
306
        tag.object = (Tree, r[gitsha].tree)
307
        r.object_store.add_object(tag)
308
        r["refs/tags/sometag"] = tag
309
        os.chdir("..")
310
        oldrepo = self.open_git_repo("d")
311
        revid = oldrepo.get_mapping().revision_id_foreign_to_bzr(gitsha)
312
        newrepo = self.clone_git_repo("d", "f")
313
        self.assertEquals(set([revid]), set(newrepo.all_revision_ids()))
314
0.200.264 by Jelmer Vernooij
Add more tests.
315
0.200.269 by Jelmer Vernooij
Prepare for testing remote repos.
316
class LocalRepositoryFetchTests(RepositoryFetchTests, TestCaseWithTransport):
317
318
    def open_git_repo(self, path):
319
        return Repository.open(path)
320
321
0.200.839 by Jelmer Vernooij
Add convenience object for updating the object store caching layer.
322
class DummyStoreUpdater(object):
323
0.200.952 by Jelmer Vernooij
Write git pack files rather than loose objects.
324
    def add_object(self, obj, ie, path):
0.200.839 by Jelmer Vernooij
Add convenience object for updating the object store caching layer.
325
        pass
326
327
    def finish(self):
328
        pass
329
330
0.200.264 by Jelmer Vernooij
Add more tests.
331
class ImportObjects(TestCaseWithTransport):
332
333
    def setUp(self):
334
        super(ImportObjects, self).setUp()
0.200.265 by Jelmer Vernooij
Add more tests.
335
        self._mapping = BzrGitMappingv1()
0.200.264 by Jelmer Vernooij
Add more tests.
336
        factory = knit.make_file_factory(True, versionedfile.PrefixMapper())
337
        self._texts = factory(self.get_transport('texts'))
338
339
    def test_import_blob_simple(self):
340
        blob = Blob.from_string("bar")
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
341
        base_inv = Inventory()
0.200.306 by Jelmer Vernooij
Fix tests, split up InterGitNonGitRepository.
342
        objs = { "blobname": blob}
0.200.839 by Jelmer Vernooij
Add convenience object for updating the object store caching layer.
343
        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.
344
            (None, "blobname"), 
0.200.848 by Jelmer Vernooij
remove unnecessary parent_inv_shamap.
345
            base_inv, None, "somerevid", [], objs.__getitem__, 
0.200.896 by Jelmer Vernooij
Add separate function for looking up file ids.
346
            (None, DEFAULT_FILE_MODE), DummyStoreUpdater(),
347
            self._mapping.generate_file_id)
0.200.264 by Jelmer Vernooij
Add more tests.
348
        self.assertEquals(set([('bla', 'somerevid')]), self._texts.keys())
0.200.265 by Jelmer Vernooij
Add more tests.
349
        self.assertEquals(self._texts.get_record_stream([('bla', 'somerevid')],
350
            "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).
351
        self.assertEquals(1, len(ret)) 
352
        self.assertEquals(None, ret[0][0])
353
        self.assertEquals("bla", ret[0][1])
354
        ie = ret[0][3]
355
        self.assertEquals(False, ie.executable)
356
        self.assertEquals("file", ie.kind)
357
        self.assertEquals("somerevid", ie.revision)
358
        self.assertEquals(osutils.sha_strings(["bar"]), ie.text_sha1)
0.200.265 by Jelmer Vernooij
Add more tests.
359
360
    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).
361
        base_inv = Inventory(root_id=None)
0.200.265 by Jelmer Vernooij
Add more tests.
362
        tree = Tree()
0.200.878 by Jelmer Vernooij
Fix determining of unusual file modes.
363
        ret, child_modes = import_git_tree(self._texts, self._mapping, "", "",
0.200.848 by Jelmer Vernooij
remove unnecessary parent_inv_shamap.
364
               (None, tree.id), base_inv, 
0.200.817 by Jelmer Vernooij
Deal with all modes locally.
365
               None, "somerevid", [], {tree.id: tree}.__getitem__,
0.200.896 by Jelmer Vernooij
Add separate function for looking up file ids.
366
               (None, stat.S_IFDIR), DummyStoreUpdater(),
367
               self._mapping.generate_file_id)
0.200.878 by Jelmer Vernooij
Fix determining of unusual file modes.
368
        self.assertEquals(child_modes, {})
0.200.265 by Jelmer Vernooij
Add more tests.
369
        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).
370
        self.assertEquals(1, len(ret))
371
        self.assertEquals(None, ret[0][0])
372
        self.assertEquals("", ret[0][1])
373
        ie = ret[0][3]
374
        self.assertEquals(False, ie.executable)
375
        self.assertEquals("directory", ie.kind)
376
        self.assertEquals({}, ie.children)
377
        self.assertEquals("somerevid", ie.revision)
378
        self.assertEquals(None, ie.text_sha1)
0.200.265 by Jelmer Vernooij
Add more tests.
379
380
    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).
381
        base_inv = Inventory()
0.200.265 by Jelmer Vernooij
Add more tests.
382
        tree = Tree()
0.200.878 by Jelmer Vernooij
Fix determining of unusual file modes.
383
        ret, child_modes = import_git_tree(self._texts, self._mapping, "bla", "bla",
0.200.848 by Jelmer Vernooij
remove unnecessary parent_inv_shamap.
384
           (None, tree.id), base_inv, None, "somerevid", [], 
0.200.817 by Jelmer Vernooij
Deal with all modes locally.
385
           { tree.id: tree }.__getitem__,
0.200.896 by Jelmer Vernooij
Add separate function for looking up file ids.
386
           (None, stat.S_IFDIR), DummyStoreUpdater(),
387
           self._mapping.generate_file_id)
0.200.878 by Jelmer Vernooij
Fix determining of unusual file modes.
388
        self.assertEquals(child_modes, {})
0.200.265 by Jelmer Vernooij
Add more tests.
389
        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).
390
        self.assertEquals(1, len(ret))
391
        self.assertEquals(None, ret[0][0])
392
        self.assertEquals("bla", ret[0][1])
393
        ie = ret[0][3]
394
        self.assertEquals("directory", ie.kind)
395
        self.assertEquals(False, ie.executable)
396
        self.assertEquals({}, ie.children)
397
        self.assertEquals("somerevid", ie.revision)
398
        self.assertEquals(None, ie.text_sha1)
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
399
400
    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).
401
        base_inv = Inventory()
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
402
        blob = Blob.from_string("bar1")
403
        tree = Tree()
0.200.1152 by Jelmer Vernooij
Require dulwich 0.7.1.
404
        tree.add("foo", stat.S_IFREG | 0644, blob.id)
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
405
        objects = { blob.id: blob, tree.id: tree }
0.200.878 by Jelmer Vernooij
Fix determining of unusual file modes.
406
        ret, child_modes = import_git_tree(self._texts, self._mapping, "bla", "bla",
0.200.848 by Jelmer Vernooij
remove unnecessary parent_inv_shamap.
407
                (None, tree.id), base_inv, None, "somerevid", [],
0.200.896 by Jelmer Vernooij
Add separate function for looking up file ids.
408
            objects.__getitem__, (None, stat.S_IFDIR), DummyStoreUpdater(),
409
            self._mapping.generate_file_id)
0.200.878 by Jelmer Vernooij
Fix determining of unusual file modes.
410
        self.assertEquals(child_modes, {})
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
411
        self.assertEquals(2, len(ret))
412
        self.assertEquals(None, ret[0][0])
413
        self.assertEquals("bla", ret[0][1])
414
        self.assertEquals(None, ret[1][0])
415
        self.assertEquals("bla/foo", ret[1][1])
416
        ie = ret[0][3]
417
        self.assertEquals("directory", ie.kind)
418
        ie = ret[1][3]
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
419
        self.assertEquals("file", ie.kind)
420
        self.assertEquals("bla/foo", ie.file_id)
421
        self.assertEquals("somerevid", ie.revision)
422
        self.assertEquals(osutils.sha_strings(["bar1"]), ie.text_sha1)
423
        self.assertEquals(False, ie.executable)
424
0.200.878 by Jelmer Vernooij
Fix determining of unusual file modes.
425
    def test_import_tree_with_unusual_mode_file(self):
426
        base_inv = Inventory()
427
        blob = Blob.from_string("bar1")
428
        tree = Tree()
0.200.1152 by Jelmer Vernooij
Require dulwich 0.7.1.
429
        tree.add("foo", stat.S_IFREG | 0664, blob.id)
0.200.878 by Jelmer Vernooij
Fix determining of unusual file modes.
430
        objects = { blob.id: blob, tree.id: tree }
0.200.1152 by Jelmer Vernooij
Require dulwich 0.7.1.
431
        ret, child_modes = import_git_tree(self._texts, self._mapping,
432
            "bla", "bla", (None, tree.id), base_inv, None, "somerevid", [],
0.200.896 by Jelmer Vernooij
Add separate function for looking up file ids.
433
            objects.__getitem__, (None, stat.S_IFDIR), DummyStoreUpdater(),
434
            self._mapping.generate_file_id)
0.200.880 by Jelmer Vernooij
remove unused function.
435
        self.assertEquals(child_modes, { "bla/foo": stat.S_IFREG | 0664 })
0.200.878 by Jelmer Vernooij
Fix determining of unusual file modes.
436
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
437
    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).
438
        base_inv = Inventory(root_id=None)
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
439
        blob = Blob.from_string("bar")
440
        tree = Tree()
0.200.1152 by Jelmer Vernooij
Require dulwich 0.7.1.
441
        tree.add("foo", 0100755, blob.id)
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
442
        objects = { blob.id: blob, tree.id: tree }
0.200.878 by Jelmer Vernooij
Fix determining of unusual file modes.
443
        ret, child_modes = import_git_tree(self._texts, self._mapping, "", "",
0.200.848 by Jelmer Vernooij
remove unnecessary parent_inv_shamap.
444
                (None, tree.id), base_inv, None, "somerevid", [],
0.200.896 by Jelmer Vernooij
Add separate function for looking up file ids.
445
            objects.__getitem__, (None, stat.S_IFDIR), DummyStoreUpdater(),
446
            self._mapping.generate_file_id)
0.200.878 by Jelmer Vernooij
Fix determining of unusual file modes.
447
        self.assertEquals(child_modes, {})
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
448
        self.assertEquals(2, len(ret))
449
        self.assertEquals(None, ret[0][0])
450
        self.assertEquals("", ret[0][1])
451
        self.assertEquals(None, ret[1][0])
452
        self.assertEquals("foo", ret[1][1])
453
        ie = ret[0][3]
454
        self.assertEquals("directory", ie.kind)
455
        ie = ret[1][3]
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
456
        self.assertEquals("file", ie.kind)
457
        self.assertEquals(True, ie.executable)
0.200.1408 by Jelmer Vernooij
Remove old ie children when converting directory into tree reference.
458
459
    def test_directory_converted_to_submodule(self):
460
        base_inv = Inventory()
461
        base_inv.add_path("foo", "directory")
462
        base_inv.add_path("foo/bar", "file")
463
        othertree = Blob.from_string("someotherthing")
464
        blob = Blob.from_string("bar")
465
        tree = Tree()
466
        tree.add("bar", 0160000, blob.id)
467
        objects = { tree.id: tree }
468
        ret, child_modes = import_git_submodule(self._texts, self._mapping, "foo", "foo",
469
                (tree.id, othertree.id), base_inv, base_inv.root.file_id, "somerevid", [],
470
                objects.__getitem__, (stat.S_IFDIR | 0755, S_IFGITLINK), DummyStoreUpdater(),
471
                self._mapping.generate_file_id)
472
        self.assertEquals(child_modes, {})
473
        self.assertEquals(2, len(ret))
474
        self.assertEquals(ret[0], ("foo/bar", None, base_inv.path2id("foo/bar"), None))
475
        self.assertEquals(ret[1][:3], ("foo", "foo", self._mapping.generate_file_id("foo")))
476
        ie = ret[1][3]
477
        self.assertEquals(ie.kind, "tree-reference")