/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.839 by Jelmer Vernooij
Add convenience object for updating the object store caching layer.
263
class DummyStoreUpdater(object):
264
265
    def add_object(self, obj, ie):
266
        pass
267
268
    def finish(self):
269
        pass
270
271
0.200.264 by Jelmer Vernooij
Add more tests.
272
class ImportObjects(TestCaseWithTransport):
273
274
    def setUp(self):
275
        super(ImportObjects, self).setUp()
0.200.265 by Jelmer Vernooij
Add more tests.
276
        self._mapping = BzrGitMappingv1()
0.200.264 by Jelmer Vernooij
Add more tests.
277
        factory = knit.make_file_factory(True, versionedfile.PrefixMapper())
278
        self._texts = factory(self.get_transport('texts'))
279
280
    def test_import_blob_simple(self):
281
        blob = Blob.from_string("bar")
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
282
        base_inv = Inventory()
0.200.306 by Jelmer Vernooij
Fix tests, split up InterGitNonGitRepository.
283
        objs = { "blobname": blob}
0.200.839 by Jelmer Vernooij
Add convenience object for updating the object store caching layer.
284
        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.
285
            (None, "blobname"), 
0.200.848 by Jelmer Vernooij
remove unnecessary parent_inv_shamap.
286
            base_inv, None, "somerevid", [], objs.__getitem__, 
0.200.839 by Jelmer Vernooij
Add convenience object for updating the object store caching layer.
287
            (None, DEFAULT_FILE_MODE), DummyStoreUpdater())
0.200.264 by Jelmer Vernooij
Add more tests.
288
        self.assertEquals(set([('bla', 'somerevid')]), self._texts.keys())
0.200.265 by Jelmer Vernooij
Add more tests.
289
        self.assertEquals(self._texts.get_record_stream([('bla', 'somerevid')],
290
            "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).
291
        self.assertEquals(1, len(ret)) 
292
        self.assertEquals(None, ret[0][0])
293
        self.assertEquals("bla", ret[0][1])
294
        ie = ret[0][3]
295
        self.assertEquals(False, ie.executable)
296
        self.assertEquals("file", ie.kind)
297
        self.assertEquals("somerevid", ie.revision)
298
        self.assertEquals(osutils.sha_strings(["bar"]), ie.text_sha1)
0.200.265 by Jelmer Vernooij
Add more tests.
299
300
    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).
301
        base_inv = Inventory(root_id=None)
0.200.265 by Jelmer Vernooij
Add more tests.
302
        tree = Tree()
0.200.839 by Jelmer Vernooij
Add convenience object for updating the object store caching layer.
303
        ret, _ = import_git_tree(self._texts, self._mapping, "", "",
0.200.848 by Jelmer Vernooij
remove unnecessary parent_inv_shamap.
304
               (None, tree.id), base_inv, 
0.200.817 by Jelmer Vernooij
Deal with all modes locally.
305
               None, "somerevid", [], {tree.id: tree}.__getitem__,
0.200.839 by Jelmer Vernooij
Add convenience object for updating the object store caching layer.
306
               (None, stat.S_IFDIR), DummyStoreUpdater())
0.200.265 by Jelmer Vernooij
Add more tests.
307
        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).
308
        self.assertEquals(1, len(ret))
309
        self.assertEquals(None, ret[0][0])
310
        self.assertEquals("", ret[0][1])
311
        ie = ret[0][3]
312
        self.assertEquals(False, ie.executable)
313
        self.assertEquals("directory", ie.kind)
314
        self.assertEquals({}, ie.children)
315
        self.assertEquals("somerevid", ie.revision)
316
        self.assertEquals(None, ie.text_sha1)
0.200.265 by Jelmer Vernooij
Add more tests.
317
318
    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).
319
        base_inv = Inventory()
0.200.265 by Jelmer Vernooij
Add more tests.
320
        tree = Tree()
0.200.839 by Jelmer Vernooij
Add convenience object for updating the object store caching layer.
321
        ret, _ = import_git_tree(self._texts, self._mapping, "bla", "bla",
0.200.848 by Jelmer Vernooij
remove unnecessary parent_inv_shamap.
322
           (None, tree.id), base_inv, None, "somerevid", [], 
0.200.817 by Jelmer Vernooij
Deal with all modes locally.
323
           { tree.id: tree }.__getitem__,
0.200.839 by Jelmer Vernooij
Add convenience object for updating the object store caching layer.
324
           (None, stat.S_IFDIR), DummyStoreUpdater())
0.200.265 by Jelmer Vernooij
Add more tests.
325
        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).
326
        self.assertEquals(1, len(ret))
327
        self.assertEquals(None, ret[0][0])
328
        self.assertEquals("bla", ret[0][1])
329
        ie = ret[0][3]
330
        self.assertEquals("directory", ie.kind)
331
        self.assertEquals(False, ie.executable)
332
        self.assertEquals({}, ie.children)
333
        self.assertEquals("somerevid", ie.revision)
334
        self.assertEquals(None, ie.text_sha1)
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
335
336
    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).
337
        base_inv = Inventory()
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
338
        blob = Blob.from_string("bar1")
339
        tree = Tree()
340
        tree.add(0100600, "foo", blob.id)
341
        objects = { blob.id: blob, tree.id: tree }
0.200.839 by Jelmer Vernooij
Add convenience object for updating the object store caching layer.
342
        ret, _ = import_git_tree(self._texts, self._mapping, "bla", "bla",
0.200.848 by Jelmer Vernooij
remove unnecessary parent_inv_shamap.
343
                (None, tree.id), base_inv, None, "somerevid", [],
0.200.839 by Jelmer Vernooij
Add convenience object for updating the object store caching layer.
344
            objects.__getitem__, (None, stat.S_IFDIR), DummyStoreUpdater())
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
345
        self.assertEquals(2, len(ret))
346
        self.assertEquals(None, ret[0][0])
347
        self.assertEquals("bla", ret[0][1])
348
        self.assertEquals(None, ret[1][0])
349
        self.assertEquals("bla/foo", ret[1][1])
350
        ie = ret[0][3]
351
        self.assertEquals("directory", ie.kind)
352
        ie = ret[1][3]
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
353
        self.assertEquals("file", ie.kind)
354
        self.assertEquals("bla/foo", ie.file_id)
355
        self.assertEquals("somerevid", ie.revision)
356
        self.assertEquals(osutils.sha_strings(["bar1"]), ie.text_sha1)
357
        self.assertEquals(False, ie.executable)
358
359
    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).
360
        base_inv = Inventory(root_id=None)
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
361
        blob = Blob.from_string("bar")
362
        tree = Tree()
363
        tree.add(0100755, "foo", blob.id)
364
        objects = { blob.id: blob, tree.id: tree }
0.200.839 by Jelmer Vernooij
Add convenience object for updating the object store caching layer.
365
        ret, _ = import_git_tree(self._texts, self._mapping, "", "",
0.200.848 by Jelmer Vernooij
remove unnecessary parent_inv_shamap.
366
                (None, tree.id), base_inv, None, "somerevid", [],
0.200.839 by Jelmer Vernooij
Add convenience object for updating the object store caching layer.
367
            objects.__getitem__, (None, stat.S_IFDIR), DummyStoreUpdater())
0.229.3 by Jelmer Vernooij
Use inventory deltas internally so fetch is O(changes) rather than O(tree).
368
        self.assertEquals(2, len(ret))
369
        self.assertEquals(None, ret[0][0])
370
        self.assertEquals("", ret[0][1])
371
        self.assertEquals(None, ret[1][0])
372
        self.assertEquals("foo", ret[1][1])
373
        ie = ret[0][3]
374
        self.assertEquals("directory", ie.kind)
375
        ie = ret[1][3]
0.200.267 by Jelmer Vernooij
Add more tests for fetch code.
376
        self.assertEquals("file", ie.kind)
377
        self.assertEquals(True, ie.executable)