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