131
134
for revid in revision_ids:
132
135
if revid == NULL_REVISION:
134
git_sha = self.source_store._lookup_revision_sha1(revid)
138
git_sha = self.source_store._lookup_revision_sha1(revid)
140
raise NoSuchRevision(revid, self.source)
135
141
git_shas.append(git_sha)
136
142
walker = Walker(self.source_store,
137
143
include=git_shas, exclude=[
142
148
for (kind, type_data) in self.source_store.lookup_git_sha(entry.commit.id):
143
149
if kind == "commit":
144
150
missing_revids.add(type_data[0])
145
return self.source.revision_ids_to_search_result(missing_revids)
151
return self.source.revision_ids_to_search_result(missing_revids)
147
153
def _warn_slow(self):
148
154
if not config.GlobalConfig().suppress_warning('slow_intervcs_push'):
363
369
isinstance(target, RemoteGitRepository))
372
class GitSearchResult(object):
374
def __init__(self, start, exclude, keys):
376
self._exclude = exclude
382
def get_recipe(self):
383
return ('search', self._start, self._exclude, len(self._keys))
366
386
class InterFromGitRepository(InterRepository):
368
388
_matching_repo_format = GitRepositoryFormat()
403
423
if limit is not None:
404
424
raise FetchLimitUnsupported(self)
408
todo.extend(revision_ids)
410
todo.extend(revision_ids)
411
with self.lock_read():
412
for revid in revision_ids:
413
if revid == NULL_REVISION:
415
git_sha, mapping = self.source.lookup_bzr_revision_id(revid)
416
git_shas.append(git_sha)
417
walker = Walker(self.source._git.object_store,
418
include=git_shas, exclude=[
419
sha for sha in self.target.controldir.get_refs_container().as_dict().values()
421
missing_revids = set()
423
missing_revids.add(self.source.lookup_foreign_revision_id(entry.commit.id))
424
return self.source.revision_ids_to_search_result(missing_revids)
425
if revision_ids is None and if_present_ids is None:
426
todo = set(self.source.all_revision_ids())
429
if revision_ids is not None:
430
for revid in revision_ids:
431
if not self.source.has_revision(revid):
432
raise NoSuchRevision(revid, self.source)
433
todo.update(revision_ids)
434
if if_present_ids is not None:
435
todo.update(if_present_ids)
436
result_set = todo.difference(self.target.all_revision_ids())
437
result_parents = set(itertools.chain.from_iterable(viewvalues(
438
self.source.get_graph().get_parent_map(result_set))))
439
included_keys = result_set.intersection(result_parents)
440
start_keys = result_set.difference(included_keys)
441
exclude_keys = result_parents.difference(result_set)
442
return GitSearchResult(start_keys, exclude_keys, result_set)
427
445
class InterGitNonGitRepository(InterFromGitRepository):