/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
1
# Copyright (C) 2007 Canonical Ltd
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
"""Tests for interfacing with a Git Repository"""
18
0.200.445 by Jelmer Vernooij
Import dulwich as dulwich, not as git.
19
import dulwich
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
20
from dulwich.repo import (
21
    Repo as GitRepo,
22
    )
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
23
import os
24
0.200.29 by David Allouche
Smoke test for GitRepository.get_revision, and corresponding fixes.
25
from bzrlib import (
0.200.61 by Jelmer Vernooij
Fix tests.
26
    errors,
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
27
    inventory,
0.200.29 by David Allouche
Smoke test for GitRepository.get_revision, and corresponding fixes.
28
    revision,
29
    )
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
30
from bzrlib.repository import (
0.200.357 by Jelmer Vernooij
Move push code to push.py.
31
    InterRepository,
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
32
    Repository,
33
    )
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
34
0.200.27 by David Allouche
Flat is better than nested, remove the gitlib hierarchy.
35
from bzrlib.plugins.git import (
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
36
    dir,
37
    repository,
0.200.97 by Jelmer Vernooij
use mapping object.
38
    tests,
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
39
    )
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
40
from bzrlib.plugins.git.mapping import (
41
    default_mapping,
42
    )
0.235.2 by Jelmer Vernooij
Fix tests.
43
from bzrlib.plugins.git.object_store import (
44
    BazaarObjectStore,
45
    )
0.200.368 by Jelmer Vernooij
Cope with more granular timezones.
46
from bzrlib.plugins.git.push import (
47
    MissingObjectsIterator,
48
    )
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
49
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
50
class TestGitRepositoryFeatures(tests.TestCaseInTempDir):
0.200.32 by David Allouche
Rewrite GitRepository._parse_rev, with unit tests.
51
    """Feature tests for GitRepository."""
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
52
53
    _test_needs_features = [tests.GitCommandFeature]
54
0.200.902 by Jelmer Vernooij
Fix Repository.has_revision{s,}.
55
    def _do_commit(self):
56
        builder = tests.GitBranchBuilder()
57
        builder.set_file('a', 'text for a\n', False)
58
        commit_handle = builder.commit('Joe Foo <joe@foo.com>', u'message')
59
        mapping = builder.finish()
60
        return mapping[commit_handle]
61
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
62
    def test_open_existing(self):
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
63
        GitRepo.init(self.test_dir)
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
64
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
65
        repo = Repository.open('.')
66
        self.assertIsInstance(repo, repository.GitRepository)
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
67
0.200.56 by Jelmer Vernooij
Switch to using GitPython rather than our own in-house stuff.
68
    def test_has_git_repo(self):
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
69
        GitRepo.init(self.test_dir)
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
70
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
71
        repo = Repository.open('.')
0.200.445 by Jelmer Vernooij
Import dulwich as dulwich, not as git.
72
        self.assertIsInstance(repo._git, dulwich.repo.Repo)
0.200.21 by John Arbash Meinel
Fix Repository.get_revision_graph()
73
0.200.902 by Jelmer Vernooij
Fix Repository.has_revision{s,}.
74
    def test_has_revision(self):
75
        GitRepo.init(self.test_dir)
76
        commit_id = self._do_commit()
77
        repo = Repository.open('.')
78
        self.assertFalse(repo.has_revision('foobar'))
79
        revid = default_mapping.revision_id_foreign_to_bzr(commit_id)
80
        self.assertTrue(repo.has_revision(revid))
81
82
    def test_has_revisions(self):
83
        GitRepo.init(self.test_dir)
84
        commit_id = self._do_commit()
85
        repo = Repository.open('.')
86
        self.assertEquals(set(), repo.has_revisions(['foobar']))
87
        revid = default_mapping.revision_id_foreign_to_bzr(commit_id)
88
        self.assertEquals(set([revid]), repo.has_revisions(['foobar', revid]))
89
0.200.29 by David Allouche
Smoke test for GitRepository.get_revision, and corresponding fixes.
90
    def test_get_revision(self):
0.200.32 by David Allouche
Rewrite GitRepository._parse_rev, with unit tests.
91
        # GitRepository.get_revision gives a Revision object.
0.200.29 by David Allouche
Smoke test for GitRepository.get_revision, and corresponding fixes.
92
93
        # Create a git repository with a revision.
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
94
        GitRepo.init(self.test_dir)
0.200.902 by Jelmer Vernooij
Fix Repository.has_revision{s,}.
95
        commit_id = self._do_commit()
0.200.29 by David Allouche
Smoke test for GitRepository.get_revision, and corresponding fixes.
96
97
        # Get the corresponding Revision object.
0.200.104 by Jelmer Vernooij
Use bzr-foreign function names for converting between git and bzr revids.
98
        revid = default_mapping.revision_id_foreign_to_bzr(commit_id)
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
99
        repo = Repository.open('.')
0.200.29 by David Allouche
Smoke test for GitRepository.get_revision, and corresponding fixes.
100
        rev = repo.get_revision(revid)
101
        self.assertIsInstance(rev, revision.Revision)
0.200.32 by David Allouche
Rewrite GitRepository._parse_rev, with unit tests.
102
0.200.106 by Jelmer Vernooij
Test that getting an unknown revision fails.
103
    def test_get_revision_unknown(self):
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
104
        GitRepo.init(self.test_dir)
0.200.106 by Jelmer Vernooij
Test that getting an unknown revision fails.
105
106
        repo = Repository.open('.')
107
        self.assertRaises(errors.NoSuchRevision, repo.get_revision, "bla")
108
0.200.79 by Jelmer Vernooij
Implement RevisionTree.get_revision_id().
109
    def simple_commit(self):
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
110
        # Create a git repository with some interesting files in a revision.
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
111
        GitRepo.init(self.test_dir)
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
112
        builder = tests.GitBranchBuilder()
113
        builder.set_file('data', 'text\n', False)
114
        builder.set_file('executable', 'content', True)
115
        builder.set_link('link', 'broken')
116
        builder.set_file('subdir/subfile', 'subdir text\n', False)
0.204.4 by James Westby
Make the inventory test match what the code produces.
117
        commit_handle = builder.commit('Joe Foo <joe@foo.com>', u'message',
118
            timestamp=1205433193)
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
119
        mapping = builder.finish()
0.200.79 by Jelmer Vernooij
Implement RevisionTree.get_revision_id().
120
        return mapping[commit_handle]
121
122
    def test_revision_tree(self):
123
        commit_id = self.simple_commit()
0.200.104 by Jelmer Vernooij
Use bzr-foreign function names for converting between git and bzr revids.
124
        revid = default_mapping.revision_id_foreign_to_bzr(commit_id)
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
125
        repo = Repository.open('.')
0.200.79 by Jelmer Vernooij
Implement RevisionTree.get_revision_id().
126
        tree = repo.revision_tree(revid)
127
        self.assertEquals(tree.get_revision_id(), revid)
0.200.88 by Jelmer Vernooij
Fix RevisionTree.get_file_text().
128
        self.assertEquals("text\n", tree.get_file_text(tree.path2id("data")))
0.200.79 by Jelmer Vernooij
Implement RevisionTree.get_revision_id().
129
130
    def test_get_inventory(self):
131
        # GitRepository.get_inventory gives a GitInventory object with
132
        # plausible entries for typical cases.
133
134
        commit_id = self.simple_commit()
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
135
136
        # Get the corresponding Inventory object.
0.200.104 by Jelmer Vernooij
Use bzr-foreign function names for converting between git and bzr revids.
137
        revid = default_mapping.revision_id_foreign_to_bzr(commit_id)
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
138
        repo = Repository.open('.')
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
139
        inv = repo.get_inventory(revid)
140
        self.assertIsInstance(inv, inventory.Inventory)
141
        printed_inv = '\n'.join(
142
            repr((path, entry.executable, entry))
143
            for path, entry in inv.iter_entries())
144
        self.assertEqualDiff(
145
            printed_inv,
0.200.394 by Jelmer Vernooij
Fix expected test output.
146
            "('', False, GitInventoryDirectory('TREE_ROOT', u'', parent_id=None,"
0.200.190 by Jelmer Vernooij
Bless current mapping as v1.
147
            " revision='"+default_mapping.revision_id_foreign_to_bzr("69c39cfa65962f3cf16b9b3eb08a15954e9d8590")+"'))\n"
0.200.394 by Jelmer Vernooij
Fix expected test output.
148
            "(u'data', False, GitInventoryFile('data', u'data',"
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
149
            " parent_id='TREE_ROOT',"
0.200.655 by Jelmer Vernooij
Fix test to be mapping-independent.
150
            " sha1='aa785adca3fcdfe1884ae840e13c6d294a2414e8', len=5, revision="+default_mapping.revid_prefix+":69c39cfa65962f3cf16b9b3eb08a15954e9d8590))\n"
0.200.394 by Jelmer Vernooij
Fix expected test output.
151
            "(u'executable', True, GitInventoryFile('executable', u'executable',"
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
152
            " parent_id='TREE_ROOT',"
0.200.655 by Jelmer Vernooij
Fix test to be mapping-independent.
153
            " sha1='040f06fd774092478d450774f5ba30c5da78acc8', len=7, revision="+default_mapping.revid_prefix+":69c39cfa65962f3cf16b9b3eb08a15954e9d8590))\n"
0.200.394 by Jelmer Vernooij
Fix expected test output.
154
            "(u'link', False, GitInventoryLink('link', u'link',"
155
            " parent_id='TREE_ROOT', revision='"+default_mapping.revision_id_foreign_to_bzr("69c39cfa65962f3cf16b9b3eb08a15954e9d8590")+"'))\n"
156
            "(u'subdir', False, GitInventoryDirectory('subdir', u'subdir',"
157
            " parent_id='TREE_ROOT', revision='"+default_mapping.revision_id_foreign_to_bzr("69c39cfa65962f3cf16b9b3eb08a15954e9d8590")+"'))\n"
158
            "(u'subdir/subfile', False, GitInventoryFile('subdir/subfile',"
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
159
            " u'subfile', parent_id='subdir',"
0.200.655 by Jelmer Vernooij
Fix test to be mapping-independent.
160
            " sha1='67b75c3e49f31fcadddbf9df6a1d8be8c3e44290', len=12, revision="+default_mapping.revid_prefix+":69c39cfa65962f3cf16b9b3eb08a15954e9d8590))")
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
161
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
162
0.204.2 by James Westby
Switch to TestCaseWithTransport so that the cache dir can be
163
class TestGitRepository(tests.TestCaseWithTransport):
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
164
0.252.41 by Jelmer Vernooij
Fix Repository.all_revision_ids.
165
    _test_needs_features = [tests.GitCommandFeature]
166
167
    def _do_commit(self):
168
        builder = tests.GitBranchBuilder()
169
        builder.set_file('a', 'text for a\n', False)
170
        commit_handle = builder.commit('Joe Foo <joe@foo.com>', u'message')
171
        mapping = builder.finish()
172
        return mapping[commit_handle]
173
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
174
    def setUp(self):
0.204.2 by James Westby
Switch to TestCaseWithTransport so that the cache dir can be
175
        tests.TestCaseWithTransport.setUp(self)
0.200.445 by Jelmer Vernooij
Import dulwich as dulwich, not as git.
176
        dulwich.repo.Repo.create(self.test_dir)
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
177
        self.git_repo = Repository.open(self.test_dir)
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
178
0.200.40 by David Allouche
GitRepository.supports_rich_root() => False
179
    def test_supports_rich_root(self):
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
180
        repo = self.git_repo
0.200.131 by Jelmer Vernooij
Fix all tests but two, use rich roots by default.
181
        self.assertEqual(repo.supports_rich_root(), True)
0.200.40 by David Allouche
GitRepository.supports_rich_root() => False
182
0.200.60 by Jelmer Vernooij
Support signature functions.
183
    def test_get_signature_text(self):
0.200.61 by Jelmer Vernooij
Fix tests.
184
        self.assertRaises(errors.NoSuchRevision, self.git_repo.get_signature_text, revision.NULL_REVISION)
0.200.60 by Jelmer Vernooij
Support signature functions.
185
186
    def test_has_signature_for_revision_id(self):
187
        self.assertEquals(False, self.git_repo.has_signature_for_revision_id(revision.NULL_REVISION))
188
0.200.75 by Jelmer Vernooij
Implement Repository.all_revision_ids().
189
    def test_all_revision_ids_none(self):
0.200.712 by Jelmer Vernooij
all_revision_ids() on an empty repo returns an empty set.
190
        self.assertEquals(set([]), self.git_repo.all_revision_ids())
0.200.75 by Jelmer Vernooij
Implement Repository.all_revision_ids().
191
0.252.41 by Jelmer Vernooij
Fix Repository.all_revision_ids.
192
    def test_all_revision_ids(self):
193
        commit_id = self._do_commit()
194
        self.assertEquals(set(["git-v1:%s" % commit_id]),
195
                self.git_repo.all_revision_ids())
196
0.200.65 by Jelmer Vernooij
Implement get_ancestry properly.
197
    def test_get_ancestry_null(self):
0.200.237 by Jelmer Vernooij
Fix get_ancestry() contents.
198
        self.assertEquals([None, revision.NULL_REVISION], self.git_repo.get_ancestry(revision.NULL_REVISION))
0.200.65 by Jelmer Vernooij
Implement get_ancestry properly.
199
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
200
    def assertIsNullInventory(self, inv):
201
        self.assertEqual(inv.root, None)
202
        self.assertEqual(inv.revision_id, revision.NULL_REVISION)
203
        self.assertEqual(list(inv.iter_entries()), [])
204
205
    def test_get_inventory_none(self):
206
        # GitRepository.get_inventory(None) returns the null inventory.
207
        repo = self.git_repo
0.200.57 by Jelmer Vernooij
Fix more tests.
208
        inv = repo.get_inventory(revision.NULL_REVISION)
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
209
        self.assertIsNullInventory(inv)
210
211
    def test_revision_tree_none(self):
212
        # GitRepository.revision_tree(None) returns the null tree.
213
        repo = self.git_repo
0.200.57 by Jelmer Vernooij
Fix more tests.
214
        tree = repo.revision_tree(revision.NULL_REVISION)
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
215
        self.assertEqual(tree.get_revision_id(), revision.NULL_REVISION)
216
        self.assertIsNullInventory(tree.inventory)
217
0.200.77 by Jelmer Vernooij
Handle NULL_REVISION in get_parent_map.
218
    def test_get_parent_map_null(self):
219
        self.assertEquals({revision.NULL_REVISION: ()}, 
220
                           self.git_repo.get_parent_map([revision.NULL_REVISION]))
221
0.200.71 by Jelmer Vernooij
Implement GitRepositoryFormat.get_format_description.
222
223
class GitRepositoryFormat(tests.TestCase):
224
225
    def setUp(self):
226
        super(GitRepositoryFormat, self).setUp()
0.200.290 by Jelmer Vernooij
Fix tests.
227
        self.format = repository.GitRepositoryFormat()
0.200.71 by Jelmer Vernooij
Implement GitRepositoryFormat.get_format_description.
228
229
    def test_get_format_description(self):
230
        self.assertEquals("Git Repository", self.format.get_format_description())
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
231
232
233
class RevisionGistImportTests(tests.TestCaseWithTransport):
234
235
    def setUp(self):
236
        tests.TestCaseWithTransport.setUp(self)
237
        self.git_path = os.path.join(self.test_dir, "git")
238
        os.mkdir(self.git_path)
0.200.445 by Jelmer Vernooij
Import dulwich as dulwich, not as git.
239
        dulwich.repo.Repo.create(self.git_path)
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
240
        self.git_repo = Repository.open(self.git_path)
241
        self.bzr_tree = self.make_branch_and_tree("bzr")
242
0.200.357 by Jelmer Vernooij
Move push code to push.py.
243
    def get_inter(self):
244
        return InterRepository.get(self.bzr_tree.branch.repository, 
245
                                   self.git_repo)
246
0.200.368 by Jelmer Vernooij
Cope with more granular timezones.
247
    def object_iter(self):
0.235.2 by Jelmer Vernooij
Fix tests.
248
        store = BazaarObjectStore(self.bzr_tree.branch.repository, default_mapping)
0.200.749 by Jelmer Vernooij
Avoid storing entries for trees in the cache, use blobs instead
249
        store_iterator = MissingObjectsIterator(store, self.bzr_tree.branch.repository)
250
        return store, store_iterator
0.200.368 by Jelmer Vernooij
Cope with more granular timezones.
251
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
252
    def import_rev(self, revid, parent_lookup=None):
0.200.749 by Jelmer Vernooij
Avoid storing entries for trees in the cache, use blobs instead
253
        store, store_iter = self.object_iter()
0.200.847 by Jelmer Vernooij
Add BzrGitCache object.
254
        store._cache.idmap.start_write_group()
0.200.749 by Jelmer Vernooij
Avoid storing entries for trees in the cache, use blobs instead
255
        try:
0.252.7 by Jelmer Vernooij
Add basic test for roundtripping from Bazaar.
256
            return store_iter.import_revision(revid, roundtrip=False)
0.200.749 by Jelmer Vernooij
Avoid storing entries for trees in the cache, use blobs instead
257
        except:
0.200.847 by Jelmer Vernooij
Add BzrGitCache object.
258
            store._cache.idmap.abort_write_group()
0.200.749 by Jelmer Vernooij
Avoid storing entries for trees in the cache, use blobs instead
259
            raise
260
        else:
0.200.847 by Jelmer Vernooij
Add BzrGitCache object.
261
            store._cache.idmap.commit_write_group()
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
262
263
    def test_pointless(self):
0.200.257 by Jelmer Vernooij
Add more details for commit, to avoid checksum from changing.
264
        revid = self.bzr_tree.commit("pointless", timestamp=1205433193,
0.200.362 by Jelmer Vernooij
Fix tests.
265
                timezone=0,
0.200.257 by Jelmer Vernooij
Add more details for commit, to avoid checksum from changing.
266
                  committer="Jelmer Vernooij <jelmer@samba.org>")
0.200.443 by Jelmer Vernooij
Fix tests.
267
        self.assertEquals("2caa8094a5b794961cd9bf582e3e2bb090db0b14", 
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
268
                self.import_rev(revid))
0.200.443 by Jelmer Vernooij
Fix tests.
269
        self.assertEquals("2caa8094a5b794961cd9bf582e3e2bb090db0b14", 
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
270
                self.import_rev(revid))
0.200.658 by Jelmer Vernooij
Provide right infrastructure for foreign repository tests from bzrlib.
271
272
273
class ForeignTestsRepositoryFactory(object):
274
275
    def make_repository(self, transport):
276
        return dir.LocalGitBzrDirFormat().initialize_on_transport(transport).open_repository()