/brz/remove-bazaar

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