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