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