/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.200.368 by Jelmer Vernooij
Cope with more granular timezones.
43
from bzrlib.plugins.git.push import (
44
    MissingObjectsIterator,
45
    )
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
46
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
47
class TestGitRepositoryFeatures(tests.TestCaseInTempDir):
0.200.32 by David Allouche
Rewrite GitRepository._parse_rev, with unit tests.
48
    """Feature tests for GitRepository."""
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
49
50
    _test_needs_features = [tests.GitCommandFeature]
51
52
    def test_open_existing(self):
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
53
        GitRepo.init(self.test_dir)
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
54
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
55
        repo = Repository.open('.')
56
        self.assertIsInstance(repo, repository.GitRepository)
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
57
0.200.56 by Jelmer Vernooij
Switch to using GitPython rather than our own in-house stuff.
58
    def test_has_git_repo(self):
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
59
        GitRepo.init(self.test_dir)
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
60
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
61
        repo = Repository.open('.')
0.200.445 by Jelmer Vernooij
Import dulwich as dulwich, not as git.
62
        self.assertIsInstance(repo._git, dulwich.repo.Repo)
0.200.21 by John Arbash Meinel
Fix Repository.get_revision_graph()
63
0.200.29 by David Allouche
Smoke test for GitRepository.get_revision, and corresponding fixes.
64
    def test_get_revision(self):
0.200.32 by David Allouche
Rewrite GitRepository._parse_rev, with unit tests.
65
        # GitRepository.get_revision gives a Revision object.
0.200.29 by David Allouche
Smoke test for GitRepository.get_revision, and corresponding fixes.
66
67
        # Create a git repository with a revision.
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
68
        GitRepo.init(self.test_dir)
0.200.29 by David Allouche
Smoke test for GitRepository.get_revision, and corresponding fixes.
69
        builder = tests.GitBranchBuilder()
0.200.32 by David Allouche
Rewrite GitRepository._parse_rev, with unit tests.
70
        builder.set_file('a', 'text for a\n', False)
0.200.29 by David Allouche
Smoke test for GitRepository.get_revision, and corresponding fixes.
71
        commit_handle = builder.commit('Joe Foo <joe@foo.com>', u'message')
72
        mapping = builder.finish()
73
        commit_id = mapping[commit_handle]
74
75
        # Get the corresponding Revision object.
0.200.104 by Jelmer Vernooij
Use bzr-foreign function names for converting between git and bzr revids.
76
        revid = default_mapping.revision_id_foreign_to_bzr(commit_id)
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
77
        repo = Repository.open('.')
0.200.29 by David Allouche
Smoke test for GitRepository.get_revision, and corresponding fixes.
78
        rev = repo.get_revision(revid)
79
        self.assertIsInstance(rev, revision.Revision)
0.200.32 by David Allouche
Rewrite GitRepository._parse_rev, with unit tests.
80
0.200.106 by Jelmer Vernooij
Test that getting an unknown revision fails.
81
    def test_get_revision_unknown(self):
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
82
        GitRepo.init(self.test_dir)
0.200.106 by Jelmer Vernooij
Test that getting an unknown revision fails.
83
84
        repo = Repository.open('.')
85
        self.assertRaises(errors.NoSuchRevision, repo.get_revision, "bla")
86
0.200.79 by Jelmer Vernooij
Implement RevisionTree.get_revision_id().
87
    def simple_commit(self):
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
88
        # Create a git repository with some interesting files in a revision.
0.200.447 by Jelmer Vernooij
Rely less on command-line git.
89
        GitRepo.init(self.test_dir)
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
90
        builder = tests.GitBranchBuilder()
91
        builder.set_file('data', 'text\n', False)
92
        builder.set_file('executable', 'content', True)
93
        builder.set_link('link', 'broken')
94
        builder.set_file('subdir/subfile', 'subdir text\n', False)
0.204.4 by James Westby
Make the inventory test match what the code produces.
95
        commit_handle = builder.commit('Joe Foo <joe@foo.com>', u'message',
96
            timestamp=1205433193)
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
97
        mapping = builder.finish()
0.200.79 by Jelmer Vernooij
Implement RevisionTree.get_revision_id().
98
        return mapping[commit_handle]
99
100
    def test_revision_tree(self):
101
        commit_id = self.simple_commit()
0.200.104 by Jelmer Vernooij
Use bzr-foreign function names for converting between git and bzr revids.
102
        revid = default_mapping.revision_id_foreign_to_bzr(commit_id)
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
103
        repo = Repository.open('.')
0.200.79 by Jelmer Vernooij
Implement RevisionTree.get_revision_id().
104
        tree = repo.revision_tree(revid)
105
        self.assertEquals(tree.get_revision_id(), revid)
0.200.88 by Jelmer Vernooij
Fix RevisionTree.get_file_text().
106
        self.assertEquals("text\n", tree.get_file_text(tree.path2id("data")))
0.200.79 by Jelmer Vernooij
Implement RevisionTree.get_revision_id().
107
108
    def test_get_inventory(self):
109
        # GitRepository.get_inventory gives a GitInventory object with
110
        # plausible entries for typical cases.
111
112
        commit_id = self.simple_commit()
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
113
114
        # Get the corresponding Inventory object.
0.200.104 by Jelmer Vernooij
Use bzr-foreign function names for converting between git and bzr revids.
115
        revid = default_mapping.revision_id_foreign_to_bzr(commit_id)
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
116
        repo = Repository.open('.')
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
117
        inv = repo.get_inventory(revid)
118
        self.assertIsInstance(inv, inventory.Inventory)
119
        printed_inv = '\n'.join(
120
            repr((path, entry.executable, entry))
121
            for path, entry in inv.iter_entries())
122
        self.assertEqualDiff(
123
            printed_inv,
0.200.394 by Jelmer Vernooij
Fix expected test output.
124
            "('', False, GitInventoryDirectory('TREE_ROOT', u'', parent_id=None,"
0.200.190 by Jelmer Vernooij
Bless current mapping as v1.
125
            " revision='"+default_mapping.revision_id_foreign_to_bzr("69c39cfa65962f3cf16b9b3eb08a15954e9d8590")+"'))\n"
0.200.394 by Jelmer Vernooij
Fix expected test output.
126
            "(u'data', False, GitInventoryFile('data', u'data',"
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
127
            " parent_id='TREE_ROOT',"
0.200.398 by Jelmer Vernooij
Fix inventory test.
128
            " sha1='aa785adca3fcdfe1884ae840e13c6d294a2414e8', len=5, revision=git-v1:69c39cfa65962f3cf16b9b3eb08a15954e9d8590))\n"
0.200.394 by Jelmer Vernooij
Fix expected test output.
129
            "(u'executable', True, GitInventoryFile('executable', u'executable',"
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
130
            " parent_id='TREE_ROOT',"
0.200.398 by Jelmer Vernooij
Fix inventory test.
131
            " sha1='040f06fd774092478d450774f5ba30c5da78acc8', len=7, revision=git-v1:69c39cfa65962f3cf16b9b3eb08a15954e9d8590))\n"
0.200.394 by Jelmer Vernooij
Fix expected test output.
132
            "(u'link', False, GitInventoryLink('link', u'link',"
133
            " parent_id='TREE_ROOT', revision='"+default_mapping.revision_id_foreign_to_bzr("69c39cfa65962f3cf16b9b3eb08a15954e9d8590")+"'))\n"
134
            "(u'subdir', False, GitInventoryDirectory('subdir', u'subdir',"
135
            " parent_id='TREE_ROOT', revision='"+default_mapping.revision_id_foreign_to_bzr("69c39cfa65962f3cf16b9b3eb08a15954e9d8590")+"'))\n"
136
            "(u'subdir/subfile', False, GitInventoryFile('subdir/subfile',"
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
137
            " u'subfile', parent_id='subdir',"
0.200.398 by Jelmer Vernooij
Fix inventory test.
138
            " sha1='67b75c3e49f31fcadddbf9df6a1d8be8c3e44290', len=12, revision=git-v1:69c39cfa65962f3cf16b9b3eb08a15954e9d8590))")
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
139
0.202.2 by David Allouche
GitRepository.get_inventory and .revision_tree work for the null revision. Support for testing GitRepository without disk data.
140
0.204.2 by James Westby
Switch to TestCaseWithTransport so that the cache dir can be
141
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.
142
143
    def setUp(self):
0.204.2 by James Westby
Switch to TestCaseWithTransport so that the cache dir can be
144
        tests.TestCaseWithTransport.setUp(self)
0.200.445 by Jelmer Vernooij
Import dulwich as dulwich, not as git.
145
        dulwich.repo.Repo.create(self.test_dir)
0.200.94 by Jelmer Vernooij
Eliminate (duplicate) git_ prefix.
146
        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.
147
0.200.40 by David Allouche
GitRepository.supports_rich_root() => False
148
    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.
149
        repo = self.git_repo
0.200.131 by Jelmer Vernooij
Fix all tests but two, use rich roots by default.
150
        self.assertEqual(repo.supports_rich_root(), True)
0.200.40 by David Allouche
GitRepository.supports_rich_root() => False
151
0.200.60 by Jelmer Vernooij
Support signature functions.
152
    def test_get_signature_text(self):
0.200.61 by Jelmer Vernooij
Fix tests.
153
        self.assertRaises(errors.NoSuchRevision, self.git_repo.get_signature_text, revision.NULL_REVISION)
0.200.60 by Jelmer Vernooij
Support signature functions.
154
155
    def test_has_signature_for_revision_id(self):
156
        self.assertEquals(False, self.git_repo.has_signature_for_revision_id(revision.NULL_REVISION))
157
0.200.75 by Jelmer Vernooij
Implement Repository.all_revision_ids().
158
    def test_all_revision_ids_none(self):
0.200.254 by Jelmer Vernooij
Fix tests.
159
        self.assertEquals(set([revision.NULL_REVISION]), self.git_repo.all_revision_ids())
0.200.75 by Jelmer Vernooij
Implement Repository.all_revision_ids().
160
0.200.65 by Jelmer Vernooij
Implement get_ancestry properly.
161
    def test_get_ancestry_null(self):
0.200.237 by Jelmer Vernooij
Fix get_ancestry() contents.
162
        self.assertEquals([None, revision.NULL_REVISION], self.git_repo.get_ancestry(revision.NULL_REVISION))
0.200.65 by Jelmer Vernooij
Implement get_ancestry properly.
163
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
    def assertIsNullInventory(self, inv):
165
        self.assertEqual(inv.root, None)
166
        self.assertEqual(inv.revision_id, revision.NULL_REVISION)
167
        self.assertEqual(list(inv.iter_entries()), [])
168
169
    def test_get_inventory_none(self):
170
        # GitRepository.get_inventory(None) returns the null inventory.
171
        repo = self.git_repo
0.200.57 by Jelmer Vernooij
Fix more tests.
172
        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.
173
        self.assertIsNullInventory(inv)
174
175
    def test_revision_tree_none(self):
176
        # GitRepository.revision_tree(None) returns the null tree.
177
        repo = self.git_repo
0.200.57 by Jelmer Vernooij
Fix more tests.
178
        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.
179
        self.assertEqual(tree.get_revision_id(), revision.NULL_REVISION)
180
        self.assertIsNullInventory(tree.inventory)
181
0.200.77 by Jelmer Vernooij
Handle NULL_REVISION in get_parent_map.
182
    def test_get_parent_map_null(self):
183
        self.assertEquals({revision.NULL_REVISION: ()}, 
184
                           self.git_repo.get_parent_map([revision.NULL_REVISION]))
185
0.200.71 by Jelmer Vernooij
Implement GitRepositoryFormat.get_format_description.
186
187
class GitRepositoryFormat(tests.TestCase):
188
189
    def setUp(self):
190
        super(GitRepositoryFormat, self).setUp()
0.200.290 by Jelmer Vernooij
Fix tests.
191
        self.format = repository.GitRepositoryFormat()
0.200.71 by Jelmer Vernooij
Implement GitRepositoryFormat.get_format_description.
192
193
    def test_get_format_description(self):
194
        self.assertEquals("Git Repository", self.format.get_format_description())
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
195
196
197
class RevisionGistImportTests(tests.TestCaseWithTransport):
198
199
    def setUp(self):
200
        tests.TestCaseWithTransport.setUp(self)
201
        self.git_path = os.path.join(self.test_dir, "git")
202
        os.mkdir(self.git_path)
0.200.445 by Jelmer Vernooij
Import dulwich as dulwich, not as git.
203
        dulwich.repo.Repo.create(self.git_path)
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
204
        self.git_repo = Repository.open(self.git_path)
205
        self.bzr_tree = self.make_branch_and_tree("bzr")
206
0.200.357 by Jelmer Vernooij
Move push code to push.py.
207
    def get_inter(self):
208
        return InterRepository.get(self.bzr_tree.branch.repository, 
209
                                   self.git_repo)
210
0.200.368 by Jelmer Vernooij
Cope with more granular timezones.
211
    def object_iter(self):
212
        return MissingObjectsIterator(self.bzr_tree.branch.repository, 
213
                                      default_mapping)
214
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
215
    def import_rev(self, revid, parent_lookup=None):
0.200.368 by Jelmer Vernooij
Cope with more granular timezones.
216
        return self.object_iter().import_revision(revid)
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
217
218
    def test_pointless(self):
0.200.257 by Jelmer Vernooij
Add more details for commit, to avoid checksum from changing.
219
        revid = self.bzr_tree.commit("pointless", timestamp=1205433193,
0.200.362 by Jelmer Vernooij
Fix tests.
220
                timezone=0,
0.200.257 by Jelmer Vernooij
Add more details for commit, to avoid checksum from changing.
221
                  committer="Jelmer Vernooij <jelmer@samba.org>")
0.200.443 by Jelmer Vernooij
Fix tests.
222
        self.assertEquals("2caa8094a5b794961cd9bf582e3e2bb090db0b14", 
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
223
                self.import_rev(revid))
0.200.443 by Jelmer Vernooij
Fix tests.
224
        self.assertEquals("2caa8094a5b794961cd9bf582e3e2bb090db0b14", 
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
225
                self.import_rev(revid))