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