/brz/remove-bazaar

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