/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/plugins/git/interrepo.py

  • Committer: Jelmer Vernooij
  • Date: 2018-06-17 14:02:43 UTC
  • mto: This revision was merged to the branch mainline in revision 6991.
  • Revision ID: jelmer@jelmer.uk-20180617140243-6ir5v4h9kulf3lmw
More test fixes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
from __future__ import absolute_import
20
20
 
21
21
from io import BytesIO
 
22
import itertools
22
23
 
23
24
from dulwich.errors import (
24
25
    NotCommitError,
52
53
    trace,
53
54
    ui,
54
55
    )
 
56
from ...sixish import viewvalues
55
57
 
56
58
from .errors import (
57
59
    NoPushSupport,
71
73
    remote_divergence,
72
74
    )
73
75
from .refs import (
 
76
    get_refs_container,
74
77
    is_tag,
75
78
    )
76
79
from .repository import (
366
369
                isinstance(target, RemoteGitRepository))
367
370
 
368
371
 
 
372
class GitSearchResult(object):
 
373
 
 
374
    def __init__(self, start, exclude, keys):
 
375
        self._start = start
 
376
        self._exclude = exclude
 
377
        self._keys = keys
 
378
 
 
379
    def get_keys(self):
 
380
        return self._keys
 
381
 
 
382
    def get_recipe(self):
 
383
        return ('search', self._start, self._exclude, len(self._keys))
 
384
 
 
385
 
369
386
class InterFromGitRepository(InterRepository):
370
387
 
371
388
    _matching_repo_format = GitRepositoryFormat()
406
423
        if limit is not None:
407
424
            raise FetchLimitUnsupported(self)
408
425
        git_shas = []
409
 
        todo = []
410
 
        if revision_ids:
411
 
            todo.extend(revision_ids)
412
 
        if if_present_ids:
413
 
            todo.extend(revision_ids)
 
426
        todo = set()
 
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:
 
436
            for revid in todo:
416
437
                if revid == NULL_REVISION:
417
438
                    continue
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()
 
445
            result_set = 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)
428
454
 
429
455
 
430
456
class InterGitNonGitRepository(InterFromGitRepository):