/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
1
# Copyright (C) 2007 Canonical Ltd
0.200.910 by Jelmer Vernooij
update copyright years
2
# Copyright (C) 2009-2010 Jelmer Vernooij <jelmer@samba.org>
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
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
18
"""An adapter between a Git Branch and a Bazaar Branch"""
19
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
20
from collections import defaultdict
21
0.200.261 by Jelmer Vernooij
More formatting fixes.
22
from dulwich.objects import (
23
    Commit,
24
    Tag,
0.200.1153 by Jelmer Vernooij
Import ZERO_SHA from dulwich.objects.
25
    ZERO_SHA,
0.200.261 by Jelmer Vernooij
More formatting fixes.
26
    )
27
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
28
from bzrlib import (
29
    branch,
0.200.513 by Jelmer Vernooij
Fix imports.
30
    bzrdir,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
31
    config,
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
32
    errors,
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
33
    repository as _mod_repository,
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
34
    revision,
0.200.82 by Jelmer Vernooij
Support listing tags.
35
    tag,
0.230.1 by Jelmer Vernooij
Support lightweight checkouts.
36
    transport,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
37
    )
0.200.261 by Jelmer Vernooij
More formatting fixes.
38
from bzrlib.decorators import (
39
    needs_read_lock,
40
    )
0.200.969 by Jelmer Vernooij
Use tuples with bzr revid and git sha to avoid lookups.
41
from bzrlib.revision import (
42
    NULL_REVISION,
43
    )
0.200.261 by Jelmer Vernooij
More formatting fixes.
44
from bzrlib.trace import (
0.200.342 by Jelmer Vernooij
Report git sha during pull.
45
    is_quiet,
0.200.261 by Jelmer Vernooij
More formatting fixes.
46
    mutter,
47
    )
48
0.200.386 by Jelmer Vernooij
Move config to a separate file, support BranchConfig.username().
49
from bzrlib.plugins.git.config import (
50
    GitBranchConfig,
51
    )
0.200.278 by Jelmer Vernooij
Update branch head appropriately during dpull.
52
from bzrlib.plugins.git.errors import (
0.200.472 by Jelmer Vernooij
Fix printing error when user attempts to push into git.
53
    NoPushSupport,
0.200.278 by Jelmer Vernooij
Update branch head appropriately during dpull.
54
    NoSuchRef,
55
    )
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
56
from bzrlib.plugins.git.refs import (
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
57
    branch_name_to_ref,
0.200.1061 by Jelmer Vernooij
Add support for using unpeel map.
58
    extract_tags,
59
    is_tag,
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
60
    ref_to_branch_name,
0.200.1061 by Jelmer Vernooij
Add support for using unpeel map.
61
    ref_to_tag_name,
0.200.875 by Jelmer Vernooij
Use new tag_name_to_ref function.
62
    tag_name_to_ref,
0.200.1292 by Jelmer Vernooij
Fix repeeling objects when determining what to send.
63
    )
64
from bzrlib.plugins.git.unpeel_map import (
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
65
    UnpeelMap,
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
66
    )
0.200.261 by Jelmer Vernooij
More formatting fixes.
67
0.238.5 by Jelmer Vernooij
Remove old backwards compatibility code.
68
from bzrlib.foreign import ForeignBranch
0.200.388 by Jelmer Vernooij
Support bzr 1.14 as well.
69
0.200.261 by Jelmer Vernooij
More formatting fixes.
70
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
71
class GitPullResult(branch.PullResult):
0.200.956 by Jelmer Vernooij
Add some more format tests.
72
    """Result of a pull from a Git branch."""
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
73
74
    def _lookup_revno(self, revid):
75
        assert isinstance(revid, str), "was %r" % revid
76
        # Try in source branch first, it'll be faster
77
        return self.target_branch.revision_id_to_revno(revid)
78
79
    @property
80
    def old_revno(self):
81
        return self._lookup_revno(self.old_revid)
82
83
    @property
84
    def new_revno(self):
85
        return self._lookup_revno(self.new_revid)
86
87
0.200.1064 by Jelmer Vernooij
Use common base class for tags.
88
class GitTags(tag.BasicTags):
89
    """Ref-based tag dictionary."""
0.200.82 by Jelmer Vernooij
Support listing tags.
90
0.200.89 by Jelmer Vernooij
Support sprouting branches.
91
    def __init__(self, branch):
92
        self.branch = branch
93
        self.repository = branch.repository
0.200.82 by Jelmer Vernooij
Support listing tags.
94
0.200.1066 by Jelmer Vernooij
Add GitTags.get_refs.
95
    def get_refs(self):
96
        raise NotImplementedError(self.get_refs)
97
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
98
    def _iter_tag_refs(self, refs):
99
        raise NotImplementedError(self._iter_tag_refs)
100
101
    def _merge_to_git(self, to_tags, refs, overwrite=False):
102
        target_repo = to_tags.repository
103
        conflicts = []
104
        for k, v in refs.iteritems():
105
            if not is_tag(k):
106
                continue
0.200.1128 by Jelmer Vernooij
remove duplicate definition of _matchingbzrdir.
107
            if overwrite or not k in target_repo._git.refs:
108
                target_repo._git.refs[k] = v
109
            elif target_repo._git.refs[k] == v:
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
110
                pass
111
            else:
112
                conflicts.append((ref_to_tag_name(k), v, target_repo.refs[k]))
113
        return conflicts
114
115
    def _merge_to_non_git(self, to_tags, refs, overwrite=False):
116
        unpeeled_map = defaultdict(set)
117
        conflicts = []
118
        result = dict(to_tags.get_tag_dict())
119
        for n, peeled, unpeeled, bzr_revid in self._iter_tag_refs(refs):
120
            if unpeeled is not None:
121
                unpeeled_map[peeled].add(unpeeled)
122
            if n not in result or overwrite:
123
                result[n] = bzr_revid
124
            elif result[n] == bzr_revid:
125
                pass
126
            else:
127
                conflicts.append((n, result[n], bzr_revid))
128
        to_tags._set_tag_dict(result)
129
        if len(unpeeled_map) > 0:
130
            map_file = UnpeelMap.from_repository(to_tags.branch.repository)
131
            map_file.update(unpeeled_map)
132
            map_file.save_in_repository(to_tags.branch.repository)
133
        return conflicts
134
135
    def merge_to(self, to_tags, overwrite=False, ignore_master=False,
136
                 source_refs=None):
0.200.1113 by Jelmer Vernooij
Fix Tags.merge_to.
137
        """See Tags.merge_to."""
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
138
        if source_refs is None:
0.200.1066 by Jelmer Vernooij
Add GitTags.get_refs.
139
            source_refs = self.get_refs()
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
140
        if self == to_tags:
141
            return
142
        if isinstance(to_tags, GitTags):
143
            return self._merge_to_git(to_tags, source_refs,
144
                                      overwrite=overwrite)
145
        else:
146
            if ignore_master:
147
                master = None
148
            else:
149
                master = to_tags.branch.get_master_branch()
150
            conflicts = self._merge_to_non_git(to_tags, source_refs,
151
                                              overwrite=overwrite)
152
            if master is not None:
0.200.1113 by Jelmer Vernooij
Fix Tags.merge_to.
153
                conflicts += self.merge_to(master.tags, overwrite=overwrite,
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
154
                                           source_refs=source_refs,
155
                                           ignore_master=ignore_master)
156
            return conflicts
157
158
    def get_tag_dict(self):
159
        ret = {}
0.200.1066 by Jelmer Vernooij
Add GitTags.get_refs.
160
        refs = self.get_refs()
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
161
        for (name, peeled, unpeeled, bzr_revid) in self._iter_tag_refs(refs):
162
            ret[name] = bzr_revid
163
        return ret
164
0.200.1064 by Jelmer Vernooij
Use common base class for tags.
165
166
class LocalGitTagDict(GitTags):
167
    """Dictionary with tags in a local repository."""
168
169
    def __init__(self, branch):
170
        super(LocalGitTagDict, self).__init__(branch)
171
        self.refs = self.repository._git.refs
172
0.200.1066 by Jelmer Vernooij
Add GitTags.get_refs.
173
    def get_refs(self):
174
        return self.repository._git.get_refs()
175
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
176
    def _iter_tag_refs(self, refs):
177
        """Iterate over the tag refs.
178
179
        :param refs: Refs dictionary (name -> git sha1)
180
        :return: iterator over (name, peeled_sha1, unpeeled_sha1, bzr_revid)
181
        """
0.200.1060 by Jelmer Vernooij
Return unpeeled tags in extract_tags.
182
        for k, (peeled, unpeeled) in extract_tags(refs).iteritems():
0.200.609 by Jelmer Vernooij
Cope with tags pointing at nonexisting objects.
183
            try:
0.200.1060 by Jelmer Vernooij
Return unpeeled tags in extract_tags.
184
                obj = self.repository._git[peeled]
0.200.609 by Jelmer Vernooij
Cope with tags pointing at nonexisting objects.
185
            except KeyError:
0.200.1060 by Jelmer Vernooij
Return unpeeled tags in extract_tags.
186
                mutter("Tag %s points at unknown object %s, ignoring", peeled,
0.200.1320 by Jelmer Vernooij
Fix trace.
187
                       peeled)
0.200.609 by Jelmer Vernooij
Cope with tags pointing at nonexisting objects.
188
                continue
0.200.1060 by Jelmer Vernooij
Return unpeeled tags in extract_tags.
189
            # FIXME: this shouldn't really be necessary, the repository
190
            # already should have these unpeeled.
0.200.194 by Jelmer Vernooij
Look for commit object in heavyweight tags.
191
            while isinstance(obj, Tag):
0.200.1060 by Jelmer Vernooij
Return unpeeled tags in extract_tags.
192
                peeled = obj.object[1]
193
                obj = self.repository._git[peeled]
0.200.194 by Jelmer Vernooij
Look for commit object in heavyweight tags.
194
            if not isinstance(obj, Commit):
0.200.261 by Jelmer Vernooij
More formatting fixes.
195
                mutter("Tag %s points at object %r that is not a commit, "
196
                       "ignoring", k, obj)
0.200.194 by Jelmer Vernooij
Look for commit object in heavyweight tags.
197
                continue
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
198
            yield (k, peeled, unpeeled,
199
                   self.branch.lookup_foreign_revision_id(peeled))
200
0.200.711 by Jelmer Vernooij
Support merging tags to a local Git repository.
201
    def _set_tag_dict(self, to_dict):
0.200.1066 by Jelmer Vernooij
Add GitTags.get_refs.
202
        extra = set(self.get_refs().keys())
0.200.711 by Jelmer Vernooij
Support merging tags to a local Git repository.
203
        for k, revid in to_dict.iteritems():
0.200.875 by Jelmer Vernooij
Use new tag_name_to_ref function.
204
            name = tag_name_to_ref(k)
0.200.711 by Jelmer Vernooij
Support merging tags to a local Git repository.
205
            if name in extra:
206
                extra.remove(name)
207
            self.set_tag(k, revid)
208
        for name in extra:
0.200.1061 by Jelmer Vernooij
Add support for using unpeel map.
209
            if is_tag(name):
0.200.711 by Jelmer Vernooij
Support merging tags to a local Git repository.
210
                del self.repository._git[name]
0.200.956 by Jelmer Vernooij
Add some more format tests.
211
0.200.86 by Jelmer Vernooij
Clearer error when setting tags.
212
    def set_tag(self, name, revid):
0.200.1064 by Jelmer Vernooij
Use common base class for tags.
213
        self.refs[tag_name_to_ref(name)], _ = \
0.200.1030 by Jelmer Vernooij
More work on supporting roundtripping push.
214
            self.branch.lookup_bzr_revision_id(revid)
0.200.86 by Jelmer Vernooij
Clearer error when setting tags.
215
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
216
0.200.1078 by Jelmer Vernooij
Fix git-import from remote repositories.
217
class DictTagDict(tag.BasicTags):
0.239.1 by Jelmer Vernooij
Avoid re-connecting to fetch tags we already know.
218
219
    def __init__(self, branch, tags):
220
        super(DictTagDict, self).__init__(branch)
221
        self._tags = tags
222
223
    def get_tag_dict(self):
224
        return self._tags
225
226
0.200.1311 by Jelmer Vernooij
More work on colocated branch support.
227
class GitSymrefBranchFormat(branch.BranchFormat):
228
229
    def get_format_description(self):
230
        return 'Git Symbolic Reference Branch'
231
232
    def network_name(self):
233
        return "git"
234
235
    def get_reference(self, controldir, name=None):
236
        return controldir.get_branch_reference(name)
237
238
    def set_reference(self, controldir, name, target):
239
        return controldir.set_branch_reference(name, target)
240
241
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
242
class GitBranchFormat(branch.BranchFormat):
243
0.200.70 by Jelmer Vernooij
Implement GitBranchFormat.get_format_description.
244
    def get_format_description(self):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
245
        return 'Git Branch'
246
0.243.1 by Jelmer Vernooij
Use foreign branch testing infrastructure.
247
    def network_name(self):
248
        return "git"
249
0.200.82 by Jelmer Vernooij
Support listing tags.
250
    def supports_tags(self):
251
        return True
252
0.200.1105 by Jelmer Vernooij
Don't claim to support leaving locks.
253
    def supports_leaving_lock(self):
254
        return False
255
0.200.1091 by Jelmer Vernooij
Provide _matchingbzrdir for testing.
256
    @property
257
    def _matchingbzrdir(self):
0.200.1140 by Jelmer Vernooij
Update now that the control dir formats are no longer in __init__.
258
        from bzrlib.plugins.git.dir import LocalGitControlDirFormat
0.200.1091 by Jelmer Vernooij
Provide _matchingbzrdir for testing.
259
        return LocalGitControlDirFormat()
260
0.243.1 by Jelmer Vernooij
Use foreign branch testing infrastructure.
261
    def get_foreign_tests_branch_factory(self):
262
        from bzrlib.plugins.git.tests.test_branch import ForeignTestsBranchFactory
263
        return ForeignTestsBranchFactory()
264
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
265
    def make_tags(self, branch):
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
266
        if getattr(branch.repository, "get_refs", None) is not None:
267
            from bzrlib.plugins.git.remote import RemoteGitTagDict
268
            return RemoteGitTagDict(branch)
0.200.261 by Jelmer Vernooij
More formatting fixes.
269
        else:
270
            return LocalGitTagDict(branch)
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
271
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
272
    def initialize(self, a_bzrdir, name=None, repository=None):
273
        from bzrlib.plugins.git.dir import LocalGitDir
274
        if not isinstance(a_bzrdir, LocalGitDir):
275
            raise errors.IncompatibleFormat(self, a_bzrdir._format)
276
        if repository is None:
277
            repository = a_bzrdir.open_repository()
0.200.1102 by Jelmer Vernooij
Fix creating of colocated branches in git repositories.
278
        ref = branch_name_to_ref(name, "HEAD")
279
        repository._git[ref] = ZERO_SHA
280
        return LocalGitBranch(a_bzrdir, repository, ref, a_bzrdir._lockfiles)
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
281
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
282
0.200.911 by Jelmer Vernooij
Cope with locking changes in bzr.dev.
283
class GitReadLock(object):
284
285
    def __init__(self, unlock):
286
        self.unlock = unlock
287
288
289
class GitWriteLock(object):
290
291
    def __init__(self, unlock):
0.200.1175 by Jelmer Vernooij
Provide GitWriteLock.branch_token.
292
        self.branch_token = None
0.200.911 by Jelmer Vernooij
Cope with locking changes in bzr.dev.
293
        self.unlock = unlock
294
295
0.200.388 by Jelmer Vernooij
Support bzr 1.14 as well.
296
class GitBranch(ForeignBranch):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
297
    """An adapter to git repositories for bzr Branch objects."""
298
0.200.1129 by Jelmer Vernooij
Implement GitBranch.control_transport.
299
    @property
300
    def control_transport(self):
301
        return self.bzrdir.control_transport
302
0.200.770 by Jelmer Vernooij
Proper branch names.
303
    def __init__(self, bzrdir, repository, ref, lockfiles, tagsdict=None):
0.200.1287 by Jelmer Vernooij
Set Branch.base before invoking branch open hooks.
304
        self.base = bzrdir.root_transport.base
0.200.82 by Jelmer Vernooij
Support listing tags.
305
        self.repository = repository
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
306
        self._format = GitBranchFormat()
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
307
        self.control_files = lockfiles
0.200.59 by Jelmer Vernooij
Add more tests, fix revision history.
308
        self.bzrdir = bzrdir
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
309
        self._lock_mode = None
310
        self._lock_count = 0
0.231.1 by Jelmer Vernooij
Check that regenerated objects have the expected sha1.
311
        super(GitBranch, self).__init__(repository.get_mapping())
0.239.1 by Jelmer Vernooij
Avoid re-connecting to fetch tags we already know.
312
        if tagsdict is not None:
313
            self.tags = DictTagDict(self, tagsdict)
0.200.770 by Jelmer Vernooij
Proper branch names.
314
        self.ref = ref
315
        self.name = ref_to_branch_name(ref)
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
316
        self._head = None
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
317
0.239.8 by Jelmer Vernooij
Support checkouts.
318
    def _get_checkout_format(self):
319
        """Return the most suitable metadir for a checkout of this branch.
320
        Weaves are used if this branch's repository uses weaves.
321
        """
0.200.927 by Jelmer Vernooij
Remove explicit use of rich root formats.
322
        return bzrdir.format_registry.make_bzrdir("default")
0.239.8 by Jelmer Vernooij
Support checkouts.
323
0.238.3 by Jelmer Vernooij
Remove svn references, prefer git send format when submitting changes against a git branch.
324
    def get_child_submit_format(self):
325
        """Return the preferred format of submissions to this branch."""
326
        ret = self.get_config().get_user_option("child_submit_format")
327
        if ret is not None:
328
            return ret
329
        return "git"
330
0.200.293 by Jelmer Vernooij
Fix branch nicks.
331
    def _get_nick(self, local=False, possible_master_transports=None):
332
        """Find the nick name for this branch.
333
334
        :return: Branch nick
335
        """
0.200.920 by Jelmer Vernooij
Fix some more tests.
336
        return self.name or "HEAD"
0.200.293 by Jelmer Vernooij
Fix branch nicks.
337
0.200.331 by Jelmer Vernooij
Add stub for setting nick function.
338
    def _set_nick(self, nick):
339
        raise NotImplementedError
340
341
    nick = property(_get_nick, _set_nick)
0.200.293 by Jelmer Vernooij
Fix branch nicks.
342
0.200.412 by Jelmer Vernooij
Implement GitBranch.__repr__.
343
    def __repr__(self):
0.200.770 by Jelmer Vernooij
Proper branch names.
344
        return "<%s(%r, %r)>" % (self.__class__.__name__, self.repository.base,
0.200.1311 by Jelmer Vernooij
More work on colocated branch support.
345
            self.name)
0.200.412 by Jelmer Vernooij
Implement GitBranch.__repr__.
346
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
347
    def generate_revision_history(self, revid, old_revid=None):
0.200.1103 by Jelmer Vernooij
Support generate_revision_history(NULL_REVISION).
348
        if revid == NULL_REVISION:
349
            newhead = ZERO_SHA
350
        else:
351
            # FIXME: Check that old_revid is in the ancestry of revid
352
            newhead, self.mapping = self.mapping.revision_id_bzr_to_foreign(revid)
0.200.1218 by Jelmer Vernooij
Support set_last_revision('null:').
353
            if self.mapping is None:
354
                raise AssertionError
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
355
        self._set_head(newhead)
356
0.200.1199 by Jelmer Vernooij
Support 'token' argument to Branch.lock_write.
357
    def lock_write(self, token=None):
358
        if token is not None:
359
            raise errors.TokenLockingNotSupported(self)
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
360
        if self._lock_mode:
361
            assert self._lock_mode == 'w'
362
            self._lock_count += 1
363
        else:
364
            self._lock_mode = 'w'
365
            self._lock_count = 1
366
        self.repository.lock_write()
0.200.911 by Jelmer Vernooij
Cope with locking changes in bzr.dev.
367
        return GitWriteLock(self.unlock)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
368
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
369
    def get_stacked_on_url(self):
370
        # Git doesn't do stacking (yet...)
0.200.631 by Jelmer Vernooij
Raise proper exception in Branch.get_stacked_on_url().
371
        raise errors.UnstackableBranchFormat(self._format, self.base)
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
372
373
    def get_parent(self):
374
        """See Branch.get_parent()."""
0.200.312 by Jelmer Vernooij
Add notes about parent locations.
375
        # FIXME: Set "origin" url from .git/config ?
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
376
        return None
377
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
378
    def set_parent(self, url):
0.200.312 by Jelmer Vernooij
Add notes about parent locations.
379
        # FIXME: Set "origin" url in .git/config ?
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
380
        pass
381
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
382
    def lock_read(self):
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
383
        if self._lock_mode:
384
            assert self._lock_mode in ('r', 'w')
385
            self._lock_count += 1
386
        else:
387
            self._lock_mode = 'r'
388
            self._lock_count = 1
389
        self.repository.lock_read()
0.200.911 by Jelmer Vernooij
Cope with locking changes in bzr.dev.
390
        return GitReadLock(self.unlock)
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
391
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
392
    def peek_lock_mode(self):
393
        return self._lock_mode
394
0.200.432 by Jelmer Vernooij
Support Branch.is_locked, required for loggerhead.
395
    def is_locked(self):
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
396
        return (self._lock_mode is not None)
0.200.432 by Jelmer Vernooij
Support Branch.is_locked, required for loggerhead.
397
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
398
    def unlock(self):
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
399
        """See Branch.unlock()."""
400
        self._lock_count -= 1
401
        if self._lock_count == 0:
402
            self._lock_mode = None
403
            self._clear_cached_state()
404
        self.repository.unlock()
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
405
406
    def get_physical_lock_status(self):
407
        return False
408
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
409
    @needs_read_lock
410
    def last_revision(self):
411
        # perhaps should escape this ?
0.200.57 by Jelmer Vernooij
Fix more tests.
412
        if self.head is None:
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
413
            return revision.NULL_REVISION
0.252.44 by Jelmer Vernooij
Properly look up Bazaar revision ids for revision parents in case they are round-tripped.
414
        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.
415
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
416
    def _basic_push(self, target, overwrite=False, stop_revision=None):
417
        return branch.InterBranch.get(self, target)._basic_push(
418
            overwrite, stop_revision)
419
0.252.49 by Jelmer Vernooij
Avoid trying to set HEAD for remote branches.
420
    def lookup_foreign_revision_id(self, foreign_revid):
0.200.956 by Jelmer Vernooij
Add some more format tests.
421
        return self.repository.lookup_foreign_revision_id(foreign_revid,
0.252.49 by Jelmer Vernooij
Avoid trying to set HEAD for remote branches.
422
            self.mapping)
423
0.200.1030 by Jelmer Vernooij
More work on supporting roundtripping push.
424
    def lookup_bzr_revision_id(self, revid):
425
        return self.repository.lookup_bzr_revision_id(
426
            revid, mapping=self.mapping)
427
0.200.692 by Jelmer Vernooij
Refuse pulling into non-rich-root branches rather than erroring out with an AttributeError.
428
0.200.465 by Jelmer Vernooij
Use dulwich standard functionality for finding missing revisions.
429
class LocalGitBranch(GitBranch):
430
    """A local Git branch."""
431
0.200.1102 by Jelmer Vernooij
Fix creating of colocated branches in git repositories.
432
    def __init__(self, bzrdir, repository, ref, lockfiles, tagsdict=None):
433
        super(LocalGitBranch, self).__init__(bzrdir, repository, ref,
0.200.763 by Jelmer Vernooij
Provide proper colocated branch support.
434
              lockfiles, tagsdict)
0.200.918 by Jelmer Vernooij
Cope with 'self.ref is None' in a couple more places.
435
        refs = repository._git.get_refs()
0.200.1102 by Jelmer Vernooij
Fix creating of colocated branches in git repositories.
436
        if not (ref in refs.keys() or "HEAD" in refs.keys()):
0.200.763 by Jelmer Vernooij
Provide proper colocated branch support.
437
            raise errors.NotBranchError(self.base)
438
0.200.261 by Jelmer Vernooij
More formatting fixes.
439
    def create_checkout(self, to_location, revision_id=None, lightweight=False,
440
        accelerator_tree=None, hardlink=False):
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
441
        if lightweight:
0.230.1 by Jelmer Vernooij
Support lightweight checkouts.
442
            t = transport.get_transport(to_location)
443
            t.ensure_base()
444
            format = self._get_checkout_format()
445
            checkout = format.initialize_on_transport(t)
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
446
            from_branch = branch.BranchReferenceFormat().initialize(checkout,
0.230.1 by Jelmer Vernooij
Support lightweight checkouts.
447
                self)
448
            tree = checkout.create_workingtree(revision_id,
449
                from_branch=from_branch, hardlink=hardlink)
450
            return tree
451
        else:
452
            return self._create_heavyweight_checkout(to_location, revision_id,
0.257.1 by Jelmer Vernooij
use transport repo objects even for local access.
453
                hardlink)
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
454
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
455
    def _create_heavyweight_checkout(self, to_location, revision_id=None,
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
456
                                     hardlink=False):
457
        """Create a new heavyweight checkout of this branch.
458
459
        :param to_location: URL of location to create the new checkout in.
460
        :param revision_id: Revision that should be the tip of the checkout.
461
        :param hardlink: Whether to hardlink
462
        :return: WorkingTree object of checkout.
463
        """
0.200.513 by Jelmer Vernooij
Fix imports.
464
        checkout_branch = bzrdir.BzrDir.create_branch_convenience(
0.200.927 by Jelmer Vernooij
Remove explicit use of rich root formats.
465
            to_location, force_new_tree=False)
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
466
        checkout = checkout_branch.bzrdir
467
        checkout_branch.bind(self)
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
468
        # pull up to the specified revision_id to set the initial
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
469
        # branch tip correctly, and seed it with history.
470
        checkout_branch.pull(self, stop_revision=revision_id)
471
        return checkout.create_workingtree(revision_id, hardlink=hardlink)
472
0.200.57 by Jelmer Vernooij
Fix more tests.
473
    def _gen_revision_history(self):
0.200.58 by Jelmer Vernooij
Fix remaining tests.
474
        if self.head is None:
475
            return []
0.200.1279 by Jelmer Vernooij
Avoid using deprecated Repository.iter_reverse_revision_history.
476
        graph = self.repository.get_graph()
477
        ret = list(graph.iter_lefthand_ancestry(self.last_revision(),
478
            (revision.NULL_REVISION, )))
0.200.59 by Jelmer Vernooij
Add more tests, fix revision history.
479
        ret.reverse()
0.200.57 by Jelmer Vernooij
Fix more tests.
480
        return ret
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
481
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
482
    def _get_head(self):
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
483
        try:
0.200.918 by Jelmer Vernooij
Cope with 'self.ref is None' in a couple more places.
484
            return self.repository._git.ref(self.ref or "HEAD")
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
485
        except KeyError:
486
            return None
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
487
0.200.1228 by Jelmer Vernooij
Provide Branch._read_last_revision_info.
488
    def _read_last_revision_info(self):
489
        last_revid = self.last_revision()
490
        graph = self.repository.get_graph()
491
        revno = graph.find_distance_to_null(last_revid,
492
            [(revision.NULL_REVISION, 0)])
493
        return revno, last_revid
494
495
    def set_last_revision_info(self, revno, revision_id):
496
        self.set_last_revision(revision_id)
497
        self._last_revision_info_cache = revno, revision_id
0.200.507 by Jelmer Vernooij
Implement set_last_revision{_info,}.
498
499
    def set_last_revision(self, revid):
0.200.1233 by Jelmer Vernooij
Implement Repository.iter_files_bytes.
500
        if not revid or not isinstance(revid, basestring):
501
            raise errors.InvalidRevisionId(revision_id=revid, branch=self)
0.200.1218 by Jelmer Vernooij
Support set_last_revision('null:').
502
        if revid == NULL_REVISION:
503
            newhead = ZERO_SHA
504
        else:
505
            (newhead, self.mapping) = self.repository.lookup_bzr_revision_id(revid)
506
            if self.mapping is None:
507
                raise AssertionError
508
        self._set_head(newhead)
0.200.507 by Jelmer Vernooij
Implement set_last_revision{_info,}.
509
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
510
    def _set_head(self, value):
511
        self._head = value
0.200.918 by Jelmer Vernooij
Cope with 'self.ref is None' in a couple more places.
512
        self.repository._git.refs[self.ref or "HEAD"] = self._head
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
513
        self._clear_cached_state()
514
515
    head = property(_get_head, _set_head)
516
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
517
    def get_config(self):
518
        return GitBranchConfig(self)
519
520
    def get_push_location(self):
521
        """See Branch.get_push_location."""
522
        push_loc = self.get_config().get_user_option('push_location')
523
        return push_loc
524
525
    def set_push_location(self, location):
526
        """See Branch.set_push_location."""
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
527
        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.
528
                                          store=config.STORE_LOCATION)
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
529
530
    def supports_tags(self):
0.200.82 by Jelmer Vernooij
Support listing tags.
531
        return True
0.200.956 by Jelmer Vernooij
Add some more format tests.
532
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
533
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
534
def _quick_lookup_revno(local_branch, remote_branch, revid):
535
    assert isinstance(revid, str), "was %r" % revid
536
    # Try in source branch first, it'll be faster
537
    try:
538
        return local_branch.revision_id_to_revno(revid)
539
    except errors.NoSuchRevision:
540
        graph = local_branch.repository.get_graph()
541
        try:
0.200.1323 by Jelmer Vernooij
Simplify push handling.
542
            return graph.find_distance_to_null(revid, [])
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
543
        except errors.GhostRevisionsHaveNoRevno:
544
            # FIXME: Check using graph.find_distance_to_null() ?
545
            return remote_branch.revision_id_to_revno(revid)
546
547
0.200.342 by Jelmer Vernooij
Report git sha during pull.
548
class GitBranchPullResult(branch.PullResult):
549
0.252.36 by Jelmer Vernooij
Fix pull.
550
    def __init__(self):
551
        super(GitBranchPullResult, self).__init__()
552
        self.new_git_head = None
553
        self._old_revno = None
554
        self._new_revno = None
555
0.200.342 by Jelmer Vernooij
Report git sha during pull.
556
    def report(self, to_file):
557
        if not is_quiet():
558
            if self.old_revid == self.new_revid:
559
                to_file.write('No revisions to pull.\n')
0.200.728 by Jelmer Vernooij
Fix pulling when all revisions are already in the repo.
560
            elif self.new_git_head is not None:
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
561
                to_file.write('Now on revision %d (git sha: %s).\n' %
0.200.342 by Jelmer Vernooij
Report git sha during pull.
562
                        (self.new_revno, self.new_git_head))
0.200.728 by Jelmer Vernooij
Fix pulling when all revisions are already in the repo.
563
            else:
564
                to_file.write('Now on revision %d.\n' % (self.new_revno,))
0.200.342 by Jelmer Vernooij
Report git sha during pull.
565
        self._show_tag_conficts(to_file)
566
0.252.36 by Jelmer Vernooij
Fix pull.
567
    def _lookup_revno(self, revid):
0.200.1185 by Jelmer Vernooij
Some formatting fixes.
568
        return _quick_lookup_revno(self.target_branch, self.source_branch,
569
                revid)
0.252.36 by Jelmer Vernooij
Fix pull.
570
571
    def _get_old_revno(self):
572
        if self._old_revno is not None:
573
            return self._old_revno
574
        return self._lookup_revno(self.old_revid)
575
576
    def _set_old_revno(self, revno):
577
        self._old_revno = revno
578
579
    old_revno = property(_get_old_revno, _set_old_revno)
580
581
    def _get_new_revno(self):
582
        if self._new_revno is not None:
583
            return self._new_revno
584
        return self._lookup_revno(self.new_revid)
585
586
    def _set_new_revno(self, revno):
587
        self._new_revno = revno
0.200.956 by Jelmer Vernooij
Add some more format tests.
588
0.252.36 by Jelmer Vernooij
Fix pull.
589
    new_revno = property(_get_new_revno, _set_new_revno)
590
0.200.342 by Jelmer Vernooij
Report git sha during pull.
591
0.200.504 by Jelmer Vernooij
Lazily find revno's for git branches.
592
class GitBranchPushResult(branch.BranchPushResult):
593
594
    def _lookup_revno(self, revid):
0.200.1185 by Jelmer Vernooij
Some formatting fixes.
595
        return _quick_lookup_revno(self.source_branch, self.target_branch,
596
            revid)
0.200.504 by Jelmer Vernooij
Lazily find revno's for git branches.
597
598
    @property
599
    def old_revno(self):
600
        return self._lookup_revno(self.old_revid)
601
602
    @property
603
    def new_revno(self):
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
604
        new_original_revno = getattr(self, "new_original_revno", None)
605
        if new_original_revno:
606
            return new_original_revno
607
        if getattr(self, "new_original_revid", None) is not None:
608
            return self._lookup_revno(self.new_original_revid)
0.200.504 by Jelmer Vernooij
Lazily find revno's for git branches.
609
        return self._lookup_revno(self.new_revid)
610
611
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
612
class InterFromGitBranch(branch.GenericInterBranch):
0.200.261 by Jelmer Vernooij
More formatting fixes.
613
    """InterBranch implementation that pulls from Git into bzr."""
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
614
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
615
    @staticmethod
616
    def _get_branch_formats_to_test():
0.200.1100 by Jelmer Vernooij
Provide test combinations for InterBranch implementations.
617
        try:
618
            default_format = branch.format_registry.get_default()
619
        except AttributeError:
620
            default_format = branch.BranchFormat._default_format
621
        return [
622
            (GitBranchFormat(), GitBranchFormat()),
623
            (GitBranchFormat(), default_format)]
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
624
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
625
    @classmethod
0.200.692 by Jelmer Vernooij
Refuse pulling into non-rich-root branches rather than erroring out with an AttributeError.
626
    def _get_interrepo(self, source, target):
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
627
        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.
628
629
    @classmethod
630
    def is_compatible(cls, source, target):
0.200.1222 by Jelmer Vernooij
Better checks in is_compatible methods.
631
        if not isinstance(source, GitBranch):
632
            return False
633
        if isinstance(target, GitBranch):
634
            # InterLocalGitRemoteGitBranch or InterToGitBranch should be used
635
            return False
636
        if getattr(cls._get_interrepo(source, target), "fetch_objects", None) is None:
637
            # fetch_objects is necessary for this to work
638
            return False
639
        return True
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
640
0.200.1305 by Jelmer Vernooij
Only actually fetch tags if "branch.fetch_tags" is set to true.
641
    def fetch(self, stop_revision=None, fetch_tags=None, limit=None):
0.200.1265 by Jelmer Vernooij
Support limit option to Branch.fetch.
642
        self.fetch_objects(stop_revision, fetch_tags=fetch_tags, limit=limit)
0.260.1 by Jelmer Vernooij
Fix fetch from remote during merge.
643
0.200.1265 by Jelmer Vernooij
Support limit option to Branch.fetch.
644
    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.
645
        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.
646
        if fetch_tags is None:
647
            c = self.source.get_config()
0.200.1306 by Jelmer Vernooij
Fix bzr 2.3 compatibility.
648
            fetch_tags = c.get_user_option_as_bool('branch.fetch_tags')
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
649
        def determine_wants(heads):
0.200.917 by Jelmer Vernooij
Cope with implicit branches during pull.
650
            if self.source.ref is not None and not self.source.ref in heads:
0.200.777 by Jelmer Vernooij
Fix colocated remote branches.
651
                raise NoSuchRef(self.source.ref, heads.keys())
0.259.6 by Jelmer Vernooij
Fetch tags during pull.
652
653
            if stop_revision is None:
0.200.917 by Jelmer Vernooij
Cope with implicit branches during pull.
654
                if self.source.ref is not None:
655
                    head = heads[self.source.ref]
656
                else:
657
                    head = heads["HEAD"]
0.252.44 by Jelmer Vernooij
Properly look up Bazaar revision ids for revision parents in case they are round-tripped.
658
                self._last_revid = self.source.lookup_foreign_revision_id(head)
0.259.6 by Jelmer Vernooij
Fetch tags during pull.
659
            else:
660
                self._last_revid = stop_revision
661
            real = interrepo.get_determine_wants_revids(
0.260.1 by Jelmer Vernooij
Fix fetch from remote during merge.
662
                [self._last_revid], include_tags=fetch_tags)
0.259.6 by Jelmer Vernooij
Fetch tags during pull.
663
            return real(heads)
0.200.1002 by Jelmer Vernooij
Fix regression in git-import.
664
        pack_hint, head, refs = interrepo.fetch_objects(
0.200.1265 by Jelmer Vernooij
Support limit option to Branch.fetch.
665
            determine_wants, self.source.mapping, limit=limit)
0.252.45 by Jelmer Vernooij
Finish fetching roundtripped revisions back into bzr.
666
        if (pack_hint is not None and
667
            self.target.repository._format.pack_compresses):
0.248.5 by Jelmer Vernooij
Reformatting, fix dpush.
668
            self.target.repository.pack(hint=pack_hint)
0.260.1 by Jelmer Vernooij
Fix fetch from remote during merge.
669
        return head, refs
670
0.200.1219 by Jelmer Vernooij
Remove InterBranch.update_revisions.
671
    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.
672
        head, refs = self.fetch_objects(stop_revision, fetch_tags=None)
0.200.313 by Jelmer Vernooij
Support overwrite parameter.
673
        if overwrite:
0.200.314 by Jelmer Vernooij
Support stop_revision.
674
            prev_last_revid = None
0.200.313 by Jelmer Vernooij
Support overwrite parameter.
675
        else:
0.200.314 by Jelmer Vernooij
Support stop_revision.
676
            prev_last_revid = self.target.last_revision()
0.248.5 by Jelmer Vernooij
Reformatting, fix dpush.
677
        self.target.generate_revision_history(self._last_revid,
0.259.6 by Jelmer Vernooij
Fetch tags during pull.
678
            prev_last_revid, self.source)
0.200.1062 by Jelmer Vernooij
Pass remote refs along in _update_revisions.
679
        return head, refs
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
680
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
681
    def pull(self, overwrite=False, stop_revision=None,
682
             possible_transports=None, _hook_master=None, run_hooks=True,
0.200.1150 by Jelmer Vernooij
merge compatibility fixes for bzr 2.4, support for fetching tags.
683
             _override_hook_target=None, local=False):
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
684
        """See Branch.pull.
685
686
        :param _hook_master: Private parameter - set the branch to
687
            be supplied as the master to pull hooks.
688
        :param run_hooks: Private parameter - if false, this branch
689
            is being called because it's the master of the primary branch,
690
            so it should not run its hooks.
691
        :param _override_hook_target: Private parameter - set the branch to be
692
            supplied as the target_branch to pull hooks.
693
        """
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
694
        # This type of branch can't be bound.
695
        if local:
696
            raise errors.LocalRequiresBoundBranch()
0.200.342 by Jelmer Vernooij
Report git sha during pull.
697
        result = GitBranchPullResult()
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
698
        result.source_branch = self.source
699
        if _override_hook_target is None:
700
            result.target_branch = self.target
701
        else:
702
            result.target_branch = _override_hook_target
703
        self.source.lock_read()
704
        try:
705
            # We assume that during 'pull' the target repository is closer than
706
            # the source one.
0.200.726 by Jelmer Vernooij
Factor out conversion of branch names to refs.
707
            (result.old_revno, result.old_revid) = \
708
                self.target.last_revision_info()
0.200.1219 by Jelmer Vernooij
Remove InterBranch.update_revisions.
709
            result.new_git_head, remote_refs = self._update_revisions(
710
                stop_revision, overwrite=overwrite)
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
711
            result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
712
                overwrite)
0.200.726 by Jelmer Vernooij
Factor out conversion of branch names to refs.
713
            (result.new_revno, result.new_revid) = \
714
                self.target.last_revision_info()
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
715
            if _hook_master:
716
                result.master_branch = _hook_master
717
                result.local_branch = result.target_branch
718
            else:
719
                result.master_branch = result.target_branch
720
                result.local_branch = None
721
            if run_hooks:
722
                for hook in branch.Branch.hooks['post_pull']:
723
                    hook(result)
724
        finally:
725
            self.source.unlock()
726
        return result
727
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
728
    def _basic_push(self, overwrite=False, stop_revision=None):
729
        result = branch.BranchPushResult()
730
        result.source_branch = self.source
731
        result.target_branch = self.target
732
        result.old_revno, result.old_revid = self.target.last_revision_info()
0.200.1219 by Jelmer Vernooij
Remove InterBranch.update_revisions.
733
        result.new_git_head, remote_refs = self._update_revisions(
734
            stop_revision, overwrite=overwrite)
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
735
        result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
736
            overwrite)
737
        result.new_revno, result.new_revid = self.target.last_revision_info()
738
        return result
739
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
740
0.200.512 by Jelmer Vernooij
Support pushing git->git.
741
class InterGitBranch(branch.GenericInterBranch):
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
742
    """InterBranch implementation that pulls between Git branches."""
743
0.200.512 by Jelmer Vernooij
Support pushing git->git.
744
0.200.1176 by Jelmer Vernooij
Fix fetch return value for inter git fetching.
745
class InterLocalGitRemoteGitBranch(InterGitBranch):
0.200.512 by Jelmer Vernooij
Support pushing git->git.
746
    """InterBranch that copies from a local to a remote git branch."""
747
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
748
    @staticmethod
749
    def _get_branch_formats_to_test():
0.200.1100 by Jelmer Vernooij
Provide test combinations for InterBranch implementations.
750
        # FIXME
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
751
        return []
752
0.200.512 by Jelmer Vernooij
Support pushing git->git.
753
    @classmethod
754
    def is_compatible(self, source, target):
755
        from bzrlib.plugins.git.remote import RemoteGitBranch
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
756
        return (isinstance(source, LocalGitBranch) and
0.200.512 by Jelmer Vernooij
Support pushing git->git.
757
                isinstance(target, RemoteGitBranch))
758
759
    def _basic_push(self, overwrite=False, stop_revision=None):
760
        result = GitBranchPushResult()
761
        result.source_branch = self.source
762
        result.target_branch = self.target
763
        if stop_revision is None:
764
            stop_revision = self.source.last_revision()
765
        # FIXME: Check for diverged branches
766
        def get_changed_refs(old_refs):
0.200.1300 by Jelmer Vernooij
Fix formatting.
767
            old_ref = old_refs.get(self.target.ref, ZERO_SHA)
768
            result.old_revid = self.target.lookup_foreign_revision_id(old_ref)
0.200.822 by Jelmer Vernooij
Fix indication of number of revisions pushed in dpush.
769
            refs = { self.target.ref: self.source.repository.lookup_bzr_revision_id(stop_revision)[0] }
0.200.512 by Jelmer Vernooij
Support pushing git->git.
770
            result.new_revid = stop_revision
771
            for name, sha in self.source.repository._git.refs.as_dict("refs/tags").iteritems():
0.200.875 by Jelmer Vernooij
Use new tag_name_to_ref function.
772
                refs[tag_name_to_ref(name)] = sha
0.200.512 by Jelmer Vernooij
Support pushing git->git.
773
            return refs
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
774
        self.target.repository.send_pack(get_changed_refs,
0.200.726 by Jelmer Vernooij
Factor out conversion of branch names to refs.
775
            self.source.repository._git.object_store.generate_pack_contents)
0.200.512 by Jelmer Vernooij
Support pushing git->git.
776
        return result
777
778
0.200.1176 by Jelmer Vernooij
Fix fetch return value for inter git fetching.
779
class InterGitLocalGitBranch(InterGitBranch):
0.200.512 by Jelmer Vernooij
Support pushing git->git.
780
    """InterBranch that copies from a remote to a local git branch."""
781
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
782
    @staticmethod
783
    def _get_branch_formats_to_test():
0.200.1100 by Jelmer Vernooij
Provide test combinations for InterBranch implementations.
784
        # FIXME
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
785
        return []
786
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
787
    @classmethod
788
    def is_compatible(self, source, target):
0.200.1176 by Jelmer Vernooij
Fix fetch return value for inter git fetching.
789
        return (isinstance(source, GitBranch) and
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
790
                isinstance(target, LocalGitBranch))
791
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
792
    def _basic_push(self, overwrite=False, stop_revision=None):
793
        result = branch.BranchPushResult()
794
        result.source_branch = self.source
795
        result.target_branch = self.target
796
        result.old_revid = self.target.last_revision()
797
        refs, stop_revision = self.update_refs(stop_revision)
798
        self.target.generate_revision_history(stop_revision, result.old_revid)
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
799
        result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
800
            source_refs=refs, overwrite=overwrite)
0.200.505 by Jelmer Vernooij
Remove duplicate code.
801
        result.new_revid = self.target.last_revision()
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
802
        return result
803
804
    def update_refs(self, stop_revision=None):
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
805
        interrepo = _mod_repository.InterRepository.get(self.source.repository,
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
806
            self.target.repository)
807
        if stop_revision is None:
0.200.940 by Jelmer Vernooij
Avoid confusion between different fetch functions with different semantics.
808
            refs = interrepo.fetch(branches=["HEAD"])
0.252.44 by Jelmer Vernooij
Properly look up Bazaar revision ids for revision parents in case they are round-tripped.
809
            stop_revision = self.target.lookup_foreign_revision_id(refs["HEAD"])
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
810
        else:
0.200.940 by Jelmer Vernooij
Avoid confusion between different fetch functions with different semantics.
811
            refs = interrepo.fetch(revision_id=stop_revision)
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
812
        return refs, stop_revision
813
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
814
    def pull(self, stop_revision=None, overwrite=False,
0.200.732 by Jelmer Vernooij
Support run_hooks argument to InterGitRemoteLocalBranch.pull().
815
        possible_transports=None, run_hooks=True,local=False):
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
816
        # This type of branch can't be bound.
817
        if local:
818
            raise errors.LocalRequiresBoundBranch()
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
819
        result = GitPullResult()
820
        result.source_branch = self.source
821
        result.target_branch = self.target
822
        result.old_revid = self.target.last_revision()
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
823
        refs, stop_revision = self.update_refs(stop_revision)
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
824
        self.target.generate_revision_history(stop_revision, result.old_revid)
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
825
        result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
826
            overwrite=overwrite, source_refs=refs)
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
827
        result.new_revid = self.target.last_revision()
828
        return result
829
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
830
0.200.960 by Jelmer Vernooij
Use GenericInterBranch.
831
class InterToGitBranch(branch.GenericInterBranch):
0.200.1185 by Jelmer Vernooij
Some formatting fixes.
832
    """InterBranch implementation that pulls into a Git branch."""
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
833
0.200.939 by Jelmer Vernooij
Use InterRepo directly.
834
    def __init__(self, source, target):
835
        super(InterToGitBranch, self).__init__(source, target)
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
836
        self.interrepo = _mod_repository.InterRepository.get(source.repository,
0.200.939 by Jelmer Vernooij
Use InterRepo directly.
837
                                           target.repository)
838
0.200.631 by Jelmer Vernooij
Raise proper exception in Branch.get_stacked_on_url().
839
    @staticmethod
840
    def _get_branch_formats_to_test():
0.200.1100 by Jelmer Vernooij
Provide test combinations for InterBranch implementations.
841
        try:
842
            default_format = branch.format_registry.get_default()
843
        except AttributeError:
844
            default_format = branch.BranchFormat._default_format
845
        return [(default_format, GitBranchFormat())]
0.200.631 by Jelmer Vernooij
Raise proper exception in Branch.get_stacked_on_url().
846
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
847
    @classmethod
848
    def is_compatible(self, source, target):
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
849
        return (not isinstance(source, GitBranch) and
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
850
                isinstance(target, GitBranch))
851
0.252.38 by Jelmer Vernooij
Minor cleanups.
852
    def _get_new_refs(self, stop_revision=None):
853
        if stop_revision is None:
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
854
            (stop_revno, stop_revision) = self.source.last_revision_info()
0.263.1 by Jelmer Vernooij
Fix dpush for certain branches.
855
        else:
856
            stop_revno = self.source.revision_id_to_revno(stop_revision)
0.200.969 by Jelmer Vernooij
Use tuples with bzr revid and git sha to avoid lookups.
857
        assert type(stop_revision) is str
0.200.916 by Jelmer Vernooij
Set refs/heads/master if no ref is set yet.
858
        main_ref = self.target.ref or "refs/heads/master"
0.200.969 by Jelmer Vernooij
Use tuples with bzr revid and git sha to avoid lookups.
859
        refs = { main_ref: (None, stop_revision) }
0.252.37 by Jelmer Vernooij
Factor out some common code for finding refs to send.
860
        for name, revid in self.source.tags.get_tag_dict().iteritems():
861
            if self.source.repository.has_revision(revid):
0.200.969 by Jelmer Vernooij
Use tuples with bzr revid and git sha to avoid lookups.
862
                refs[tag_name_to_ref(name)] = (None, revid)
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
863
        return refs, main_ref, (stop_revno, stop_revision)
0.252.37 by Jelmer Vernooij
Factor out some common code for finding refs to send.
864
0.252.36 by Jelmer Vernooij
Fix pull.
865
    def pull(self, overwrite=False, stop_revision=None, local=False,
0.200.1131 by Jelmer Vernooij
Accept run_hooks argument to InterToGitBranch.pull().
866
             possible_transports=None, run_hooks=True):
0.252.36 by Jelmer Vernooij
Fix pull.
867
        result = GitBranchPullResult()
868
        result.source_branch = self.source
869
        result.target_branch = self.target
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
870
        new_refs, main_ref, stop_revinfo = self._get_new_refs(stop_revision)
0.200.941 by Jelmer Vernooij
Pass update_refs argument to fetch_refs.
871
        def update_refs(old_refs):
0.200.945 by Jelmer Vernooij
Move fixmes
872
            # FIXME: Check for diverged branches
0.200.1323 by Jelmer Vernooij
Simplify push handling.
873
            return new_refs
0.200.1156 by Jelmer Vernooij
Disable push.
874
        try:
0.200.1323 by Jelmer Vernooij
Simplify push handling.
875
            result.revidmap, old_refs, new_refs = self.interrepo.fetch_refs(
876
                update_refs, lossy=False)
0.200.1156 by Jelmer Vernooij
Disable push.
877
        except NoPushSupport:
0.200.1161 by Jelmer Vernooij
Fix exception type.
878
            raise errors.NoRoundtrippingSupport(self.source, self.target)
0.200.1042 by Jelmer Vernooij
Fix pull into git branches.
879
        (result.old_revid, old_sha1) = old_refs.get(main_ref, (ZERO_SHA, NULL_REVISION))
880
        if result.old_revid is None:
881
            result.old_revid = self.target.lookup_foreign_revision_id(old_sha1)
882
        result.new_revid = new_refs[main_ref][1]
0.252.36 by Jelmer Vernooij
Fix pull.
883
        return result
884
0.200.1260 by Jelmer Vernooij
Cope with new lossy argument.
885
    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.
886
             _override_hook_source_branch=None):
0.252.5 by Jelmer Vernooij
enable 'bzr push'.
887
        result = GitBranchPushResult()
888
        result.source_branch = self.source
889
        result.target_branch = self.target
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
890
        new_refs, main_ref, stop_revinfo = self._get_new_refs(stop_revision)
0.200.941 by Jelmer Vernooij
Pass update_refs argument to fetch_refs.
891
        def update_refs(old_refs):
0.200.945 by Jelmer Vernooij
Move fixmes
892
            # FIXME: Check for diverged branches
0.200.1323 by Jelmer Vernooij
Simplify push handling.
893
            return new_refs
894
        try:
895
            result.revidmap, old_refs, new_refs = self.interrepo.fetch_refs(
896
                update_refs, lossy=lossy)
897
        except NoPushSupport:
898
            raise errors.NoRoundtrippingSupport(self.source, self.target)
0.200.1035 by Jelmer Vernooij
Cope with tuples in refs dictionary.
899
        (result.old_revid, old_sha1) = old_refs.get(main_ref, (ZERO_SHA, NULL_REVISION))
900
        if result.old_revid is None:
901
            result.old_revid = self.target.lookup_foreign_revision_id(old_sha1)
0.200.1042 by Jelmer Vernooij
Fix pull into git branches.
902
        result.new_revid = new_refs[main_ref][1]
0.200.1260 by Jelmer Vernooij
Cope with new lossy argument.
903
        (result.new_original_revno, result.new_original_revid) = stop_revinfo
0.252.5 by Jelmer Vernooij
enable 'bzr push'.
904
        return result
0.200.472 by Jelmer Vernooij
Fix printing error when user attempts to push into git.
905
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
906
    def lossy_push(self, stop_revision=None):
0.200.1261 by Jelmer Vernooij
add note about compatibility
907
        # For compatibility with bzr < 2.4
0.200.1260 by Jelmer Vernooij
Cope with new lossy argument.
908
        return self.push(lossy=True, stop_revision=stop_revision)
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
909
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
910
0.200.1176 by Jelmer Vernooij
Fix fetch return value for inter git fetching.
911
branch.InterBranch.register_optimiser(InterGitLocalGitBranch)
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
912
branch.InterBranch.register_optimiser(InterFromGitBranch)
913
branch.InterBranch.register_optimiser(InterToGitBranch)
0.200.1176 by Jelmer Vernooij
Fix fetch return value for inter git fetching.
914
branch.InterBranch.register_optimiser(InterLocalGitRemoteGitBranch)