/brz/remove-bazaar

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