/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.261 by Jelmer Vernooij
More formatting fixes.
20
from dulwich.objects import (
21
    Commit,
22
    Tag,
23
    )
24
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
25
from bzrlib import (
26
    branch,
0.200.513 by Jelmer Vernooij
Fix imports.
27
    bzrdir,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
28
    config,
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
29
    errors,
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
30
    repository,
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
31
    revision,
0.200.82 by Jelmer Vernooij
Support listing tags.
32
    tag,
0.230.1 by Jelmer Vernooij
Support lightweight checkouts.
33
    transport,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
34
    )
0.200.261 by Jelmer Vernooij
More formatting fixes.
35
from bzrlib.decorators import (
36
    needs_read_lock,
37
    )
0.200.969 by Jelmer Vernooij
Use tuples with bzr revid and git sha to avoid lookups.
38
from bzrlib.revision import (
39
    NULL_REVISION,
40
    )
0.200.261 by Jelmer Vernooij
More formatting fixes.
41
from bzrlib.trace import (
0.200.342 by Jelmer Vernooij
Report git sha during pull.
42
    is_quiet,
0.200.261 by Jelmer Vernooij
More formatting fixes.
43
    mutter,
44
    )
45
0.200.386 by Jelmer Vernooij
Move config to a separate file, support BranchConfig.username().
46
from bzrlib.plugins.git.config import (
47
    GitBranchConfig,
48
    )
0.200.278 by Jelmer Vernooij
Update branch head appropriately during dpull.
49
from bzrlib.plugins.git.errors import (
0.200.472 by Jelmer Vernooij
Fix printing error when user attempts to push into git.
50
    NoPushSupport,
0.200.278 by Jelmer Vernooij
Update branch head appropriately during dpull.
51
    NoSuchRef,
52
    )
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
53
from bzrlib.plugins.git.refs import (
54
    ref_to_branch_name,
55
    extract_tags,
0.200.875 by Jelmer Vernooij
Use new tag_name_to_ref function.
56
    tag_name_to_ref,
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
57
    )
0.200.261 by Jelmer Vernooij
More formatting fixes.
58
0.238.5 by Jelmer Vernooij
Remove old backwards compatibility code.
59
from bzrlib.foreign import ForeignBranch
0.200.388 by Jelmer Vernooij
Support bzr 1.14 as well.
60
0.200.261 by Jelmer Vernooij
More formatting fixes.
61
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
62
class GitPullResult(branch.PullResult):
0.200.956 by Jelmer Vernooij
Add some more format tests.
63
    """Result of a pull from a Git branch."""
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
64
65
    def _lookup_revno(self, revid):
66
        assert isinstance(revid, str), "was %r" % revid
67
        # Try in source branch first, it'll be faster
68
        return self.target_branch.revision_id_to_revno(revid)
69
70
    @property
71
    def old_revno(self):
72
        return self._lookup_revno(self.old_revid)
73
74
    @property
75
    def new_revno(self):
76
        return self._lookup_revno(self.new_revid)
77
78
0.200.261 by Jelmer Vernooij
More formatting fixes.
79
class LocalGitTagDict(tag.BasicTags):
80
    """Dictionary with tags in a local repository."""
0.200.82 by Jelmer Vernooij
Support listing tags.
81
0.200.89 by Jelmer Vernooij
Support sprouting branches.
82
    def __init__(self, branch):
83
        self.branch = branch
84
        self.repository = branch.repository
0.200.82 by Jelmer Vernooij
Support listing tags.
85
86
    def get_tag_dict(self):
87
        ret = {}
0.200.648 by Jelmer Vernooij
Fix tag handling when encountering packed refs.
88
        for k,v in extract_tags(self.repository._git.get_refs()).iteritems():
0.200.609 by Jelmer Vernooij
Cope with tags pointing at nonexisting objects.
89
            try:
0.200.647 by Jelmer Vernooij
Fix use of packed refs.
90
                obj = self.repository._git[v]
0.200.609 by Jelmer Vernooij
Cope with tags pointing at nonexisting objects.
91
            except KeyError:
92
                mutter("Tag %s points at unknown object %s, ignoring", v, obj)
93
                continue
0.200.194 by Jelmer Vernooij
Look for commit object in heavyweight tags.
94
            while isinstance(obj, Tag):
95
                v = obj.object[1]
0.200.647 by Jelmer Vernooij
Fix use of packed refs.
96
                obj = self.repository._git[v]
0.200.194 by Jelmer Vernooij
Look for commit object in heavyweight tags.
97
            if not isinstance(obj, Commit):
0.200.261 by Jelmer Vernooij
More formatting fixes.
98
                mutter("Tag %s points at object %r that is not a commit, "
99
                       "ignoring", k, obj)
0.200.194 by Jelmer Vernooij
Look for commit object in heavyweight tags.
100
                continue
0.252.44 by Jelmer Vernooij
Properly look up Bazaar revision ids for revision parents in case they are round-tripped.
101
            ret[k] = self.branch.lookup_foreign_revision_id(v)
0.200.82 by Jelmer Vernooij
Support listing tags.
102
        return ret
103
0.200.711 by Jelmer Vernooij
Support merging tags to a local Git repository.
104
    def _set_tag_dict(self, to_dict):
105
        extra = set(self.repository._git.get_refs().keys())
106
        for k, revid in to_dict.iteritems():
0.200.875 by Jelmer Vernooij
Use new tag_name_to_ref function.
107
            name = tag_name_to_ref(k)
0.200.711 by Jelmer Vernooij
Support merging tags to a local Git repository.
108
            if name in extra:
109
                extra.remove(name)
110
            self.set_tag(k, revid)
111
        for name in extra:
112
            if name.startswith("refs/tags/"):
113
                del self.repository._git[name]
0.200.956 by Jelmer Vernooij
Add some more format tests.
114
0.200.86 by Jelmer Vernooij
Clearer error when setting tags.
115
    def set_tag(self, name, revid):
0.200.875 by Jelmer Vernooij
Use new tag_name_to_ref function.
116
        self.repository._git.refs[tag_name_to_ref(name)], _ = \
0.200.1030 by Jelmer Vernooij
More work on supporting roundtripping push.
117
            self.branch.lookup_bzr_revision_id(revid)
0.200.86 by Jelmer Vernooij
Clearer error when setting tags.
118
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
119
0.239.1 by Jelmer Vernooij
Avoid re-connecting to fetch tags we already know.
120
class DictTagDict(LocalGitTagDict):
121
122
    def __init__(self, branch, tags):
123
        super(DictTagDict, self).__init__(branch)
124
        self._tags = tags
125
126
    def get_tag_dict(self):
127
        return self._tags
128
129
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
130
class GitBranchFormat(branch.BranchFormat):
131
0.200.70 by Jelmer Vernooij
Implement GitBranchFormat.get_format_description.
132
    def get_format_description(self):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
133
        return 'Git Branch'
134
0.243.1 by Jelmer Vernooij
Use foreign branch testing infrastructure.
135
    def network_name(self):
136
        return "git"
137
0.200.82 by Jelmer Vernooij
Support listing tags.
138
    def supports_tags(self):
139
        return True
140
0.243.1 by Jelmer Vernooij
Use foreign branch testing infrastructure.
141
    def get_foreign_tests_branch_factory(self):
142
        from bzrlib.plugins.git.tests.test_branch import ForeignTestsBranchFactory
143
        return ForeignTestsBranchFactory()
144
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
145
    def make_tags(self, branch):
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
146
        if getattr(branch.repository, "get_refs", None) is not None:
147
            from bzrlib.plugins.git.remote import RemoteGitTagDict
148
            return RemoteGitTagDict(branch)
0.200.261 by Jelmer Vernooij
More formatting fixes.
149
        else:
150
            return LocalGitTagDict(branch)
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
151
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
152
0.200.911 by Jelmer Vernooij
Cope with locking changes in bzr.dev.
153
class GitReadLock(object):
154
155
    def __init__(self, unlock):
156
        self.unlock = unlock
157
158
159
class GitWriteLock(object):
160
161
    def __init__(self, unlock):
162
        self.unlock = unlock
163
164
0.200.388 by Jelmer Vernooij
Support bzr 1.14 as well.
165
class GitBranch(ForeignBranch):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
166
    """An adapter to git repositories for bzr Branch objects."""
167
0.200.770 by Jelmer Vernooij
Proper branch names.
168
    def __init__(self, bzrdir, repository, ref, lockfiles, tagsdict=None):
0.200.82 by Jelmer Vernooij
Support listing tags.
169
        self.repository = repository
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
170
        self._format = GitBranchFormat()
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
171
        self.control_files = lockfiles
0.200.59 by Jelmer Vernooij
Add more tests, fix revision history.
172
        self.bzrdir = bzrdir
0.231.1 by Jelmer Vernooij
Check that regenerated objects have the expected sha1.
173
        super(GitBranch, self).__init__(repository.get_mapping())
0.239.1 by Jelmer Vernooij
Avoid re-connecting to fetch tags we already know.
174
        if tagsdict is not None:
175
            self.tags = DictTagDict(self, tagsdict)
0.200.770 by Jelmer Vernooij
Proper branch names.
176
        self.ref = ref
177
        self.name = ref_to_branch_name(ref)
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
178
        self._head = None
0.200.630 by Jelmer Vernooij
Fix base url of Git branches - use the working tree path rather than the control directory path.
179
        self.base = bzrdir.root_transport.base
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
180
0.239.8 by Jelmer Vernooij
Support checkouts.
181
    def _get_checkout_format(self):
182
        """Return the most suitable metadir for a checkout of this branch.
183
        Weaves are used if this branch's repository uses weaves.
184
        """
0.200.927 by Jelmer Vernooij
Remove explicit use of rich root formats.
185
        return bzrdir.format_registry.make_bzrdir("default")
0.239.8 by Jelmer Vernooij
Support checkouts.
186
0.238.3 by Jelmer Vernooij
Remove svn references, prefer git send format when submitting changes against a git branch.
187
    def get_child_submit_format(self):
188
        """Return the preferred format of submissions to this branch."""
189
        ret = self.get_config().get_user_option("child_submit_format")
190
        if ret is not None:
191
            return ret
192
        return "git"
193
0.200.293 by Jelmer Vernooij
Fix branch nicks.
194
    def _get_nick(self, local=False, possible_master_transports=None):
195
        """Find the nick name for this branch.
196
197
        :return: Branch nick
198
        """
0.200.920 by Jelmer Vernooij
Fix some more tests.
199
        return self.name or "HEAD"
0.200.293 by Jelmer Vernooij
Fix branch nicks.
200
0.200.331 by Jelmer Vernooij
Add stub for setting nick function.
201
    def _set_nick(self, nick):
202
        raise NotImplementedError
203
204
    nick = property(_get_nick, _set_nick)
0.200.293 by Jelmer Vernooij
Fix branch nicks.
205
0.200.412 by Jelmer Vernooij
Implement GitBranch.__repr__.
206
    def __repr__(self):
0.200.770 by Jelmer Vernooij
Proper branch names.
207
        return "<%s(%r, %r)>" % (self.__class__.__name__, self.repository.base,
0.200.920 by Jelmer Vernooij
Fix some more tests.
208
            self.ref or "HEAD")
0.200.412 by Jelmer Vernooij
Implement GitBranch.__repr__.
209
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
210
    def generate_revision_history(self, revid, old_revid=None):
211
        # FIXME: Check that old_revid is in the ancestry of revid
212
        newhead, self.mapping = self.mapping.revision_id_bzr_to_foreign(revid)
213
        self._set_head(newhead)
214
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
215
    def lock_write(self):
216
        self.control_files.lock_write()
0.200.911 by Jelmer Vernooij
Cope with locking changes in bzr.dev.
217
        return GitWriteLock(self.unlock)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
218
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
219
    def get_stacked_on_url(self):
220
        # Git doesn't do stacking (yet...)
0.200.631 by Jelmer Vernooij
Raise proper exception in Branch.get_stacked_on_url().
221
        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.
222
223
    def get_parent(self):
224
        """See Branch.get_parent()."""
0.200.312 by Jelmer Vernooij
Add notes about parent locations.
225
        # 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.
226
        return None
227
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
228
    def set_parent(self, url):
0.200.312 by Jelmer Vernooij
Add notes about parent locations.
229
        # FIXME: Set "origin" url in .git/config ?
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
230
        pass
231
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
232
    def lock_read(self):
233
        self.control_files.lock_read()
0.200.911 by Jelmer Vernooij
Cope with locking changes in bzr.dev.
234
        return GitReadLock(self.unlock)
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
235
0.200.432 by Jelmer Vernooij
Support Branch.is_locked, required for loggerhead.
236
    def is_locked(self):
237
        return self.control_files.is_locked()
238
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
239
    def unlock(self):
240
        self.control_files.unlock()
241
242
    def get_physical_lock_status(self):
243
        return False
244
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
245
    @needs_read_lock
246
    def last_revision(self):
247
        # perhaps should escape this ?
0.200.57 by Jelmer Vernooij
Fix more tests.
248
        if self.head is None:
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
249
            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.
250
        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.
251
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
252
    def _basic_push(self, target, overwrite=False, stop_revision=None):
253
        return branch.InterBranch.get(self, target)._basic_push(
254
            overwrite, stop_revision)
255
0.252.49 by Jelmer Vernooij
Avoid trying to set HEAD for remote branches.
256
    def lookup_foreign_revision_id(self, foreign_revid):
0.200.956 by Jelmer Vernooij
Add some more format tests.
257
        return self.repository.lookup_foreign_revision_id(foreign_revid,
0.252.49 by Jelmer Vernooij
Avoid trying to set HEAD for remote branches.
258
            self.mapping)
259
0.200.1030 by Jelmer Vernooij
More work on supporting roundtripping push.
260
    def lookup_bzr_revision_id(self, revid):
261
        return self.repository.lookup_bzr_revision_id(
262
            revid, mapping=self.mapping)
263
0.200.692 by Jelmer Vernooij
Refuse pulling into non-rich-root branches rather than erroring out with an AttributeError.
264
0.200.465 by Jelmer Vernooij
Use dulwich standard functionality for finding missing revisions.
265
class LocalGitBranch(GitBranch):
266
    """A local Git branch."""
267
0.200.763 by Jelmer Vernooij
Provide proper colocated branch support.
268
    def __init__(self, bzrdir, repository, name, lockfiles, tagsdict=None):
0.200.956 by Jelmer Vernooij
Add some more format tests.
269
        super(LocalGitBranch, self).__init__(bzrdir, repository, name,
0.200.763 by Jelmer Vernooij
Provide proper colocated branch support.
270
              lockfiles, tagsdict)
0.200.918 by Jelmer Vernooij
Cope with 'self.ref is None' in a couple more places.
271
        refs = repository._git.get_refs()
272
        if not (name in refs.keys() or "HEAD" in refs.keys()):
0.200.763 by Jelmer Vernooij
Provide proper colocated branch support.
273
            raise errors.NotBranchError(self.base)
274
0.200.261 by Jelmer Vernooij
More formatting fixes.
275
    def create_checkout(self, to_location, revision_id=None, lightweight=False,
276
        accelerator_tree=None, hardlink=False):
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
277
        if lightweight:
0.230.1 by Jelmer Vernooij
Support lightweight checkouts.
278
            t = transport.get_transport(to_location)
279
            t.ensure_base()
280
            format = self._get_checkout_format()
281
            checkout = format.initialize_on_transport(t)
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
282
            from_branch = branch.BranchReferenceFormat().initialize(checkout,
0.230.1 by Jelmer Vernooij
Support lightweight checkouts.
283
                self)
284
            tree = checkout.create_workingtree(revision_id,
285
                from_branch=from_branch, hardlink=hardlink)
286
            return tree
287
        else:
288
            return self._create_heavyweight_checkout(to_location, revision_id,
0.257.1 by Jelmer Vernooij
use transport repo objects even for local access.
289
                hardlink)
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
290
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
291
    def _create_heavyweight_checkout(self, to_location, revision_id=None,
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
292
                                     hardlink=False):
293
        """Create a new heavyweight checkout of this branch.
294
295
        :param to_location: URL of location to create the new checkout in.
296
        :param revision_id: Revision that should be the tip of the checkout.
297
        :param hardlink: Whether to hardlink
298
        :return: WorkingTree object of checkout.
299
        """
0.200.513 by Jelmer Vernooij
Fix imports.
300
        checkout_branch = bzrdir.BzrDir.create_branch_convenience(
0.200.927 by Jelmer Vernooij
Remove explicit use of rich root formats.
301
            to_location, force_new_tree=False)
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
302
        checkout = checkout_branch.bzrdir
303
        checkout_branch.bind(self)
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
304
        # 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.
305
        # branch tip correctly, and seed it with history.
306
        checkout_branch.pull(self, stop_revision=revision_id)
307
        return checkout.create_workingtree(revision_id, hardlink=hardlink)
308
0.200.57 by Jelmer Vernooij
Fix more tests.
309
    def _gen_revision_history(self):
0.200.58 by Jelmer Vernooij
Fix remaining tests.
310
        if self.head is None:
311
            return []
0.200.261 by Jelmer Vernooij
More formatting fixes.
312
        ret = list(self.repository.iter_reverse_revision_history(
313
            self.last_revision()))
0.200.59 by Jelmer Vernooij
Add more tests, fix revision history.
314
        ret.reverse()
0.200.57 by Jelmer Vernooij
Fix more tests.
315
        return ret
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
316
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
317
    def _get_head(self):
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
318
        try:
0.200.918 by Jelmer Vernooij
Cope with 'self.ref is None' in a couple more places.
319
            return self.repository._git.ref(self.ref or "HEAD")
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
320
        except KeyError:
321
            return None
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
322
0.200.507 by Jelmer Vernooij
Implement set_last_revision{_info,}.
323
    def set_last_revision_info(self, revno, revid):
324
        self.set_last_revision(revid)
325
326
    def set_last_revision(self, revid):
0.252.5 by Jelmer Vernooij
enable 'bzr push'.
327
        (newhead, self.mapping) = self.repository.lookup_bzr_revision_id(revid)
0.200.523 by Jelmer Vernooij
Fix undefined error.
328
        self.head = newhead
0.200.507 by Jelmer Vernooij
Implement set_last_revision{_info,}.
329
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
330
    def _set_head(self, value):
331
        self._head = value
0.200.918 by Jelmer Vernooij
Cope with 'self.ref is None' in a couple more places.
332
        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.
333
        self._clear_cached_state()
334
335
    head = property(_get_head, _set_head)
336
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
337
    def get_config(self):
338
        return GitBranchConfig(self)
339
340
    def get_push_location(self):
341
        """See Branch.get_push_location."""
342
        push_loc = self.get_config().get_user_option('push_location')
343
        return push_loc
344
345
    def set_push_location(self, location):
346
        """See Branch.set_push_location."""
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
347
        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.
348
                                          store=config.STORE_LOCATION)
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
349
350
    def supports_tags(self):
0.200.82 by Jelmer Vernooij
Support listing tags.
351
        return True
0.200.956 by Jelmer Vernooij
Add some more format tests.
352
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
353
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
354
def _quick_lookup_revno(local_branch, remote_branch, revid):
355
    assert isinstance(revid, str), "was %r" % revid
356
    # Try in source branch first, it'll be faster
357
    try:
358
        return local_branch.revision_id_to_revno(revid)
359
    except errors.NoSuchRevision:
360
        graph = local_branch.repository.get_graph()
361
        try:
362
            return graph.find_distance_to_null(revid)
363
        except errors.GhostRevisionsHaveNoRevno:
364
            # FIXME: Check using graph.find_distance_to_null() ?
365
            return remote_branch.revision_id_to_revno(revid)
366
367
0.200.342 by Jelmer Vernooij
Report git sha during pull.
368
class GitBranchPullResult(branch.PullResult):
369
0.252.36 by Jelmer Vernooij
Fix pull.
370
    def __init__(self):
371
        super(GitBranchPullResult, self).__init__()
372
        self.new_git_head = None
373
        self._old_revno = None
374
        self._new_revno = None
375
0.200.342 by Jelmer Vernooij
Report git sha during pull.
376
    def report(self, to_file):
377
        if not is_quiet():
378
            if self.old_revid == self.new_revid:
379
                to_file.write('No revisions to pull.\n')
0.200.728 by Jelmer Vernooij
Fix pulling when all revisions are already in the repo.
380
            elif self.new_git_head is not None:
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
381
                to_file.write('Now on revision %d (git sha: %s).\n' %
0.200.342 by Jelmer Vernooij
Report git sha during pull.
382
                        (self.new_revno, self.new_git_head))
0.200.728 by Jelmer Vernooij
Fix pulling when all revisions are already in the repo.
383
            else:
384
                to_file.write('Now on revision %d.\n' % (self.new_revno,))
0.200.342 by Jelmer Vernooij
Report git sha during pull.
385
        self._show_tag_conficts(to_file)
386
0.252.36 by Jelmer Vernooij
Fix pull.
387
    def _lookup_revno(self, revid):
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
388
        return _quick_lookup_revno(self.target_branch, self.source_branch, revid)
0.252.36 by Jelmer Vernooij
Fix pull.
389
390
    def _get_old_revno(self):
391
        if self._old_revno is not None:
392
            return self._old_revno
393
        return self._lookup_revno(self.old_revid)
394
395
    def _set_old_revno(self, revno):
396
        self._old_revno = revno
397
398
    old_revno = property(_get_old_revno, _set_old_revno)
399
400
    def _get_new_revno(self):
401
        if self._new_revno is not None:
402
            return self._new_revno
403
        return self._lookup_revno(self.new_revid)
404
405
    def _set_new_revno(self, revno):
406
        self._new_revno = revno
0.200.956 by Jelmer Vernooij
Add some more format tests.
407
0.252.36 by Jelmer Vernooij
Fix pull.
408
    new_revno = property(_get_new_revno, _set_new_revno)
409
0.200.342 by Jelmer Vernooij
Report git sha during pull.
410
0.200.504 by Jelmer Vernooij
Lazily find revno's for git branches.
411
class GitBranchPushResult(branch.BranchPushResult):
412
413
    def _lookup_revno(self, revid):
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
414
        return _quick_lookup_revno(self.source_branch, self.target_branch, revid)
0.200.504 by Jelmer Vernooij
Lazily find revno's for git branches.
415
416
    @property
417
    def old_revno(self):
418
        return self._lookup_revno(self.old_revid)
419
420
    @property
421
    def new_revno(self):
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
422
        new_original_revno = getattr(self, "new_original_revno", None)
423
        if new_original_revno:
424
            return new_original_revno
425
        if getattr(self, "new_original_revid", None) is not None:
426
            return self._lookup_revno(self.new_original_revid)
0.200.504 by Jelmer Vernooij
Lazily find revno's for git branches.
427
        return self._lookup_revno(self.new_revid)
428
429
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
430
class InterFromGitBranch(branch.GenericInterBranch):
0.200.261 by Jelmer Vernooij
More formatting fixes.
431
    """InterBranch implementation that pulls from Git into bzr."""
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
432
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
433
    @staticmethod
434
    def _get_branch_formats_to_test():
435
        return []
436
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
437
    @classmethod
0.200.692 by Jelmer Vernooij
Refuse pulling into non-rich-root branches rather than erroring out with an AttributeError.
438
    def _get_interrepo(self, source, target):
439
        return repository.InterRepository.get(source.repository,
440
            target.repository)
441
442
    @classmethod
443
    def is_compatible(cls, source, target):
444
        return (isinstance(source, GitBranch) and
445
                not isinstance(target, GitBranch) and
446
                (getattr(cls._get_interrepo(source, target), "fetch_objects", None) is not None))
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
447
0.247.7 by Michael Hudson
preserve the interface of update_revisions()
448
    def _update_revisions(self, stop_revision=None, overwrite=False,
0.247.2 by Michael Hudson
this works for my tests, but i'm pretty sure it's wrong in general
449
        graph=None, limit=None):
0.247.7 by Michael Hudson
preserve the interface of update_revisions()
450
        """Like InterBranch.update_revisions(), but with additions.
451
452
        Compared to the `update_revisions()` below, this function takes a
453
        `limit` argument that limits how many git commits will be converted
454
        and returns the new git head.
455
        """
0.200.692 by Jelmer Vernooij
Refuse pulling into non-rich-root branches rather than erroring out with an AttributeError.
456
        interrepo = self._get_interrepo(self.source, self.target)
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
457
        def determine_wants(heads):
0.200.917 by Jelmer Vernooij
Cope with implicit branches during pull.
458
            if self.source.ref is not None and not self.source.ref in heads:
0.200.777 by Jelmer Vernooij
Fix colocated remote branches.
459
                raise NoSuchRef(self.source.ref, heads.keys())
0.200.314 by Jelmer Vernooij
Support stop_revision.
460
            if stop_revision is not None:
0.200.728 by Jelmer Vernooij
Fix pulling when all revisions are already in the repo.
461
                self._last_revid = stop_revision
0.200.912 by Jelmer Vernooij
Merge roundtrip support.
462
                head, mapping = self.source.repository.lookup_bzr_revision_id(
0.200.316 by Jelmer Vernooij
Fix formatting.
463
                    stop_revision)
0.200.314 by Jelmer Vernooij
Support stop_revision.
464
            else:
0.200.917 by Jelmer Vernooij
Cope with implicit branches during pull.
465
                if self.source.ref is not None:
466
                    head = heads[self.source.ref]
467
                else:
468
                    head = heads["HEAD"]
0.252.44 by Jelmer Vernooij
Properly look up Bazaar revision ids for revision parents in case they are round-tripped.
469
                self._last_revid = self.source.lookup_foreign_revision_id(head)
0.200.728 by Jelmer Vernooij
Fix pulling when all revisions are already in the repo.
470
            if self.target.repository.has_revision(self._last_revid):
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
471
                return []
0.247.6 by Michael Hudson
away with underscore prefixed local variables
472
            return [head]
0.200.1002 by Jelmer Vernooij
Fix regression in git-import.
473
        pack_hint, head, refs = interrepo.fetch_objects(
0.247.2 by Michael Hudson
this works for my tests, but i'm pretty sure it's wrong in general
474
            determine_wants, self.source.mapping, limit=limit)
0.252.45 by Jelmer Vernooij
Finish fetching roundtripped revisions back into bzr.
475
        if (pack_hint is not None and
476
            self.target.repository._format.pack_compresses):
0.248.5 by Jelmer Vernooij
Reformatting, fix dpush.
477
            self.target.repository.pack(hint=pack_hint)
0.200.728 by Jelmer Vernooij
Fix pulling when all revisions are already in the repo.
478
        if head is not None:
0.252.44 by Jelmer Vernooij
Properly look up Bazaar revision ids for revision parents in case they are round-tripped.
479
            self._last_revid = self.source.lookup_foreign_revision_id(head)
0.200.313 by Jelmer Vernooij
Support overwrite parameter.
480
        if overwrite:
0.200.314 by Jelmer Vernooij
Support stop_revision.
481
            prev_last_revid = None
0.200.313 by Jelmer Vernooij
Support overwrite parameter.
482
        else:
0.200.314 by Jelmer Vernooij
Support stop_revision.
483
            prev_last_revid = self.target.last_revision()
0.248.5 by Jelmer Vernooij
Reformatting, fix dpush.
484
        self.target.generate_revision_history(self._last_revid,
485
            prev_last_revid)
0.247.6 by Michael Hudson
away with underscore prefixed local variables
486
        return head
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
487
0.200.726 by Jelmer Vernooij
Factor out conversion of branch names to refs.
488
    def update_revisions(self, stop_revision=None, overwrite=False,
489
                         graph=None):
0.247.7 by Michael Hudson
preserve the interface of update_revisions()
490
        """See InterBranch.update_revisions()."""
491
        self._update_revisions(stop_revision, overwrite, graph)
492
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
493
    def pull(self, overwrite=False, stop_revision=None,
494
             possible_transports=None, _hook_master=None, run_hooks=True,
0.247.2 by Michael Hudson
this works for my tests, but i'm pretty sure it's wrong in general
495
             _override_hook_target=None, local=False, limit=None):
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
496
        """See Branch.pull.
497
498
        :param _hook_master: Private parameter - set the branch to
499
            be supplied as the master to pull hooks.
500
        :param run_hooks: Private parameter - if false, this branch
501
            is being called because it's the master of the primary branch,
502
            so it should not run its hooks.
503
        :param _override_hook_target: Private parameter - set the branch to be
504
            supplied as the target_branch to pull hooks.
0.247.2 by Michael Hudson
this works for my tests, but i'm pretty sure it's wrong in general
505
        :param limit: Only import this many revisons.  `None`, the default,
506
            means import all revisions.
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
507
        """
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
508
        # This type of branch can't be bound.
509
        if local:
510
            raise errors.LocalRequiresBoundBranch()
0.200.342 by Jelmer Vernooij
Report git sha during pull.
511
        result = GitBranchPullResult()
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
512
        result.source_branch = self.source
513
        if _override_hook_target is None:
514
            result.target_branch = self.target
515
        else:
516
            result.target_branch = _override_hook_target
517
        self.source.lock_read()
518
        try:
519
            # We assume that during 'pull' the target repository is closer than
520
            # the source one.
521
            graph = self.target.repository.get_graph(self.source.repository)
0.200.726 by Jelmer Vernooij
Factor out conversion of branch names to refs.
522
            (result.old_revno, result.old_revid) = \
523
                self.target.last_revision_info()
0.247.7 by Michael Hudson
preserve the interface of update_revisions()
524
            result.new_git_head = self._update_revisions(
0.247.6 by Michael Hudson
away with underscore prefixed local variables
525
                stop_revision, overwrite=overwrite, graph=graph, limit=limit)
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
526
            result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
527
                overwrite)
0.200.726 by Jelmer Vernooij
Factor out conversion of branch names to refs.
528
            (result.new_revno, result.new_revid) = \
529
                self.target.last_revision_info()
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
530
            if _hook_master:
531
                result.master_branch = _hook_master
532
                result.local_branch = result.target_branch
533
            else:
534
                result.master_branch = result.target_branch
535
                result.local_branch = None
536
            if run_hooks:
537
                for hook in branch.Branch.hooks['post_pull']:
538
                    hook(result)
539
        finally:
540
            self.source.unlock()
541
        return result
542
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
543
    def _basic_push(self, overwrite=False, stop_revision=None):
544
        result = branch.BranchPushResult()
545
        result.source_branch = self.source
546
        result.target_branch = self.target
0.200.505 by Jelmer Vernooij
Remove duplicate code.
547
        graph = self.target.repository.get_graph(self.source.repository)
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
548
        result.old_revno, result.old_revid = self.target.last_revision_info()
0.247.8 by Michael Hudson
incredibly minor tweak
549
        result.new_git_head = self._update_revisions(
0.247.3 by Michael Hudson
oh, so it wasn't (particularly) wrong, but it was a bit obscure
550
            stop_revision, overwrite=overwrite, graph=graph)
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
551
        result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
552
            overwrite)
553
        result.new_revno, result.new_revid = self.target.last_revision_info()
554
        return result
555
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
556
0.200.512 by Jelmer Vernooij
Support pushing git->git.
557
class InterGitBranch(branch.GenericInterBranch):
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
558
    """InterBranch implementation that pulls between Git branches."""
559
0.200.512 by Jelmer Vernooij
Support pushing git->git.
560
561
class InterGitLocalRemoteBranch(InterGitBranch):
562
    """InterBranch that copies from a local to a remote git branch."""
563
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
564
    @staticmethod
565
    def _get_branch_formats_to_test():
566
        return []
567
0.200.512 by Jelmer Vernooij
Support pushing git->git.
568
    @classmethod
569
    def is_compatible(self, source, target):
570
        from bzrlib.plugins.git.remote import RemoteGitBranch
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
571
        return (isinstance(source, LocalGitBranch) and
0.200.512 by Jelmer Vernooij
Support pushing git->git.
572
                isinstance(target, RemoteGitBranch))
573
574
    def _basic_push(self, overwrite=False, stop_revision=None):
0.200.891 by Jelmer Vernooij
Use ZERO_SHA constant where possible.
575
        from dulwich.protocol import ZERO_SHA
0.200.512 by Jelmer Vernooij
Support pushing git->git.
576
        result = GitBranchPushResult()
577
        result.source_branch = self.source
578
        result.target_branch = self.target
579
        if stop_revision is None:
580
            stop_revision = self.source.last_revision()
581
        # FIXME: Check for diverged branches
582
        def get_changed_refs(old_refs):
0.252.44 by Jelmer Vernooij
Properly look up Bazaar revision ids for revision parents in case they are round-tripped.
583
            result.old_revid = self.target.lookup_foreign_revision_id(old_refs.get(self.target.ref, ZERO_SHA))
0.200.822 by Jelmer Vernooij
Fix indication of number of revisions pushed in dpush.
584
            refs = { self.target.ref: self.source.repository.lookup_bzr_revision_id(stop_revision)[0] }
0.200.512 by Jelmer Vernooij
Support pushing git->git.
585
            result.new_revid = stop_revision
586
            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.
587
                refs[tag_name_to_ref(name)] = sha
0.200.512 by Jelmer Vernooij
Support pushing git->git.
588
            return refs
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
589
        self.target.repository.send_pack(get_changed_refs,
0.200.726 by Jelmer Vernooij
Factor out conversion of branch names to refs.
590
            self.source.repository._git.object_store.generate_pack_contents)
0.200.512 by Jelmer Vernooij
Support pushing git->git.
591
        return result
592
593
594
class InterGitRemoteLocalBranch(InterGitBranch):
595
    """InterBranch that copies from a remote to a local git branch."""
596
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
597
    @staticmethod
598
    def _get_branch_formats_to_test():
599
        return []
600
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
601
    @classmethod
602
    def is_compatible(self, source, target):
603
        from bzrlib.plugins.git.remote import RemoteGitBranch
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
604
        return (isinstance(source, RemoteGitBranch) and
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
605
                isinstance(target, LocalGitBranch))
606
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
607
    def _basic_push(self, overwrite=False, stop_revision=None):
608
        result = branch.BranchPushResult()
609
        result.source_branch = self.source
610
        result.target_branch = self.target
611
        result.old_revid = self.target.last_revision()
612
        refs, stop_revision = self.update_refs(stop_revision)
613
        self.target.generate_revision_history(stop_revision, result.old_revid)
614
        self.update_tags(refs)
0.200.505 by Jelmer Vernooij
Remove duplicate code.
615
        result.new_revid = self.target.last_revision()
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
616
        return result
617
618
    def update_tags(self, refs):
0.200.648 by Jelmer Vernooij
Fix tag handling when encountering packed refs.
619
        for name, v in extract_tags(refs).iteritems():
0.252.44 by Jelmer Vernooij
Properly look up Bazaar revision ids for revision parents in case they are round-tripped.
620
            revid = self.target.lookup_foreign_revision_id(v)
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
621
            self.target.tags.set_tag(name, revid)
622
623
    def update_refs(self, stop_revision=None):
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
624
        interrepo = repository.InterRepository.get(self.source.repository,
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
625
            self.target.repository)
626
        if stop_revision is None:
0.200.940 by Jelmer Vernooij
Avoid confusion between different fetch functions with different semantics.
627
            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.
628
            stop_revision = self.target.lookup_foreign_revision_id(refs["HEAD"])
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
629
        else:
0.200.940 by Jelmer Vernooij
Avoid confusion between different fetch functions with different semantics.
630
            refs = interrepo.fetch(revision_id=stop_revision)
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
631
        return refs, stop_revision
632
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
633
    def pull(self, stop_revision=None, overwrite=False,
0.200.732 by Jelmer Vernooij
Support run_hooks argument to InterGitRemoteLocalBranch.pull().
634
        possible_transports=None, run_hooks=True,local=False):
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
635
        # This type of branch can't be bound.
636
        if local:
637
            raise errors.LocalRequiresBoundBranch()
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
638
        result = GitPullResult()
639
        result.source_branch = self.source
640
        result.target_branch = self.target
641
        result.old_revid = self.target.last_revision()
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
642
        refs, stop_revision = self.update_refs(stop_revision)
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
643
        self.target.generate_revision_history(stop_revision, result.old_revid)
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
644
        self.update_tags(refs)
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
645
        result.new_revid = self.target.last_revision()
646
        return result
647
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
648
0.200.960 by Jelmer Vernooij
Use GenericInterBranch.
649
class InterToGitBranch(branch.GenericInterBranch):
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
650
    """InterBranch implementation that pulls from Git into bzr."""
651
0.200.939 by Jelmer Vernooij
Use InterRepo directly.
652
    def __init__(self, source, target):
653
        super(InterToGitBranch, self).__init__(source, target)
654
        self.interrepo = repository.InterRepository.get(source.repository,
655
                                           target.repository)
656
0.200.631 by Jelmer Vernooij
Raise proper exception in Branch.get_stacked_on_url().
657
    @staticmethod
658
    def _get_branch_formats_to_test():
0.200.961 by Jelmer Vernooij
Cope with API changes to InterBranch._get_branch_formats_to_test.
659
        return []
0.200.631 by Jelmer Vernooij
Raise proper exception in Branch.get_stacked_on_url().
660
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
661
    @classmethod
662
    def is_compatible(self, source, target):
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
663
        return (not isinstance(source, GitBranch) and
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
664
                isinstance(target, GitBranch))
665
0.200.542 by Jelmer Vernooij
Proper error for push in 1.14.
666
    def update_revisions(self, *args, **kwargs):
667
        raise NoPushSupport()
668
0.252.38 by Jelmer Vernooij
Minor cleanups.
669
    def _get_new_refs(self, stop_revision=None):
670
        if stop_revision is None:
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
671
            (stop_revno, stop_revision) = self.source.last_revision_info()
0.200.969 by Jelmer Vernooij
Use tuples with bzr revid and git sha to avoid lookups.
672
        assert type(stop_revision) is str
0.200.916 by Jelmer Vernooij
Set refs/heads/master if no ref is set yet.
673
        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.
674
        refs = { main_ref: (None, stop_revision) }
0.252.37 by Jelmer Vernooij
Factor out some common code for finding refs to send.
675
        for name, revid in self.source.tags.get_tag_dict().iteritems():
676
            if self.source.repository.has_revision(revid):
0.200.969 by Jelmer Vernooij
Use tuples with bzr revid and git sha to avoid lookups.
677
                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.
678
        return refs, main_ref, (stop_revno, stop_revision)
0.252.37 by Jelmer Vernooij
Factor out some common code for finding refs to send.
679
0.252.36 by Jelmer Vernooij
Fix pull.
680
    def pull(self, overwrite=False, stop_revision=None, local=False,
681
             possible_transports=None):
682
        from dulwich.protocol import ZERO_SHA
683
        result = GitBranchPullResult()
684
        result.source_branch = self.source
685
        result.target_branch = self.target
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
686
        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.
687
        def update_refs(old_refs):
688
            refs = dict(old_refs)
0.200.945 by Jelmer Vernooij
Move fixmes
689
            # FIXME: Check for diverged branches
0.200.941 by Jelmer Vernooij
Pass update_refs argument to fetch_refs.
690
            refs.update(new_refs)
691
            return refs
692
        old_refs, new_refs = self.interrepo.fetch_refs(update_refs)
0.200.1042 by Jelmer Vernooij
Fix pull into git branches.
693
        (result.old_revid, old_sha1) = old_refs.get(main_ref, (ZERO_SHA, NULL_REVISION))
694
        if result.old_revid is None:
695
            result.old_revid = self.target.lookup_foreign_revision_id(old_sha1)
696
        result.new_revid = new_refs[main_ref][1]
0.252.36 by Jelmer Vernooij
Fix pull.
697
        return result
698
0.252.38 by Jelmer Vernooij
Minor cleanups.
699
    def push(self, overwrite=False, stop_revision=None,
0.200.472 by Jelmer Vernooij
Fix printing error when user attempts to push into git.
700
             _override_hook_source_branch=None):
0.252.5 by Jelmer Vernooij
enable 'bzr push'.
701
        from dulwich.protocol import ZERO_SHA
702
        result = GitBranchPushResult()
703
        result.source_branch = self.source
704
        result.target_branch = self.target
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
705
        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.
706
        def update_refs(old_refs):
707
            refs = dict(old_refs)
0.200.945 by Jelmer Vernooij
Move fixmes
708
            # FIXME: Check for diverged branches
0.200.941 by Jelmer Vernooij
Pass update_refs argument to fetch_refs.
709
            refs.update(new_refs)
710
            return refs
711
        old_refs, new_refs = self.interrepo.fetch_refs(update_refs)
0.200.1035 by Jelmer Vernooij
Cope with tuples in refs dictionary.
712
        (result.old_revid, old_sha1) = old_refs.get(main_ref, (ZERO_SHA, NULL_REVISION))
713
        if result.old_revid is None:
714
            result.old_revid = self.target.lookup_foreign_revision_id(old_sha1)
0.200.1042 by Jelmer Vernooij
Fix pull into git branches.
715
        result.new_revid = new_refs[main_ref][1]
0.252.5 by Jelmer Vernooij
enable 'bzr push'.
716
        return result
0.200.472 by Jelmer Vernooij
Fix printing error when user attempts to push into git.
717
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
718
    def lossy_push(self, stop_revision=None):
0.200.504 by Jelmer Vernooij
Lazily find revno's for git branches.
719
        result = GitBranchPushResult()
0.200.503 by Jelmer Vernooij
Remove dpull, return BranchPushResult in lossy_push.
720
        result.source_branch = self.source
721
        result.target_branch = self.target
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
722
        new_refs, main_ref, stop_revinfo = self._get_new_refs(stop_revision)
0.200.942 by Jelmer Vernooij
pass update_refs to dfetch_refs.
723
        def update_refs(old_refs):
724
            refs = dict(old_refs)
0.200.945 by Jelmer Vernooij
Move fixmes
725
            # FIXME: Check for diverged branches
0.200.942 by Jelmer Vernooij
pass update_refs to dfetch_refs.
726
            refs.update(new_refs)
727
            return refs
728
        result.revidmap, old_refs, new_refs = self.interrepo.dfetch_refs(
729
            update_refs)
0.200.969 by Jelmer Vernooij
Use tuples with bzr revid and git sha to avoid lookups.
730
        result.old_revid = old_refs.get(self.target.ref, (None, NULL_REVISION))[1]
731
        result.new_revid = new_refs[main_ref][1]
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
732
        (result.new_original_revno, result.new_original_revid) = stop_revinfo
0.200.503 by Jelmer Vernooij
Remove dpull, return BranchPushResult in lossy_push.
733
        return result
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
734
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
735
736
branch.InterBranch.register_optimiser(InterGitRemoteLocalBranch)
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
737
branch.InterBranch.register_optimiser(InterFromGitBranch)
738
branch.InterBranch.register_optimiser(InterToGitBranch)
0.200.512 by Jelmer Vernooij
Support pushing git->git.
739
branch.InterBranch.register_optimiser(InterGitLocalRemoteBranch)