/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
1
# Copyright (C) 2007 Canonical Ltd
0.200.252 by Jelmer Vernooij
Clarify history, copyright.
2
# Copyright (C) 2008-2009 Jelmer Vernooij <jelmer@samba.org>
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
18
"""An adapter between a Git Repository and a Bazaar Branch"""
19
0.200.1594 by Jelmer Vernooij
Use absolute_import everywhere.
20
from __future__ import absolute_import
21
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
22
from ... import (
0.200.1244 by Jelmer Vernooij
Implement GitRepository.check.
23
    check,
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
24
    errors,
0.200.1281 by Jelmer Vernooij
Provide Repository.get_known_graph_ancestry.
25
    graph as _mod_graph,
0.200.1670 by Jelmer Vernooij
Fix compatibility with newer versions of bzr.
26
    lock,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
27
    repository,
0.285.5 by Jelmer Vernooij
Fix import.
28
    revision as _mod_revision,
0.200.1411 by Jelmer Vernooij
Fix control files.
29
    transactions,
0.200.1601 by Jelmer Vernooij
remove compatibility code for bzr < 2.5.
30
    ui,
0.200.1646 by Jelmer Vernooij
Rename bzrlib to breezy.
31
    version_info as breezy_version,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
32
    )
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
33
from ...bzr import (
34
    inventory,
35
    inventorytree,
36
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
37
from ...decorators import only_raises
38
from ...foreign import (
0.200.292 by Jelmer Vernooij
Fix formatting.
39
    ForeignRepository,
40
    )
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
41
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
42
from .commit import (
0.200.387 by Jelmer Vernooij
Initial work on supporting commit in git trees.
43
    GitCommitBuilder,
44
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
45
from .filegraph import (
0.200.1283 by Jelmer Vernooij
Provide Repository.get_file_graph() and Tree.get_file_revision().
46
    GitFileLastChangeScanner,
47
    GitFileParentProvider,
48
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
49
from .mapping import (
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
50
    default_mapping,
0.200.1263 by Jelmer Vernooij
Fix foreign_vcs_git.
51
    foreign_vcs_git,
0.200.256 by Jelmer Vernooij
Add tests for import_revision_gist.
52
    mapping_registry,
53
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
54
from .tree import (
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
55
    GitRevisionTree,
56
    )
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
57
58
0.200.1636 by Jelmer Vernooij
Some formatting fixes.
59
from dulwich.errors import (
60
    NotCommitError,
61
    )
0.252.21 by Jelmer Vernooij
Fix GitRepository.all_revision_ids() to find all revisions.
62
from dulwich.objects import (
63
    Commit,
0.200.1153 by Jelmer Vernooij
Import ZERO_SHA from dulwich.objects.
64
    ZERO_SHA,
0.252.21 by Jelmer Vernooij
Fix GitRepository.all_revision_ids() to find all revisions.
65
    )
0.200.1233 by Jelmer Vernooij
Implement Repository.iter_files_bytes.
66
from dulwich.object_store import (
67
    tree_lookup_path,
68
    )
0.252.21 by Jelmer Vernooij
Fix GitRepository.all_revision_ids() to find all revisions.
69
70
0.200.1246 by Jelmer Vernooij
Provide GitRepository.reconcile.
71
class RepoReconciler(object):
72
    """Reconciler that reconciles a repository.
73
74
    """
75
76
    def __init__(self, repo, other=None, thorough=False):
77
        """Construct a RepoReconciler.
78
79
        :param thorough: perform a thorough check which may take longer but
80
                         will correct non-data loss issues such as incorrect
81
                         cached data.
82
        """
83
        self.repo = repo
84
85
    def reconcile(self):
86
        """Perform reconciliation.
87
88
        After reconciliation the following attributes document found issues:
89
        inconsistent_parents: The number of revisions in the repository whose
90
                              ancestry was being reported incorrectly.
91
        garbage_inventories: The number of inventory objects without revisions
92
                             that were garbage collected.
93
        """
94
95
0.200.1244 by Jelmer Vernooij
Implement GitRepository.check.
96
class GitCheck(check.Check):
97
98
    def __init__(self, repository, check_repo=True):
99
        self.repository = repository
100
        self.checked_rev_cnt = 0
101
102
    def check(self, callback_refs=None, check_repo=True):
103
        if callback_refs is None:
104
            callback_refs = {}
0.200.1680 by Jelmer Vernooij
Fix repo locks.
105
        with self.repository.lock_read():
0.200.1670 by Jelmer Vernooij
Fix compatibility with newer versions of bzr.
106
            # TODO(jelmer): Check some things
107
            pass
0.200.1244 by Jelmer Vernooij
Implement GitRepository.check.
108
109
    def report_results(self, verbose):
110
        pass
111
112
0.200.1447 by Jelmer Vernooij
Load optimisers at most once.
113
_optimisers_loaded = False
114
115
def lazy_load_optimisers():
116
    global _optimisers_loaded
117
    if _optimisers_loaded:
118
        return
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
119
    from . import fetch, push
0.200.1447 by Jelmer Vernooij
Load optimisers at most once.
120
    for optimiser in [fetch.InterRemoteGitNonGitRepository,
121
                      fetch.InterLocalGitNonGitRepository,
122
                      fetch.InterGitGitRepository,
123
                      push.InterToLocalGitRepository,
124
                      push.InterToRemoteGitRepository]:
125
        repository.InterRepository.register_optimiser(optimiser)
126
    _optimisers_loaded = True
127
128
0.200.115 by Jelmer Vernooij
Pass mapping object.
129
class GitRepository(ForeignRepository):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
130
    """An adapter to git repositories for bzr."""
131
0.200.41 by David Allouche
Define _serializer = None in GitRepository.
132
    _serializer = None
0.200.1263 by Jelmer Vernooij
Fix foreign_vcs_git.
133
    vcs = foreign_vcs_git
0.200.1086 by Jelmer Vernooij
Provide chk_bytes attribute.
134
    chk_bytes = None
0.200.41 by David Allouche
Define _serializer = None in GitRepository.
135
0.200.1411 by Jelmer Vernooij
Fix control files.
136
    def __init__(self, gitdir):
0.200.1447 by Jelmer Vernooij
Load optimisers at most once.
137
        self._transport = gitdir.root_transport
0.200.1307 by Jelmer Vernooij
Formatting fixes, specify path to a couple more functions.
138
        super(GitRepository, self).__init__(GitRepositoryFormat(),
0.200.1601 by Jelmer Vernooij
remove compatibility code for bzr < 2.5.
139
            gitdir, control_files=None)
0.200.1449 by Jelmer Vernooij
Fix compatibility with bzr < 2.5 when used with remote repositories.
140
        self.base = gitdir.root_transport.base
0.200.1447 by Jelmer Vernooij
Load optimisers at most once.
141
        lazy_load_optimisers()
0.200.1411 by Jelmer Vernooij
Fix control files.
142
        self._lock_mode = None
143
        self._lock_count = 0
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
144
0.200.1231 by Jelmer Vernooij
Implement GitRepository.add_fallback_repository.
145
    def add_fallback_repository(self, basis_url):
0.200.1307 by Jelmer Vernooij
Formatting fixes, specify path to a couple more functions.
146
        raise errors.UnstackableRepositoryFormat(self._format,
147
            self.control_transport.base)
0.200.1231 by Jelmer Vernooij
Implement GitRepository.add_fallback_repository.
148
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
149
    def is_shared(self):
0.200.886 by Jelmer Vernooij
Git repositories are not shared.
150
        return False
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
151
0.200.1411 by Jelmer Vernooij
Fix control files.
152
    def get_physical_lock_status(self):
153
        return False
154
155
    def lock_write(self):
156
        """See Branch.lock_write()."""
157
        if self._lock_mode:
158
            assert self._lock_mode == 'w'
159
            self._lock_count += 1
160
        else:
161
            self._lock_mode = 'w'
162
            self._lock_count = 1
0.200.1680 by Jelmer Vernooij
Fix repo locks.
163
        return repository.RepositoryWriteLockResult(self.unlock, None)
0.200.1411 by Jelmer Vernooij
Fix control files.
164
0.200.1454 by Jelmer Vernooij
Provide Repository.break_lock.
165
    def break_lock(self):
166
        raise NotImplementedError(self.break_lock)
167
0.200.1411 by Jelmer Vernooij
Fix control files.
168
    def dont_leave_lock_in_place(self):
169
        raise NotImplementedError(self.dont_leave_lock_in_place)
170
171
    def leave_lock_in_place(self):
172
        raise NotImplementedError(self.leave_lock_in_place)
173
174
    def lock_read(self):
175
        if self._lock_mode:
176
            assert self._lock_mode in ('r', 'w')
177
            self._lock_count += 1
178
        else:
179
            self._lock_mode = 'r'
180
            self._lock_count = 1
0.200.1670 by Jelmer Vernooij
Fix compatibility with newer versions of bzr.
181
        return lock.LogicalLockResult(self.unlock)
0.200.1411 by Jelmer Vernooij
Fix control files.
182
183
    @only_raises(errors.LockNotHeld, errors.LockBroken)
184
    def unlock(self):
185
        if self._lock_count == 0:
186
            raise errors.LockNotHeld(self)
187
        if self._lock_count == 1 and self._lock_mode == 'w':
188
            if self._write_group is not None:
189
                self.abort_write_group()
190
                self._lock_count -= 1
191
                self._lock_mode = None
192
                raise errors.BzrError(
193
                    'Must end write groups before releasing write locks.')
194
        self._lock_count -= 1
195
        if self._lock_count == 0:
196
            self._lock_mode = None
197
198
    def is_write_locked(self):
199
        return (self._lock_mode == 'w')
200
201
    def is_locked(self):
202
        return (self._lock_mode is not None)
203
204
    def get_transaction(self):
205
        """See Repository.get_transaction()."""
206
        if self._write_group is None:
207
            return transactions.PassThroughTransaction()
208
        else:
209
            return self._write_group
210
0.200.1246 by Jelmer Vernooij
Provide GitRepository.reconcile.
211
    def reconcile(self, other=None, thorough=False):
212
        """Reconcile this repository."""
213
        reconciler = RepoReconciler(self, thorough=thorough)
214
        reconciler.reconcile()
215
        return reconciler
216
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
217
    def supports_rich_root(self):
218
        return True
219
220
    def get_mapping(self):
221
        return default_mapping
222
0.200.147 by Jelmer Vernooij
Merge new dulwich; fetching objects from local repository works now; they aren't converted yet though.
223
    def make_working_trees(self):
0.200.1546 by Jelmer Vernooij
Provide get_config.
224
        return not self._git.get_config().get_boolean(("core", ), "bare")
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
225
0.200.557 by Jelmer Vernooij
Implement GitRepository.revision_graph_can_have_wrong_parents().
226
    def revision_graph_can_have_wrong_parents(self):
227
        return False
228
0.200.1158 by Jelmer Vernooij
Implement stub Repositor.add_signature_text.
229
    def add_signature_text(self, revid, signature):
230
        raise errors.UnsupportedOperation(self.add_signature_text, self)
231
0.200.1467 by Jelmer Vernooij
Implement GitRepository.sign_revision.
232
    def sign_revision(self, revision_id, gpg_strategy):
233
        raise errors.UnsupportedOperation(self.add_signature_text, self)
234
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
235
236
class LocalGitRepository(GitRepository):
0.200.276 by Jelmer Vernooij
Improve formatting.
237
    """Git repository on the file system."""
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
238
0.200.1411 by Jelmer Vernooij
Fix control files.
239
    def __init__(self, gitdir):
240
        GitRepository.__init__(self, gitdir)
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
241
        self._git = gitdir._git
0.200.1283 by Jelmer Vernooij
Provide Repository.get_file_graph() and Tree.get_file_revision().
242
        self._file_change_scanner = GitFileLastChangeScanner(self)
0.200.45 by David Allouche
More performance hacking, introduce sqlite cache, escape characters in commits that break serializers.
243
0.200.1224 by Jelmer Vernooij
provide explicit GitRepository.get_commit_builder.
244
    def get_commit_builder(self, branch, parents, config, timestamp=None,
245
                           timezone=None, committer=None, revprops=None,
246
                           revision_id=None, lossy=False):
247
        """Obtain a CommitBuilder for this repository.
248
249
        :param branch: Branch to commit to.
250
        :param parents: Revision ids of the parents of the new revision.
251
        :param config: Configuration to use.
252
        :param timestamp: Optional timestamp recorded for commit.
253
        :param timezone: Optional timezone for timestamp.
254
        :param committer: Optional committer to set for commit.
255
        :param revprops: Optional dictionary of revision properties.
256
        :param revision_id: Optional revision id.
257
        :param lossy: Whether to discard data that can not be natively
258
            represented, when pushing to a foreign VCS
259
        """
0.200.1229 by Jelmer Vernooij
Provide CommitBuilder.any_changes.
260
        self.start_write_group()
0.200.1224 by Jelmer Vernooij
provide explicit GitRepository.get_commit_builder.
261
        return GitCommitBuilder(self, parents, config,
262
            timestamp, timezone, committer, revprops, revision_id,
263
            lossy)
264
0.200.1283 by Jelmer Vernooij
Provide Repository.get_file_graph() and Tree.get_file_revision().
265
    def get_file_graph(self):
0.200.1307 by Jelmer Vernooij
Formatting fixes, specify path to a couple more functions.
266
        return _mod_graph.Graph(GitFileParentProvider(
267
            self._file_change_scanner))
0.200.1283 by Jelmer Vernooij
Provide Repository.get_file_graph() and Tree.get_file_revision().
268
0.200.1233 by Jelmer Vernooij
Implement Repository.iter_files_bytes.
269
    def iter_files_bytes(self, desired_files):
270
        """Iterate through file versions.
271
272
        Files will not necessarily be returned in the order they occur in
273
        desired_files.  No specific order is guaranteed.
274
275
        Yields pairs of identifier, bytes_iterator.  identifier is an opaque
276
        value supplied by the caller as part of desired_files.  It should
277
        uniquely identify the file version in the caller's context.  (Examples:
278
        an index number or a TreeTransform trans_id.)
279
280
        bytes_iterator is an iterable of bytestrings for the file.  The
281
        kind of iterable and length of the bytestrings are unspecified, but for
282
        this implementation, it is a list of bytes produced by
283
        VersionedFile.get_record_stream().
284
285
        :param desired_files: a list of (file_id, revision_id, identifier)
286
            triples
287
        """
288
        per_revision = {}
289
        for (file_id, revision_id, identifier) in desired_files:
0.200.1307 by Jelmer Vernooij
Formatting fixes, specify path to a couple more functions.
290
            per_revision.setdefault(revision_id, []).append(
291
                (file_id, identifier))
0.200.1233 by Jelmer Vernooij
Implement Repository.iter_files_bytes.
292
        for revid, files in per_revision.iteritems():
0.200.1745 by Jelmer Vernooij
Fix iter_files_bytes.
293
            try:
294
                (commit_id, mapping) = self.lookup_bzr_revision_id(revid)
295
            except errors.NoSuchRevision:
296
                raise errors.RevisionNotPresent(revid, self)
0.200.1233 by Jelmer Vernooij
Implement Repository.iter_files_bytes.
297
            try:
298
                commit = self._git.object_store[commit_id]
299
            except KeyError:
300
                raise errors.RevisionNotPresent(revid, self)
301
            root_tree = commit.tree
302
            for fileid, identifier in files:
0.200.1715 by Jelmer Vernooij
Fix some more tests.
303
                try:
304
                    path = mapping.parse_file_id(fileid)
305
                except ValueError:
306
                    raise errors.RevisionNotPresent((fileid, revid), self)
0.200.1233 by Jelmer Vernooij
Implement Repository.iter_files_bytes.
307
                try:
308
                    obj = tree_lookup_path(
309
                        self._git.object_store.__getitem__, root_tree, path)
310
                    if isinstance(obj, tuple):
311
                        (mode, item_id) = obj
312
                        obj = self._git.object_store[item_id]
313
                except KeyError:
314
                    raise errors.RevisionNotPresent((fileid, revid), self)
315
                else:
316
                    if obj.type_name == "tree":
317
                        yield (identifier, [])
318
                    elif obj.type_name == "blob":
319
                        yield (identifier, obj.chunked)
320
                    else:
321
                        raise AssertionError("file text resolved to %r" % obj)
322
0.200.1533 by Jelmer Vernooij
Improve gather_stats.
323
    def gather_stats(self, revid=None, committers=None):
324
        """See Repository.gather_stats()."""
325
        result = super(LocalGitRepository, self).gather_stats(revid, committers)
326
        revs = []
327
        for sha in self._git.object_store:
328
            o = self._git.object_store[sha]
329
            if o.type_name == "commit":
330
                revs.append(o.id)
331
        result['revisions'] = len(revs)
332
        return result
333
0.252.46 by Jelmer Vernooij
Generate refs/bzr/* if not set yet.
334
    def _iter_revision_ids(self):
0.200.1021 by Jelmer Vernooij
Put testament sha1 in revisions.
335
        mapping = self.get_mapping()
0.252.21 by Jelmer Vernooij
Fix GitRepository.all_revision_ids() to find all revisions.
336
        for sha in self._git.object_store:
337
            o = self._git.object_store[sha]
338
            if not isinstance(o, Commit):
339
                continue
0.200.1029 by Jelmer Vernooij
Use dictionary with verifiers rather than requiring testament3-sha1 everywhere.
340
            rev, roundtrip_revid, verifiers = mapping.import_commit(o,
0.261.6 by Jelmer Vernooij
Use mapping.revision_id_foreign_to_bzr to find parents everywhere.
341
                mapping.revision_id_foreign_to_bzr)
0.200.1021 by Jelmer Vernooij
Put testament sha1 in revisions.
342
            yield o.id, rev.revision_id, roundtrip_revid
0.252.46 by Jelmer Vernooij
Generate refs/bzr/* if not set yet.
343
344
    def all_revision_ids(self):
0.200.1727 by Jelmer Vernooij
Change all_revision_ids type to list.
345
        ret = set()
0.200.1021 by Jelmer Vernooij
Put testament sha1 in revisions.
346
        for git_sha, revid, roundtrip_revid in self._iter_revision_ids():
347
            if roundtrip_revid:
348
                ret.add(roundtrip_revid)
0.200.1325 by Jelmer Vernooij
More test fixes.
349
            else:
350
                ret.add(revid)
0.200.1727 by Jelmer Vernooij
Change all_revision_ids type to list.
351
        return list(ret)
0.200.74 by Jelmer Vernooij
Implement Repository.all_revision_ids().
352
0.200.1552 by Jelmer Vernooij
Claim to support nested trees.
353
    def _get_parents(self, revid, no_alternates=False):
0.200.1328 by Jelmer Vernooij
More test fixes.
354
        if type(revid) != str:
355
            raise ValueError
356
        try:
0.200.1343 by Jelmer Vernooij
Update docstrings.
357
            (hexsha, mapping) = self.lookup_bzr_revision_id(revid)
0.200.1328 by Jelmer Vernooij
More test fixes.
358
        except errors.NoSuchRevision:
359
            return None
0.200.1552 by Jelmer Vernooij
Claim to support nested trees.
360
        # FIXME: Honor no_alternates setting
0.200.1328 by Jelmer Vernooij
More test fixes.
361
        try:
0.200.1553 by Jelmer Vernooij
Avoid using nonexistant method.
362
            commit = self._git.object_store[hexsha]
0.200.1328 by Jelmer Vernooij
More test fixes.
363
        except KeyError:
364
            return None
365
        return [
366
            self.lookup_foreign_revision_id(p, mapping)
367
            for p in commit.parents]
368
0.200.1552 by Jelmer Vernooij
Claim to support nested trees.
369
    def _get_parent_map_no_fallbacks(self, revids):
370
        return self.get_parent_map(revids, no_alternates=True)
371
372
    def get_parent_map(self, revids, no_alternates=False):
0.200.131 by Jelmer Vernooij
Fix all tests but two, use rich roots by default.
373
        parent_map = {}
374
        for revision_id in revids:
0.200.1552 by Jelmer Vernooij
Claim to support nested trees.
375
            parents = self._get_parents(revision_id, no_alternates=no_alternates)
0.285.5 by Jelmer Vernooij
Fix import.
376
            if revision_id == _mod_revision.NULL_REVISION:
0.200.1329 by Jelmer Vernooij
Fix more tests.
377
                parent_map[revision_id] = ()
378
                continue
0.200.1328 by Jelmer Vernooij
More test fixes.
379
            if parents is None:
380
                continue
0.200.1324 by Jelmer Vernooij
More work on roundtripping support.
381
            if len(parents) == 0:
0.285.5 by Jelmer Vernooij
Fix import.
382
                parents = [_mod_revision.NULL_REVISION]
0.200.1094 by Jelmer Vernooij
Fix test_get_no_parents.
383
            parent_map[revision_id] = tuple(parents)
0.200.131 by Jelmer Vernooij
Fix all tests but two, use rich roots by default.
384
        return parent_map
385
0.200.1281 by Jelmer Vernooij
Provide Repository.get_known_graph_ancestry.
386
    def get_known_graph_ancestry(self, revision_ids):
387
        """Return the known graph for a set of revision ids and their ancestors.
388
        """
389
        pending = set(revision_ids)
390
        parent_map = {}
391
        while pending:
0.200.1328 by Jelmer Vernooij
More test fixes.
392
            this_parent_map = {}
393
            for revid in pending:
0.285.5 by Jelmer Vernooij
Fix import.
394
                if revid == _mod_revision.NULL_REVISION:
0.200.1328 by Jelmer Vernooij
More test fixes.
395
                    continue
396
                parents = self._get_parents(revid)
397
                if parents is not None:
398
                    this_parent_map[revid] = parents
0.200.1281 by Jelmer Vernooij
Provide Repository.get_known_graph_ancestry.
399
            parent_map.update(this_parent_map)
400
            pending = set()
401
            map(pending.update, this_parent_map.itervalues())
402
            pending = pending.difference(parent_map)
403
        return _mod_graph.KnownGraph(parent_map)
404
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
405
    def get_signature_text(self, revision_id):
406
        raise errors.NoSuchRevision(self, revision_id)
407
0.200.1244 by Jelmer Vernooij
Implement GitRepository.check.
408
    def check(self, revision_ids=None, callback_refs=None, check_repo=True):
409
        result = GitCheck(self, check_repo=check_repo)
410
        result.check(callback_refs)
411
        return result
412
0.257.1 by Jelmer Vernooij
use transport repo objects even for local access.
413
    def pack(self, hint=None, clean_obsolete_packs=False):
414
        self._git.object_store.pack_loose_objects()
415
0.200.650 by Jelmer Vernooij
Use standard names for lookup functions.
416
    def lookup_foreign_revision_id(self, foreign_revid, mapping=None):
0.200.124 by Jelmer Vernooij
Add lookup_revision_id stub.
417
        """Lookup a revision id.
0.200.676 by Jelmer Vernooij
Avoid iterating over all keys in the tdb database.
418
0.200.1508 by Jelmer Vernooij
Add docstring, use peel_sha.
419
        :param foreign_revid: Foreign revision id to look up
420
        :param mapping: Mapping to use (use default mapping if not specified)
421
        :raise KeyError: If foreign revision was not found
422
        :return: bzr revision id
0.200.124 by Jelmer Vernooij
Add lookup_revision_id stub.
423
        """
0.200.1033 by Jelmer Vernooij
Don't claim to support working trees for bare repositories.
424
        assert type(foreign_revid) is str
0.200.649 by Jelmer Vernooij
Make GitRevisions VF implementation behave as the interface expects.
425
        if mapping is None:
426
            mapping = self.get_mapping()
0.200.914 by Jelmer Vernooij
Fix tests.
427
        if foreign_revid == ZERO_SHA:
0.285.5 by Jelmer Vernooij
Fix import.
428
            return _mod_revision.NULL_REVISION
0.200.1508 by Jelmer Vernooij
Add docstring, use peel_sha.
429
        commit = self._git.object_store.peel_sha(foreign_revid)
0.200.1403 by Jelmer Vernooij
Cope with tags pointing at tree objects when cloning local git repositories.
430
        if not isinstance(commit, Commit):
431
            raise NotCommitError(commit.id)
0.200.1029 by Jelmer Vernooij
Use dictionary with verifiers rather than requiring testament3-sha1 everywhere.
432
        rev, roundtrip_revid, verifiers = mapping.import_commit(commit,
0.261.6 by Jelmer Vernooij
Use mapping.revision_id_foreign_to_bzr to find parents everywhere.
433
            mapping.revision_id_foreign_to_bzr)
0.200.1021 by Jelmer Vernooij
Put testament sha1 in revisions.
434
        # FIXME: check testament before doing this?
435
        if roundtrip_revid:
436
            return roundtrip_revid
437
        else:
438
            return rev.revision_id
0.200.124 by Jelmer Vernooij
Add lookup_revision_id stub.
439
0.200.60 by Jelmer Vernooij
Support signature functions.
440
    def has_signature_for_revision_id(self, revision_id):
0.200.1343 by Jelmer Vernooij
Update docstrings.
441
        """Check whether a GPG signature is present for this revision.
442
443
        This is never the case for Git repositories.
444
        """
0.200.60 by Jelmer Vernooij
Support signature functions.
445
        return False
446
0.200.913 by Jelmer Vernooij
Fix tests.
447
    def lookup_bzr_revision_id(self, bzr_revid, mapping=None):
0.200.1343 by Jelmer Vernooij
Update docstrings.
448
        """Lookup a bzr revision id in a Git repository.
449
450
        :param bzr_revid: Bazaar revision id
451
        :param mapping: Optional mapping to use
452
        :return: Tuple with git commit id, mapping that was used and supplement
453
            details
454
        """
0.200.105 by Jelmer Vernooij
Add common function for finding git commit by bzr revid.
455
        try:
0.200.1343 by Jelmer Vernooij
Update docstrings.
456
            (git_sha, mapping) = mapping_registry.revision_id_bzr_to_foreign(bzr_revid)
0.200.105 by Jelmer Vernooij
Add common function for finding git commit by bzr revid.
457
        except errors.InvalidRevisionId:
0.200.913 by Jelmer Vernooij
Fix tests.
458
            if mapping is None:
459
                mapping = self.get_mapping()
0.252.6 by Jelmer Vernooij
Roundtripping support for revision ids works.
460
            try:
0.200.1307 by Jelmer Vernooij
Formatting fixes, specify path to a couple more functions.
461
                return (self._git.refs[mapping.revid_as_refname(bzr_revid)],
462
                        mapping)
0.252.6 by Jelmer Vernooij
Roundtripping support for revision ids works.
463
            except KeyError:
0.252.46 by Jelmer Vernooij
Generate refs/bzr/* if not set yet.
464
                # Update refs from Git commit objects
465
                # FIXME: Hitting this a lot will be very inefficient...
0.200.1601 by Jelmer Vernooij
remove compatibility code for bzr < 2.5.
466
                pb = ui.ui_factory.nested_progress_bar()
467
                try:
468
                    for i, (git_sha, revid, roundtrip_revid) in enumerate(self._iter_revision_ids()):
469
                        if not roundtrip_revid:
470
                            continue
471
                        pb.update("resolving revision id", i)
472
                        refname = mapping.revid_as_refname(roundtrip_revid)
473
                        self._git.refs[refname] = git_sha
474
                        if roundtrip_revid == bzr_revid:
475
                            return git_sha, mapping
476
                finally:
477
                    pb.finished()
0.200.913 by Jelmer Vernooij
Fix tests.
478
                raise errors.NoSuchRevision(self, bzr_revid)
0.200.1343 by Jelmer Vernooij
Update docstrings.
479
        else:
480
            return (git_sha, mapping)
0.200.105 by Jelmer Vernooij
Add common function for finding git commit by bzr revid.
481
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
482
    def get_revision(self, revision_id):
0.200.1101 by Jelmer Vernooij
Raise InvalidRevisionId on invalid type being specified to Repository.get_revision.
483
        if not isinstance(revision_id, str):
484
            raise errors.InvalidRevisionId(revision_id, self)
0.200.650 by Jelmer Vernooij
Use standard names for lookup functions.
485
        git_commit_id, mapping = self.lookup_bzr_revision_id(revision_id)
0.200.147 by Jelmer Vernooij
Merge new dulwich; fetching objects from local repository works now; they aren't converted yet though.
486
        try:
0.200.1552 by Jelmer Vernooij
Claim to support nested trees.
487
            commit = self._git.object_store[git_commit_id]
0.200.147 by Jelmer Vernooij
Merge new dulwich; fetching objects from local repository works now; they aren't converted yet though.
488
        except KeyError:
489
            raise errors.NoSuchRevision(self, revision_id)
0.200.1029 by Jelmer Vernooij
Use dictionary with verifiers rather than requiring testament3-sha1 everywhere.
490
        revision, roundtrip_revid, verifiers = mapping.import_commit(
0.200.1021 by Jelmer Vernooij
Put testament sha1 in revisions.
491
            commit, self.lookup_foreign_revision_id)
0.200.131 by Jelmer Vernooij
Fix all tests but two, use rich roots by default.
492
        assert revision is not None
0.200.1029 by Jelmer Vernooij
Use dictionary with verifiers rather than requiring testament3-sha1 everywhere.
493
        # FIXME: check verifiers ?
0.200.1021 by Jelmer Vernooij
Put testament sha1 in revisions.
494
        if roundtrip_revid:
495
            revision.revision_id = roundtrip_revid
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
496
        return revision
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
497
498
    def has_revision(self, revision_id):
0.200.1119 by Jelmer Vernooij
Refactor repository initialization.
499
        """See Repository.has_revision."""
0.285.5 by Jelmer Vernooij
Fix import.
500
        if revision_id == _mod_revision.NULL_REVISION:
0.200.1122 by Jelmer Vernooij
has_revision(null:) should always return True.
501
            return True
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
502
        try:
0.200.902 by Jelmer Vernooij
Fix Repository.has_revision{s,}.
503
            git_commit_id, mapping = self.lookup_bzr_revision_id(revision_id)
0.200.130 by Jelmer Vernooij
Make most tree inspection tests succeed.
504
        except errors.NoSuchRevision:
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
505
            return False
0.200.902 by Jelmer Vernooij
Fix Repository.has_revision{s,}.
506
        return (git_commit_id in self._git)
507
508
    def has_revisions(self, revision_ids):
0.200.1119 by Jelmer Vernooij
Refactor repository initialization.
509
        """See Repository.has_revisions."""
0.200.913 by Jelmer Vernooij
Fix tests.
510
        return set(filter(self.has_revision, revision_ids))
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
511
0.200.1657 by Jelmer Vernooij
Implement iter_revisions.
512
    def iter_revisions(self, revision_ids):
0.200.1119 by Jelmer Vernooij
Refactor repository initialization.
513
        """See Repository.get_revisions."""
0.200.1657 by Jelmer Vernooij
Implement iter_revisions.
514
        for revid in revision_ids:
515
            try:
516
                rev = self.get_revision(revid)
517
            except errors.NoSuchRevision:
518
                rev = None
519
            yield (revid, rev)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
520
521
    def revision_trees(self, revids):
0.200.1119 by Jelmer Vernooij
Refactor repository initialization.
522
        """See Repository.revision_trees."""
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
523
        for revid in revids:
524
            yield self.revision_tree(revid)
525
526
    def revision_tree(self, revision_id):
0.200.1119 by Jelmer Vernooij
Refactor repository initialization.
527
        """See Repository.revision_tree."""
0.285.5 by Jelmer Vernooij
Fix import.
528
        if revision_id == _mod_revision.NULL_REVISION:
0.200.57 by Jelmer Vernooij
Fix more tests.
529
            inv = inventory.Inventory(root_id=None)
530
            inv.revision_id = revision_id
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
531
            return inventorytree.InventoryRevisionTree(self, inv, revision_id)
0.200.195 by Jelmer Vernooij
Return mapping in revision_id_bzr_to_foreign() as required by the interface.
532
        return GitRevisionTree(self, revision_id)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
533
0.285.4 by Jelmer Vernooij
Add get_deltas_for_revisoins implementation.
534
    def get_deltas_for_revisions(self, revisions, specific_fileids=None):
535
        """Produce a generator of revision deltas.
536
537
        Note that the input is a sequence of REVISIONS, not revision_ids.
538
        Trees will be held in memory until the generator exits.
539
        Each delta is relative to the revision's lefthand predecessor.
540
541
        :param specific_fileids: if not None, the result is filtered
542
          so that only those file-ids, their parents and their
543
          children are included.
544
        """
545
        # Get the revision-ids of interest
546
        required_trees = set()
547
        for revision in revisions:
548
            required_trees.add(revision.revision_id)
549
            required_trees.update(revision.parent_ids[:1])
550
0.200.1743 by Jelmer Vernooij
Fix some revision delta filtering.
551
        trees = dict((t.get_revision_id(), t) for
552
            t in self.revision_trees(required_trees))
0.285.4 by Jelmer Vernooij
Add get_deltas_for_revisoins implementation.
553
554
        # Calculate the deltas
555
        for revision in revisions:
556
            if not revision.parent_ids:
557
                old_tree = self.revision_tree(_mod_revision.NULL_REVISION)
558
            else:
559
                old_tree = trees[revision.parent_ids[0]]
0.200.1743 by Jelmer Vernooij
Fix some revision delta filtering.
560
            new_tree = trees[revision.revision_id]
561
            if specific_fileids is not None:
562
                specific_files = [new_tree.id2path(fid) for fid in specific_fileids]
563
            else:
564
                specific_files = None
565
            yield new_tree.changes_from(old_tree, specific_files=specific_files)
0.285.4 by Jelmer Vernooij
Add get_deltas_for_revisoins implementation.
566
567
    def _filtered_revision_trees(self, revision_ids, file_ids):
568
        """Return Tree for a revision on this branch with only some files.
569
570
        :param revision_ids: a sequence of revision-ids;
571
          a revision-id may not be None or 'null:'
572
        :param file_ids: if not None, the result is filtered
573
          so that only those file-ids, their parents and their
574
          children are included.
575
        """
576
        for t in self.revision_trees(revision_ids):
577
            # Should we introduce a FilteredRevisionTree class rather
578
            # than pre-filter the inventory here?
579
            filtered_inv = inv.filter(file_ids)
580
            yield inventorytree.InventoryRevisionTree(self, filtered_inv, filtered_inv.revision_id)
581
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
582
    def get_inventory(self, revision_id):
0.264.4 by Jelmer Vernooij
No longer implement Repository.get_inventory.
583
        raise NotImplementedError(self.get_inventory)
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
584
0.200.108 by Jelmer Vernooij
Support bzr init --git.
585
    def set_make_working_trees(self, trees):
0.200.1546 by Jelmer Vernooij
Provide get_config.
586
        if trees:
587
            self._git.get_config().set(("core", ), "bare", "false")
588
        else:
589
            self._git.get_config().set(("core", ), "bare", "true")
0.200.108 by Jelmer Vernooij
Support bzr init --git.
590
0.200.276 by Jelmer Vernooij
Improve formatting.
591
    def fetch_objects(self, determine_wants, graph_walker, resolve_ext_ref,
0.286.6 by Jelmer Vernooij
Pass through limit argument.
592
        progress=None, limit=None):
593
        return self._git.fetch_objects(determine_wants, graph_walker, progress,
594
            limit=limit)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
595
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
596
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
597
class GitRepositoryFormat(repository.RepositoryFormat):
0.200.429 by Jelmer Vernooij
get remote dpush to a point where we now what to send.
598
    """Git repository format."""
0.203.1 by Aaron Bentley
Make checkouts work
599
0.200.1294 by Jelmer Vernooij
Mark as not supporting versioned directories.
600
    supports_versioned_directories = False
0.203.1 by Aaron Bentley
Make checkouts work
601
    supports_tree_reference = False
0.200.133 by Jelmer Vernooij
Unmark as deprecated.
602
    rich_root_data = True
0.200.1105 by Jelmer Vernooij
Don't claim to support leaving locks.
603
    supports_leaving_lock = False
0.200.1106 by Jelmer Vernooij
Claim to support fast deltas.
604
    fast_deltas = True
0.200.1123 by Jelmer Vernooij
Set more repository format flags.
605
    supports_funky_characters = True
0.200.1560 by Jelmer Vernooij
stacking is not supported.
606
    supports_external_lookups = False
0.200.1135 by Jelmer Vernooij
Set supports_full_versioned_files=False.
607
    supports_full_versioned_files = False
0.200.1162 by Jelmer Vernooij
Set RepositoryFormat.supports_revision_signatures.
608
    supports_revision_signatures = False
0.200.1383 by Jelmer Vernooij
Claim to not support nested repositories.
609
    supports_nesting_repositories = False
0.200.1166 by Jelmer Vernooij
Set GitRepositoryFormat.revision_graph_can_have_wrong_parents.
610
    revision_graph_can_have_wrong_parents = False
0.200.1493 by Jelmer Vernooij
Test fixes.
611
    supports_unreferenced_revisions = True
0.200.1665 by Jelmer Vernooij
Rename _matchingbzrdir to _matchingcnotroldir.
612
    supports_setting_revision_ids = False
0.200.1698 by Jelmer Vernooij
Update xfail.
613
    supports_storing_branch_nick = False
614
    supports_overriding_transport = False
0.200.1746 by Jelmer Vernooij
Mark as not supporting custom revision properties.
615
    supports_custom_revision_properties = False
0.200.71 by Jelmer Vernooij
Implement GitRepositoryFormat.get_format_description.
616
0.200.1083 by Jelmer Vernooij
Register repository format.
617
    @property
0.200.1665 by Jelmer Vernooij
Rename _matchingbzrdir to _matchingcnotroldir.
618
    def _matchingcontroldir(self):
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
619
        from .dir import LocalGitControlDirFormat
0.200.1083 by Jelmer Vernooij
Register repository format.
620
        return LocalGitControlDirFormat()
621
0.200.71 by Jelmer Vernooij
Implement GitRepositoryFormat.get_format_description.
622
    def get_format_description(self):
623
        return "Git Repository"
0.200.133 by Jelmer Vernooij
Unmark as deprecated.
624
0.200.1084 by Jelmer Vernooij
Support 'initializing' repositories in control directories.
625
    def initialize(self, controldir, shared=False, _internal=False):
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
626
        from .dir import GitDir
0.200.1084 by Jelmer Vernooij
Support 'initializing' repositories in control directories.
627
        if not isinstance(controldir, GitDir):
628
            raise errors.UninitializableFormat(self)
629
        return controldir.open_repository()
0.200.133 by Jelmer Vernooij
Unmark as deprecated.
630
631
    def check_conversion_target(self, target_repo_format):
632
        return target_repo_format.rich_root_data
0.200.536 by Jelmer Vernooij
Implement network name.
633
0.200.658 by Jelmer Vernooij
Provide right infrastructure for foreign repository tests from bzrlib.
634
    def get_foreign_tests_repository_factory(self):
0.200.1654 by Jelmer Vernooij
Fix test import.
635
        from .tests.test_repository import (
0.200.713 by Jelmer Vernooij
Improve formatting.
636
            ForeignTestsRepositoryFactory,
637
            )
0.200.658 by Jelmer Vernooij
Provide right infrastructure for foreign repository tests from bzrlib.
638
        return ForeignTestsRepositoryFactory()
639
0.200.536 by Jelmer Vernooij
Implement network name.
640
    def network_name(self):
641
        return "git"