/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
"""An adapter between a Git Repository and a Bazaar Branch"""
18
0.200.45 by David Allouche
More performance hacking, introduce sqlite cache, escape characters in commits that break serializers.
19
import os
0.200.57 by Jelmer Vernooij
Fix more tests.
20
import time
0.200.45 by David Allouche
More performance hacking, introduce sqlite cache, escape characters in commits that break serializers.
21
22
import bzrlib
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
23
from bzrlib import (
0.200.20 by John Arbash Meinel
All tests are passing again
24
    deprecated_graph,
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
25
    errors,
0.200.38 by David Allouche
Reimplement GitRepository.get_inventory, simpler and faster.
26
    inventory,
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
27
    osutils,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
28
    repository,
0.200.29 by David Allouche
Smoke test for GitRepository.get_revision, and corresponding fixes.
29
    revision,
0.200.39 by David Allouche
Black-box text for "bzr log" in a git tree. Further simplification of GitRevisionTree.
30
    revisiontree,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
31
    urlutils,
0.200.60 by Jelmer Vernooij
Support signature functions.
32
    versionedfile,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
33
    )
0.200.115 by Jelmer Vernooij
Pass mapping object.
34
from bzrlib.foreign import (
35
        ForeignRevision,
36
        )
0.200.45 by David Allouche
More performance hacking, introduce sqlite cache, escape characters in commits that break serializers.
37
from bzrlib.transport import get_transport
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
38
0.209.1 by Ali Sabil
Fixed wrong import for versionedfiles in repository.py
39
from bzrlib.plugins.git.foreign import (
0.200.115 by Jelmer Vernooij
Pass mapping object.
40
    ForeignRepository,
0.208.5 by Jelmer Vernooij
Add log show function for git.
41
    versionedfiles,
0.200.20 by John Arbash Meinel
All tests are passing again
42
    )
0.200.97 by Jelmer Vernooij
use mapping object.
43
from bzrlib.plugins.git.mapping import default_mapping
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
44
0.200.123 by Jelmer Vernooij
Use central git module.
45
from bzrlib.plugins.git import git
46
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
47
0.200.120 by Jelmer Vernooij
Use API closer to that of python-git.
48
class GitTags(object):
49
50
    def __init__(self, tags):
51
        self._tags = tags
52
53
    def __iter__(self):
54
        return iter(self._tags)
55
56
0.200.115 by Jelmer Vernooij
Pass mapping object.
57
class GitRepository(ForeignRepository):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
58
    """An adapter to git repositories for bzr."""
59
0.200.41 by David Allouche
Define _serializer = None in GitRepository.
60
    _serializer = None
61
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
62
    def __init__(self, gitdir, lockfiles):
0.200.61 by Jelmer Vernooij
Fix tests.
63
        self.base = gitdir.root_transport.base
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
64
        self.bzrdir = gitdir
65
        self.control_files = lockfiles
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
66
        self._git = gitdir._git
0.200.56 by Jelmer Vernooij
Switch to using GitPython rather than our own in-house stuff.
67
        self.texts = None
0.200.92 by Jelmer Vernooij
Update versionedfiles.
68
        self.signatures = versionedfiles.VirtualSignatureTexts(self)
69
        self.revisions = versionedfiles.VirtualRevisionTexts(self)
0.203.1 by Aaron Bentley
Make checkouts work
70
        self._format = GitFormat()
0.200.59 by Jelmer Vernooij
Add more tests, fix revision history.
71
        self._fallback_repositories = []
0.200.120 by Jelmer Vernooij
Use API closer to that of python-git.
72
        self.tags = GitTags(self._git.get_tags())
0.200.45 by David Allouche
More performance hacking, introduce sqlite cache, escape characters in commits that break serializers.
73
0.200.74 by Jelmer Vernooij
Implement Repository.all_revision_ids().
74
    def _all_revision_ids(self):
75
        if self._git.heads == []:
76
            return set()
77
        ret = set()
78
        skip = 0
79
        max_count = 1000
80
        cms = None
81
        while cms != []:
82
            cms = self._git.commits("--all", max_count=max_count, skip=skip)
83
            skip += max_count
0.200.104 by Jelmer Vernooij
Use bzr-foreign function names for converting between git and bzr revids.
84
            ret.update([default_mapping.revision_id_foreign_to_bzr(cm.id) for cm in cms])
0.200.74 by Jelmer Vernooij
Implement Repository.all_revision_ids().
85
        return ret
86
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
87
    def is_shared(self):
88
        return True
89
0.200.40 by David Allouche
GitRepository.supports_rich_root() => False
90
    def supports_rich_root(self):
91
        return False
92
0.200.82 by Jelmer Vernooij
Support listing tags.
93
    #def get_revision_delta(self, revision_id):
94
    #    parent_revid = self.get_revision(revision_id).parent_ids[0]
95
    #    diff = self._git.diff(ids.convert_revision_id_bzr_to_git(parent_revid),
96
    #                   ids.convert_revision_id_bzr_to_git(revision_id))
97
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
98
    def get_ancestry(self, revision_id):
0.200.65 by Jelmer Vernooij
Implement get_ancestry properly.
99
        revision_id = revision.ensure_null(revision_id)
100
        ret = []
101
        if revision_id != revision.NULL_REVISION:
102
            skip = 0
103
            max_count = 1000
104
            cms = None
105
            while cms != []:
0.200.106 by Jelmer Vernooij
Test that getting an unknown revision fails.
106
                cms = self._git.commits(self.lookup_git_revid(revision_id, default_mapping), max_count=max_count, skip=skip)
0.200.65 by Jelmer Vernooij
Implement get_ancestry properly.
107
                skip += max_count
0.200.104 by Jelmer Vernooij
Use bzr-foreign function names for converting between git and bzr revids.
108
                ret += [default_mapping.revision_id_foreign_to_bzr(cm.id) for cm in cms]
0.200.65 by Jelmer Vernooij
Implement get_ancestry properly.
109
        return [None] + ret
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
110
111
    def get_signature_text(self, revision_id):
112
        raise errors.NoSuchRevision(self, revision_id)
113
0.200.124 by Jelmer Vernooij
Add lookup_revision_id stub.
114
    def lookup_revision_id(self, revid):
115
        """Lookup a revision id.
116
        
117
        :param revid: Bazaar revision id.
118
        :return: Tuple with git revisionid and mapping.
119
        """
120
        # Yes, this doesn't really work, but good enough as a stub
121
        return osutils.sha(rev_id).hexdigest(), self.get_mapping()
122
0.200.60 by Jelmer Vernooij
Support signature functions.
123
    def has_signature_for_revision_id(self, revision_id):
124
        return False
125
0.200.57 by Jelmer Vernooij
Fix more tests.
126
    def get_parent_map(self, revision_ids):
127
        ret = {}
128
        for revid in revision_ids:
0.200.77 by Jelmer Vernooij
Handle NULL_REVISION in get_parent_map.
129
            if revid == revision.NULL_REVISION:
130
                ret[revid] = ()
131
            else:
0.200.124 by Jelmer Vernooij
Add lookup_revision_id stub.
132
                ret[revid] = tuple([self.get_mapping().revision_id_foreign_to_bzr(p.id) for p in commit.parents])
0.200.57 by Jelmer Vernooij
Fix more tests.
133
        return ret
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
134
0.200.105 by Jelmer Vernooij
Add common function for finding git commit by bzr revid.
135
    def lookup_git_revid(self, bzr_revid, mapping):
136
        try:
137
            return mapping.revision_id_bzr_to_foreign(bzr_revid)
138
        except errors.InvalidRevisionId:
139
            raise errors.NoSuchRevision(bzr_revid, self)
140
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
141
    def get_revision(self, revision_id):
0.200.105 by Jelmer Vernooij
Add common function for finding git commit by bzr revid.
142
        git_commit_id = self.lookup_git_revid(revision_id, default_mapping)
0.200.57 by Jelmer Vernooij
Fix more tests.
143
        commit = self._git.commit(git_commit_id)
0.204.5 by James Westby
Lose the debuggin prints.
144
        # print "fetched revision:", git_commit_id
0.200.115 by Jelmer Vernooij
Pass mapping object.
145
        revision = self._parse_rev(commit, default_mapping)
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
146
        return revision
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
147
148
    def has_revision(self, revision_id):
149
        try:
150
            self.get_revision(revision_id)
151
        except NoSuchRevision:
152
            return False
153
        else:
154
            return True
155
156
    def get_revisions(self, revisions):
157
        return [self.get_revision(r) for r in revisions]
158
0.200.32 by David Allouche
Rewrite GitRepository._parse_rev, with unit tests.
159
    @classmethod
0.200.115 by Jelmer Vernooij
Pass mapping object.
160
    def _parse_rev(klass, commit, mapping):
0.200.57 by Jelmer Vernooij
Fix more tests.
161
        """Convert a git commit to a bzr revision.
162
0.200.32 by David Allouche
Rewrite GitRepository._parse_rev, with unit tests.
163
        :return: a `bzrlib.revision.Revision` object.
164
        """
0.200.122 by Jelmer Vernooij
Use objects that more closely match GitPython, support creating new repositories.
165
        if commit is None:
166
            raise AssertionError("Commit object can't be None")
0.200.115 by Jelmer Vernooij
Pass mapping object.
167
        rev = ForeignRevision(commit.id, mapping, mapping.revision_id_foreign_to_bzr(commit.id))
168
        rev.parent_ids = tuple([mapping.revision_id_foreign_to_bzr(p.id) for p in commit.parents])
0.200.63 by Jelmer Vernooij
Ignore decoding errors since git doesn't support storing encoding.
169
        rev.message = commit.message.decode("utf-8", "replace")
0.208.7 by Jelmer Vernooij
Cope with utf8 author/committer names.
170
        rev.committer = str(commit.committer).decode("utf-8", "replace")
171
        rev.properties['author'] = str(commit.author).decode("utf-8", "replace")
0.200.57 by Jelmer Vernooij
Fix more tests.
172
        rev.timestamp = time.mktime(commit.committed_date)
173
        rev.timezone = 0
0.200.32 by David Allouche
Rewrite GitRepository._parse_rev, with unit tests.
174
        return rev
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
175
176
    def revision_trees(self, revids):
177
        for revid in revids:
178
            yield self.revision_tree(revid)
179
180
    def revision_tree(self, revision_id):
0.200.57 by Jelmer Vernooij
Fix more tests.
181
        revision_id = revision.ensure_null(revision_id)
182
183
        if revision_id == revision.NULL_REVISION:
184
            inv = inventory.Inventory(root_id=None)
185
            inv.revision_id = revision_id
186
            return revisiontree.RevisionTree(self, inv, revision_id)
187
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
188
        return GitRevisionTree(self, revision_id)
189
190
    def get_inventory(self, revision_id):
0.200.57 by Jelmer Vernooij
Fix more tests.
191
        assert revision_id != None
192
        return self.revision_tree(revision_id).inventory
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
193
0.200.108 by Jelmer Vernooij
Support bzr init --git.
194
    def set_make_working_trees(self, trees):
195
        pass
196
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
197
198
def escape_file_id(file_id):
199
    return file_id.replace('_', '__').replace(' ', '_s')
0.200.39 by David Allouche
Black-box text for "bzr log" in a git tree. Further simplification of GitRevisionTree.
200
0.200.45 by David Allouche
More performance hacking, introduce sqlite cache, escape characters in commits that break serializers.
201
0.200.88 by Jelmer Vernooij
Fix RevisionTree.get_file_text().
202
def unescape_file_id(file_id):
203
    return file_id.replace("_s", " ").replace("__", "_")
204
205
0.200.39 by David Allouche
Black-box text for "bzr log" in a git tree. Further simplification of GitRevisionTree.
206
class GitRevisionTree(revisiontree.RevisionTree):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
207
208
    def __init__(self, repository, revision_id):
0.200.39 by David Allouche
Black-box text for "bzr log" in a git tree. Further simplification of GitRevisionTree.
209
        self._repository = repository
0.200.58 by Jelmer Vernooij
Fix remaining tests.
210
        self.revision_id = revision_id
0.200.105 by Jelmer Vernooij
Add common function for finding git commit by bzr revid.
211
        git_id = repository.lookup_git_revid(revision_id, default_mapping)
0.200.57 by Jelmer Vernooij
Fix more tests.
212
        self.tree = repository._git.commit(git_id).tree
0.200.58 by Jelmer Vernooij
Fix remaining tests.
213
        self._inventory = inventory.Inventory(revision_id=revision_id)
214
        self._inventory.root.revision = revision_id
215
        self._build_inventory(self.tree, self._inventory.root, "")
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
216
0.200.79 by Jelmer Vernooij
Implement RevisionTree.get_revision_id().
217
    def get_revision_id(self):
218
        return self.revision_id
219
0.200.87 by Jelmer Vernooij
Remove cache usage.
220
    def get_file_text(self, file_id):
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
221
        entry = self._inventory[file_id]
0.200.87 by Jelmer Vernooij
Remove cache usage.
222
        if entry.kind == 'directory': return ""
0.200.88 by Jelmer Vernooij
Fix RevisionTree.get_file_text().
223
        return self._repository._git.blob(entry.text_id).data
0.203.1 by Aaron Bentley
Make checkouts work
224
0.200.58 by Jelmer Vernooij
Fix remaining tests.
225
    def _build_inventory(self, tree, ie, path):
226
        assert isinstance(path, str)
0.200.115 by Jelmer Vernooij
Pass mapping object.
227
        for b in tree.contents:
0.200.58 by Jelmer Vernooij
Fix remaining tests.
228
            basename = b.name.decode("utf-8")
229
            if path == "":
230
                child_path = b.name
231
            else:
232
                child_path = urlutils.join(path, b.name)
233
            file_id = escape_file_id(child_path.encode('utf-8'))
234
            if b.mode[0] == '0':
235
                child_ie = inventory.InventoryDirectory(file_id, basename, ie.file_id)
236
            elif b.mode[0] == '1':
237
                if b.mode[1] == '0':
238
                    child_ie = inventory.InventoryFile(file_id, basename, ie.file_id)
239
                    child_ie.text_sha1 = osutils.sha_string(b.data)
240
                elif b.mode[1] == '2':
241
                    child_ie = inventory.InventoryLink(file_id, basename, ie.file_id)
242
                    child_ie.text_sha1 = osutils.sha_string("")
243
                else:
244
                    raise AssertionError(
245
                        "Unknown file kind, perms=%r." % (b.mode,))
0.200.88 by Jelmer Vernooij
Fix RevisionTree.get_file_text().
246
                child_ie.text_id = b.id
0.200.58 by Jelmer Vernooij
Fix remaining tests.
247
                child_ie.text_size = b.size
248
            else:
249
                raise AssertionError(
250
                    "Unknown blob kind, perms=%r." % (b.mode,))
251
            child_ie.executable = bool(int(b.mode[3:], 8) & 0111)
252
            child_ie.revision = self.revision_id
0.200.88 by Jelmer Vernooij
Fix RevisionTree.get_file_text().
253
            self._inventory.add(child_ie)
0.200.58 by Jelmer Vernooij
Fix remaining tests.
254
            if b.mode[0] == '0':
255
                self._build_inventory(b, child_ie, child_path)
256
0.203.1 by Aaron Bentley
Make checkouts work
257
258
class GitFormat(object):
259
260
    supports_tree_reference = False
0.200.71 by Jelmer Vernooij
Implement GitRepositoryFormat.get_format_description.
261
262
    def get_format_description(self):
263
        return "Git Repository"