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