106
98
self._report_repo_results(verbose)
109
_optimisers_loaded = False
112
def lazy_load_optimisers():
113
global _optimisers_loaded
114
if _optimisers_loaded:
116
from . import interrepo
117
for optimiser in [interrepo.InterRemoteGitNonGitRepository,
118
interrepo.InterLocalGitNonGitRepository,
119
interrepo.InterLocalGitLocalGitRepository,
120
interrepo.InterRemoteGitLocalGitRepository,
121
interrepo.InterToLocalGitRepository,
122
interrepo.InterToRemoteGitRepository,
124
repository.InterRepository.register_optimiser(optimiser)
125
_optimisers_loaded = True
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)
128
112
class GitRepository(ForeignRepository):
137
121
super(GitRepository, self).__init__(GitRepositoryFormat(),
138
122
gitdir, control_files=None)
139
123
self.base = gitdir.root_transport.base
140
lazy_load_optimisers()
141
124
self._lock_mode = None
142
125
self._lock_count = 0
265
248
:param lossy: Whether to discard data that can not be natively
266
249
represented, when pushing to a foreign VCS
251
from .commit import (
268
254
builder = GitCommitBuilder(
269
255
self, parents, config, timestamp, timezone, committer, revprops,
270
256
revision_id, lossy)
298
284
for (file_id, revision_id, identifier) in desired_files:
299
285
per_revision.setdefault(revision_id, []).append(
300
286
(file_id, identifier))
301
for revid, files in viewitems(per_revision):
287
for revid, files in per_revision.items():
303
289
(commit_id, mapping) = self.lookup_bzr_revision_id(revid)
304
290
except errors.NoSuchRevision:
317
303
obj = tree_lookup_path(
318
304
self._git.object_store.__getitem__, root_tree,
319
path.encode('utf-8'))
305
encode_git_path(path))
320
306
if isinstance(obj, tuple):
321
307
(mode, item_id) = obj
322
308
obj = self._git.object_store[item_id]
410
396
this_parent_map[revid] = parents
411
397
parent_map.update(this_parent_map)
413
for values in viewvalues(this_parent_map):
399
for values in this_parent_map.values():
414
400
pending.update(values)
415
401
pending = pending.difference(parent_map)
416
402
return _mod_graph.KnownGraph(parent_map)
559
545
raise ValueError('invalid revision id %s' % revision_id)
560
546
return GitRevisionTree(self, revision_id)
562
def get_deltas_for_revisions(self, revisions, specific_fileids=None):
563
"""Produce a generator of revision deltas.
565
Note that the input is a sequence of REVISIONS, not revision_ids.
566
Trees will be held in memory until the generator exits.
567
Each delta is relative to the revision's lefthand predecessor.
569
:param specific_fileids: if not None, the result is filtered
570
so that only those file-ids, their parents and their
571
children are included.
573
# Get the revision-ids of interest
574
required_trees = set()
575
for revision in revisions:
576
required_trees.add(revision.revision_id)
577
required_trees.update(revision.parent_ids[:1])
579
trees = dict((t.get_revision_id(), t) for
580
t in self.revision_trees(required_trees))
582
# Calculate the deltas
583
for revision in revisions:
584
if not revision.parent_ids:
585
old_tree = self.revision_tree(_mod_revision.NULL_REVISION)
587
old_tree = trees[revision.parent_ids[0]]
588
new_tree = trees[revision.revision_id]
589
if specific_fileids is not None:
590
specific_files = [new_tree.id2path(
591
fid) for fid in specific_fileids]
593
specific_files = None
594
yield new_tree.changes_from(
595
old_tree, specific_files=specific_files)
597
548
def set_make_working_trees(self, trees):
598
549
raise errors.UnsupportedOperation(self.set_make_working_trees, self)