/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-29 20:24:31 UTC
  • mfrom: (6999 work)
  • mto: This revision was merged to the branch mainline in revision 7008.
  • Revision ID: jelmer@jelmer.uk-20180629202431-2td8kihrsthzuvau
merge trunk.

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 (
131
134
            for revid in revision_ids:
132
135
                if revid == NULL_REVISION:
133
136
                    continue
134
 
                git_sha = self.source_store._lookup_revision_sha1(revid)
 
137
                try:
 
138
                    git_sha = self.source_store._lookup_revision_sha1(revid)
 
139
                except KeyError:
 
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)
146
152
 
147
153
    def _warn_slow(self):
148
154
        if not config.GlobalConfig().suppress_warning('slow_intervcs_push'):
363
369
                isinstance(target, RemoteGitRepository))
364
370
 
365
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
 
366
386
class InterFromGitRepository(InterRepository):
367
387
 
368
388
    _matching_repo_format = GitRepositoryFormat()
402
422
            limit=None):
403
423
        if limit is not None:
404
424
            raise FetchLimitUnsupported(self)
405
 
        git_shas = []
406
 
        todo = []
407
 
        if revision_ids:
408
 
            todo.extend(revision_ids)
409
 
        if if_present_ids:
410
 
            todo.extend(revision_ids)
411
 
        with self.lock_read():
412
 
            for revid in revision_ids:
413
 
                if revid == NULL_REVISION:
414
 
                    continue
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()
420
 
                    if sha != ZERO_SHA])
421
 
            missing_revids = set()
422
 
            for entry in walker:
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())
 
427
        else:
 
428
            todo = set()
 
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)
425
443
 
426
444
 
427
445
class InterGitNonGitRepository(InterFromGitRepository):