/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.1613 by Jelmer Vernooij
Handle encoding better in working tree iter changes.
1
# Copyright (C) 2007,2012 Canonical Ltd
0.358.2 by Jelmer Vernooij
Refresh copyright headers, add my email.
2
# Copyright (C) 2009-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.
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 Branch and a Bazaar Branch"""
19
0.200.1594 by Jelmer Vernooij
Use absolute_import everywhere.
20
from __future__ import absolute_import
21
6964.2.1 by Jelmer Vernooij
Initial work to support brz-git on python3.
22
from io import BytesIO
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
23
from collections import defaultdict
24
0.200.261 by Jelmer Vernooij
More formatting fixes.
25
from dulwich.objects import (
0.200.1717 by Jelmer Vernooij
Ignore tags pointing at non-commit objects.
26
    NotCommitError,
0.200.1153 by Jelmer Vernooij
Import ZERO_SHA from dulwich.objects.
27
    ZERO_SHA,
0.200.261 by Jelmer Vernooij
More formatting fixes.
28
    )
0.200.1391 by Jelmer Vernooij
Warn on (and skip) invalid tags.
29
from dulwich.repo import check_ref_format
0.200.261 by Jelmer Vernooij
More formatting fixes.
30
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
31
from ... import (
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
32
    branch,
33
    config,
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
34
    controldir,
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
35
    errors,
0.200.1670 by Jelmer Vernooij
Fix compatibility with newer versions of bzr.
36
    lock,
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
37
    repository as _mod_repository,
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
38
    revision,
0.200.82 by Jelmer Vernooij
Support listing tags.
39
    tag,
0.375.1 by Jelmer Vernooij
Fix remote tests, warn when fetching git->bzr and bzr->git.
40
    trace,
0.230.1 by Jelmer Vernooij
Support lightweight checkouts.
41
    transport,
0.200.1414 by Jelmer Vernooij
Fix pulling into bound branches.
42
    urlutils,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
43
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
44
from ...revision import (
0.200.969 by Jelmer Vernooij
Use tuples with bzr revid and git sha to avoid lookups.
45
    NULL_REVISION,
46
    )
7018.3.2 by Jelmer Vernooij
Fix some git tests.
47
from ...sixish import (
48
    text_type,
49
    viewitems,
50
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
51
from ...trace import (
0.200.342 by Jelmer Vernooij
Report git sha during pull.
52
    is_quiet,
0.200.261 by Jelmer Vernooij
More formatting fixes.
53
    mutter,
0.200.1391 by Jelmer Vernooij
Warn on (and skip) invalid tags.
54
    warning,
0.200.261 by Jelmer Vernooij
More formatting fixes.
55
    )
56
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
57
from .config import (
0.200.386 by Jelmer Vernooij
Move config to a separate file, support BranchConfig.username().
58
    GitBranchConfig,
0.200.1472 by Jelmer Vernooij
Provide basic implementation of Branch.get_config_stack.
59
    GitBranchStack,
0.200.386 by Jelmer Vernooij
Move config to a separate file, support BranchConfig.username().
60
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
61
from .errors import (
0.200.472 by Jelmer Vernooij
Fix printing error when user attempts to push into git.
62
    NoPushSupport,
0.200.278 by Jelmer Vernooij
Update branch head appropriately during dpull.
63
    NoSuchRef,
64
    )
0.404.5 by Jelmer Vernooij
Check for diverged branches during push.
65
from .push import (
66
    remote_divergence,
67
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
68
from .refs import (
0.408.4 by Jelmer Vernooij
Fix some tests.
69
    branch_name_to_ref,
0.200.1061 by Jelmer Vernooij
Add support for using unpeel map.
70
    is_tag,
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
71
    ref_to_branch_name,
0.200.1061 by Jelmer Vernooij
Add support for using unpeel map.
72
    ref_to_tag_name,
0.346.1 by Jelmer Vernooij
Fix tag caching.
73
    remote_refs_dict_to_tag_refs,
0.200.875 by Jelmer Vernooij
Use new tag_name_to_ref function.
74
    tag_name_to_ref,
0.200.1292 by Jelmer Vernooij
Fix repeeling objects when determining what to send.
75
    )
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
76
from .unpeel_map import (
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
77
    UnpeelMap,
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
78
    )
0.408.1 by Jelmer Vernooij
Convert Git URLs in stored config to Breezy URLs.
79
from .urls import git_url_to_bzr_url
0.200.261 by Jelmer Vernooij
More formatting fixes.
80
0.200.1641 by Jelmer Vernooij
Use relative imports where possible.
81
from ...foreign import ForeignBranch
6973.13.2 by Jelmer Vernooij
Fix some more tests.
82
from ...sixish import viewitems
0.200.388 by Jelmer Vernooij
Support bzr 1.14 as well.
83
0.200.261 by Jelmer Vernooij
More formatting fixes.
84
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
85
class GitPullResult(branch.PullResult):
0.200.956 by Jelmer Vernooij
Add some more format tests.
86
    """Result of a pull from a Git branch."""
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
87
88
    def _lookup_revno(self, revid):
6973.13.2 by Jelmer Vernooij
Fix some more tests.
89
        if not isinstance(revid, bytes):
0.361.1 by Jelmer Vernooij
Don't use assert.
90
            raise TypeError(revid)
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
91
        # Try in source branch first, it'll be faster
0.200.1670 by Jelmer Vernooij
Fix compatibility with newer versions of bzr.
92
        with self.target_branch.lock_read():
0.200.1362 by Jelmer Vernooij
Add locking.
93
            return self.target_branch.revision_id_to_revno(revid)
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
94
95
    @property
96
    def old_revno(self):
97
        return self._lookup_revno(self.old_revid)
98
99
    @property
100
    def new_revno(self):
101
        return self._lookup_revno(self.new_revid)
102
103
0.200.1064 by Jelmer Vernooij
Use common base class for tags.
104
class GitTags(tag.BasicTags):
105
    """Ref-based tag dictionary."""
0.200.82 by Jelmer Vernooij
Support listing tags.
106
0.200.89 by Jelmer Vernooij
Support sprouting branches.
107
    def __init__(self, branch):
108
        self.branch = branch
109
        self.repository = branch.repository
0.200.82 by Jelmer Vernooij
Support listing tags.
110
0.346.1 by Jelmer Vernooij
Fix tag caching.
111
    def _merge_to_remote_git(self, target_repo, source_tag_refs, overwrite=False):
0.200.1396 by Jelmer Vernooij
Support updating tags in remote branches during pull.
112
        updates = {}
113
        conflicts = []
114
        def get_changed_refs(old_refs):
115
            ret = dict(old_refs)
0.346.1 by Jelmer Vernooij
Fix tag caching.
116
            for ref_name, tag_name, peeled, unpeeled in source_tag_refs.iteritems():
117
                if old_refs.get(ref_name) == unpeeled:
0.200.1396 by Jelmer Vernooij
Support updating tags in remote branches during pull.
118
                    pass
0.346.1 by Jelmer Vernooij
Fix tag caching.
119
                elif overwrite or not ref_name in old_refs:
120
                    ret[ref_name] = unpeeled
121
                    updates[tag_name] = target_repo.lookup_foreign_revision_id(peeled)
0.200.1396 by Jelmer Vernooij
Support updating tags in remote branches during pull.
122
                else:
0.346.1 by Jelmer Vernooij
Fix tag caching.
123
                    conflicts.append(
124
                        (tag_name,
125
                        self.repository.lookup_foreign_revision_id(peeled),
126
                        target_repo.lookup_foreign_revision_id(old_refs[ref_name])))
0.200.1396 by Jelmer Vernooij
Support updating tags in remote branches during pull.
127
            return ret
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
128
        target_repo.controldir.send_pack(get_changed_refs, lambda have, want: [])
0.200.1396 by Jelmer Vernooij
Support updating tags in remote branches during pull.
129
        return updates, conflicts
130
0.346.1 by Jelmer Vernooij
Fix tag caching.
131
    def _merge_to_local_git(self, target_repo, source_tag_refs, overwrite=False):
0.200.1396 by Jelmer Vernooij
Support updating tags in remote branches during pull.
132
        conflicts = []
133
        updates = {}
0.346.1 by Jelmer Vernooij
Fix tag caching.
134
        for ref_name, tag_name, peeled, unpeeled in source_tag_refs:
135
            if target_repo._git.refs.get(ref_name) == unpeeled:
0.200.1396 by Jelmer Vernooij
Support updating tags in remote branches during pull.
136
                pass
0.346.1 by Jelmer Vernooij
Fix tag caching.
137
            elif overwrite or not ref_name in target_repo._git.refs:
138
                target_repo._git.refs[ref_name] = unpeeled or peeled
139
                updates[tag_name] = self.repository.lookup_foreign_revision_id(peeled)
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
140
            else:
0.375.1 by Jelmer Vernooij
Fix remote tests, warn when fetching git->bzr and bzr->git.
141
                source_revid = self.repository.lookup_foreign_revision_id(peeled)
142
                try:
143
                    target_revid = target_repo.lookup_foreign_revision_id(
144
                            target_repo._git.refs[ref_name])
145
                except KeyError:
146
                    trace.warning('%s does not point to a valid object',
147
                                  ref_name)
148
                    continue
149
                conflicts.append((tag_name, source_revid, target_revid))
0.200.1396 by Jelmer Vernooij
Support updating tags in remote branches during pull.
150
        return updates, conflicts
151
0.346.1 by Jelmer Vernooij
Fix tag caching.
152
    def _merge_to_git(self, to_tags, source_tag_refs, overwrite=False):
0.200.1396 by Jelmer Vernooij
Support updating tags in remote branches during pull.
153
        target_repo = to_tags.repository
154
        if self.repository.has_same_location(target_repo):
155
            return {}, []
0.346.1 by Jelmer Vernooij
Fix tag caching.
156
        try:
157
            if getattr(target_repo, "_git", None):
158
                return self._merge_to_local_git(target_repo, source_tag_refs, overwrite)
159
            else:
160
                return self._merge_to_remote_git(target_repo, source_tag_refs, overwrite)
161
        finally:
162
            to_tags.branch._tag_refs = None
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
163
0.346.1 by Jelmer Vernooij
Fix tag caching.
164
    def _merge_to_non_git(self, to_tags, source_tag_refs, overwrite=False):
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
165
        unpeeled_map = defaultdict(set)
166
        conflicts = []
0.200.1396 by Jelmer Vernooij
Support updating tags in remote branches during pull.
167
        updates = {}
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
168
        result = dict(to_tags.get_tag_dict())
0.346.1 by Jelmer Vernooij
Fix tag caching.
169
        for ref_name, tag_name, peeled, unpeeled in source_tag_refs:
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
170
            if unpeeled is not None:
171
                unpeeled_map[peeled].add(unpeeled)
0.346.1 by Jelmer Vernooij
Fix tag caching.
172
            try:
173
                bzr_revid = self.branch.lookup_foreign_revision_id(peeled)
174
            except NotCommitError:
175
                continue
176
            if result.get(tag_name) == bzr_revid:
0.200.1396 by Jelmer Vernooij
Support updating tags in remote branches during pull.
177
                pass
0.346.1 by Jelmer Vernooij
Fix tag caching.
178
            elif tag_name not in result or overwrite:
179
                result[tag_name] = bzr_revid
180
                updates[tag_name] = bzr_revid
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
181
            else:
0.346.1 by Jelmer Vernooij
Fix tag caching.
182
                conflicts.append((tag_name, bzr_revid, result[n]))
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
183
        to_tags._set_tag_dict(result)
184
        if len(unpeeled_map) > 0:
185
            map_file = UnpeelMap.from_repository(to_tags.branch.repository)
186
            map_file.update(unpeeled_map)
187
            map_file.save_in_repository(to_tags.branch.repository)
0.200.1396 by Jelmer Vernooij
Support updating tags in remote branches during pull.
188
        return updates, conflicts
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
189
190
    def merge_to(self, to_tags, overwrite=False, ignore_master=False,
0.346.1 by Jelmer Vernooij
Fix tag caching.
191
                 source_tag_refs=None):
0.200.1113 by Jelmer Vernooij
Fix Tags.merge_to.
192
        """See Tags.merge_to."""
0.346.1 by Jelmer Vernooij
Fix tag caching.
193
        if source_tag_refs is None:
194
            source_tag_refs = self.branch.get_tag_refs()
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
195
        if self == to_tags:
0.200.1402 by Jelmer Vernooij
Cope with tag changes in bzr.
196
            return {}, []
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
197
        if isinstance(to_tags, GitTags):
0.346.1 by Jelmer Vernooij
Fix tag caching.
198
            return self._merge_to_git(to_tags, source_tag_refs,
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
199
                                      overwrite=overwrite)
200
        else:
201
            if ignore_master:
202
                master = None
203
            else:
204
                master = to_tags.branch.get_master_branch()
205
            if master is not None:
0.331.1 by Jelmer Vernooij
Fix some tags tests.
206
                master.lock_write()
207
            try:
0.346.1 by Jelmer Vernooij
Fix tag caching.
208
                updates, conflicts = self._merge_to_non_git(to_tags, source_tag_refs,
0.331.1 by Jelmer Vernooij
Fix some tags tests.
209
                                                  overwrite=overwrite)
210
                if master is not None:
211
                    extra_updates, extra_conflicts = self.merge_to(
212
                        master.tags, overwrite=overwrite,
0.346.1 by Jelmer Vernooij
Fix tag caching.
213
                                               source_tag_refs=source_tag_refs,
0.331.1 by Jelmer Vernooij
Fix some tags tests.
214
                                               ignore_master=ignore_master)
215
                    updates.update(extra_updates)
216
                    conflicts += extra_conflicts
217
                return updates, conflicts
218
            finally:
219
                if master is not None:
220
                    master.unlock()
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
221
222
    def get_tag_dict(self):
223
        ret = {}
0.346.1 by Jelmer Vernooij
Fix tag caching.
224
        for (ref_name, tag_name, peeled, unpeeled) in self.branch.get_tag_refs():
225
            try:
226
                bzr_revid = self.branch.lookup_foreign_revision_id(peeled)
227
            except NotCommitError:
228
                continue
229
            else:
230
                ret[tag_name] = bzr_revid
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
231
        return ret
232
0.200.1064 by Jelmer Vernooij
Use common base class for tags.
233
234
class LocalGitTagDict(GitTags):
235
    """Dictionary with tags in a local repository."""
236
237
    def __init__(self, branch):
238
        super(LocalGitTagDict, self).__init__(branch)
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
239
        self.refs = self.repository.controldir._git.refs
0.200.1064 by Jelmer Vernooij
Use common base class for tags.
240
0.200.711 by Jelmer Vernooij
Support merging tags to a local Git repository.
241
    def _set_tag_dict(self, to_dict):
0.200.1487 by Jelmer Vernooij
Use peeling.
242
        extra = set(self.refs.allkeys())
6973.13.2 by Jelmer Vernooij
Fix some more tests.
243
        for k, revid in viewitems(to_dict):
0.200.875 by Jelmer Vernooij
Use new tag_name_to_ref function.
244
            name = tag_name_to_ref(k)
0.200.711 by Jelmer Vernooij
Support merging tags to a local Git repository.
245
            if name in extra:
246
                extra.remove(name)
247
            self.set_tag(k, revid)
248
        for name in extra:
0.200.1061 by Jelmer Vernooij
Add support for using unpeel map.
249
            if is_tag(name):
0.200.711 by Jelmer Vernooij
Support merging tags to a local Git repository.
250
                del self.repository._git[name]
0.200.956 by Jelmer Vernooij
Add some more format tests.
251
0.200.86 by Jelmer Vernooij
Clearer error when setting tags.
252
    def set_tag(self, name, revid):
0.200.1369 by Jelmer Vernooij
Clarify that ghost tags are not supported.
253
        try:
254
            git_sha, mapping = self.branch.lookup_bzr_revision_id(revid)
255
        except errors.NoSuchRevision:
256
            raise errors.GhostTagsNotSupported(self)
257
        self.refs[tag_name_to_ref(name)] = git_sha
0.346.1 by Jelmer Vernooij
Fix tag caching.
258
        self.branch._tag_refs = None
259
260
    def delete_tag(self, name):
261
        ref = tag_name_to_ref(name)
262
        if not ref in self.refs:
263
            raise errors.NoSuchTag(name)
264
        del self.refs[ref]
265
        self.branch._tag_refs = None
0.239.1 by Jelmer Vernooij
Avoid re-connecting to fetch tags we already know.
266
267
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
268
class GitBranchFormat(branch.BranchFormat):
269
0.243.1 by Jelmer Vernooij
Use foreign branch testing infrastructure.
270
    def network_name(self):
6973.6.2 by Jelmer Vernooij
Fix more tests.
271
        return b"git"
0.243.1 by Jelmer Vernooij
Use foreign branch testing infrastructure.
272
0.200.82 by Jelmer Vernooij
Support listing tags.
273
    def supports_tags(self):
274
        return True
275
0.200.1105 by Jelmer Vernooij
Don't claim to support leaving locks.
276
    def supports_leaving_lock(self):
277
        return False
278
0.200.1369 by Jelmer Vernooij
Clarify that ghost tags are not supported.
279
    def supports_tags_referencing_ghosts(self):
280
        return False
281
282
    def tags_are_versioned(self):
283
        return False
284
0.243.1 by Jelmer Vernooij
Use foreign branch testing infrastructure.
285
    def get_foreign_tests_branch_factory(self):
0.200.1644 by Jelmer Vernooij
More relative imports.
286
        from .tests.test_branch import ForeignTestsBranchFactory
0.243.1 by Jelmer Vernooij
Use foreign branch testing infrastructure.
287
        return ForeignTestsBranchFactory()
288
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
289
    def make_tags(self, branch):
0.200.1487 by Jelmer Vernooij
Use peeling.
290
        try:
291
            return branch.tags
292
        except AttributeError:
293
            pass
0.200.1433 by Jelmer Vernooij
Fix fetching between git repositories.
294
        if getattr(branch.repository, "_git", None) is None:
0.200.1644 by Jelmer Vernooij
More relative imports.
295
            from .remote import RemoteGitTagDict
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
296
            return RemoteGitTagDict(branch)
0.200.261 by Jelmer Vernooij
More formatting fixes.
297
        else:
298
            return LocalGitTagDict(branch)
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
299
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
300
    def initialize(self, a_controldir, name=None, repository=None,
0.200.1378 by Jelmer Vernooij
Fix branch.
301
                   append_revisions_only=None):
0.295.2 by Jelmer Vernooij
Make RemoteGitBranchFormat uninitializeable.
302
        raise NotImplementedError(self.initialize)
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
303
0.200.1728 by Jelmer Vernooij
Support following branch references.
304
    def get_reference(self, controldir, name=None):
305
        return controldir.get_branch_reference(name)
306
307
    def set_reference(self, controldir, name, target):
308
        return controldir.set_branch_reference(target, name)
309
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
310
0.295.1 by Jelmer Vernooij
Split up branch formats.
311
class LocalGitBranchFormat(GitBranchFormat):
312
313
    def get_format_description(self):
314
        return 'Local Git Branch'
315
316
    @property
317
    def _matchingcontroldir(self):
318
        from .dir import LocalGitControlDirFormat
319
        return LocalGitControlDirFormat()
320
0.295.2 by Jelmer Vernooij
Make RemoteGitBranchFormat uninitializeable.
321
    def initialize(self, a_controldir, name=None, repository=None,
322
                   append_revisions_only=None):
323
        from .dir import LocalGitDir
324
        if not isinstance(a_controldir, LocalGitDir):
325
            raise errors.IncompatibleFormat(self, a_controldir._format)
326
        return a_controldir.create_branch(repository=repository, name=name,
327
            append_revisions_only=append_revisions_only)
328
0.295.1 by Jelmer Vernooij
Split up branch formats.
329
0.200.388 by Jelmer Vernooij
Support bzr 1.14 as well.
330
class GitBranch(ForeignBranch):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
331
    """An adapter to git repositories for bzr Branch objects."""
332
0.200.1129 by Jelmer Vernooij
Implement GitBranch.control_transport.
333
    @property
334
    def control_transport(self):
0.310.16 by Jelmer Vernooij
Update xfail.
335
        return self._control_transport
0.306.1 by Jelmer Vernooij
Set correct segment parameters on branches.
336
0.310.14 by Jelmer Vernooij
merge lightweight checkout-in-git support.
337
    @property
338
    def user_transport(self):
339
        return self._user_transport
340
0.295.1 by Jelmer Vernooij
Split up branch formats.
341
    def __init__(self, controldir, repository, ref, format):
0.200.82 by Jelmer Vernooij
Support listing tags.
342
        self.repository = repository
0.295.1 by Jelmer Vernooij
Split up branch formats.
343
        self._format = format
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
344
        self.controldir = controldir
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
345
        self._lock_mode = None
346
        self._lock_count = 0
0.231.1 by Jelmer Vernooij
Check that regenerated objects have the expected sha1.
347
        super(GitBranch, self).__init__(repository.get_mapping())
0.200.770 by Jelmer Vernooij
Proper branch names.
348
        self.ref = ref
0.200.1708 by Jelmer Vernooij
Fix to colocated branch tests.
349
        self._head = None
0.310.14 by Jelmer Vernooij
merge lightweight checkout-in-git support.
350
        self._user_transport = controldir.user_transport.clone('.')
0.310.16 by Jelmer Vernooij
Update xfail.
351
        self._control_transport = controldir.control_transport.clone('.')
0.346.1 by Jelmer Vernooij
Fix tag caching.
352
        self._tag_refs = None
0.306.1 by Jelmer Vernooij
Set correct segment parameters on branches.
353
        params = {}
0.200.1361 by Jelmer Vernooij
Support branches where the ref can't be mapped back to a branch name.
354
        try:
355
            self.name = ref_to_branch_name(ref)
356
        except ValueError:
357
            self.name = None
0.200.1708 by Jelmer Vernooij
Fix to colocated branch tests.
358
            if self.ref is not None:
0.310.16 by Jelmer Vernooij
Update xfail.
359
                params = {"ref": urlutils.escape(self.ref)}
0.200.1708 by Jelmer Vernooij
Fix to colocated branch tests.
360
        else:
361
            if self.name != "":
0.310.16 by Jelmer Vernooij
Update xfail.
362
                params = {"branch": urlutils.escape(self.name)}
363
        for k, v in params.items():
364
            self._user_transport.set_segment_parameter(k, v)
365
            self._control_transport.set_segment_parameter(k, v)
0.310.14 by Jelmer Vernooij
merge lightweight checkout-in-git support.
366
        self.base = controldir.user_transport.base
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
367
0.200.1360 by Jelmer Vernooij
Support lighweight argument to _get_checkout_format.
368
    def _get_checkout_format(self, lightweight=False):
0.239.8 by Jelmer Vernooij
Support checkouts.
369
        """Return the most suitable metadir for a checkout of this branch.
370
        Weaves are used if this branch's repository uses weaves.
371
        """
0.311.1 by Jelmer Vernooij
Support git lightweight checkouts.
372
        if lightweight:
373
            return controldir.format_registry.make_controldir("git")
374
        else:
375
            return controldir.format_registry.make_controldir("default")
0.239.8 by Jelmer Vernooij
Support checkouts.
376
0.238.3 by Jelmer Vernooij
Remove svn references, prefer git send format when submitting changes against a git branch.
377
    def get_child_submit_format(self):
378
        """Return the preferred format of submissions to this branch."""
0.200.1584 by Jelmer Vernooij
Use config stacks in a few more places.
379
        ret = self.get_config_stack().get("child_submit_format")
0.238.3 by Jelmer Vernooij
Remove svn references, prefer git send format when submitting changes against a git branch.
380
        if ret is not None:
381
            return ret
382
        return "git"
383
0.200.1397 by Jelmer Vernooij
Fix use of get_config() for RemoteGitBranch.
384
    def get_config(self):
385
        return GitBranchConfig(self)
386
0.200.1472 by Jelmer Vernooij
Provide basic implementation of Branch.get_config_stack.
387
    def get_config_stack(self):
388
        return GitBranchStack(self)
389
0.200.293 by Jelmer Vernooij
Fix branch nicks.
390
    def _get_nick(self, local=False, possible_master_transports=None):
391
        """Find the nick name for this branch.
392
393
        :return: Branch nick
394
        """
0.200.1547 by Jelmer Vernooij
Support setting branch nicks.
395
        cs = self.repository._git.get_config_stack()
396
        try:
0.200.1694 by Jelmer Vernooij
Fix nick test.
397
            return cs.get((b"branch", self.name.encode('utf-8')), b"nick").decode("utf-8")
0.200.1547 by Jelmer Vernooij
Support setting branch nicks.
398
        except KeyError:
399
            pass
0.200.1694 by Jelmer Vernooij
Fix nick test.
400
        return self.name or u"HEAD"
0.200.293 by Jelmer Vernooij
Fix branch nicks.
401
0.200.331 by Jelmer Vernooij
Add stub for setting nick function.
402
    def _set_nick(self, nick):
0.200.1547 by Jelmer Vernooij
Support setting branch nicks.
403
        cf = self.repository._git.get_config()
0.200.1694 by Jelmer Vernooij
Fix nick test.
404
        cf.set((b"branch", self.name.encode('utf-8')), b"nick", nick.encode("utf-8"))
6964.2.1 by Jelmer Vernooij
Initial work to support brz-git on python3.
405
        f = BytesIO()
0.200.1547 by Jelmer Vernooij
Support setting branch nicks.
406
        cf.write_to_file(f)
0.288.3 by Jelmer Vernooij
Fix parent URL handling.
407
        self.repository._git._put_named_file('config', f.getvalue())
0.200.331 by Jelmer Vernooij
Add stub for setting nick function.
408
409
    nick = property(_get_nick, _set_nick)
0.200.293 by Jelmer Vernooij
Fix branch nicks.
410
0.200.412 by Jelmer Vernooij
Implement GitBranch.__repr__.
411
    def __repr__(self):
0.200.770 by Jelmer Vernooij
Proper branch names.
412
        return "<%s(%r, %r)>" % (self.__class__.__name__, self.repository.base,
0.200.1311 by Jelmer Vernooij
More work on colocated branch support.
413
            self.name)
0.200.412 by Jelmer Vernooij
Implement GitBranch.__repr__.
414
0.296.2 by Jelmer Vernooij
Handle DivergedBranches.
415
    def generate_revision_history(self, revid, last_rev=None, other_branch=None):
416
        if last_rev is not None:
417
            graph = self.repository.get_graph()
418
            if not graph.is_ancestor(last_rev, revid):
419
                # our previous tip is not merged into stop_revision
420
                raise errors.DivergedBranches(self, other_branch)
421
0.297.2 by Jelmer Vernooij
Simplify Branch.generate_revision_history.
422
        self.set_last_revision(revid)
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
423
0.200.1199 by Jelmer Vernooij
Support 'token' argument to Branch.lock_write.
424
    def lock_write(self, token=None):
425
        if token is not None:
426
            raise errors.TokenLockingNotSupported(self)
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
427
        if self._lock_mode:
0.200.1369 by Jelmer Vernooij
Clarify that ghost tags are not supported.
428
            if self._lock_mode == 'r':
429
                raise errors.ReadOnlyError(self)
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
430
            self._lock_count += 1
431
        else:
0.383.1 by Jelmer Vernooij
Fix a bunch of locking issues.
432
            self._lock_ref()
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
433
            self._lock_mode = 'w'
434
            self._lock_count = 1
435
        self.repository.lock_write()
0.200.1670 by Jelmer Vernooij
Fix compatibility with newer versions of bzr.
436
        return lock.LogicalLockResult(self.unlock)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
437
0.200.1453 by Jelmer Vernooij
Provide Branch.leave_lock_in_place and Branch.dont_leave_lock_in_place.
438
    def leave_lock_in_place(self):
439
        raise NotImplementedError(self.leave_lock_in_place)
440
441
    def dont_leave_lock_in_place(self):
442
        raise NotImplementedError(self.dont_leave_lock_in_place)
443
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
444
    def get_stacked_on_url(self):
445
        # Git doesn't do stacking (yet...)
0.200.1660 by Jelmer Vernooij
Fix imports.
446
        raise branch.UnstackableBranchFormat(self._format, self.base)
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
447
0.288.3 by Jelmer Vernooij
Fix parent URL handling.
448
    def _get_parent_location(self):
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
449
        """See Branch.get_parent()."""
0.200.312 by Jelmer Vernooij
Add notes about parent locations.
450
        # FIXME: Set "origin" url from .git/config ?
0.288.3 by Jelmer Vernooij
Fix parent URL handling.
451
        cs = self.repository._git.get_config_stack()
452
        try:
0.408.1 by Jelmer Vernooij
Convert Git URLs in stored config to Breezy URLs.
453
            location = cs.get((b"remote", b'origin'), b"url")
0.288.3 by Jelmer Vernooij
Fix parent URL handling.
454
        except KeyError:
455
            return None
0.408.4 by Jelmer Vernooij
Fix some tests.
456
457
        params = {}
458
        try:
459
            ref = cs.get((b"remote", b"origin"), b"merge")
460
        except KeyError:
461
            pass
0.408.1 by Jelmer Vernooij
Convert Git URLs in stored config to Breezy URLs.
462
        else:
0.408.4 by Jelmer Vernooij
Fix some tests.
463
            if ref != 'HEAD':
464
                try:
465
                    params['branch'] = ref_to_branch_name(ref).encode('utf-8')
466
                except ValueError:
467
                    params['ref'] = ref.encode('utf-8')
468
469
        url = git_url_to_bzr_url(location)
470
        return urlutils.join_segment_parameters(url, params)
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
471
0.288.3 by Jelmer Vernooij
Fix parent URL handling.
472
    def set_parent(self, location):
0.200.312 by Jelmer Vernooij
Add notes about parent locations.
473
        # FIXME: Set "origin" url in .git/config ?
0.288.3 by Jelmer Vernooij
Fix parent URL handling.
474
        cs = self.repository._git.get_config()
0.408.4 by Jelmer Vernooij
Fix some tests.
475
        this_url = urlutils.split_segment_parameters(self.user_url)[0]
476
        target_url, target_params = urlutils.split_segment_parameters(location)
477
        location = urlutils.relative_url(this_url, target_url)
0.288.3 by Jelmer Vernooij
Fix parent URL handling.
478
        cs.set((b"remote", b"origin"), b"url", location)
0.408.4 by Jelmer Vernooij
Fix some tests.
479
        if 'branch' in target_params:
480
            cs.set((b"remote", b"origin"), b"merge",
481
                   branch_name_to_ref(target_params['branch']))
482
        elif 'ref' in target_params:
483
            cs.set((b"remote", b"origin"), b"merge",
484
                   target_params['ref'])
485
        else:
486
            # TODO(jelmer): Maybe unset rather than setting to HEAD?
487
            cs.set((b"remote", b"origin"), b"merge", 'HEAD')
6964.2.1 by Jelmer Vernooij
Initial work to support brz-git on python3.
488
        f = BytesIO()
0.288.3 by Jelmer Vernooij
Fix parent URL handling.
489
        cs.write_to_file(f)
490
        self.repository._git._put_named_file('config', f.getvalue())
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
491
0.200.1411 by Jelmer Vernooij
Fix control files.
492
    def break_lock(self):
493
        raise NotImplementedError(self.break_lock)
494
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
495
    def lock_read(self):
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
496
        if self._lock_mode:
0.361.1 by Jelmer Vernooij
Don't use assert.
497
            if self._lock_mode not in ('r', 'w'):
498
                raise ValueError(self._lock_mode)
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
499
            self._lock_count += 1
500
        else:
501
            self._lock_mode = 'r'
502
            self._lock_count = 1
503
        self.repository.lock_read()
0.200.1670 by Jelmer Vernooij
Fix compatibility with newer versions of bzr.
504
        return lock.LogicalLockResult(self.unlock)
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
505
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
506
    def peek_lock_mode(self):
507
        return self._lock_mode
508
0.200.432 by Jelmer Vernooij
Support Branch.is_locked, required for loggerhead.
509
    def is_locked(self):
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
510
        return (self._lock_mode is not None)
0.200.432 by Jelmer Vernooij
Support Branch.is_locked, required for loggerhead.
511
0.383.1 by Jelmer Vernooij
Fix a bunch of locking issues.
512
    def _lock_ref(self):
513
        pass
514
515
    def _unlock_ref(self):
516
        pass
517
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
518
    def unlock(self):
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
519
        """See Branch.unlock()."""
520
        if self._lock_count == 0:
0.383.1 by Jelmer Vernooij
Fix a bunch of locking issues.
521
            raise errors.LockNotHeld(self)
522
        try:
523
            self._lock_count -= 1
524
            if self._lock_count == 0:
525
                if self._lock_mode == 'w':
526
                    self._unlock_ref()
527
                self._lock_mode = None
528
                self._clear_cached_state()
529
        finally:
530
            self.repository.unlock()
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
531
532
    def get_physical_lock_status(self):
533
        return False
534
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
535
    def last_revision(self):
0.200.1675 by Jelmer Vernooij
Remove uses of decorators.
536
        with self.lock_read():
537
            # perhaps should escape this ?
538
            if self.head is None:
539
                return revision.NULL_REVISION
540
            return self.lookup_foreign_revision_id(self.head)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
541
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
542
    def _basic_push(self, target, overwrite=False, stop_revision=None):
543
        return branch.InterBranch.get(self, target)._basic_push(
544
            overwrite, stop_revision)
545
0.252.49 by Jelmer Vernooij
Avoid trying to set HEAD for remote branches.
546
    def lookup_foreign_revision_id(self, foreign_revid):
0.200.1760 by Jelmer Vernooij
Fall back to simple revision id generation.
547
        try:
548
            return self.repository.lookup_foreign_revision_id(foreign_revid,
549
                self.mapping)
550
        except KeyError:
551
            # Let's try..
552
            return self.mapping.revision_id_foreign_to_bzr(foreign_revid)
0.252.49 by Jelmer Vernooij
Avoid trying to set HEAD for remote branches.
553
0.200.1030 by Jelmer Vernooij
More work on supporting roundtripping push.
554
    def lookup_bzr_revision_id(self, revid):
555
        return self.repository.lookup_bzr_revision_id(
556
            revid, mapping=self.mapping)
557
0.200.1678 by Jelmer Vernooij
Fix tests.
558
    def get_unshelver(self, tree):
559
        raise errors.StoringUncommittedNotSupported(self)
560
0.346.1 by Jelmer Vernooij
Fix tag caching.
561
    def _clear_cached_state(self):
562
        super(GitBranch, self)._clear_cached_state()
563
        self._tag_refs = None
564
565
    def _iter_tag_refs(self, refs):
566
        """Iterate over the tag refs.
567
568
        :param refs: Refs dictionary (name -> git sha1)
569
        :return: iterator over (ref_name, tag_name, peeled_sha1, unpeeled_sha1)
570
        """
571
        raise NotImplementedError(self._iter_tag_refs)
572
0.375.1 by Jelmer Vernooij
Fix remote tests, warn when fetching git->bzr and bzr->git.
573
    def get_tag_refs(self):
574
        with self.lock_read():
575
            if self._tag_refs is None:
576
                self._tag_refs = list(self._iter_tag_refs())
577
            return self._tag_refs
578
0.200.692 by Jelmer Vernooij
Refuse pulling into non-rich-root branches rather than erroring out with an AttributeError.
579
0.200.465 by Jelmer Vernooij
Use dulwich standard functionality for finding missing revisions.
580
class LocalGitBranch(GitBranch):
581
    """A local Git branch."""
582
0.200.1648 by Jelmer Vernooij
Fix compatibility with newer versions of breezy.
583
    def __init__(self, controldir, repository, ref):
0.295.1 by Jelmer Vernooij
Split up branch formats.
584
        super(LocalGitBranch, self).__init__(controldir, repository, ref,
585
                LocalGitBranchFormat())
0.200.763 by Jelmer Vernooij
Provide proper colocated branch support.
586
0.200.261 by Jelmer Vernooij
More formatting fixes.
587
    def create_checkout(self, to_location, revision_id=None, lightweight=False,
588
        accelerator_tree=None, hardlink=False):
0.200.1774 by Jelmer Vernooij
Simplify checkout creation.
589
        t = transport.get_transport(to_location)
590
        t.ensure_base()
591
        format = self._get_checkout_format(lightweight=lightweight)
592
        checkout = format.initialize_on_transport(t)
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
593
        if lightweight:
0.200.1774 by Jelmer Vernooij
Simplify checkout creation.
594
            from_branch = checkout.set_branch_reference(target_branch=self)
595
        else:
596
            policy = checkout.determine_repository_policy()
597
            repo = policy.acquire_repository()[0]
598
599
            checkout_branch = checkout.create_branch()
600
            checkout_branch.bind(self)
601
            checkout_branch.pull(self, stop_revision=revision_id)
602
            from_branch = None
603
        return checkout.create_workingtree(revision_id,
0.230.1 by Jelmer Vernooij
Support lightweight checkouts.
604
                from_branch=from_branch, hardlink=hardlink)
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
605
0.383.1 by Jelmer Vernooij
Fix a bunch of locking issues.
606
    def _lock_ref(self):
607
        self._ref_lock = self.repository._git.refs.lock_ref(self.ref)
608
609
    def _unlock_ref(self):
610
        self._ref_lock.unlock()
611
0.412.1 by Jelmer Vernooij
Implement Branch.break_lock.
612
    def break_lock(self):
613
        self.repository._git.refs.unlock_ref(self.ref)
614
0.200.1493 by Jelmer Vernooij
Test fixes.
615
    def fetch(self, from_branch, last_revision=None, limit=None):
616
        return branch.InterBranch.get(from_branch, self).fetch(
617
            stop_revision=last_revision, limit=limit)
618
0.200.57 by Jelmer Vernooij
Fix more tests.
619
    def _gen_revision_history(self):
0.200.58 by Jelmer Vernooij
Fix remaining tests.
620
        if self.head is None:
621
            return []
6968.1.1 by Jelmer Vernooij
Support 'bzr version-info' in horizon branches.
622
        last_revid = self.last_revision()
0.200.1279 by Jelmer Vernooij
Avoid using deprecated Repository.iter_reverse_revision_history.
623
        graph = self.repository.get_graph()
6968.1.1 by Jelmer Vernooij
Support 'bzr version-info' in horizon branches.
624
        try:
625
            ret = list(graph.iter_lefthand_ancestry(last_revid,
626
                (revision.NULL_REVISION, )))
627
        except errors.RevisionNotPresent as e:
628
            raise errors.GhostRevisionsHaveNoRevno(last_revid, e.revision_id)
0.200.59 by Jelmer Vernooij
Add more tests, fix revision history.
629
        ret.reverse()
0.200.57 by Jelmer Vernooij
Fix more tests.
630
        return ret
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
631
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
632
    def _get_head(self):
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
633
        try:
0.336.2 by Jelmer Vernooij
Don't use ZERO_SHA outside of remote communication to indicate empty history.
634
            return self.repository._git.refs[self.ref]
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
635
        except KeyError:
636
            return None
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
637
0.200.1228 by Jelmer Vernooij
Provide Branch._read_last_revision_info.
638
    def _read_last_revision_info(self):
639
        last_revid = self.last_revision()
640
        graph = self.repository.get_graph()
641
        revno = graph.find_distance_to_null(last_revid,
642
            [(revision.NULL_REVISION, 0)])
643
        return revno, last_revid
644
645
    def set_last_revision_info(self, revno, revision_id):
646
        self.set_last_revision(revision_id)
647
        self._last_revision_info_cache = revno, revision_id
0.200.507 by Jelmer Vernooij
Implement set_last_revision{_info,}.
648
649
    def set_last_revision(self, revid):
6964.2.1 by Jelmer Vernooij
Initial work to support brz-git on python3.
650
        if not revid or not isinstance(revid, bytes):
0.200.1233 by Jelmer Vernooij
Implement Repository.iter_files_bytes.
651
            raise errors.InvalidRevisionId(revision_id=revid, branch=self)
0.200.1218 by Jelmer Vernooij
Support set_last_revision('null:').
652
        if revid == NULL_REVISION:
0.336.2 by Jelmer Vernooij
Don't use ZERO_SHA outside of remote communication to indicate empty history.
653
            newhead = None
0.200.1218 by Jelmer Vernooij
Support set_last_revision('null:').
654
        else:
655
            (newhead, self.mapping) = self.repository.lookup_bzr_revision_id(revid)
656
            if self.mapping is None:
657
                raise AssertionError
658
        self._set_head(newhead)
0.200.507 by Jelmer Vernooij
Implement set_last_revision{_info,}.
659
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
660
    def _set_head(self, value):
0.361.1 by Jelmer Vernooij
Don't use assert.
661
        if value == ZERO_SHA:
662
            raise ValueError(value)
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
663
        self._head = value
0.336.2 by Jelmer Vernooij
Don't use ZERO_SHA outside of remote communication to indicate empty history.
664
        if value is None:
665
            del self.repository._git.refs[self.ref]
666
        else:
667
            self.repository._git.refs[self.ref] = self._head
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
668
        self._clear_cached_state()
669
670
    head = property(_get_head, _set_head)
671
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
672
    def get_push_location(self):
673
        """See Branch.get_push_location."""
0.200.1584 by Jelmer Vernooij
Use config stacks in a few more places.
674
        push_loc = self.get_config_stack().get('push_location')
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
675
        return push_loc
676
677
    def set_push_location(self, location):
678
        """See Branch.set_push_location."""
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
679
        self.get_config().set_user_option('push_location', location,
0.217.54 by John Carr
set_user_option breaks - doesnt have a local option in BranchConfig. Follow the bzr.dev syntax instead.
680
                                          store=config.STORE_LOCATION)
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
681
682
    def supports_tags(self):
0.200.82 by Jelmer Vernooij
Support listing tags.
683
        return True
0.200.956 by Jelmer Vernooij
Add some more format tests.
684
0.200.1681 by Jelmer Vernooij
Provide Branch.store_uncommitted.
685
    def store_uncommitted(self, creator):
686
        raise errors.StoringUncommittedNotSupported(self)
687
0.346.1 by Jelmer Vernooij
Fix tag caching.
688
    def _iter_tag_refs(self):
689
        """Iterate over the tag refs.
690
691
        :param refs: Refs dictionary (name -> git sha1)
692
        :return: iterator over (ref_name, tag_name, peeled_sha1, unpeeled_sha1)
693
        """
694
        refs = self.repository._git.refs
7018.3.2 by Jelmer Vernooij
Fix some git tests.
695
        for ref_name, unpeeled in viewitems(refs.as_dict()):
0.346.1 by Jelmer Vernooij
Fix tag caching.
696
            try:
697
                tag_name = ref_to_tag_name(ref_name)
698
            except (ValueError, UnicodeDecodeError):
699
                continue
700
            peeled = refs.get_peeled(ref_name)
701
            if peeled is None:
0.382.1 by Jelmer Vernooij
Various fixes for annotated tags and symrefs.
702
                peeled = unpeeled
6973.6.2 by Jelmer Vernooij
Fix more tests.
703
            if not isinstance(tag_name, text_type):
0.361.1 by Jelmer Vernooij
Don't use assert.
704
                raise TypeError(tag_name)
0.346.1 by Jelmer Vernooij
Fix tag caching.
705
            yield (ref_name, tag_name, peeled, unpeeled)
706
0.360.1 by Jelmer Vernooij
Implement GitMemoryTree.
707
    def create_memorytree(self):
708
        from .memorytree import GitMemoryTree
709
        return GitMemoryTree(self, self.repository._git.object_store, self.head)
710
0.429.10 by Jelmer Vernooij
use new read_submodule_head from dulwich.
711
    def reference_parent(self, path, file_id=None, possible_transports=None):
712
        """Return the parent branch for a tree-reference file_id
713
714
        :param path: The path of the file_id in the tree
715
        :param file_id: Optional file_id of the tree reference
716
        :return: A branch associated with the file_id
717
        """
718
        # FIXME should provide multiple branches, based on config
0.429.18 by Jelmer Vernooij
Fix reference_parent tets.
719
        url = urlutils.join(self.user_url, path)
720
        return branch.Branch.open(
721
                url,
722
                possible_transports=possible_transports)
723
0.429.10 by Jelmer Vernooij
use new read_submodule_head from dulwich.
724
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
725
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
726
def _quick_lookup_revno(local_branch, remote_branch, revid):
6973.13.2 by Jelmer Vernooij
Fix some more tests.
727
    if not isinstance(revid, bytes):
0.361.1 by Jelmer Vernooij
Don't use assert.
728
        raise TypeError(revid)
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
729
    # Try in source branch first, it'll be faster
0.200.1788 by Jelmer Vernooij
Use context managers.
730
    with local_branch.lock_read():
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
731
        try:
0.200.1362 by Jelmer Vernooij
Add locking.
732
            return local_branch.revision_id_to_revno(revid)
733
        except errors.NoSuchRevision:
734
            graph = local_branch.repository.get_graph()
735
            try:
736
                return graph.find_distance_to_null(revid,
737
                    [(revision.NULL_REVISION, 0)])
738
            except errors.GhostRevisionsHaveNoRevno:
739
                # FIXME: Check using graph.find_distance_to_null() ?
0.200.1788 by Jelmer Vernooij
Use context managers.
740
                with remote_branch.lock_read():
0.200.1362 by Jelmer Vernooij
Add locking.
741
                    return remote_branch.revision_id_to_revno(revid)
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
742
743
0.200.342 by Jelmer Vernooij
Report git sha during pull.
744
class GitBranchPullResult(branch.PullResult):
745
0.252.36 by Jelmer Vernooij
Fix pull.
746
    def __init__(self):
747
        super(GitBranchPullResult, self).__init__()
748
        self.new_git_head = None
749
        self._old_revno = None
750
        self._new_revno = None
751
0.200.342 by Jelmer Vernooij
Report git sha during pull.
752
    def report(self, to_file):
753
        if not is_quiet():
754
            if self.old_revid == self.new_revid:
755
                to_file.write('No revisions to pull.\n')
0.200.728 by Jelmer Vernooij
Fix pulling when all revisions are already in the repo.
756
            elif self.new_git_head is not None:
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
757
                to_file.write('Now on revision %d (git sha: %s).\n' %
0.200.342 by Jelmer Vernooij
Report git sha during pull.
758
                        (self.new_revno, self.new_git_head))
0.200.728 by Jelmer Vernooij
Fix pulling when all revisions are already in the repo.
759
            else:
760
                to_file.write('Now on revision %d.\n' % (self.new_revno,))
0.200.342 by Jelmer Vernooij
Report git sha during pull.
761
        self._show_tag_conficts(to_file)
762
0.252.36 by Jelmer Vernooij
Fix pull.
763
    def _lookup_revno(self, revid):
0.200.1185 by Jelmer Vernooij
Some formatting fixes.
764
        return _quick_lookup_revno(self.target_branch, self.source_branch,
0.200.1513 by Jelmer Vernooij
Cope with zero shas.
765
            revid)
0.252.36 by Jelmer Vernooij
Fix pull.
766
767
    def _get_old_revno(self):
768
        if self._old_revno is not None:
769
            return self._old_revno
770
        return self._lookup_revno(self.old_revid)
771
772
    def _set_old_revno(self, revno):
773
        self._old_revno = revno
774
775
    old_revno = property(_get_old_revno, _set_old_revno)
776
777
    def _get_new_revno(self):
778
        if self._new_revno is not None:
779
            return self._new_revno
780
        return self._lookup_revno(self.new_revid)
781
782
    def _set_new_revno(self, revno):
783
        self._new_revno = revno
0.200.956 by Jelmer Vernooij
Add some more format tests.
784
0.252.36 by Jelmer Vernooij
Fix pull.
785
    new_revno = property(_get_new_revno, _set_new_revno)
786
0.200.342 by Jelmer Vernooij
Report git sha during pull.
787
0.200.504 by Jelmer Vernooij
Lazily find revno's for git branches.
788
class GitBranchPushResult(branch.BranchPushResult):
789
790
    def _lookup_revno(self, revid):
0.200.1185 by Jelmer Vernooij
Some formatting fixes.
791
        return _quick_lookup_revno(self.source_branch, self.target_branch,
792
            revid)
0.200.504 by Jelmer Vernooij
Lazily find revno's for git branches.
793
794
    @property
795
    def old_revno(self):
796
        return self._lookup_revno(self.old_revid)
797
798
    @property
799
    def new_revno(self):
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
800
        new_original_revno = getattr(self, "new_original_revno", None)
801
        if new_original_revno:
802
            return new_original_revno
803
        if getattr(self, "new_original_revid", None) is not None:
804
            return self._lookup_revno(self.new_original_revid)
0.200.504 by Jelmer Vernooij
Lazily find revno's for git branches.
805
        return self._lookup_revno(self.new_revid)
806
807
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
808
class InterFromGitBranch(branch.GenericInterBranch):
0.200.261 by Jelmer Vernooij
More formatting fixes.
809
    """InterBranch implementation that pulls from Git into bzr."""
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
810
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
811
    @staticmethod
812
    def _get_branch_formats_to_test():
0.200.1100 by Jelmer Vernooij
Provide test combinations for InterBranch implementations.
813
        try:
814
            default_format = branch.format_registry.get_default()
815
        except AttributeError:
816
            default_format = branch.BranchFormat._default_format
0.295.4 by Jelmer Vernooij
Fix imports.
817
        from .remote import RemoteGitBranchFormat
0.200.1100 by Jelmer Vernooij
Provide test combinations for InterBranch implementations.
818
        return [
0.295.1 by Jelmer Vernooij
Split up branch formats.
819
            (RemoteGitBranchFormat(), default_format),
820
            (LocalGitBranchFormat(), default_format)]
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
821
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
822
    @classmethod
0.200.692 by Jelmer Vernooij
Refuse pulling into non-rich-root branches rather than erroring out with an AttributeError.
823
    def _get_interrepo(self, source, target):
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
824
        return _mod_repository.InterRepository.get(source.repository, target.repository)
0.200.692 by Jelmer Vernooij
Refuse pulling into non-rich-root branches rather than erroring out with an AttributeError.
825
826
    @classmethod
827
    def is_compatible(cls, source, target):
0.200.1222 by Jelmer Vernooij
Better checks in is_compatible methods.
828
        if not isinstance(source, GitBranch):
829
            return False
830
        if isinstance(target, GitBranch):
831
            # InterLocalGitRemoteGitBranch or InterToGitBranch should be used
832
            return False
833
        if getattr(cls._get_interrepo(source, target), "fetch_objects", None) is None:
834
            # fetch_objects is necessary for this to work
835
            return False
836
        return True
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
837
0.200.1305 by Jelmer Vernooij
Only actually fetch tags if "branch.fetch_tags" is set to true.
838
    def fetch(self, stop_revision=None, fetch_tags=None, limit=None):
0.200.1265 by Jelmer Vernooij
Support limit option to Branch.fetch.
839
        self.fetch_objects(stop_revision, fetch_tags=fetch_tags, limit=limit)
0.260.1 by Jelmer Vernooij
Fix fetch from remote during merge.
840
0.200.1265 by Jelmer Vernooij
Support limit option to Branch.fetch.
841
    def fetch_objects(self, stop_revision, fetch_tags, limit=None):
0.200.692 by Jelmer Vernooij
Refuse pulling into non-rich-root branches rather than erroring out with an AttributeError.
842
        interrepo = self._get_interrepo(self.source, self.target)
0.200.1305 by Jelmer Vernooij
Only actually fetch tags if "branch.fetch_tags" is set to true.
843
        if fetch_tags is None:
0.200.1584 by Jelmer Vernooij
Use config stacks in a few more places.
844
            c = self.source.get_config_stack()
845
            fetch_tags = c.get('branch.fetch_tags')
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
846
        def determine_wants(heads):
0.259.6 by Jelmer Vernooij
Fetch tags during pull.
847
            if stop_revision is None:
0.336.6 by Jelmer Vernooij
Fix pull tests.
848
                try:
0.200.917 by Jelmer Vernooij
Cope with implicit branches during pull.
849
                    head = heads[self.source.ref]
0.336.6 by Jelmer Vernooij
Fix pull tests.
850
                except KeyError:
851
                    self._last_revid = revision.NULL_REVISION
0.200.917 by Jelmer Vernooij
Cope with implicit branches during pull.
852
                else:
0.336.6 by Jelmer Vernooij
Fix pull tests.
853
                    self._last_revid = self.source.lookup_foreign_revision_id(head)
0.259.6 by Jelmer Vernooij
Fetch tags during pull.
854
            else:
855
                self._last_revid = stop_revision
856
            real = interrepo.get_determine_wants_revids(
0.260.1 by Jelmer Vernooij
Fix fetch from remote during merge.
857
                [self._last_revid], include_tags=fetch_tags)
0.259.6 by Jelmer Vernooij
Fetch tags during pull.
858
            return real(heads)
0.200.1002 by Jelmer Vernooij
Fix regression in git-import.
859
        pack_hint, head, refs = interrepo.fetch_objects(
0.200.1265 by Jelmer Vernooij
Support limit option to Branch.fetch.
860
            determine_wants, self.source.mapping, limit=limit)
0.252.45 by Jelmer Vernooij
Finish fetching roundtripped revisions back into bzr.
861
        if (pack_hint is not None and
862
            self.target.repository._format.pack_compresses):
0.248.5 by Jelmer Vernooij
Reformatting, fix dpush.
863
            self.target.repository.pack(hint=pack_hint)
0.260.1 by Jelmer Vernooij
Fix fetch from remote during merge.
864
        return head, refs
865
0.200.1219 by Jelmer Vernooij
Remove InterBranch.update_revisions.
866
    def _update_revisions(self, stop_revision=None, overwrite=False):
0.200.1305 by Jelmer Vernooij
Only actually fetch tags if "branch.fetch_tags" is set to true.
867
        head, refs = self.fetch_objects(stop_revision, fetch_tags=None)
0.200.313 by Jelmer Vernooij
Support overwrite parameter.
868
        if overwrite:
0.200.314 by Jelmer Vernooij
Support stop_revision.
869
            prev_last_revid = None
0.200.313 by Jelmer Vernooij
Support overwrite parameter.
870
        else:
0.200.314 by Jelmer Vernooij
Support stop_revision.
871
            prev_last_revid = self.target.last_revision()
0.248.5 by Jelmer Vernooij
Reformatting, fix dpush.
872
        self.target.generate_revision_history(self._last_revid,
0.296.2 by Jelmer Vernooij
Handle DivergedBranches.
873
            last_rev=prev_last_revid, other_branch=self.source)
0.200.1062 by Jelmer Vernooij
Pass remote refs along in _update_revisions.
874
        return head, refs
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
875
0.200.1423 by Jelmer Vernooij
Fix space.
876
    def _basic_pull(self, stop_revision, overwrite, run_hooks,
0.200.1414 by Jelmer Vernooij
Fix pulling into bound branches.
877
              _override_hook_target, _hook_master):
0.343.1 by Jelmer Vernooij
Support overwrite flag properly, remove DictTagDict.
878
        if overwrite is True:
879
            overwrite = set(["history", "tags"])
880
        else:
881
            overwrite = set()
0.200.342 by Jelmer Vernooij
Report git sha during pull.
882
        result = GitBranchPullResult()
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
883
        result.source_branch = self.source
884
        if _override_hook_target is None:
885
            result.target_branch = self.target
886
        else:
887
            result.target_branch = _override_hook_target
0.200.1670 by Jelmer Vernooij
Fix compatibility with newer versions of bzr.
888
        with self.target.lock_write(), self.source.lock_read():
889
            # We assume that during 'pull' the target repository is closer than
890
            # the source one.
891
            (result.old_revno, result.old_revid) = \
892
                self.target.last_revision_info()
893
            result.new_git_head, remote_refs = self._update_revisions(
0.343.1 by Jelmer Vernooij
Support overwrite flag properly, remove DictTagDict.
894
                stop_revision, overwrite=("history" in overwrite))
0.200.1670 by Jelmer Vernooij
Fix compatibility with newer versions of bzr.
895
            tags_ret  = self.source.tags.merge_to(
0.343.1 by Jelmer Vernooij
Support overwrite flag properly, remove DictTagDict.
896
                    self.target.tags, ("tags" in overwrite), ignore_master=True)
0.200.1670 by Jelmer Vernooij
Fix compatibility with newer versions of bzr.
897
            if isinstance(tags_ret, tuple):
898
                result.tag_updates, result.tag_conflicts = tags_ret
899
            else:
900
                result.tag_conflicts = tags_ret
901
            (result.new_revno, result.new_revid) = \
902
                self.target.last_revision_info()
903
            if _hook_master:
904
                result.master_branch = _hook_master
905
                result.local_branch = result.target_branch
906
            else:
907
                result.master_branch = result.target_branch
908
                result.local_branch = None
909
            if run_hooks:
910
                for hook in branch.Branch.hooks['post_pull']:
911
                    hook(result)
912
            return result
0.200.1414 by Jelmer Vernooij
Fix pulling into bound branches.
913
914
    def pull(self, overwrite=False, stop_revision=None,
915
             possible_transports=None, _hook_master=None, run_hooks=True,
916
             _override_hook_target=None, local=False):
917
        """See Branch.pull.
918
919
        :param _hook_master: Private parameter - set the branch to
920
            be supplied as the master to pull hooks.
921
        :param run_hooks: Private parameter - if false, this branch
922
            is being called because it's the master of the primary branch,
923
            so it should not run its hooks.
924
        :param _override_hook_target: Private parameter - set the branch to be
925
            supplied as the target_branch to pull hooks.
926
        """
927
        # This type of branch can't be bound.
928
        bound_location = self.target.get_bound_location()
929
        if local and not bound_location:
930
            raise errors.LocalRequiresBoundBranch()
931
        master_branch = None
932
        source_is_master = False
933
        self.source.lock_read()
934
        if bound_location:
935
            # bound_location comes from a config file, some care has to be
936
            # taken to relate it to source.user_url
937
            normalized = urlutils.normalize_url(bound_location)
938
            try:
939
                relpath = self.source.user_transport.relpath(normalized)
940
                source_is_master = (relpath == '')
0.200.1660 by Jelmer Vernooij
Fix imports.
941
            except (errors.PathNotChild, urlutils.InvalidURL):
0.200.1414 by Jelmer Vernooij
Fix pulling into bound branches.
942
                source_is_master = False
943
        if not local and bound_location and not source_is_master:
944
            # not pulling from master, so we need to update master.
945
            master_branch = self.target.get_master_branch(possible_transports)
946
            master_branch.lock_write()
947
        try:
948
            try:
949
                if master_branch:
950
                    # pull from source into master.
951
                    master_branch.pull(self.source, overwrite, stop_revision,
952
                        run_hooks=False)
953
                result = self._basic_pull(stop_revision, overwrite, run_hooks,
954
                    _override_hook_target, _hook_master=master_branch)
955
            finally:
956
                self.source.unlock()
957
        finally:
958
            if master_branch:
959
                master_branch.unlock()
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
960
        return result
961
0.331.1 by Jelmer Vernooij
Fix some tags tests.
962
    def _basic_push(self, overwrite, stop_revision):
963
        if overwrite is True:
964
            overwrite = set(["history", "tags"])
965
        else:
966
            overwrite = set()
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
967
        result = branch.BranchPushResult()
968
        result.source_branch = self.source
969
        result.target_branch = self.target
970
        result.old_revno, result.old_revid = self.target.last_revision_info()
0.200.1219 by Jelmer Vernooij
Remove InterBranch.update_revisions.
971
        result.new_git_head, remote_refs = self._update_revisions(
0.331.1 by Jelmer Vernooij
Fix some tags tests.
972
            stop_revision, overwrite=("history" in overwrite))
0.200.1402 by Jelmer Vernooij
Cope with tag changes in bzr.
973
        tags_ret = self.source.tags.merge_to(self.target.tags,
0.331.1 by Jelmer Vernooij
Fix some tags tests.
974
            "tags" in overwrite, ignore_master=True)
975
        (result.tag_updates, result.tag_conflicts) = tags_ret
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
976
        result.new_revno, result.new_revid = self.target.last_revision_info()
977
        return result
978
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
979
0.200.512 by Jelmer Vernooij
Support pushing git->git.
980
class InterGitBranch(branch.GenericInterBranch):
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
981
    """InterBranch implementation that pulls between Git branches."""
982
0.200.1493 by Jelmer Vernooij
Test fixes.
983
    def fetch(self, stop_revision=None, fetch_tags=None, limit=None):
984
        raise NotImplementedError(self.fetch)
985
0.200.512 by Jelmer Vernooij
Support pushing git->git.
986
0.200.1176 by Jelmer Vernooij
Fix fetch return value for inter git fetching.
987
class InterLocalGitRemoteGitBranch(InterGitBranch):
0.200.512 by Jelmer Vernooij
Support pushing git->git.
988
    """InterBranch that copies from a local to a remote git branch."""
989
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
990
    @staticmethod
991
    def _get_branch_formats_to_test():
0.295.4 by Jelmer Vernooij
Fix imports.
992
        from .remote import RemoteGitBranchFormat
0.295.3 by Jelmer Vernooij
Fix some more tests.
993
        return [
994
            (LocalGitBranchFormat(), RemoteGitBranchFormat())]
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
995
0.200.512 by Jelmer Vernooij
Support pushing git->git.
996
    @classmethod
997
    def is_compatible(self, source, target):
0.200.1644 by Jelmer Vernooij
More relative imports.
998
        from .remote import RemoteGitBranch
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
999
        return (isinstance(source, LocalGitBranch) and
0.200.512 by Jelmer Vernooij
Support pushing git->git.
1000
                isinstance(target, RemoteGitBranch))
1001
0.331.1 by Jelmer Vernooij
Fix some tags tests.
1002
    def _basic_push(self, overwrite, stop_revision):
0.200.512 by Jelmer Vernooij
Support pushing git->git.
1003
        result = GitBranchPushResult()
1004
        result.source_branch = self.source
1005
        result.target_branch = self.target
1006
        if stop_revision is None:
1007
            stop_revision = self.source.last_revision()
1008
        def get_changed_refs(old_refs):
0.404.5 by Jelmer Vernooij
Check for diverged branches during push.
1009
            old_ref = old_refs.get(self.target.ref, None)
1010
            if old_ref is None:
1011
                result.old_revid = revision.NULL_REVISION
1012
            else:
1013
                result.old_revid = self.target.lookup_foreign_revision_id(old_ref)
1014
            new_ref = self.source.repository.lookup_bzr_revision_id(stop_revision)[0]
1015
            if not overwrite:
1016
                if remote_divergence(old_ref, new_ref, self.source.repository._git.object_store):
1017
                    raise errors.DivergedBranches(self.source, self.target)
1018
            refs = { self.target.ref: new_ref }
0.200.512 by Jelmer Vernooij
Support pushing git->git.
1019
            result.new_revid = stop_revision
7018.3.8 by Jelmer Vernooij
Disable some flaky tests on python3, allow running without fastimport.
1020
            for name, sha in viewitems(self.source.repository._git.refs.as_dict(b"refs/tags")):
0.200.875 by Jelmer Vernooij
Use new tag_name_to_ref function.
1021
                refs[tag_name_to_ref(name)] = sha
0.200.512 by Jelmer Vernooij
Support pushing git->git.
1022
            return refs
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
1023
        self.target.repository.send_pack(get_changed_refs,
0.375.1 by Jelmer Vernooij
Fix remote tests, warn when fetching git->bzr and bzr->git.
1024
            self.source.repository._git.object_store.generate_pack_data)
0.200.512 by Jelmer Vernooij
Support pushing git->git.
1025
        return result
1026
1027
0.200.1176 by Jelmer Vernooij
Fix fetch return value for inter git fetching.
1028
class InterGitLocalGitBranch(InterGitBranch):
0.200.512 by Jelmer Vernooij
Support pushing git->git.
1029
    """InterBranch that copies from a remote to a local git branch."""
1030
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
1031
    @staticmethod
1032
    def _get_branch_formats_to_test():
0.295.4 by Jelmer Vernooij
Fix imports.
1033
        from .remote import RemoteGitBranchFormat
0.295.3 by Jelmer Vernooij
Fix some more tests.
1034
        return [
1035
            (RemoteGitBranchFormat(), LocalGitBranchFormat()),
1036
            (LocalGitBranchFormat(), LocalGitBranchFormat())]
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
1037
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
1038
    @classmethod
1039
    def is_compatible(self, source, target):
0.200.1176 by Jelmer Vernooij
Fix fetch return value for inter git fetching.
1040
        return (isinstance(source, GitBranch) and
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
1041
                isinstance(target, LocalGitBranch))
1042
0.200.1534 by Jelmer Vernooij
Implement fetch between git branches, encode nicks.
1043
    def fetch(self, stop_revision=None, fetch_tags=None, limit=None):
1044
        interrepo = _mod_repository.InterRepository.get(self.source.repository,
1045
            self.target.repository)
1046
        if stop_revision is None:
1047
            stop_revision = self.source.last_revision()
1048
        determine_wants = interrepo.get_determine_wants_revids(
1049
            [stop_revision], include_tags=fetch_tags)
1050
        interrepo.fetch_objects(determine_wants, limit=limit)
1051
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
1052
    def _basic_push(self, overwrite=False, stop_revision=None):
0.343.1 by Jelmer Vernooij
Support overwrite flag properly, remove DictTagDict.
1053
        if overwrite is True:
1054
            overwrite = set(["history", "tags"])
1055
        else:
1056
            overwrite = set()
0.200.1325 by Jelmer Vernooij
More test fixes.
1057
        result = GitBranchPushResult()
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
1058
        result.source_branch = self.source
1059
        result.target_branch = self.target
1060
        result.old_revid = self.target.last_revision()
1061
        refs, stop_revision = self.update_refs(stop_revision)
0.296.3 by Jelmer Vernooij
Update xfail.
1062
        self.target.generate_revision_history(stop_revision,
0.343.1 by Jelmer Vernooij
Support overwrite flag properly, remove DictTagDict.
1063
                (result.old_revid if ("history" not in overwrite) else None),
0.296.2 by Jelmer Vernooij
Handle DivergedBranches.
1064
                other_branch=self.source)
0.200.1402 by Jelmer Vernooij
Cope with tag changes in bzr.
1065
        tags_ret = self.source.tags.merge_to(self.target.tags,
0.346.1 by Jelmer Vernooij
Fix tag caching.
1066
            source_tag_refs=remote_refs_dict_to_tag_refs(refs),
0.343.1 by Jelmer Vernooij
Support overwrite flag properly, remove DictTagDict.
1067
            overwrite=("tags" in overwrite))
0.200.1402 by Jelmer Vernooij
Cope with tag changes in bzr.
1068
        if isinstance(tags_ret, tuple):
1069
            (result.tag_updates, result.tag_conflicts) = tags_ret
1070
        else:
1071
            result.tag_conflicts = tags_ret
0.200.505 by Jelmer Vernooij
Remove duplicate code.
1072
        result.new_revid = self.target.last_revision()
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
1073
        return result
1074
1075
    def update_refs(self, stop_revision=None):
0.296.1 by Jelmer Vernooij
Fix tag fetching.
1076
        interrepo = _mod_repository.InterRepository.get(
1077
                self.source.repository, self.target.repository)
1078
        c = self.source.get_config_stack()
1079
        fetch_tags = c.get('branch.fetch_tags')
1080
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
1081
        if stop_revision is None:
0.296.1 by Jelmer Vernooij
Fix tag fetching.
1082
            refs = interrepo.fetch(branches=["HEAD"], include_tags=fetch_tags)
0.336.5 by Jelmer Vernooij
Fix some tests.
1083
            try:
1084
                head = refs["HEAD"]
1085
            except KeyError:
1086
                stop_revision = revision.NULL_REVISION
1087
            else:
1088
                stop_revision = self.target.lookup_foreign_revision_id(head)
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
1089
        else:
0.296.1 by Jelmer Vernooij
Fix tag fetching.
1090
            refs = interrepo.fetch(revision_id=stop_revision, include_tags=fetch_tags)
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
1091
        return refs, stop_revision
1092
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
1093
    def pull(self, stop_revision=None, overwrite=False,
0.296.1 by Jelmer Vernooij
Fix tag fetching.
1094
             possible_transports=None, run_hooks=True, local=False):
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
1095
        # This type of branch can't be bound.
1096
        if local:
1097
            raise errors.LocalRequiresBoundBranch()
0.343.1 by Jelmer Vernooij
Support overwrite flag properly, remove DictTagDict.
1098
        if overwrite is True:
1099
            overwrite = set(["history", "tags"])
1100
        else:
1101
            overwrite = set()
1102
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
1103
        result = GitPullResult()
1104
        result.source_branch = self.source
1105
        result.target_branch = self.target
0.200.1670 by Jelmer Vernooij
Fix compatibility with newer versions of bzr.
1106
        with self.target.lock_write(), self.source.lock_read():
1107
            result.old_revid = self.target.last_revision()
1108
            refs, stop_revision = self.update_refs(stop_revision)
0.296.2 by Jelmer Vernooij
Handle DivergedBranches.
1109
            self.target.generate_revision_history(stop_revision,
0.343.1 by Jelmer Vernooij
Support overwrite flag properly, remove DictTagDict.
1110
                    (result.old_revid if ("history" not in overwrite) else None),
0.296.2 by Jelmer Vernooij
Handle DivergedBranches.
1111
                    other_branch=self.source)
0.200.1670 by Jelmer Vernooij
Fix compatibility with newer versions of bzr.
1112
            tags_ret = self.source.tags.merge_to(self.target.tags,
0.343.1 by Jelmer Vernooij
Support overwrite flag properly, remove DictTagDict.
1113
                overwrite=("tags" in overwrite),
0.346.1 by Jelmer Vernooij
Fix tag caching.
1114
                source_tag_refs=remote_refs_dict_to_tag_refs(refs))
0.200.1670 by Jelmer Vernooij
Fix compatibility with newer versions of bzr.
1115
            if isinstance(tags_ret, tuple):
1116
                (result.tag_updates, result.tag_conflicts) = tags_ret
1117
            else:
1118
                result.tag_conflicts = tags_ret
1119
            result.new_revid = self.target.last_revision()
1120
            result.local_branch = None
1121
            result.master_branch = result.target_branch
1122
            if run_hooks:
1123
                for hook in branch.Branch.hooks['post_pull']:
1124
                    hook(result)
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
1125
        return result
1126
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
1127
0.200.960 by Jelmer Vernooij
Use GenericInterBranch.
1128
class InterToGitBranch(branch.GenericInterBranch):
0.296.1 by Jelmer Vernooij
Fix tag fetching.
1129
    """InterBranch implementation that pulls from a non-bzr into a Git branch."""
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
1130
0.200.939 by Jelmer Vernooij
Use InterRepo directly.
1131
    def __init__(self, source, target):
1132
        super(InterToGitBranch, self).__init__(source, target)
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
1133
        self.interrepo = _mod_repository.InterRepository.get(source.repository,
0.200.939 by Jelmer Vernooij
Use InterRepo directly.
1134
                                           target.repository)
1135
0.200.631 by Jelmer Vernooij
Raise proper exception in Branch.get_stacked_on_url().
1136
    @staticmethod
1137
    def _get_branch_formats_to_test():
0.200.1100 by Jelmer Vernooij
Provide test combinations for InterBranch implementations.
1138
        try:
1139
            default_format = branch.format_registry.get_default()
1140
        except AttributeError:
1141
            default_format = branch.BranchFormat._default_format
0.295.4 by Jelmer Vernooij
Fix imports.
1142
        from .remote import RemoteGitBranchFormat
0.295.1 by Jelmer Vernooij
Split up branch formats.
1143
        return [
1144
            (default_format, LocalGitBranchFormat()),
1145
            (default_format, RemoteGitBranchFormat())]
0.200.631 by Jelmer Vernooij
Raise proper exception in Branch.get_stacked_on_url().
1146
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
1147
    @classmethod
1148
    def is_compatible(self, source, target):
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
1149
        return (not isinstance(source, GitBranch) and
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
1150
                isinstance(target, GitBranch))
1151
0.200.1363 by Jelmer Vernooij
Only fetch tags if requested in config.
1152
    def _get_new_refs(self, stop_revision=None, fetch_tags=None):
0.361.1 by Jelmer Vernooij
Don't use assert.
1153
        if not self.source.is_locked():
1154
            raise errors.ObjectNotLocked(self.source)
0.252.38 by Jelmer Vernooij
Minor cleanups.
1155
        if stop_revision is None:
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
1156
            (stop_revno, stop_revision) = self.source.last_revision_info()
0.263.1 by Jelmer Vernooij
Fix dpush for certain branches.
1157
        else:
1158
            stop_revno = self.source.revision_id_to_revno(stop_revision)
6973.13.2 by Jelmer Vernooij
Fix some more tests.
1159
        if not isinstance(stop_revision, bytes):
0.361.1 by Jelmer Vernooij
Don't use assert.
1160
            raise TypeError(stop_revision)
0.377.1 by Jelmer Vernooij
Fix some remote operations and add more tests.
1161
        main_ref = self.target.ref
0.200.969 by Jelmer Vernooij
Use tuples with bzr revid and git sha to avoid lookups.
1162
        refs = { main_ref: (None, stop_revision) }
0.200.1363 by Jelmer Vernooij
Only fetch tags if requested in config.
1163
        if fetch_tags is None:
0.200.1584 by Jelmer Vernooij
Use config stacks in a few more places.
1164
            c = self.source.get_config_stack()
1165
            fetch_tags = c.get('branch.fetch_tags')
7018.3.2 by Jelmer Vernooij
Fix some git tests.
1166
        for name, revid in viewitems(self.source.tags.get_tag_dict()):
0.200.1391 by Jelmer Vernooij
Warn on (and skip) invalid tags.
1167
            if self.source.repository.has_revision(revid):
1168
                ref = tag_name_to_ref(name)
1169
                if not check_ref_format(ref):
1170
                    warning("skipping tag with invalid characters %s (%s)",
1171
                        name, ref)
1172
                    continue
0.200.1398 by Jelmer Vernooij
Make GitSmartRemoteNotSupported derive from UnsupportedOperation.
1173
                if fetch_tags:
1174
                    # FIXME: Skip tags that are not in the ancestry
0.200.1391 by Jelmer Vernooij
Warn on (and skip) invalid tags.
1175
                    refs[ref] = (None, revid)
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
1176
        return refs, main_ref, (stop_revno, stop_revision)
0.252.37 by Jelmer Vernooij
Factor out some common code for finding refs to send.
1177
0.200.1392 by Jelmer Vernooij
Preserve existing refs.
1178
    def _update_refs(self, result, old_refs, new_refs, overwrite):
1179
        mutter("updating refs. old refs: %r, new refs: %r",
1180
               old_refs, new_refs)
1181
        result.tag_updates = {}
1182
        result.tag_conflicts = []
1183
        ret = dict(old_refs)
1184
        def ref_equals(refs, ref, git_sha, revid):
1185
            try:
1186
                value = refs[ref]
1187
            except KeyError:
1188
                return False
1189
            if (value[0] is not None and
1190
                git_sha is not None and
0.200.1479 by Jelmer Vernooij
Simplify branch ref handling.
1191
                value[0] == git_sha):
1192
                return True
0.200.1392 by Jelmer Vernooij
Preserve existing refs.
1193
            if (value[1] is not None and
1194
                revid is not None and
0.200.1479 by Jelmer Vernooij
Simplify branch ref handling.
1195
                value[1] == revid):
1196
                return True
0.200.1392 by Jelmer Vernooij
Preserve existing refs.
1197
            # FIXME: If one side only has the git sha available and the other only
1198
            # has the bzr revid, then this will cause us to show a tag as updated
0.200.1636 by Jelmer Vernooij
Some formatting fixes.
1199
            # that hasn't actually been updated.
0.200.1479 by Jelmer Vernooij
Simplify branch ref handling.
1200
            return False
0.200.1474 by Jelmer Vernooij
Cope with refs when pushing.
1201
        # FIXME: Check for diverged branches
7018.3.8 by Jelmer Vernooij
Disable some flaky tests on python3, allow running without fastimport.
1202
        for ref, (git_sha, revid) in viewitems(new_refs):
0.200.1479 by Jelmer Vernooij
Simplify branch ref handling.
1203
            if ref_equals(ret, ref, git_sha, revid):
1204
                # Already up to date
1205
                if git_sha is None:
1206
                    git_sha = old_refs[ref][0]
1207
                if revid is None:
1208
                    revid = old_refs[ref][1]
1209
                ret[ref] = new_refs[ref] = (git_sha, revid)
1210
            elif ref not in ret or overwrite:
1211
                try:
1212
                    tag_name = ref_to_tag_name(ref)
1213
                except ValueError:
1214
                    pass
1215
                else:
1216
                    result.tag_updates[tag_name] = revid
0.200.1392 by Jelmer Vernooij
Preserve existing refs.
1217
                ret[ref] = (git_sha, revid)
1218
            else:
0.200.1474 by Jelmer Vernooij
Cope with refs when pushing.
1219
                # FIXME: Check diverged
1220
                diverged = False
1221
                if diverged:
1222
                    try:
1223
                        name = ref_to_tag_name(ref)
1224
                    except ValueError:
1225
                        pass
1226
                    else:
1227
                        result.tag_conflicts.append((name, revid, ret[name][1]))
0.200.1392 by Jelmer Vernooij
Preserve existing refs.
1228
                else:
0.200.1474 by Jelmer Vernooij
Cope with refs when pushing.
1229
                    ret[ref] = (git_sha, revid)
0.200.1392 by Jelmer Vernooij
Preserve existing refs.
1230
        return ret
1231
0.200.1493 by Jelmer Vernooij
Test fixes.
1232
    def fetch(self, stop_revision=None, fetch_tags=None, lossy=False, limit=None):
1233
        if stop_revision is None:
1234
            stop_revision = self.source.last_revision()
1235
        ret = []
1236
        if fetch_tags:
7018.3.2 by Jelmer Vernooij
Fix some git tests.
1237
            for k, v in viewitems(self.source.tags.get_tag_dict()):
0.200.1493 by Jelmer Vernooij
Test fixes.
1238
                ret.append((None, v))
1239
        ret.append((None, stop_revision))
0.320.5 by Jelmer Vernooij
Always raise NoRoundtrippingSupport rather than NoPushSupport.
1240
        try:
1241
            self.interrepo.fetch_objects(ret, lossy=lossy, limit=limit)
1242
        except NoPushSupport:
1243
            raise errors.NoRoundtrippingSupport(self.source, self.target)
0.200.1493 by Jelmer Vernooij
Test fixes.
1244
0.252.36 by Jelmer Vernooij
Fix pull.
1245
    def pull(self, overwrite=False, stop_revision=None, local=False,
0.200.1131 by Jelmer Vernooij
Accept run_hooks argument to InterToGitBranch.pull().
1246
             possible_transports=None, run_hooks=True):
0.252.36 by Jelmer Vernooij
Fix pull.
1247
        result = GitBranchPullResult()
1248
        result.source_branch = self.source
1249
        result.target_branch = self.target
0.200.1788 by Jelmer Vernooij
Use context managers.
1250
        with self.source.lock_read(), self.target.lock_write():
1251
            new_refs, main_ref, stop_revinfo = self._get_new_refs(
1252
                stop_revision)
1253
            def update_refs(old_refs):
1254
                return self._update_refs(result, old_refs, new_refs, overwrite)
0.200.1353 by Jelmer Vernooij
Run various hooks.
1255
            try:
0.200.1788 by Jelmer Vernooij
Use context managers.
1256
                result.revidmap, old_refs, new_refs = self.interrepo.fetch_refs(
1257
                    update_refs, lossy=False)
1258
            except NoPushSupport:
1259
                raise errors.NoRoundtrippingSupport(self.source, self.target)
1260
            (old_sha1, result.old_revid) = old_refs.get(main_ref, (ZERO_SHA, NULL_REVISION))
1261
            if result.old_revid is None:
1262
                result.old_revid = self.target.lookup_foreign_revision_id(old_sha1)
1263
            result.new_revid = new_refs[main_ref][1]
1264
            result.local_branch = None
1265
            result.master_branch = self.target
1266
            if run_hooks:
1267
                for hook in branch.Branch.hooks['post_pull']:
1268
                    hook(result)
0.252.36 by Jelmer Vernooij
Fix pull.
1269
        return result
1270
0.200.1260 by Jelmer Vernooij
Cope with new lossy argument.
1271
    def push(self, overwrite=False, stop_revision=None, lossy=False,
0.200.472 by Jelmer Vernooij
Fix printing error when user attempts to push into git.
1272
             _override_hook_source_branch=None):
0.252.5 by Jelmer Vernooij
enable 'bzr push'.
1273
        result = GitBranchPushResult()
1274
        result.source_branch = self.source
1275
        result.target_branch = self.target
0.200.1356 by Jelmer Vernooij
Fix result properties for hook.
1276
        result.local_branch = None
1277
        result.master_branch = result.target_branch
0.331.1 by Jelmer Vernooij
Fix some tags tests.
1278
        with self.source.lock_read(), self.target.lock_write():
0.200.1391 by Jelmer Vernooij
Warn on (and skip) invalid tags.
1279
            new_refs, main_ref, stop_revinfo = self._get_new_refs(stop_revision)
1280
            def update_refs(old_refs):
0.200.1392 by Jelmer Vernooij
Preserve existing refs.
1281
                return self._update_refs(result, old_refs, new_refs, overwrite)
0.200.1391 by Jelmer Vernooij
Warn on (and skip) invalid tags.
1282
            try:
1283
                result.revidmap, old_refs, new_refs = self.interrepo.fetch_refs(
0.404.5 by Jelmer Vernooij
Check for diverged branches during push.
1284
                    update_refs, lossy=lossy, overwrite=overwrite)
0.200.1391 by Jelmer Vernooij
Warn on (and skip) invalid tags.
1285
            except NoPushSupport:
1286
                raise errors.NoRoundtrippingSupport(self.source, self.target)
1287
            (old_sha1, result.old_revid) = old_refs.get(main_ref, (ZERO_SHA, NULL_REVISION))
1288
            if result.old_revid is None:
1289
                result.old_revid = self.target.lookup_foreign_revision_id(old_sha1)
1290
            result.new_revid = new_refs[main_ref][1]
1291
            (result.new_original_revno, result.new_original_revid) = stop_revinfo
1292
            for hook in branch.Branch.hooks['post_push']:
1293
                hook(result)
0.252.5 by Jelmer Vernooij
enable 'bzr push'.
1294
        return result
0.200.472 by Jelmer Vernooij
Fix printing error when user attempts to push into git.
1295
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
1296
0.200.1176 by Jelmer Vernooij
Fix fetch return value for inter git fetching.
1297
branch.InterBranch.register_optimiser(InterGitLocalGitBranch)
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
1298
branch.InterBranch.register_optimiser(InterFromGitBranch)
1299
branch.InterBranch.register_optimiser(InterToGitBranch)
0.200.1176 by Jelmer Vernooij
Fix fetch return value for inter git fetching.
1300
branch.InterBranch.register_optimiser(InterLocalGitRemoteGitBranch)