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