366
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))
369
386
class InterFromGitRepository(InterRepository):
371
388
_matching_repo_format = GitRepositoryFormat()
406
423
if limit is not None:
407
424
raise FetchLimitUnsupported(self)
411
todo.extend(revision_ids)
413
todo.extend(revision_ids)
427
if revision_ids is not None:
428
todo.update(revision_ids)
429
if if_present_ids is not None:
430
todo.update(revision_ids)
431
if if_present_ids is None and revision_ids is None:
432
todo = set(self.source.all_revision_ids())
433
target_store = get_object_store(self.target)
434
target_refs = get_refs_container(self.target.controldir, target_store)
414
435
with self.lock_read():
415
for revid in revision_ids:
416
437
if revid == NULL_REVISION:
418
439
git_sha, mapping = self.source.lookup_bzr_revision_id(revid)
419
440
git_shas.append(git_sha)
420
441
walker = Walker(self.source._git.object_store,
421
442
include=git_shas, exclude=[
422
sha for sha in self.target.controldir.get_refs_container().as_dict().values()
443
sha for sha in target_refs.as_dict().values()
423
444
if sha != ZERO_SHA])
424
missing_revids = set()
425
446
for entry in walker:
426
missing_revids.add(self.source.lookup_foreign_revision_id(entry.commit.id))
427
return self.source.revision_ids_to_search_result(missing_revids)
447
result_set.add(self.source.lookup_foreign_revision_id(entry.commit.id))
448
result_parents = set(itertools.chain.from_iterable(viewvalues(
449
self.source.get_graph().get_parent_map(result_set))))
450
included_keys = result_set.intersection(result_parents)
451
start_keys = result_set.difference(included_keys)
452
exclude_keys = result_parents.difference(result_set)
453
return GitSearchResult(start_keys, exclude_keys, result_set)
430
456
class InterGitNonGitRepository(InterFromGitRepository):