bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 
0.200.252
by Jelmer Vernooij
 Clarify history, copyright.  | 
1  | 
# Copyright (C) 2007 Canonical Ltd
 | 
2  | 
# Copyright (C) 2008-2009 Jelmer Vernooij <jelmer@samba.org>
 | 
|
3  | 
# Copyright (C) 2008 John Carr
 | 
|
| 
0.200.18
by John Arbash Meinel
 Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.  | 
4  | 
#
 | 
5  | 
# This program is free software; you can redistribute it and/or modify
 | 
|
6  | 
# it under the terms of the GNU General Public License as published by
 | 
|
7  | 
# the Free Software Foundation; either version 2 of the License, or
 | 
|
8  | 
# (at your option) any later version.
 | 
|
9  | 
#
 | 
|
10  | 
# This program is distributed in the hope that it will be useful,
 | 
|
11  | 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
|
12  | 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
|
13  | 
# GNU General Public License for more details.
 | 
|
14  | 
#
 | 
|
15  | 
# You should have received a copy of the GNU General Public License
 | 
|
16  | 
# along with this program; if not, write to the Free Software
 | 
|
17  | 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
|
18  | 
||
19  | 
"""Converters, etc for going between Bazaar and Git ids."""
 | 
|
20  | 
||
| 
0.200.292
by Jelmer Vernooij
 Fix formatting.  | 
21  | 
from bzrlib import (  | 
22  | 
errors,  | 
|
23  | 
foreign,  | 
|
24  | 
urlutils,  | 
|
25  | 
    )
 | 
|
26  | 
from bzrlib.inventory import (  | 
|
27  | 
ROOT_ID,  | 
|
28  | 
    )
 | 
|
| 
0.200.152
by Jelmer Vernooij
 Fix syntax errors.  | 
29  | 
from bzrlib.foreign import (  | 
| 
0.200.292
by Jelmer Vernooij
 Fix formatting.  | 
30  | 
ForeignVcs,  | 
31  | 
VcsMappingRegistry,  | 
|
32  | 
ForeignRevision,  | 
|
33  | 
    )
 | 
|
| 
0.206.1
by Jelmer Vernooij
 Use foreign utility functions.  | 
34  | 
|
| 
0.200.150
by Jelmer Vernooij
 Abstract away file id generation.  | 
35  | 
def escape_file_id(file_id):  | 
36  | 
return file_id.replace('_', '__').replace(' ', '_s')  | 
|
37  | 
||
38  | 
||
39  | 
def unescape_file_id(file_id):  | 
|
40  | 
return file_id.replace("_s", " ").replace("__", "_")  | 
|
41  | 
||
42  | 
||
| 
0.206.1
by Jelmer Vernooij
 Use foreign utility functions.  | 
43  | 
class BzrGitMapping(foreign.VcsMapping):  | 
| 
0.200.97
by Jelmer Vernooij
 use mapping object.  | 
44  | 
"""Class that maps between Git and Bazaar semantics."""  | 
45  | 
experimental = False  | 
|
46  | 
||
| 
0.200.198
by Jelmer Vernooij
 Cope with move of show_foreign_revid.  | 
47  | 
def __init__(self):  | 
48  | 
super(BzrGitMapping, self).__init__(foreign_git)  | 
|
49  | 
||
| 
0.200.195
by Jelmer Vernooij
 Return mapping in revision_id_bzr_to_foreign() as required by the interface.  | 
50  | 
def __eq__(self, other):  | 
51  | 
return type(self) == type(other) and self.revid_prefix == other.revid_prefix  | 
|
52  | 
||
53  | 
    @classmethod
 | 
|
54  | 
def revision_id_foreign_to_bzr(cls, git_rev_id):  | 
|
| 
0.200.97
by Jelmer Vernooij
 use mapping object.  | 
55  | 
"""Convert a git revision id handle to a Bazaar revision id."""  | 
| 
0.200.195
by Jelmer Vernooij
 Return mapping in revision_id_bzr_to_foreign() as required by the interface.  | 
56  | 
return "%s:%s" % (cls.revid_prefix, git_rev_id)  | 
| 
0.200.97
by Jelmer Vernooij
 use mapping object.  | 
57  | 
|
| 
0.200.195
by Jelmer Vernooij
 Return mapping in revision_id_bzr_to_foreign() as required by the interface.  | 
58  | 
    @classmethod
 | 
59  | 
def revision_id_bzr_to_foreign(cls, bzr_rev_id):  | 
|
| 
0.200.97
by Jelmer Vernooij
 use mapping object.  | 
60  | 
"""Convert a Bazaar revision id to a git revision id handle."""  | 
| 
0.200.195
by Jelmer Vernooij
 Return mapping in revision_id_bzr_to_foreign() as required by the interface.  | 
61  | 
if not bzr_rev_id.startswith("%s:" % cls.revid_prefix):  | 
62  | 
raise errors.InvalidRevisionId(bzr_rev_id, cls)  | 
|
63  | 
return bzr_rev_id[len(cls.revid_prefix)+1:], cls()  | 
|
| 
0.200.97
by Jelmer Vernooij
 use mapping object.  | 
64  | 
|
| 
0.200.150
by Jelmer Vernooij
 Abstract away file id generation.  | 
65  | 
def generate_file_id(self, path):  | 
| 
0.200.297
by Jelmer Vernooij
 Cope with non-ascii characters in filenames (needs a test..).  | 
66  | 
        # Git paths are just bytestrings
 | 
67  | 
        # We must just hope they are valid UTF-8..
 | 
|
68  | 
assert isinstance(path, str)  | 
|
| 
0.200.157
by Jelmer Vernooij
 Fix some bit of fetching.  | 
69  | 
if path == "":  | 
70  | 
return ROOT_ID  | 
|
| 
0.200.297
by Jelmer Vernooij
 Cope with non-ascii characters in filenames (needs a test..).  | 
71  | 
return escape_file_id(path)  | 
| 
0.200.150
by Jelmer Vernooij
 Abstract away file id generation.  | 
72  | 
|
| 
0.200.151
by Jelmer Vernooij
 Support converting git objects to bzr objects.  | 
73  | 
def import_commit(self, commit):  | 
74  | 
"""Convert a git commit to a bzr revision.  | 
|
75  | 
||
76  | 
        :return: a `bzrlib.revision.Revision` object.
 | 
|
77  | 
        """
 | 
|
78  | 
if commit is None:  | 
|
79  | 
raise AssertionError("Commit object can't be None")  | 
|
80  | 
rev = ForeignRevision(commit.id, self, self.revision_id_foreign_to_bzr(commit.id))  | 
|
81  | 
rev.parent_ids = tuple([self.revision_id_foreign_to_bzr(p) for p in commit.parents])  | 
|
82  | 
rev.message = commit.message.decode("utf-8", "replace")  | 
|
83  | 
rev.committer = str(commit.committer).decode("utf-8", "replace")  | 
|
84  | 
if commit.committer != commit.author:  | 
|
85  | 
rev.properties['author'] = str(commit.author).decode("utf-8", "replace")  | 
|
86  | 
rev.timestamp = commit.commit_time  | 
|
87  | 
rev.timezone = 0  | 
|
88  | 
return rev  | 
|
89  | 
||
| 
0.200.97
by Jelmer Vernooij
 use mapping object.  | 
90  | 
|
| 
0.200.190
by Jelmer Vernooij
 Bless current mapping as v1.  | 
91  | 
class BzrGitMappingv1(BzrGitMapping):  | 
92  | 
revid_prefix = 'git-v1'  | 
|
93  | 
experimental = False  | 
|
94  | 
||
95  | 
||
96  | 
class BzrGitMappingExperimental(BzrGitMappingv1):  | 
|
| 
0.200.104
by Jelmer Vernooij
 Use bzr-foreign function names for converting between git and bzr revids.  | 
97  | 
revid_prefix = 'git-experimental'  | 
98  | 
experimental = True  | 
|
| 
0.200.97
by Jelmer Vernooij
 use mapping object.  | 
99  | 
|
100  | 
||
| 
0.200.195
by Jelmer Vernooij
 Return mapping in revision_id_bzr_to_foreign() as required by the interface.  | 
101  | 
class GitMappingRegistry(VcsMappingRegistry):  | 
102  | 
||
103  | 
def revision_id_bzr_to_foreign(self, bzr_revid):  | 
|
104  | 
if not bzr_revid.startswith("git-"):  | 
|
105  | 
raise errors.InvalidRevisionId(bzr_revid, None)  | 
|
106  | 
(mapping_version, git_sha) = bzr_revid.split(":", 1)  | 
|
107  | 
mapping = self.get(mapping_version)  | 
|
108  | 
return mapping.revision_id_bzr_to_foreign(bzr_revid)  | 
|
109  | 
||
110  | 
parse_revision_id = revision_id_bzr_to_foreign  | 
|
111  | 
||
112  | 
||
113  | 
mapping_registry = GitMappingRegistry()  | 
|
114  | 
mapping_registry.register_lazy('git-v1', "bzrlib.plugins.git.mapping",  | 
|
115  | 
"BzrGitMappingv1")  | 
|
116  | 
mapping_registry.register_lazy('git-experimental', "bzrlib.plugins.git.mapping",  | 
|
117  | 
"BzrGitMappingExperimental")  | 
|
118  | 
||
119  | 
||
120  | 
class ForeignGit(ForeignVcs):  | 
|
121  | 
"""Foreign Git."""  | 
|
122  | 
||
123  | 
def __init__(self):  | 
|
124  | 
super(ForeignGit, self).__init__(mapping_registry)  | 
|
125  | 
||
| 
0.200.198
by Jelmer Vernooij
 Cope with move of show_foreign_revid.  | 
126  | 
    @classmethod
 | 
127  | 
def show_foreign_revid(cls, foreign_revid):  | 
|
128  | 
return { "git commit": foreign_revid }  | 
|
129  | 
||
130  | 
||
131  | 
foreign_git = ForeignGit()  | 
|
| 
0.200.190
by Jelmer Vernooij
 Bless current mapping as v1.  | 
132  | 
default_mapping = BzrGitMappingv1()  | 
| 
0.200.212
by Jelmer Vernooij
 Move conversion functions to mapping, use fetch_objects() from repository if present.  | 
133  | 
|
134  | 
||
135  | 
def inventory_to_tree_and_blobs(repo, mapping, revision_id):  | 
|
| 
0.200.213
by Jelmer Vernooij
 Move functions to mapping.  | 
136  | 
from dulwich.objects import Tree, Blob  | 
137  | 
from bzrlib.inventory import InventoryDirectory, InventoryFile  | 
|
138  | 
import stat  | 
|
| 
0.200.212
by Jelmer Vernooij
 Move conversion functions to mapping, use fetch_objects() from repository if present.  | 
139  | 
stack = []  | 
140  | 
cur = ""  | 
|
141  | 
tree = Tree()  | 
|
142  | 
||
143  | 
inv = repo.get_inventory(revision_id)  | 
|
144  | 
||
| 
0.200.220
by Jelmer Vernooij
 yield the right path for the tree root.  | 
145  | 
    # stack contains the set of trees that we haven't 
 | 
146  | 
    # finished constructing
 | 
|
| 
0.200.212
by Jelmer Vernooij
 Move conversion functions to mapping, use fetch_objects() from repository if present.  | 
147  | 
for path, entry in inv.iter_entries():  | 
148  | 
while stack and not path.startswith(cur):  | 
|
149  | 
tree.serialize()  | 
|
150  | 
sha = tree.sha().hexdigest()  | 
|
| 
0.200.221
by Jelmer Vernooij
 Add FOSDEM roundtripping notes.  | 
151  | 
yield sha, tree, cur  | 
| 
0.200.219
by Jelmer Vernooij
 Fix some issues in tree conversion functions.  | 
152  | 
t = (stat.S_IFDIR, urlutils.basename(cur).encode('UTF-8'), sha)  | 
| 
0.200.212
by Jelmer Vernooij
 Move conversion functions to mapping, use fetch_objects() from repository if present.  | 
153  | 
cur, tree = stack.pop()  | 
154  | 
tree.add(*t)  | 
|
155  | 
||
156  | 
if type(entry) == InventoryDirectory:  | 
|
157  | 
stack.append((cur, tree))  | 
|
158  | 
cur = path  | 
|
159  | 
tree = Tree()  | 
|
160  | 
||
161  | 
if type(entry) == InventoryFile:  | 
|
162  | 
            #FIXME: We can make potentially make this Lazy to avoid shaing lots of stuff
 | 
|
163  | 
            # and having all these objects in memory at once
 | 
|
164  | 
blob = Blob()  | 
|
| 
0.200.219
by Jelmer Vernooij
 Fix some issues in tree conversion functions.  | 
165  | 
_, blob._text = repo.iter_files_bytes([(entry.file_id, entry.revision, path)]).next()  | 
| 
0.200.212
by Jelmer Vernooij
 Move conversion functions to mapping, use fetch_objects() from repository if present.  | 
166  | 
sha = blob.sha().hexdigest()  | 
167  | 
yield sha, blob, path  | 
|
168  | 
||
| 
0.200.219
by Jelmer Vernooij
 Fix some issues in tree conversion functions.  | 
169  | 
name = urlutils.basename(path).encode("utf-8")  | 
| 
0.200.212
by Jelmer Vernooij
 Move conversion functions to mapping, use fetch_objects() from repository if present.  | 
170  | 
mode = stat.S_IFREG | 0644  | 
171  | 
if entry.executable:  | 
|
172  | 
mode |= 0111  | 
|
173  | 
tree.add(mode, name, sha)  | 
|
174  | 
||
175  | 
while len(stack) > 1:  | 
|
176  | 
tree.serialize()  | 
|
177  | 
sha = tree.sha().hexdigest()  | 
|
| 
0.200.221
by Jelmer Vernooij
 Add FOSDEM roundtripping notes.  | 
178  | 
yield sha, tree, cur  | 
| 
0.200.219
by Jelmer Vernooij
 Fix some issues in tree conversion functions.  | 
179  | 
t = (stat.S_IFDIR, urlutils.basename(cur).encode('UTF-8'), sha)  | 
| 
0.200.212
by Jelmer Vernooij
 Move conversion functions to mapping, use fetch_objects() from repository if present.  | 
180  | 
cur, tree = stack.pop()  | 
181  | 
tree.add(*t)  | 
|
182  | 
||
183  | 
tree.serialize()  | 
|
| 
0.200.221
by Jelmer Vernooij
 Add FOSDEM roundtripping notes.  | 
184  | 
yield tree.sha().hexdigest(), tree, cur  | 
| 
0.200.212
by Jelmer Vernooij
 Move conversion functions to mapping, use fetch_objects() from repository if present.  | 
185  | 
|
186  | 
||
187  | 
def revision_to_commit(rev, tree_sha, parent_lookup):  | 
|
188  | 
"""Turn a Bazaar revision in to a Git commit  | 
|
189  | 
||
190  | 
    :param tree_sha: Tree sha for the commit
 | 
|
191  | 
    :param parent_lookup: Function for looking up the GIT sha equiv of a bzr revision
 | 
|
192  | 
    :return dulwich.objects.Commit represent the revision:
 | 
|
193  | 
    """
 | 
|
194  | 
from dulwich.objects import Commit  | 
|
195  | 
commit = Commit()  | 
|
196  | 
commit._tree = tree_sha  | 
|
197  | 
for p in rev.parent_ids:  | 
|
| 
0.200.222
by Jelmer Vernooij
 Dpush works \o/  | 
198  | 
git_p = parent_lookup(p)  | 
199  | 
if git_p is not None:  | 
|
| 
0.200.281
by Jelmer Vernooij
 Add extra assert to make sure we don't write invalid parents.  | 
200  | 
assert len(git_p) == 40, "unexpected length for %r" % git_p  | 
| 
0.200.222
by Jelmer Vernooij
 Dpush works \o/  | 
201  | 
commit._parents.append(git_p)  | 
| 
0.200.231
by Jelmer Vernooij
 Partially fix pull.  | 
202  | 
commit._message = rev.message.encode("utf-8")  | 
203  | 
commit._committer = rev.committer.encode("utf-8")  | 
|
| 
0.200.244
by Jelmer Vernooij
 Avoid use of deprecated get_apparent_author.  | 
204  | 
commit._author = rev.get_apparent_authors()[0].encode("utf-8")  | 
| 
0.200.212
by Jelmer Vernooij
 Move conversion functions to mapping, use fetch_objects() from repository if present.  | 
205  | 
commit._commit_time = long(rev.timestamp)  | 
206  | 
commit.serialize()  | 
|
207  | 
return commit  |