/brz/remove-bazaar

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