98
100
self._report_repo_results(verbose)
101
for optimiser in ['InterRemoteGitNonGitRepository',
102
'InterLocalGitNonGitRepository',
103
'InterLocalGitLocalGitRepository',
104
'InterRemoteGitLocalGitRepository',
105
'InterToLocalGitRepository',
106
'InterToRemoteGitRepository',
108
repository.InterRepository.register_lazy_optimiser(
109
'breezy.git.interrepo', optimiser)
103
_optimisers_loaded = False
106
def lazy_load_optimisers():
107
global _optimisers_loaded
108
if _optimisers_loaded:
110
from . import interrepo
111
for optimiser in [interrepo.InterRemoteGitNonGitRepository,
112
interrepo.InterLocalGitNonGitRepository,
113
interrepo.InterLocalGitLocalGitRepository,
114
interrepo.InterRemoteGitLocalGitRepository,
115
interrepo.InterToLocalGitRepository,
116
interrepo.InterToRemoteGitRepository,
118
repository.InterRepository.register_optimiser(optimiser)
119
_optimisers_loaded = True
112
122
class GitRepository(ForeignRepository):
121
131
super(GitRepository, self).__init__(GitRepositoryFormat(),
122
132
gitdir, control_files=None)
123
133
self.base = gitdir.root_transport.base
134
lazy_load_optimisers()
124
135
self._lock_mode = None
125
136
self._lock_count = 0
248
259
:param lossy: Whether to discard data that can not be natively
249
260
represented, when pushing to a foreign VCS
251
from .commit import (
254
262
builder = GitCommitBuilder(
255
263
self, parents, config, timestamp, timezone, committer, revprops,
256
264
revision_id, lossy)
303
311
obj = tree_lookup_path(
304
312
self._git.object_store.__getitem__, root_tree,
305
encode_git_path(path))
313
path.encode('utf-8'))
306
314
if isinstance(obj, tuple):
307
315
(mode, item_id) = obj
308
316
obj = self._git.object_store[item_id]
545
553
raise ValueError('invalid revision id %s' % revision_id)
546
554
return GitRevisionTree(self, revision_id)
556
def get_deltas_for_revisions(self, revisions, specific_fileids=None):
557
"""Produce a generator of revision deltas.
559
Note that the input is a sequence of REVISIONS, not revision_ids.
560
Trees will be held in memory until the generator exits.
561
Each delta is relative to the revision's lefthand predecessor.
563
:param specific_fileids: if not None, the result is filtered
564
so that only those file-ids, their parents and their
565
children are included.
567
# Get the revision-ids of interest
568
required_trees = set()
569
for revision in revisions:
570
required_trees.add(revision.revision_id)
571
required_trees.update(revision.parent_ids[:1])
573
trees = dict((t.get_revision_id(), t) for
574
t in self.revision_trees(required_trees))
576
# Calculate the deltas
577
for revision in revisions:
578
if not revision.parent_ids:
579
old_tree = self.revision_tree(_mod_revision.NULL_REVISION)
581
old_tree = trees[revision.parent_ids[0]]
582
new_tree = trees[revision.revision_id]
583
if specific_fileids is not None:
584
specific_files = [new_tree.id2path(
585
fid) for fid in specific_fileids]
587
specific_files = None
588
yield new_tree.changes_from(
589
old_tree, specific_files=specific_files)
548
591
def set_make_working_trees(self, trees):
549
592
raise errors.UnsupportedOperation(self.set_make_working_trees, self)