/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.252 by Jelmer Vernooij
Clarify history, copyright.
2
# Copyright (C) 2009 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,
27
    config,
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
28
    errors,
0.200.327 by Jelmer Vernooij
merge new bzr-foreign.
29
    foreign,
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.261 by Jelmer Vernooij
More formatting fixes.
50
0.200.388 by Jelmer Vernooij
Support bzr 1.14 as well.
51
try:
52
    from bzrlib.foreign import ForeignBranch
53
except ImportError:
54
    class ForeignBranch(branch.Branch):
55
        def __init__(self, mapping):
56
            self.mapping = mapping
57
            super(ForeignBranch, self).__init__()
58
0.200.261 by Jelmer Vernooij
More formatting fixes.
59
0.200.462 by Jelmer Vernooij
Import tags when pulling.
60
def extract_tags(refs, mapping):
61
    ret = {}
62
    for k,v in refs.iteritems():
63
        if k.startswith("refs/tags/") and not k.endswith("^{}"):
64
            v = refs.get(k+"^{}", v)
65
            ret[k[len("refs/tags/"):]] = mapping.revision_id_foreign_to_bzr(v)
66
    return ret
67
68
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
69
class GitPullResult(branch.PullResult):
70
71
    def _lookup_revno(self, revid):
72
        assert isinstance(revid, str), "was %r" % revid
73
        # Try in source branch first, it'll be faster
74
        return self.target_branch.revision_id_to_revno(revid)
75
76
    @property
77
    def old_revno(self):
78
        return self._lookup_revno(self.old_revid)
79
80
    @property
81
    def new_revno(self):
82
        return self._lookup_revno(self.new_revid)
83
84
0.200.261 by Jelmer Vernooij
More formatting fixes.
85
class LocalGitTagDict(tag.BasicTags):
86
    """Dictionary with tags in a local repository."""
0.200.82 by Jelmer Vernooij
Support listing tags.
87
0.200.89 by Jelmer Vernooij
Support sprouting branches.
88
    def __init__(self, branch):
89
        self.branch = branch
90
        self.repository = branch.repository
0.200.82 by Jelmer Vernooij
Support listing tags.
91
92
    def get_tag_dict(self):
93
        ret = {}
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
94
        for k,v in self.repository._git.refs.as_dict("refs/tags").iteritems():
0.200.194 by Jelmer Vernooij
Look for commit object in heavyweight tags.
95
            obj = self.repository._git.get_object(v)
96
            while isinstance(obj, Tag):
97
                v = obj.object[1]
98
                obj = self.repository._git.get_object(v)
99
            if not isinstance(obj, Commit):
0.200.261 by Jelmer Vernooij
More formatting fixes.
100
                mutter("Tag %s points at object %r that is not a commit, "
101
                       "ignoring", k, obj)
0.200.194 by Jelmer Vernooij
Look for commit object in heavyweight tags.
102
                continue
0.200.180 by Jelmer Vernooij
Simplify tag handling.
103
            ret[k] = self.branch.mapping.revision_id_foreign_to_bzr(v)
0.200.82 by Jelmer Vernooij
Support listing tags.
104
        return ret
105
0.200.86 by Jelmer Vernooij
Clearer error when setting tags.
106
    def set_tag(self, name, revid):
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
107
        self.repository._git.refs["refs/tags/%s" % name], _ = \
0.200.462 by Jelmer Vernooij
Import tags when pulling.
108
            self.branch.mapping.revision_id_bzr_to_foreign(revid)
0.200.86 by Jelmer Vernooij
Clearer error when setting tags.
109
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
110
111
class GitBranchFormat(branch.BranchFormat):
112
0.200.70 by Jelmer Vernooij
Implement GitBranchFormat.get_format_description.
113
    def get_format_description(self):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
114
        return 'Git Branch'
115
0.200.82 by Jelmer Vernooij
Support listing tags.
116
    def supports_tags(self):
117
        return True
118
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
119
    def make_tags(self, branch):
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
120
        if getattr(branch.repository, "get_refs", None) is not None:
121
            from bzrlib.plugins.git.remote import RemoteGitTagDict
122
            return RemoteGitTagDict(branch)
0.200.261 by Jelmer Vernooij
More formatting fixes.
123
        else:
124
            return LocalGitTagDict(branch)
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
125
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
126
0.200.388 by Jelmer Vernooij
Support bzr 1.14 as well.
127
class GitBranch(ForeignBranch):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
128
    """An adapter to git repositories for bzr Branch objects."""
129
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
130
    def __init__(self, bzrdir, repository, name, lockfiles):
0.200.82 by Jelmer Vernooij
Support listing tags.
131
        self.repository = repository
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
132
        self._format = GitBranchFormat()
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
133
        self.control_files = lockfiles
0.200.59 by Jelmer Vernooij
Add more tests, fix revision history.
134
        self.bzrdir = bzrdir
0.231.1 by Jelmer Vernooij
Check that regenerated objects have the expected sha1.
135
        super(GitBranch, self).__init__(repository.get_mapping())
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
136
        self.name = name
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
137
        self._head = None
0.200.143 by Jelmer Vernooij
Reoncile InterGitRepository objects.
138
        self.base = bzrdir.transport.base
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
139
0.200.293 by Jelmer Vernooij
Fix branch nicks.
140
    def _get_nick(self, local=False, possible_master_transports=None):
141
        """Find the nick name for this branch.
142
143
        :return: Branch nick
144
        """
145
        return self.name
146
0.200.331 by Jelmer Vernooij
Add stub for setting nick function.
147
    def _set_nick(self, nick):
148
        raise NotImplementedError
149
150
    nick = property(_get_nick, _set_nick)
0.200.293 by Jelmer Vernooij
Fix branch nicks.
151
0.200.412 by Jelmer Vernooij
Implement GitBranch.__repr__.
152
    def __repr__(self):
153
        return "%s(%r, %r)" % (self.__class__.__name__, self.repository.base, self.name)
154
0.200.211 by Jelmer Vernooij
Add basic infrastructure for dpush.
155
    def dpull(self, source, stop_revision=None):
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
156
        return branch.InterBranch.get(source, self).lossy_push()
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
157
158
    def generate_revision_history(self, revid, old_revid=None):
159
        # FIXME: Check that old_revid is in the ancestry of revid
160
        newhead, self.mapping = self.mapping.revision_id_bzr_to_foreign(revid)
161
        self._set_head(newhead)
162
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
163
    def lock_write(self):
164
        self.control_files.lock_write()
165
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
166
    def get_stacked_on_url(self):
167
        # Git doesn't do stacking (yet...)
168
        return None
169
170
    def get_parent(self):
171
        """See Branch.get_parent()."""
0.200.312 by Jelmer Vernooij
Add notes about parent locations.
172
        # 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.
173
        return None
174
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
175
    def set_parent(self, url):
0.200.312 by Jelmer Vernooij
Add notes about parent locations.
176
        # FIXME: Set "origin" url in .git/config ?
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
177
        pass
178
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
179
    def lock_read(self):
180
        self.control_files.lock_read()
181
0.200.432 by Jelmer Vernooij
Support Branch.is_locked, required for loggerhead.
182
    def is_locked(self):
183
        return self.control_files.is_locked()
184
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
185
    def unlock(self):
186
        self.control_files.unlock()
187
188
    def get_physical_lock_status(self):
189
        return False
190
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
191
    @needs_read_lock
192
    def last_revision(self):
193
        # perhaps should escape this ?
0.200.57 by Jelmer Vernooij
Fix more tests.
194
        if self.head is None:
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
195
            return revision.NULL_REVISION
0.200.112 by Jelmer Vernooij
Fix the build.
196
        return self.mapping.revision_id_foreign_to_bzr(self.head)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
197
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
198
    def _basic_push(self, target, overwrite=False, stop_revision=None):
199
        return branch.InterBranch.get(self, target)._basic_push(
200
            overwrite, stop_revision)
201
0.200.465 by Jelmer Vernooij
Use dulwich standard functionality for finding missing revisions.
202
 
203
class LocalGitBranch(GitBranch):
204
    """A local Git branch."""
205
0.230.1 by Jelmer Vernooij
Support lightweight checkouts.
206
    def _get_checkout_format(self):
207
        """Return the most suitable metadir for a checkout of this branch.
208
        Weaves are used if this branch's repository uses weaves.
209
        """
210
        format = self.repository.bzrdir.checkout_metadir()
211
        format.set_branch_format(self._format)
212
        return format
213
0.200.261 by Jelmer Vernooij
More formatting fixes.
214
    def create_checkout(self, to_location, revision_id=None, lightweight=False,
215
        accelerator_tree=None, hardlink=False):
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
216
        if lightweight:
0.230.1 by Jelmer Vernooij
Support lightweight checkouts.
217
            t = transport.get_transport(to_location)
218
            t.ensure_base()
219
            format = self._get_checkout_format()
220
            checkout = format.initialize_on_transport(t)
221
            from_branch = branch.BranchReferenceFormat().initialize(checkout, 
222
                self)
223
            tree = checkout.create_workingtree(revision_id,
224
                from_branch=from_branch, hardlink=hardlink)
225
            return tree
226
        else:
227
            return self._create_heavyweight_checkout(to_location, revision_id,
0.200.261 by Jelmer Vernooij
More formatting fixes.
228
            hardlink)
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
229
230
    def _create_heavyweight_checkout(self, to_location, revision_id=None, 
231
                                     hardlink=False):
232
        """Create a new heavyweight checkout of this branch.
233
234
        :param to_location: URL of location to create the new checkout in.
235
        :param revision_id: Revision that should be the tip of the checkout.
236
        :param hardlink: Whether to hardlink
237
        :return: WorkingTree object of checkout.
238
        """
239
        checkout_branch = BzrDir.create_branch_convenience(
240
            to_location, force_new_tree=False, format=get_rich_root_format())
241
        checkout = checkout_branch.bzrdir
242
        checkout_branch.bind(self)
243
        # pull up to the specified revision_id to set the initial 
244
        # branch tip correctly, and seed it with history.
245
        checkout_branch.pull(self, stop_revision=revision_id)
246
        return checkout.create_workingtree(revision_id, hardlink=hardlink)
247
0.200.57 by Jelmer Vernooij
Fix more tests.
248
    def _gen_revision_history(self):
0.200.58 by Jelmer Vernooij
Fix remaining tests.
249
        if self.head is None:
250
            return []
0.200.261 by Jelmer Vernooij
More formatting fixes.
251
        ret = list(self.repository.iter_reverse_revision_history(
252
            self.last_revision()))
0.200.59 by Jelmer Vernooij
Add more tests, fix revision history.
253
        ret.reverse()
0.200.57 by Jelmer Vernooij
Fix more tests.
254
        return ret
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
255
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
256
    def _get_head(self):
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
257
        try:
258
            return self.repository._git.ref(self.name)
259
        except KeyError:
260
            return None
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
261
262
    def _set_head(self, value):
263
        self._head = value
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
264
        self.repository._git.refs[self.name] = self._head
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
265
        self._clear_cached_state()
266
267
    head = property(_get_head, _set_head)
268
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
269
    def get_config(self):
270
        return GitBranchConfig(self)
271
272
    def get_push_location(self):
273
        """See Branch.get_push_location."""
274
        push_loc = self.get_config().get_user_option('push_location')
275
        return push_loc
276
277
    def set_push_location(self, location):
278
        """See Branch.set_push_location."""
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
279
        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.
280
                                          store=config.STORE_LOCATION)
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
281
282
    def supports_tags(self):
0.200.82 by Jelmer Vernooij
Support listing tags.
283
        return True
0.200.96 by Jelmer Vernooij
Fix branch.
284
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
285
0.200.342 by Jelmer Vernooij
Report git sha during pull.
286
class GitBranchPullResult(branch.PullResult):
287
288
    def report(self, to_file):
289
        if not is_quiet():
290
            if self.old_revid == self.new_revid:
291
                to_file.write('No revisions to pull.\n')
292
            else:
293
                to_file.write('Now on revision %d (git sha: %s).\n' % 
294
                        (self.new_revno, self.new_git_head))
295
        self._show_tag_conficts(to_file)
296
297
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
298
class InterFromGitBranch(branch.GenericInterBranch):
0.200.261 by Jelmer Vernooij
More formatting fixes.
299
    """InterBranch implementation that pulls from Git into bzr."""
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
300
301
    @classmethod
302
    def is_compatible(self, source, target):
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
303
        return (isinstance(source, GitBranch) and 
304
                not isinstance(target, GitBranch))
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
305
306
    def update_revisions(self, stop_revision=None, overwrite=False,
307
        graph=None):
308
        """See InterBranch.update_revisions()."""
0.226.2 by Jelmer Vernooij
Cope with new fetch_spec argument.
309
        interrepo = repository.InterRepository.get(self.source.repository, 
310
            self.target.repository)
0.200.342 by Jelmer Vernooij
Report git sha during pull.
311
        self._head = None
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
312
        self._last_revid = None
313
        def determine_wants(heads):
314
            if not self.source.name in heads:
0.200.278 by Jelmer Vernooij
Update branch head appropriately during dpull.
315
                raise NoSuchRef(self.source.name, heads.keys())
0.200.314 by Jelmer Vernooij
Support stop_revision.
316
            if stop_revision is not None:
317
                self._last_revid = stop_revision
0.200.342 by Jelmer Vernooij
Report git sha during pull.
318
                self._head, mapping = self.source.repository.lookup_git_revid(
0.200.316 by Jelmer Vernooij
Fix formatting.
319
                    stop_revision)
0.200.314 by Jelmer Vernooij
Support stop_revision.
320
            else:
0.200.342 by Jelmer Vernooij
Report git sha during pull.
321
                self._head = heads[self.source.name]
0.200.316 by Jelmer Vernooij
Fix formatting.
322
                self._last_revid = \
0.200.342 by Jelmer Vernooij
Report git sha during pull.
323
                    self.source.mapping.revision_id_foreign_to_bzr(self._head)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
324
            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.
325
                return []
0.200.342 by Jelmer Vernooij
Report git sha during pull.
326
            return [self._head]
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
327
        interrepo.fetch_objects(determine_wants, self.source.mapping)
0.200.313 by Jelmer Vernooij
Support overwrite parameter.
328
        if overwrite:
0.200.314 by Jelmer Vernooij
Support stop_revision.
329
            prev_last_revid = None
0.200.313 by Jelmer Vernooij
Support overwrite parameter.
330
        else:
0.200.314 by Jelmer Vernooij
Support stop_revision.
331
            prev_last_revid = self.target.last_revision()
332
        self.target.generate_revision_history(self._last_revid, prev_last_revid)
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
333
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
334
    def pull(self, overwrite=False, stop_revision=None,
335
             possible_transports=None, _hook_master=None, run_hooks=True,
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
336
             _override_hook_target=None, local=False):
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
337
        """See Branch.pull.
338
339
        :param _hook_master: Private parameter - set the branch to
340
            be supplied as the master to pull hooks.
341
        :param run_hooks: Private parameter - if false, this branch
342
            is being called because it's the master of the primary branch,
343
            so it should not run its hooks.
344
        :param _override_hook_target: Private parameter - set the branch to be
345
            supplied as the target_branch to pull hooks.
346
        """
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
347
        # This type of branch can't be bound.
348
        if local:
349
            raise errors.LocalRequiresBoundBranch()
0.200.342 by Jelmer Vernooij
Report git sha during pull.
350
        result = GitBranchPullResult()
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
351
        result.source_branch = self.source
352
        if _override_hook_target is None:
353
            result.target_branch = self.target
354
        else:
355
            result.target_branch = _override_hook_target
356
        self.source.lock_read()
357
        try:
358
            # We assume that during 'pull' the target repository is closer than
359
            # the source one.
360
            graph = self.target.repository.get_graph(self.source.repository)
361
            result.old_revno, result.old_revid = \
362
                self.target.last_revision_info()
0.200.342 by Jelmer Vernooij
Report git sha during pull.
363
            self.update_revisions(stop_revision, overwrite=overwrite, 
364
                graph=graph)
365
            result.new_git_head = self._head
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
366
            result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
367
                overwrite)
368
            result.new_revno, result.new_revid = self.target.last_revision_info()
369
            if _hook_master:
370
                result.master_branch = _hook_master
371
                result.local_branch = result.target_branch
372
            else:
373
                result.master_branch = result.target_branch
374
                result.local_branch = None
375
            if run_hooks:
376
                for hook in branch.Branch.hooks['post_pull']:
377
                    hook(result)
378
        finally:
379
            self.source.unlock()
380
        return result
381
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
382
    def _basic_push(self, overwrite=False, stop_revision=None):
383
        result = branch.BranchPushResult()
384
        result.source_branch = self.source
385
        result.target_branch = self.target
386
        result.old_revno, result.old_revid = self.target.last_revision_info()
387
        graph = self.target.repository.get_graph(self.source.repository)
388
        result.old_revno, result.old_revid = \
389
            self.target.last_revision_info()
390
        self.update_revisions(stop_revision, overwrite=overwrite, 
391
            graph=graph)
392
        result.new_git_head = self._head
393
        result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
394
            overwrite)
395
        result.new_revno, result.new_revid = self.target.last_revision_info()
396
        return result
397
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
398
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
399
class InterGitRemoteLocalBranch(branch.InterBranch):
400
    """InterBranch implementation that pulls between Git branches."""
401
402
    @classmethod
403
    def is_compatible(self, source, target):
404
        from bzrlib.plugins.git.remote import RemoteGitBranch
405
        return (isinstance(source, RemoteGitBranch) and 
406
                isinstance(target, LocalGitBranch))
407
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
408
    def _basic_push(self, overwrite=False, stop_revision=None):
409
        result = branch.BranchPushResult()
410
        result.source_branch = self.source
411
        result.target_branch = self.target
412
        result.old_revid = self.target.last_revision()
413
        refs, stop_revision = self.update_refs(stop_revision)
414
        self.target.generate_revision_history(stop_revision, result.old_revid)
415
        self.update_tags(refs)
416
        result.new_revid = target.last_revision()
417
        return result
418
419
    def update_tags(self, refs):
420
        for name, revid in extract_tags(refs, self.target.mapping).iteritems():
421
            self.target.tags.set_tag(name, revid)
422
423
    def update_refs(self, stop_revision=None):
424
        interrepo = repository.InterRepository.get(self.source.repository, 
425
            self.target.repository)
426
        if stop_revision is None:
427
            refs = interrepo.fetch_refs(branches=["HEAD"])
428
            stop_revision = self.target.mapping.revision_id_foreign_to_bzr(refs["HEAD"])
429
        else:
430
            refs = interrepo.fetch_refs(revision_id=stop_revision)
431
        return refs, stop_revision
432
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
433
    def pull(self, stop_revision=None, overwrite=False, 
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
434
        possible_transports=None, local=False):
435
        # This type of branch can't be bound.
436
        if local:
437
            raise errors.LocalRequiresBoundBranch()
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
438
        result = GitPullResult()
439
        result.source_branch = self.source
440
        result.target_branch = self.target
441
        result.old_revid = self.target.last_revision()
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
442
        refs, stop_revision = self.update_refs(stop_revision)
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
443
        self.target.generate_revision_history(stop_revision, result.old_revid)
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
444
        self.update_tags(refs)
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
445
        result.new_revid = self.target.last_revision()
446
        return result
447
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
448
    
449
class InterToGitBranch(branch.InterBranch):
450
    """InterBranch implementation that pulls from Git into bzr."""
451
452
    @classmethod
453
    def is_compatible(self, source, target):
454
        return (not isinstance(source, GitBranch) and 
455
                isinstance(target, GitBranch))
456
0.200.472 by Jelmer Vernooij
Fix printing error when user attempts to push into git.
457
    def push(self, overwrite=True, stop_revision=None, 
458
             _override_hook_source_branch=None):
459
        raise NoPushSupport()
460
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
461
    def lossy_push(self, stop_revision=None):
462
        if stop_revision is None:
463
            stop_revision = self.source.last_revision()
464
        # FIXME: Check for diverged branches
465
        refs = { "refs/heads/master": stop_revision }
466
        for name, revid in self.source.tags.get_tag_dict().iteritems():
467
            if self.source.repository.has_revision(revid):
468
                refs["refs/tags/%s" % name] = revid
469
        revidmap, new_refs = self.target.repository.dfetch_refs(
470
            self.source.repository, refs)
471
        if revidmap != {}:
472
            self.target.generate_revision_history(revidmap[stop_revision])
473
        return revidmap
474
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
475
476
branch.InterBranch.register_optimiser(InterGitRemoteLocalBranch)
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
477
branch.InterBranch.register_optimiser(InterFromGitBranch)
478
branch.InterBranch.register_optimiser(InterToGitBranch)