17
17
"""Converters, etc for going between Bazaar and Git ids."""
19
from bzrlib import errors, foreign
19
from bzrlib import errors, foreign, urlutils
20
20
from bzrlib.inventory import ROOT_ID
21
21
from bzrlib.foreign import (
79
def export_commit(self, rev, tree_sha):
80
"""Turn a Bazaar revision in to a Git commit
82
:param tree_sha: HACK parameter (until we can retrieve this from the mapping)
83
:return dulwich.objects.Commit represent the revision:
85
from dulwich.objects import Commit
87
commit._tree = tree_sha
88
for p in rev.parent_ids:
89
commit._parents.append(self.revision_id_bzr_to_foreign(p))
90
commit._message = rev.message
91
commit._committer = rev.committer
92
if 'author' in rev.properties:
93
commit._author = rev.properties['author']
95
commit._author = rev.committer
96
commit._commit_time = long(rev.timestamp)
101
80
class BzrGitMappingv1(BzrGitMapping):
102
81
revid_prefix = 'git-v1'
141
120
foreign_git = ForeignGit()
142
121
default_mapping = BzrGitMappingv1()
124
def inventory_to_tree_and_blobs(repo, mapping, revision_id):
125
from dulwich.objects import Tree, Blob
126
from bzrlib.inventory import InventoryDirectory, InventoryFile
132
inv = repo.get_inventory(revision_id)
134
# stack contains the set of trees that we haven't
135
# finished constructing
137
for path, entry in inv.iter_entries():
138
while stack and not path.startswith(cur):
140
sha = tree.sha().hexdigest()
142
t = (stat.S_IFDIR, urlutils.basename(cur).encode('UTF-8'), sha)
143
cur, tree = stack.pop()
146
if type(entry) == InventoryDirectory:
147
stack.append((cur, tree))
151
if type(entry) == InventoryFile:
152
#FIXME: We can make potentially make this Lazy to avoid shaing lots of stuff
153
# and having all these objects in memory at once
155
_, blob._text = repo.iter_files_bytes([(entry.file_id, entry.revision, path)]).next()
156
sha = blob.sha().hexdigest()
157
yield sha, blob, path
159
name = urlutils.basename(path).encode("utf-8")
160
mode = stat.S_IFREG | 0644
163
tree.add(mode, name, sha)
165
while len(stack) > 1:
167
sha = tree.sha().hexdigest()
169
t = (stat.S_IFDIR, urlutils.basename(cur).encode('UTF-8'), sha)
170
cur, tree = stack.pop()
174
yield tree.sha().hexdigest(), tree, cur
177
def revision_to_commit(rev, tree_sha, parent_lookup):
178
"""Turn a Bazaar revision in to a Git commit
180
:param tree_sha: Tree sha for the commit
181
:param parent_lookup: Function for looking up the GIT sha equiv of a bzr revision
182
:return dulwich.objects.Commit represent the revision:
184
from dulwich.objects import Commit
186
commit._tree = tree_sha
187
for p in rev.parent_ids:
188
commit._parents.append(parent_lookup(p))
189
commit._message = rev.message
190
commit._committer = rev.committer
191
if 'author' in rev.properties:
192
commit._author = rev.properties['author']
194
commit._author = rev.committer
195
commit._commit_time = long(rev.timestamp)