57
55
self.source = source
58
56
self._object_store = store
60
self._sent_shas = set()
64
60
def import_revisions(self, revids):
65
self._revids.update(revids)
66
61
for i, revid in enumerate(revids):
68
63
self.pb.update("pushing revisions", i, len(revids))
69
64
git_commit = self.import_revision(revid)
70
65
yield (revid, git_commit)
72
def need_sha(self, sha):
73
if sha in self._sent_shas:
75
(type, (fileid, revid)) = self._object_store._idmap.lookup_git_sha(sha)
76
assert type in ("blob", "tree")
77
if revid in self._revids:
78
# Not sent yet, and part of the set of revisions to send
80
# Not changed in the revisions to send, so either not necessary
81
# or already present remotely (as git doesn't do ghosts)
84
def queue(self, sha, obj, path, ie=None, inv=None):
87
self._pending.append((obj, path))
88
self._sent_shas.add(sha)
90
67
def import_revision(self, revid):
91
68
"""Import the gist of a revision into this Git repository.
94
inv = self.source.get_inventory(revid)
71
inv = self._object_store.parent_invs_cache.get_inventory(revid)
95
72
rev = self.source.get_revision(revid)
96
unusual_modes = extract_unusual_modes(rev)
101
(sha, object) = self._object_store._get_ie_object_or_sha1(ie, inv, unusual_modes)
102
if ie.parent_id is None:
104
if not self.need_sha(sha):
106
self.queue(sha, object, inv.id2path(ie.file_id), ie, inv)
107
if ie.kind == "directory":
108
todo.extend(ie.children.values())
109
assert tree_sha is not None
110
commit = self._object_store._get_commit(rev, tree_sha)
111
self.queue(commit.id, commit, None)
74
for path, obj in self._object_store._revision_to_objects(rev, inv):
75
if obj._type == "commit":
77
self._pending.append((obj, path))
114
80
def __len__(self):
115
81
return len(self._pending)
117
83
def __iter__(self):
118
for i, (object, path) in enumerate(self._pending):
120
self.pb.update("writing pack objects", i, len(self))
121
if isinstance(object, tuple):
122
object = self._object_store._get_ie_object(*object)
84
return iter(self._pending)
126
87
class InterToGitRepository(InterRepository):
141
102
"""See InterRepository.copy_content."""
142
103
self.fetch(revision_id, pb, find_ghosts=False)
144
def fetch(self, revision_id=None, pb=None, find_ghosts=False,
105
def fetch(self, revision_id=None, pb=None, find_ghosts=False,
145
106
fetch_spec=None):
146
107
raise NoPushSupport()