/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,
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.513 by Jelmer Vernooij
Fix imports.
43
from bzrlib.plugins.git import (
44
    get_rich_root_format,
45
    )
0.200.386 by Jelmer Vernooij
Move config to a separate file, support BranchConfig.username().
46
from bzrlib.plugins.git.config import (
47
    GitBranchConfig,
48
    )
0.200.278 by Jelmer Vernooij
Update branch head appropriately during dpull.
49
from bzrlib.plugins.git.errors import (
0.200.472 by Jelmer Vernooij
Fix printing error when user attempts to push into git.
50
    NoPushSupport,
0.200.278 by Jelmer Vernooij
Update branch head appropriately during dpull.
51
    NoSuchRef,
52
    )
0.200.261 by Jelmer Vernooij
More formatting fixes.
53
0.238.5 by Jelmer Vernooij
Remove old backwards compatibility code.
54
from bzrlib.foreign import ForeignBranch
0.200.388 by Jelmer Vernooij
Support bzr 1.14 as well.
55
0.200.261 by Jelmer Vernooij
More formatting fixes.
56
0.200.648 by Jelmer Vernooij
Fix tag handling when encountering packed refs.
57
def extract_tags(refs):
0.200.462 by Jelmer Vernooij
Import tags when pulling.
58
    ret = {}
59
    for k,v in refs.iteritems():
60
        if k.startswith("refs/tags/") and not k.endswith("^{}"):
61
            v = refs.get(k+"^{}", v)
0.200.648 by Jelmer Vernooij
Fix tag handling when encountering packed refs.
62
            ret[k[len("refs/tags/"):]] = v
0.200.462 by Jelmer Vernooij
Import tags when pulling.
63
    return ret
64
65
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
66
class GitPullResult(branch.PullResult):
67
68
    def _lookup_revno(self, revid):
69
        assert isinstance(revid, str), "was %r" % revid
70
        # Try in source branch first, it'll be faster
71
        return self.target_branch.revision_id_to_revno(revid)
72
73
    @property
74
    def old_revno(self):
75
        return self._lookup_revno(self.old_revid)
76
77
    @property
78
    def new_revno(self):
79
        return self._lookup_revno(self.new_revid)
80
81
0.200.261 by Jelmer Vernooij
More formatting fixes.
82
class LocalGitTagDict(tag.BasicTags):
83
    """Dictionary with tags in a local repository."""
0.200.82 by Jelmer Vernooij
Support listing tags.
84
0.200.89 by Jelmer Vernooij
Support sprouting branches.
85
    def __init__(self, branch):
86
        self.branch = branch
87
        self.repository = branch.repository
0.200.82 by Jelmer Vernooij
Support listing tags.
88
89
    def get_tag_dict(self):
90
        ret = {}
0.200.648 by Jelmer Vernooij
Fix tag handling when encountering packed refs.
91
        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.
92
            try:
0.200.647 by Jelmer Vernooij
Fix use of packed refs.
93
                obj = self.repository._git[v]
0.200.609 by Jelmer Vernooij
Cope with tags pointing at nonexisting objects.
94
            except KeyError:
95
                mutter("Tag %s points at unknown object %s, ignoring", v, obj)
96
                continue
0.200.194 by Jelmer Vernooij
Look for commit object in heavyweight tags.
97
            while isinstance(obj, Tag):
98
                v = obj.object[1]
0.200.647 by Jelmer Vernooij
Fix use of packed refs.
99
                obj = self.repository._git[v]
0.200.194 by Jelmer Vernooij
Look for commit object in heavyweight tags.
100
            if not isinstance(obj, Commit):
0.200.261 by Jelmer Vernooij
More formatting fixes.
101
                mutter("Tag %s points at object %r that is not a commit, "
102
                       "ignoring", k, obj)
0.200.194 by Jelmer Vernooij
Look for commit object in heavyweight tags.
103
                continue
0.200.180 by Jelmer Vernooij
Simplify tag handling.
104
            ret[k] = self.branch.mapping.revision_id_foreign_to_bzr(v)
0.200.82 by Jelmer Vernooij
Support listing tags.
105
        return ret
106
0.200.86 by Jelmer Vernooij
Clearer error when setting tags.
107
    def set_tag(self, name, revid):
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
108
        self.repository._git.refs["refs/tags/%s" % name], _ = \
0.200.462 by Jelmer Vernooij
Import tags when pulling.
109
            self.branch.mapping.revision_id_bzr_to_foreign(revid)
0.200.86 by Jelmer Vernooij
Clearer error when setting tags.
110
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
111
0.239.1 by Jelmer Vernooij
Avoid re-connecting to fetch tags we already know.
112
class DictTagDict(LocalGitTagDict):
113
114
115
    def __init__(self, branch, tags):
116
        super(DictTagDict, self).__init__(branch)
117
        self._tags = tags
118
119
    def get_tag_dict(self):
120
        return self._tags
121
122
123
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
124
class GitBranchFormat(branch.BranchFormat):
125
0.200.70 by Jelmer Vernooij
Implement GitBranchFormat.get_format_description.
126
    def get_format_description(self):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
127
        return 'Git Branch'
128
0.243.1 by Jelmer Vernooij
Use foreign branch testing infrastructure.
129
    def network_name(self):
130
        return "git"
131
0.200.82 by Jelmer Vernooij
Support listing tags.
132
    def supports_tags(self):
133
        return True
134
0.243.1 by Jelmer Vernooij
Use foreign branch testing infrastructure.
135
    def get_foreign_tests_branch_factory(self):
136
        from bzrlib.plugins.git.tests.test_branch import ForeignTestsBranchFactory
137
        return ForeignTestsBranchFactory()
138
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
139
    def make_tags(self, branch):
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
140
        if getattr(branch.repository, "get_refs", None) is not None:
141
            from bzrlib.plugins.git.remote import RemoteGitTagDict
142
            return RemoteGitTagDict(branch)
0.200.261 by Jelmer Vernooij
More formatting fixes.
143
        else:
144
            return LocalGitTagDict(branch)
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
145
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
146
0.200.388 by Jelmer Vernooij
Support bzr 1.14 as well.
147
class GitBranch(ForeignBranch):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
148
    """An adapter to git repositories for bzr Branch objects."""
149
0.239.1 by Jelmer Vernooij
Avoid re-connecting to fetch tags we already know.
150
    def __init__(self, bzrdir, repository, name, lockfiles, tagsdict=None):
0.200.82 by Jelmer Vernooij
Support listing tags.
151
        self.repository = repository
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
152
        self._format = GitBranchFormat()
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
153
        self.control_files = lockfiles
0.200.59 by Jelmer Vernooij
Add more tests, fix revision history.
154
        self.bzrdir = bzrdir
0.231.1 by Jelmer Vernooij
Check that regenerated objects have the expected sha1.
155
        super(GitBranch, self).__init__(repository.get_mapping())
0.239.1 by Jelmer Vernooij
Avoid re-connecting to fetch tags we already know.
156
        if tagsdict is not None:
157
            self.tags = DictTagDict(self, tagsdict)
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
158
        self.name = name
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
159
        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.
160
        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.
161
0.239.8 by Jelmer Vernooij
Support checkouts.
162
    def _get_checkout_format(self):
163
        """Return the most suitable metadir for a checkout of this branch.
164
        Weaves are used if this branch's repository uses weaves.
165
        """
166
        return get_rich_root_format()
167
0.238.3 by Jelmer Vernooij
Remove svn references, prefer git send format when submitting changes against a git branch.
168
    def get_child_submit_format(self):
169
        """Return the preferred format of submissions to this branch."""
170
        ret = self.get_config().get_user_option("child_submit_format")
171
        if ret is not None:
172
            return ret
173
        return "git"
174
0.200.293 by Jelmer Vernooij
Fix branch nicks.
175
    def _get_nick(self, local=False, possible_master_transports=None):
176
        """Find the nick name for this branch.
177
178
        :return: Branch nick
179
        """
180
        return self.name
181
0.200.331 by Jelmer Vernooij
Add stub for setting nick function.
182
    def _set_nick(self, nick):
183
        raise NotImplementedError
184
185
    nick = property(_get_nick, _set_nick)
0.200.293 by Jelmer Vernooij
Fix branch nicks.
186
0.200.412 by Jelmer Vernooij
Implement GitBranch.__repr__.
187
    def __repr__(self):
188
        return "%s(%r, %r)" % (self.__class__.__name__, self.repository.base, self.name)
189
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
190
    def generate_revision_history(self, revid, old_revid=None):
191
        # FIXME: Check that old_revid is in the ancestry of revid
192
        newhead, self.mapping = self.mapping.revision_id_bzr_to_foreign(revid)
193
        self._set_head(newhead)
194
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
195
    def lock_write(self):
196
        self.control_files.lock_write()
197
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
198
    def get_stacked_on_url(self):
199
        # Git doesn't do stacking (yet...)
0.200.631 by Jelmer Vernooij
Raise proper exception in Branch.get_stacked_on_url().
200
        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.
201
202
    def get_parent(self):
203
        """See Branch.get_parent()."""
0.200.312 by Jelmer Vernooij
Add notes about parent locations.
204
        # 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.
205
        return None
206
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
207
    def set_parent(self, url):
0.200.312 by Jelmer Vernooij
Add notes about parent locations.
208
        # FIXME: Set "origin" url in .git/config ?
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
209
        pass
210
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
211
    def lock_read(self):
212
        self.control_files.lock_read()
213
0.200.432 by Jelmer Vernooij
Support Branch.is_locked, required for loggerhead.
214
    def is_locked(self):
215
        return self.control_files.is_locked()
216
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
217
    def unlock(self):
218
        self.control_files.unlock()
219
220
    def get_physical_lock_status(self):
221
        return False
222
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
223
    @needs_read_lock
224
    def last_revision(self):
225
        # perhaps should escape this ?
0.200.57 by Jelmer Vernooij
Fix more tests.
226
        if self.head is None:
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
227
            return revision.NULL_REVISION
0.200.112 by Jelmer Vernooij
Fix the build.
228
        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.
229
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
230
    def _basic_push(self, target, overwrite=False, stop_revision=None):
231
        return branch.InterBranch.get(self, target)._basic_push(
232
            overwrite, stop_revision)
233
0.200.692 by Jelmer Vernooij
Refuse pulling into non-rich-root branches rather than erroring out with an AttributeError.
234
0.200.465 by Jelmer Vernooij
Use dulwich standard functionality for finding missing revisions.
235
class LocalGitBranch(GitBranch):
236
    """A local Git branch."""
237
0.200.261 by Jelmer Vernooij
More formatting fixes.
238
    def create_checkout(self, to_location, revision_id=None, lightweight=False,
239
        accelerator_tree=None, hardlink=False):
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
240
        if lightweight:
0.230.1 by Jelmer Vernooij
Support lightweight checkouts.
241
            t = transport.get_transport(to_location)
242
            t.ensure_base()
243
            format = self._get_checkout_format()
244
            checkout = format.initialize_on_transport(t)
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
245
            from_branch = branch.BranchReferenceFormat().initialize(checkout,
0.230.1 by Jelmer Vernooij
Support lightweight checkouts.
246
                self)
247
            tree = checkout.create_workingtree(revision_id,
248
                from_branch=from_branch, hardlink=hardlink)
249
            return tree
250
        else:
251
            return self._create_heavyweight_checkout(to_location, revision_id,
0.200.261 by Jelmer Vernooij
More formatting fixes.
252
            hardlink)
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
253
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
254
    def _create_heavyweight_checkout(self, to_location, revision_id=None,
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
255
                                     hardlink=False):
256
        """Create a new heavyweight checkout of this branch.
257
258
        :param to_location: URL of location to create the new checkout in.
259
        :param revision_id: Revision that should be the tip of the checkout.
260
        :param hardlink: Whether to hardlink
261
        :return: WorkingTree object of checkout.
262
        """
0.200.513 by Jelmer Vernooij
Fix imports.
263
        checkout_branch = bzrdir.BzrDir.create_branch_convenience(
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
264
            to_location, force_new_tree=False, format=get_rich_root_format())
265
        checkout = checkout_branch.bzrdir
266
        checkout_branch.bind(self)
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
267
        # 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.
268
        # branch tip correctly, and seed it with history.
269
        checkout_branch.pull(self, stop_revision=revision_id)
270
        return checkout.create_workingtree(revision_id, hardlink=hardlink)
271
0.200.57 by Jelmer Vernooij
Fix more tests.
272
    def _gen_revision_history(self):
0.200.58 by Jelmer Vernooij
Fix remaining tests.
273
        if self.head is None:
274
            return []
0.200.261 by Jelmer Vernooij
More formatting fixes.
275
        ret = list(self.repository.iter_reverse_revision_history(
276
            self.last_revision()))
0.200.59 by Jelmer Vernooij
Add more tests, fix revision history.
277
        ret.reverse()
0.200.57 by Jelmer Vernooij
Fix more tests.
278
        return ret
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
279
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
280
    def _get_head(self):
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
281
        try:
282
            return self.repository._git.ref(self.name)
283
        except KeyError:
284
            return None
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
285
0.200.507 by Jelmer Vernooij
Implement set_last_revision{_info,}.
286
    def set_last_revision_info(self, revno, revid):
287
        self.set_last_revision(revid)
288
289
    def set_last_revision(self, revid):
0.200.523 by Jelmer Vernooij
Fix undefined error.
290
        (newhead, self.mapping) = self.mapping.revision_id_bzr_to_foreign(
0.200.507 by Jelmer Vernooij
Implement set_last_revision{_info,}.
291
                revid)
0.200.523 by Jelmer Vernooij
Fix undefined error.
292
        self.head = newhead
0.200.507 by Jelmer Vernooij
Implement set_last_revision{_info,}.
293
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
294
    def _set_head(self, value):
295
        self._head = value
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
296
        self.repository._git.refs[self.name] = self._head
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
297
        self._clear_cached_state()
298
299
    head = property(_get_head, _set_head)
300
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
301
    def get_config(self):
302
        return GitBranchConfig(self)
303
304
    def get_push_location(self):
305
        """See Branch.get_push_location."""
306
        push_loc = self.get_config().get_user_option('push_location')
307
        return push_loc
308
309
    def set_push_location(self, location):
310
        """See Branch.set_push_location."""
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
311
        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.
312
                                          store=config.STORE_LOCATION)
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
313
314
    def supports_tags(self):
0.200.82 by Jelmer Vernooij
Support listing tags.
315
        return True
0.200.96 by Jelmer Vernooij
Fix branch.
316
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
317
0.200.342 by Jelmer Vernooij
Report git sha during pull.
318
class GitBranchPullResult(branch.PullResult):
319
320
    def report(self, to_file):
321
        if not is_quiet():
322
            if self.old_revid == self.new_revid:
323
                to_file.write('No revisions to pull.\n')
324
            else:
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
325
                to_file.write('Now on revision %d (git sha: %s).\n' %
0.200.342 by Jelmer Vernooij
Report git sha during pull.
326
                        (self.new_revno, self.new_git_head))
327
        self._show_tag_conficts(to_file)
328
329
0.200.504 by Jelmer Vernooij
Lazily find revno's for git branches.
330
class GitBranchPushResult(branch.BranchPushResult):
331
332
    def _lookup_revno(self, revid):
333
        assert isinstance(revid, str), "was %r" % revid
334
        # Try in source branch first, it'll be faster
335
        try:
336
            return self.source_branch.revision_id_to_revno(revid)
0.200.523 by Jelmer Vernooij
Fix undefined error.
337
        except errors.NoSuchRevision:
0.200.504 by Jelmer Vernooij
Lazily find revno's for git branches.
338
            # FIXME: Check using graph.find_distance_to_null() ?
339
            return self.target_branch.revision_id_to_revno(revid)
340
341
    @property
342
    def old_revno(self):
343
        return self._lookup_revno(self.old_revid)
344
345
    @property
346
    def new_revno(self):
347
        return self._lookup_revno(self.new_revid)
348
349
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
350
class InterFromGitBranch(branch.GenericInterBranch):
0.200.261 by Jelmer Vernooij
More formatting fixes.
351
    """InterBranch implementation that pulls from Git into bzr."""
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
352
353
    @classmethod
0.200.692 by Jelmer Vernooij
Refuse pulling into non-rich-root branches rather than erroring out with an AttributeError.
354
    def _get_interrepo(self, source, target):
355
        return repository.InterRepository.get(source.repository,
356
            target.repository)
357
358
    @classmethod
359
    def is_compatible(cls, source, target):
360
        return (isinstance(source, GitBranch) and
361
                not isinstance(target, GitBranch) and
362
                (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.
363
364
    def update_revisions(self, stop_revision=None, overwrite=False,
365
        graph=None):
366
        """See InterBranch.update_revisions()."""
0.200.692 by Jelmer Vernooij
Refuse pulling into non-rich-root branches rather than erroring out with an AttributeError.
367
        interrepo = self._get_interrepo(self.source, self.target)
0.200.342 by Jelmer Vernooij
Report git sha during pull.
368
        self._head = None
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
369
        self._last_revid = None
370
        def determine_wants(heads):
371
            if not self.source.name in heads:
0.200.278 by Jelmer Vernooij
Update branch head appropriately during dpull.
372
                raise NoSuchRef(self.source.name, heads.keys())
0.200.314 by Jelmer Vernooij
Support stop_revision.
373
            if stop_revision is not None:
374
                self._last_revid = stop_revision
0.200.650 by Jelmer Vernooij
Use standard names for lookup functions.
375
                self._head, mapping = self.source.repository.lookup_bzr_revision_id(
0.200.316 by Jelmer Vernooij
Fix formatting.
376
                    stop_revision)
0.200.314 by Jelmer Vernooij
Support stop_revision.
377
            else:
0.200.342 by Jelmer Vernooij
Report git sha during pull.
378
                self._head = heads[self.source.name]
0.200.316 by Jelmer Vernooij
Fix formatting.
379
                self._last_revid = \
0.200.342 by Jelmer Vernooij
Report git sha during pull.
380
                    self.source.mapping.revision_id_foreign_to_bzr(self._head)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
381
            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.
382
                return []
0.200.342 by Jelmer Vernooij
Report git sha during pull.
383
            return [self._head]
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
384
        interrepo.fetch_objects(determine_wants, self.source.mapping)
0.200.313 by Jelmer Vernooij
Support overwrite parameter.
385
        if overwrite:
0.200.314 by Jelmer Vernooij
Support stop_revision.
386
            prev_last_revid = None
0.200.313 by Jelmer Vernooij
Support overwrite parameter.
387
        else:
0.200.314 by Jelmer Vernooij
Support stop_revision.
388
            prev_last_revid = self.target.last_revision()
389
        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.
390
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
391
    def pull(self, overwrite=False, stop_revision=None,
392
             possible_transports=None, _hook_master=None, run_hooks=True,
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
393
             _override_hook_target=None, local=False):
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
394
        """See Branch.pull.
395
396
        :param _hook_master: Private parameter - set the branch to
397
            be supplied as the master to pull hooks.
398
        :param run_hooks: Private parameter - if false, this branch
399
            is being called because it's the master of the primary branch,
400
            so it should not run its hooks.
401
        :param _override_hook_target: Private parameter - set the branch to be
402
            supplied as the target_branch to pull hooks.
403
        """
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
404
        # This type of branch can't be bound.
405
        if local:
406
            raise errors.LocalRequiresBoundBranch()
0.200.342 by Jelmer Vernooij
Report git sha during pull.
407
        result = GitBranchPullResult()
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
408
        result.source_branch = self.source
409
        if _override_hook_target is None:
410
            result.target_branch = self.target
411
        else:
412
            result.target_branch = _override_hook_target
413
        self.source.lock_read()
414
        try:
415
            # We assume that during 'pull' the target repository is closer than
416
            # the source one.
417
            graph = self.target.repository.get_graph(self.source.repository)
418
            result.old_revno, result.old_revid = \
419
                self.target.last_revision_info()
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
420
            self.update_revisions(stop_revision, overwrite=overwrite,
0.200.342 by Jelmer Vernooij
Report git sha during pull.
421
                graph=graph)
422
            result.new_git_head = self._head
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
423
            result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
424
                overwrite)
425
            result.new_revno, result.new_revid = self.target.last_revision_info()
426
            if _hook_master:
427
                result.master_branch = _hook_master
428
                result.local_branch = result.target_branch
429
            else:
430
                result.master_branch = result.target_branch
431
                result.local_branch = None
432
            if run_hooks:
433
                for hook in branch.Branch.hooks['post_pull']:
434
                    hook(result)
435
        finally:
436
            self.source.unlock()
437
        return result
438
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
439
    def _basic_push(self, overwrite=False, stop_revision=None):
440
        result = branch.BranchPushResult()
441
        result.source_branch = self.source
442
        result.target_branch = self.target
0.200.505 by Jelmer Vernooij
Remove duplicate code.
443
        graph = self.target.repository.get_graph(self.source.repository)
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
444
        result.old_revno, result.old_revid = self.target.last_revision_info()
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
445
        self.update_revisions(stop_revision, overwrite=overwrite, graph=graph)
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
446
        result.new_git_head = self._head
447
        result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
448
            overwrite)
449
        result.new_revno, result.new_revid = self.target.last_revision_info()
450
        return result
451
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
452
0.200.512 by Jelmer Vernooij
Support pushing git->git.
453
class InterGitBranch(branch.GenericInterBranch):
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
454
    """InterBranch implementation that pulls between Git branches."""
455
0.200.512 by Jelmer Vernooij
Support pushing git->git.
456
457
class InterGitLocalRemoteBranch(InterGitBranch):
458
    """InterBranch that copies from a local to a remote git branch."""
459
460
    @classmethod
461
    def is_compatible(self, source, target):
462
        from bzrlib.plugins.git.remote import RemoteGitBranch
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
463
        return (isinstance(source, LocalGitBranch) and
0.200.512 by Jelmer Vernooij
Support pushing git->git.
464
                isinstance(target, RemoteGitBranch))
465
466
    def _basic_push(self, overwrite=False, stop_revision=None):
467
        result = GitBranchPushResult()
468
        result.source_branch = self.source
469
        result.target_branch = self.target
470
        if stop_revision is None:
471
            stop_revision = self.source.last_revision()
472
        # FIXME: Check for diverged branches
473
        def get_changed_refs(old_refs):
0.200.544 by Jelmer Vernooij
Support pushing from git -> empty git repo.
474
            result.old_revid = self.target.mapping.revision_id_foreign_to_bzr(old_refs.get("refs/heads/master", "0" * 40))
0.200.650 by Jelmer Vernooij
Use standard names for lookup functions.
475
            refs = { "refs/heads/master": self.source.repository.lookup_bzr_revision_id(stop_revision)[0] }
0.200.512 by Jelmer Vernooij
Support pushing git->git.
476
            result.new_revid = stop_revision
477
            for name, sha in self.source.repository._git.refs.as_dict("refs/tags").iteritems():
478
                refs["refs/tags/%s" % name] = sha
479
            return refs
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
480
        self.target.repository.send_pack(get_changed_refs,
0.200.512 by Jelmer Vernooij
Support pushing git->git.
481
                self.source.repository._git.object_store.generate_pack_contents)
482
        return result
483
484
485
class InterGitRemoteLocalBranch(InterGitBranch):
486
    """InterBranch that copies from a remote to a local git branch."""
487
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
488
    @classmethod
489
    def is_compatible(self, source, target):
490
        from bzrlib.plugins.git.remote import RemoteGitBranch
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
491
        return (isinstance(source, RemoteGitBranch) and
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
492
                isinstance(target, LocalGitBranch))
493
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
494
    def _basic_push(self, overwrite=False, stop_revision=None):
495
        result = branch.BranchPushResult()
496
        result.source_branch = self.source
497
        result.target_branch = self.target
498
        result.old_revid = self.target.last_revision()
499
        refs, stop_revision = self.update_refs(stop_revision)
500
        self.target.generate_revision_history(stop_revision, result.old_revid)
501
        self.update_tags(refs)
0.200.505 by Jelmer Vernooij
Remove duplicate code.
502
        result.new_revid = self.target.last_revision()
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
503
        return result
504
505
    def update_tags(self, refs):
0.200.648 by Jelmer Vernooij
Fix tag handling when encountering packed refs.
506
        for name, v in extract_tags(refs).iteritems():
507
            revid = self.target.mapping.revision_id_foreign_to_bzr(v)
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
508
            self.target.tags.set_tag(name, revid)
509
510
    def update_refs(self, stop_revision=None):
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
511
        interrepo = repository.InterRepository.get(self.source.repository,
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
512
            self.target.repository)
513
        if stop_revision is None:
514
            refs = interrepo.fetch_refs(branches=["HEAD"])
515
            stop_revision = self.target.mapping.revision_id_foreign_to_bzr(refs["HEAD"])
516
        else:
517
            refs = interrepo.fetch_refs(revision_id=stop_revision)
518
        return refs, stop_revision
519
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
520
    def pull(self, stop_revision=None, overwrite=False,
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
521
        possible_transports=None, local=False):
522
        # This type of branch can't be bound.
523
        if local:
524
            raise errors.LocalRequiresBoundBranch()
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
525
        result = GitPullResult()
526
        result.source_branch = self.source
527
        result.target_branch = self.target
528
        result.old_revid = self.target.last_revision()
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
529
        refs, stop_revision = self.update_refs(stop_revision)
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
530
        self.target.generate_revision_history(stop_revision, result.old_revid)
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
531
        self.update_tags(refs)
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
532
        result.new_revid = self.target.last_revision()
533
        return result
534
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
535
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
536
class InterToGitBranch(branch.InterBranch):
537
    """InterBranch implementation that pulls from Git into bzr."""
538
0.200.631 by Jelmer Vernooij
Raise proper exception in Branch.get_stacked_on_url().
539
    @staticmethod
540
    def _get_branch_formats_to_test():
541
        return None, None
542
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
543
    @classmethod
544
    def is_compatible(self, source, target):
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
545
        return (not isinstance(source, GitBranch) and
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
546
                isinstance(target, GitBranch))
547
0.200.542 by Jelmer Vernooij
Proper error for push in 1.14.
548
    def update_revisions(self, *args, **kwargs):
549
        raise NoPushSupport()
550
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
551
    def push(self, overwrite=True, stop_revision=None,
0.200.472 by Jelmer Vernooij
Fix printing error when user attempts to push into git.
552
             _override_hook_source_branch=None):
553
        raise NoPushSupport()
554
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
555
    def lossy_push(self, stop_revision=None):
0.200.504 by Jelmer Vernooij
Lazily find revno's for git branches.
556
        result = GitBranchPushResult()
0.200.503 by Jelmer Vernooij
Remove dpull, return BranchPushResult in lossy_push.
557
        result.source_branch = self.source
558
        result.target_branch = self.target
0.239.14 by Jelmer Vernooij
Cope with pushing to (not yet) existing branches.
559
        try:
560
            result.old_revid = self.target.last_revision()
561
        except NoSuchRef:
562
            result.old_revid = revision.NULL_REVISION
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
563
        if stop_revision is None:
564
            stop_revision = self.source.last_revision()
565
        # FIXME: Check for diverged branches
566
        refs = { "refs/heads/master": stop_revision }
567
        for name, revid in self.source.tags.get_tag_dict().iteritems():
568
            if self.source.repository.has_revision(revid):
569
                refs["refs/tags/%s" % name] = revid
570
        revidmap, new_refs = self.target.repository.dfetch_refs(
571
            self.source.repository, refs)
572
        if revidmap != {}:
573
            self.target.generate_revision_history(revidmap[stop_revision])
0.200.520 by Jelmer Vernooij
Proper output from dpush.
574
            result.new_revid = revidmap[stop_revision]
575
        else:
576
            result.new_revid = result.old_revid
0.200.503 by Jelmer Vernooij
Remove dpull, return BranchPushResult in lossy_push.
577
        result.revidmap = revidmap
578
        return result
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
579
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
580
581
branch.InterBranch.register_optimiser(InterGitRemoteLocalBranch)
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
582
branch.InterBranch.register_optimiser(InterFromGitBranch)
583
branch.InterBranch.register_optimiser(InterToGitBranch)
0.200.512 by Jelmer Vernooij
Support pushing git->git.
584
branch.InterBranch.register_optimiser(InterGitLocalRemoteBranch)