/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
1
# Copyright (C) 2007 Canonical Ltd
0.200.910 by Jelmer Vernooij
update copyright years
2
# Copyright (C) 2009-2010 Jelmer Vernooij <jelmer@samba.org>
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
18
"""An adapter between a Git Branch and a Bazaar Branch"""
19
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
20
from collections import defaultdict
21
0.200.261 by Jelmer Vernooij
More formatting fixes.
22
from dulwich.objects import (
23
    Commit,
24
    Tag,
0.200.1153 by Jelmer Vernooij
Import ZERO_SHA from dulwich.objects.
25
    ZERO_SHA,
0.200.261 by Jelmer Vernooij
More formatting fixes.
26
    )
27
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
28
from bzrlib import (
29
    branch,
0.200.513 by Jelmer Vernooij
Fix imports.
30
    bzrdir,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
31
    config,
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
32
    errors,
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
33
    repository as _mod_repository,
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
34
    revision,
0.200.82 by Jelmer Vernooij
Support listing tags.
35
    tag,
0.230.1 by Jelmer Vernooij
Support lightweight checkouts.
36
    transport,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
37
    )
0.200.261 by Jelmer Vernooij
More formatting fixes.
38
from bzrlib.decorators import (
39
    needs_read_lock,
40
    )
0.200.969 by Jelmer Vernooij
Use tuples with bzr revid and git sha to avoid lookups.
41
from bzrlib.revision import (
42
    NULL_REVISION,
43
    )
0.200.261 by Jelmer Vernooij
More formatting fixes.
44
from bzrlib.trace import (
0.200.342 by Jelmer Vernooij
Report git sha during pull.
45
    is_quiet,
0.200.261 by Jelmer Vernooij
More formatting fixes.
46
    mutter,
47
    )
48
0.200.386 by Jelmer Vernooij
Move config to a separate file, support BranchConfig.username().
49
from bzrlib.plugins.git.config import (
50
    GitBranchConfig,
51
    )
0.200.278 by Jelmer Vernooij
Update branch head appropriately during dpull.
52
from bzrlib.plugins.git.errors import (
0.200.472 by Jelmer Vernooij
Fix printing error when user attempts to push into git.
53
    NoPushSupport,
0.200.278 by Jelmer Vernooij
Update branch head appropriately during dpull.
54
    NoSuchRef,
55
    )
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
56
from bzrlib.plugins.git.refs import (
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
57
    branch_name_to_ref,
0.200.1061 by Jelmer Vernooij
Add support for using unpeel map.
58
    extract_tags,
59
    is_tag,
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
60
    ref_to_branch_name,
0.200.1061 by Jelmer Vernooij
Add support for using unpeel map.
61
    ref_to_tag_name,
0.200.875 by Jelmer Vernooij
Use new tag_name_to_ref function.
62
    tag_name_to_ref,
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
63
    UnpeelMap,
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
64
    )
0.200.261 by Jelmer Vernooij
More formatting fixes.
65
0.238.5 by Jelmer Vernooij
Remove old backwards compatibility code.
66
from bzrlib.foreign import ForeignBranch
0.200.388 by Jelmer Vernooij
Support bzr 1.14 as well.
67
0.200.261 by Jelmer Vernooij
More formatting fixes.
68
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
69
class GitPullResult(branch.PullResult):
0.200.956 by Jelmer Vernooij
Add some more format tests.
70
    """Result of a pull from a Git branch."""
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
71
72
    def _lookup_revno(self, revid):
73
        assert isinstance(revid, str), "was %r" % revid
74
        # Try in source branch first, it'll be faster
75
        return self.target_branch.revision_id_to_revno(revid)
76
77
    @property
78
    def old_revno(self):
79
        return self._lookup_revno(self.old_revid)
80
81
    @property
82
    def new_revno(self):
83
        return self._lookup_revno(self.new_revid)
84
85
0.200.1064 by Jelmer Vernooij
Use common base class for tags.
86
class GitTags(tag.BasicTags):
87
    """Ref-based tag dictionary."""
0.200.82 by Jelmer Vernooij
Support listing tags.
88
0.200.89 by Jelmer Vernooij
Support sprouting branches.
89
    def __init__(self, branch):
90
        self.branch = branch
91
        self.repository = branch.repository
0.200.82 by Jelmer Vernooij
Support listing tags.
92
0.200.1066 by Jelmer Vernooij
Add GitTags.get_refs.
93
    def get_refs(self):
94
        raise NotImplementedError(self.get_refs)
95
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
96
    def _iter_tag_refs(self, refs):
97
        raise NotImplementedError(self._iter_tag_refs)
98
99
    def _merge_to_git(self, to_tags, refs, overwrite=False):
100
        target_repo = to_tags.repository
101
        conflicts = []
102
        for k, v in refs.iteritems():
103
            if not is_tag(k):
104
                continue
0.200.1128 by Jelmer Vernooij
remove duplicate definition of _matchingbzrdir.
105
            if overwrite or not k in target_repo._git.refs:
106
                target_repo._git.refs[k] = v
107
            elif target_repo._git.refs[k] == v:
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
108
                pass
109
            else:
110
                conflicts.append((ref_to_tag_name(k), v, target_repo.refs[k]))
111
        return conflicts
112
113
    def _merge_to_non_git(self, to_tags, refs, overwrite=False):
114
        unpeeled_map = defaultdict(set)
115
        conflicts = []
116
        result = dict(to_tags.get_tag_dict())
117
        for n, peeled, unpeeled, bzr_revid in self._iter_tag_refs(refs):
118
            if unpeeled is not None:
119
                unpeeled_map[peeled].add(unpeeled)
120
            if n not in result or overwrite:
121
                result[n] = bzr_revid
122
            elif result[n] == bzr_revid:
123
                pass
124
            else:
125
                conflicts.append((n, result[n], bzr_revid))
126
        to_tags._set_tag_dict(result)
127
        if len(unpeeled_map) > 0:
128
            map_file = UnpeelMap.from_repository(to_tags.branch.repository)
129
            map_file.update(unpeeled_map)
130
            map_file.save_in_repository(to_tags.branch.repository)
131
        return conflicts
132
133
    def merge_to(self, to_tags, overwrite=False, ignore_master=False,
134
                 source_refs=None):
0.200.1113 by Jelmer Vernooij
Fix Tags.merge_to.
135
        """See Tags.merge_to."""
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
136
        if source_refs is None:
0.200.1066 by Jelmer Vernooij
Add GitTags.get_refs.
137
            source_refs = self.get_refs()
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
138
        if self == to_tags:
139
            return
140
        if isinstance(to_tags, GitTags):
141
            return self._merge_to_git(to_tags, source_refs,
142
                                      overwrite=overwrite)
143
        else:
144
            if ignore_master:
145
                master = None
146
            else:
147
                master = to_tags.branch.get_master_branch()
148
            conflicts = self._merge_to_non_git(to_tags, source_refs,
149
                                              overwrite=overwrite)
150
            if master is not None:
0.200.1113 by Jelmer Vernooij
Fix Tags.merge_to.
151
                conflicts += self.merge_to(master.tags, overwrite=overwrite,
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
152
                                           source_refs=source_refs,
153
                                           ignore_master=ignore_master)
154
            return conflicts
155
156
    def get_tag_dict(self):
157
        ret = {}
0.200.1066 by Jelmer Vernooij
Add GitTags.get_refs.
158
        refs = self.get_refs()
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
159
        for (name, peeled, unpeeled, bzr_revid) in self._iter_tag_refs(refs):
160
            ret[name] = bzr_revid
161
        return ret
162
0.200.1064 by Jelmer Vernooij
Use common base class for tags.
163
164
class LocalGitTagDict(GitTags):
165
    """Dictionary with tags in a local repository."""
166
167
    def __init__(self, branch):
168
        super(LocalGitTagDict, self).__init__(branch)
169
        self.refs = self.repository._git.refs
170
0.200.1066 by Jelmer Vernooij
Add GitTags.get_refs.
171
    def get_refs(self):
172
        return self.repository._git.get_refs()
173
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
174
    def _iter_tag_refs(self, refs):
175
        """Iterate over the tag refs.
176
177
        :param refs: Refs dictionary (name -> git sha1)
178
        :return: iterator over (name, peeled_sha1, unpeeled_sha1, bzr_revid)
179
        """
0.200.1060 by Jelmer Vernooij
Return unpeeled tags in extract_tags.
180
        for k, (peeled, unpeeled) in extract_tags(refs).iteritems():
0.200.609 by Jelmer Vernooij
Cope with tags pointing at nonexisting objects.
181
            try:
0.200.1060 by Jelmer Vernooij
Return unpeeled tags in extract_tags.
182
                obj = self.repository._git[peeled]
0.200.609 by Jelmer Vernooij
Cope with tags pointing at nonexisting objects.
183
            except KeyError:
0.200.1060 by Jelmer Vernooij
Return unpeeled tags in extract_tags.
184
                mutter("Tag %s points at unknown object %s, ignoring", peeled,
185
                       obj)
0.200.609 by Jelmer Vernooij
Cope with tags pointing at nonexisting objects.
186
                continue
0.200.1060 by Jelmer Vernooij
Return unpeeled tags in extract_tags.
187
            # FIXME: this shouldn't really be necessary, the repository
188
            # already should have these unpeeled.
0.200.194 by Jelmer Vernooij
Look for commit object in heavyweight tags.
189
            while isinstance(obj, Tag):
0.200.1060 by Jelmer Vernooij
Return unpeeled tags in extract_tags.
190
                peeled = obj.object[1]
191
                obj = self.repository._git[peeled]
0.200.194 by Jelmer Vernooij
Look for commit object in heavyweight tags.
192
            if not isinstance(obj, Commit):
0.200.261 by Jelmer Vernooij
More formatting fixes.
193
                mutter("Tag %s points at object %r that is not a commit, "
194
                       "ignoring", k, obj)
0.200.194 by Jelmer Vernooij
Look for commit object in heavyweight tags.
195
                continue
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
196
            yield (k, peeled, unpeeled,
197
                   self.branch.lookup_foreign_revision_id(peeled))
198
0.200.711 by Jelmer Vernooij
Support merging tags to a local Git repository.
199
    def _set_tag_dict(self, to_dict):
0.200.1066 by Jelmer Vernooij
Add GitTags.get_refs.
200
        extra = set(self.get_refs().keys())
0.200.711 by Jelmer Vernooij
Support merging tags to a local Git repository.
201
        for k, revid in to_dict.iteritems():
0.200.875 by Jelmer Vernooij
Use new tag_name_to_ref function.
202
            name = tag_name_to_ref(k)
0.200.711 by Jelmer Vernooij
Support merging tags to a local Git repository.
203
            if name in extra:
204
                extra.remove(name)
205
            self.set_tag(k, revid)
206
        for name in extra:
0.200.1061 by Jelmer Vernooij
Add support for using unpeel map.
207
            if is_tag(name):
0.200.711 by Jelmer Vernooij
Support merging tags to a local Git repository.
208
                del self.repository._git[name]
0.200.956 by Jelmer Vernooij
Add some more format tests.
209
0.200.86 by Jelmer Vernooij
Clearer error when setting tags.
210
    def set_tag(self, name, revid):
0.200.1064 by Jelmer Vernooij
Use common base class for tags.
211
        self.refs[tag_name_to_ref(name)], _ = \
0.200.1030 by Jelmer Vernooij
More work on supporting roundtripping push.
212
            self.branch.lookup_bzr_revision_id(revid)
0.200.86 by Jelmer Vernooij
Clearer error when setting tags.
213
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
214
0.200.1078 by Jelmer Vernooij
Fix git-import from remote repositories.
215
class DictTagDict(tag.BasicTags):
0.239.1 by Jelmer Vernooij
Avoid re-connecting to fetch tags we already know.
216
217
    def __init__(self, branch, tags):
218
        super(DictTagDict, self).__init__(branch)
219
        self._tags = tags
220
221
    def get_tag_dict(self):
222
        return self._tags
223
224
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
225
class GitBranchFormat(branch.BranchFormat):
226
0.200.70 by Jelmer Vernooij
Implement GitBranchFormat.get_format_description.
227
    def get_format_description(self):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
228
        return 'Git Branch'
229
0.243.1 by Jelmer Vernooij
Use foreign branch testing infrastructure.
230
    def network_name(self):
231
        return "git"
232
0.200.82 by Jelmer Vernooij
Support listing tags.
233
    def supports_tags(self):
234
        return True
235
0.200.1105 by Jelmer Vernooij
Don't claim to support leaving locks.
236
    def supports_leaving_lock(self):
237
        return False
238
0.200.1091 by Jelmer Vernooij
Provide _matchingbzrdir for testing.
239
    @property
240
    def _matchingbzrdir(self):
0.200.1140 by Jelmer Vernooij
Update now that the control dir formats are no longer in __init__.
241
        from bzrlib.plugins.git.dir import LocalGitControlDirFormat
0.200.1091 by Jelmer Vernooij
Provide _matchingbzrdir for testing.
242
        return LocalGitControlDirFormat()
243
0.243.1 by Jelmer Vernooij
Use foreign branch testing infrastructure.
244
    def get_foreign_tests_branch_factory(self):
245
        from bzrlib.plugins.git.tests.test_branch import ForeignTestsBranchFactory
246
        return ForeignTestsBranchFactory()
247
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
248
    def make_tags(self, branch):
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
249
        if getattr(branch.repository, "get_refs", None) is not None:
250
            from bzrlib.plugins.git.remote import RemoteGitTagDict
251
            return RemoteGitTagDict(branch)
0.200.261 by Jelmer Vernooij
More formatting fixes.
252
        else:
253
            return LocalGitTagDict(branch)
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
254
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
255
    def initialize(self, a_bzrdir, name=None, repository=None):
256
        from bzrlib.plugins.git.dir import LocalGitDir
257
        if not isinstance(a_bzrdir, LocalGitDir):
258
            raise errors.IncompatibleFormat(self, a_bzrdir._format)
259
        if repository is None:
260
            repository = a_bzrdir.open_repository()
0.200.1102 by Jelmer Vernooij
Fix creating of colocated branches in git repositories.
261
        ref = branch_name_to_ref(name, "HEAD")
262
        repository._git[ref] = ZERO_SHA
263
        return LocalGitBranch(a_bzrdir, repository, ref, a_bzrdir._lockfiles)
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
264
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
265
0.200.911 by Jelmer Vernooij
Cope with locking changes in bzr.dev.
266
class GitReadLock(object):
267
268
    def __init__(self, unlock):
269
        self.unlock = unlock
270
271
272
class GitWriteLock(object):
273
274
    def __init__(self, unlock):
0.200.1175 by Jelmer Vernooij
Provide GitWriteLock.branch_token.
275
        self.branch_token = None
0.200.911 by Jelmer Vernooij
Cope with locking changes in bzr.dev.
276
        self.unlock = unlock
277
278
0.200.388 by Jelmer Vernooij
Support bzr 1.14 as well.
279
class GitBranch(ForeignBranch):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
280
    """An adapter to git repositories for bzr Branch objects."""
281
0.200.1129 by Jelmer Vernooij
Implement GitBranch.control_transport.
282
    @property
283
    def control_transport(self):
284
        return self.bzrdir.control_transport
285
0.200.770 by Jelmer Vernooij
Proper branch names.
286
    def __init__(self, bzrdir, repository, ref, lockfiles, tagsdict=None):
0.200.82 by Jelmer Vernooij
Support listing tags.
287
        self.repository = repository
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
288
        self._format = GitBranchFormat()
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
289
        self.control_files = lockfiles
0.200.59 by Jelmer Vernooij
Add more tests, fix revision history.
290
        self.bzrdir = bzrdir
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
291
        self._lock_mode = None
292
        self._lock_count = 0
0.231.1 by Jelmer Vernooij
Check that regenerated objects have the expected sha1.
293
        super(GitBranch, self).__init__(repository.get_mapping())
0.239.1 by Jelmer Vernooij
Avoid re-connecting to fetch tags we already know.
294
        if tagsdict is not None:
295
            self.tags = DictTagDict(self, tagsdict)
0.200.770 by Jelmer Vernooij
Proper branch names.
296
        self.ref = ref
297
        self.name = ref_to_branch_name(ref)
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
298
        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.
299
        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.
300
0.239.8 by Jelmer Vernooij
Support checkouts.
301
    def _get_checkout_format(self):
302
        """Return the most suitable metadir for a checkout of this branch.
303
        Weaves are used if this branch's repository uses weaves.
304
        """
0.200.927 by Jelmer Vernooij
Remove explicit use of rich root formats.
305
        return bzrdir.format_registry.make_bzrdir("default")
0.239.8 by Jelmer Vernooij
Support checkouts.
306
0.238.3 by Jelmer Vernooij
Remove svn references, prefer git send format when submitting changes against a git branch.
307
    def get_child_submit_format(self):
308
        """Return the preferred format of submissions to this branch."""
309
        ret = self.get_config().get_user_option("child_submit_format")
310
        if ret is not None:
311
            return ret
312
        return "git"
313
0.200.293 by Jelmer Vernooij
Fix branch nicks.
314
    def _get_nick(self, local=False, possible_master_transports=None):
315
        """Find the nick name for this branch.
316
317
        :return: Branch nick
318
        """
0.200.920 by Jelmer Vernooij
Fix some more tests.
319
        return self.name or "HEAD"
0.200.293 by Jelmer Vernooij
Fix branch nicks.
320
0.200.331 by Jelmer Vernooij
Add stub for setting nick function.
321
    def _set_nick(self, nick):
322
        raise NotImplementedError
323
324
    nick = property(_get_nick, _set_nick)
0.200.293 by Jelmer Vernooij
Fix branch nicks.
325
0.200.412 by Jelmer Vernooij
Implement GitBranch.__repr__.
326
    def __repr__(self):
0.200.770 by Jelmer Vernooij
Proper branch names.
327
        return "<%s(%r, %r)>" % (self.__class__.__name__, self.repository.base,
0.200.920 by Jelmer Vernooij
Fix some more tests.
328
            self.ref or "HEAD")
0.200.412 by Jelmer Vernooij
Implement GitBranch.__repr__.
329
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
330
    def generate_revision_history(self, revid, old_revid=None):
0.200.1103 by Jelmer Vernooij
Support generate_revision_history(NULL_REVISION).
331
        if revid == NULL_REVISION:
332
            newhead = ZERO_SHA
333
        else:
334
            # FIXME: Check that old_revid is in the ancestry of revid
335
            newhead, self.mapping = self.mapping.revision_id_bzr_to_foreign(revid)
0.200.1218 by Jelmer Vernooij
Support set_last_revision('null:').
336
            if self.mapping is None:
337
                raise AssertionError
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
338
        self._set_head(newhead)
339
0.200.1199 by Jelmer Vernooij
Support 'token' argument to Branch.lock_write.
340
    def lock_write(self, token=None):
341
        if token is not None:
342
            raise errors.TokenLockingNotSupported(self)
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
343
        if self._lock_mode:
344
            assert self._lock_mode == 'w'
345
            self._lock_count += 1
346
        else:
347
            self._lock_mode = 'w'
348
            self._lock_count = 1
349
        self.repository.lock_write()
0.200.911 by Jelmer Vernooij
Cope with locking changes in bzr.dev.
350
        return GitWriteLock(self.unlock)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
351
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
352
    def get_stacked_on_url(self):
353
        # Git doesn't do stacking (yet...)
0.200.631 by Jelmer Vernooij
Raise proper exception in Branch.get_stacked_on_url().
354
        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.
355
356
    def get_parent(self):
357
        """See Branch.get_parent()."""
0.200.312 by Jelmer Vernooij
Add notes about parent locations.
358
        # 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.
359
        return None
360
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
361
    def set_parent(self, url):
0.200.312 by Jelmer Vernooij
Add notes about parent locations.
362
        # FIXME: Set "origin" url in .git/config ?
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
363
        pass
364
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
365
    def lock_read(self):
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
366
        if self._lock_mode:
367
            assert self._lock_mode in ('r', 'w')
368
            self._lock_count += 1
369
        else:
370
            self._lock_mode = 'r'
371
            self._lock_count = 1
372
        self.repository.lock_read()
0.200.911 by Jelmer Vernooij
Cope with locking changes in bzr.dev.
373
        return GitReadLock(self.unlock)
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
374
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
375
    def peek_lock_mode(self):
376
        return self._lock_mode
377
0.200.432 by Jelmer Vernooij
Support Branch.is_locked, required for loggerhead.
378
    def is_locked(self):
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
379
        return (self._lock_mode is not None)
0.200.432 by Jelmer Vernooij
Support Branch.is_locked, required for loggerhead.
380
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
381
    def unlock(self):
0.200.1250 by Jelmer Vernooij
Simplify lock handling.
382
        """See Branch.unlock()."""
383
        self._lock_count -= 1
384
        if self._lock_count == 0:
385
            self._lock_mode = None
386
            self._clear_cached_state()
387
        self.repository.unlock()
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
388
389
    def get_physical_lock_status(self):
390
        return False
391
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
392
    @needs_read_lock
393
    def last_revision(self):
394
        # perhaps should escape this ?
0.200.57 by Jelmer Vernooij
Fix more tests.
395
        if self.head is None:
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
396
            return revision.NULL_REVISION
0.252.44 by Jelmer Vernooij
Properly look up Bazaar revision ids for revision parents in case they are round-tripped.
397
        return self.lookup_foreign_revision_id(self.head)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
398
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
399
    def _basic_push(self, target, overwrite=False, stop_revision=None):
400
        return branch.InterBranch.get(self, target)._basic_push(
401
            overwrite, stop_revision)
402
0.252.49 by Jelmer Vernooij
Avoid trying to set HEAD for remote branches.
403
    def lookup_foreign_revision_id(self, foreign_revid):
0.200.956 by Jelmer Vernooij
Add some more format tests.
404
        return self.repository.lookup_foreign_revision_id(foreign_revid,
0.252.49 by Jelmer Vernooij
Avoid trying to set HEAD for remote branches.
405
            self.mapping)
406
0.200.1030 by Jelmer Vernooij
More work on supporting roundtripping push.
407
    def lookup_bzr_revision_id(self, revid):
408
        return self.repository.lookup_bzr_revision_id(
409
            revid, mapping=self.mapping)
410
0.200.692 by Jelmer Vernooij
Refuse pulling into non-rich-root branches rather than erroring out with an AttributeError.
411
0.200.465 by Jelmer Vernooij
Use dulwich standard functionality for finding missing revisions.
412
class LocalGitBranch(GitBranch):
413
    """A local Git branch."""
414
0.200.1102 by Jelmer Vernooij
Fix creating of colocated branches in git repositories.
415
    def __init__(self, bzrdir, repository, ref, lockfiles, tagsdict=None):
416
        super(LocalGitBranch, self).__init__(bzrdir, repository, ref,
0.200.763 by Jelmer Vernooij
Provide proper colocated branch support.
417
              lockfiles, tagsdict)
0.200.918 by Jelmer Vernooij
Cope with 'self.ref is None' in a couple more places.
418
        refs = repository._git.get_refs()
0.200.1102 by Jelmer Vernooij
Fix creating of colocated branches in git repositories.
419
        if not (ref in refs.keys() or "HEAD" in refs.keys()):
0.200.763 by Jelmer Vernooij
Provide proper colocated branch support.
420
            raise errors.NotBranchError(self.base)
421
0.200.261 by Jelmer Vernooij
More formatting fixes.
422
    def create_checkout(self, to_location, revision_id=None, lightweight=False,
423
        accelerator_tree=None, hardlink=False):
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
424
        if lightweight:
0.230.1 by Jelmer Vernooij
Support lightweight checkouts.
425
            t = transport.get_transport(to_location)
426
            t.ensure_base()
427
            format = self._get_checkout_format()
428
            checkout = format.initialize_on_transport(t)
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
429
            from_branch = branch.BranchReferenceFormat().initialize(checkout,
0.230.1 by Jelmer Vernooij
Support lightweight checkouts.
430
                self)
431
            tree = checkout.create_workingtree(revision_id,
432
                from_branch=from_branch, hardlink=hardlink)
433
            return tree
434
        else:
435
            return self._create_heavyweight_checkout(to_location, revision_id,
0.257.1 by Jelmer Vernooij
use transport repo objects even for local access.
436
                hardlink)
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
437
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
438
    def _create_heavyweight_checkout(self, to_location, revision_id=None,
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
439
                                     hardlink=False):
440
        """Create a new heavyweight checkout of this branch.
441
442
        :param to_location: URL of location to create the new checkout in.
443
        :param revision_id: Revision that should be the tip of the checkout.
444
        :param hardlink: Whether to hardlink
445
        :return: WorkingTree object of checkout.
446
        """
0.200.513 by Jelmer Vernooij
Fix imports.
447
        checkout_branch = bzrdir.BzrDir.create_branch_convenience(
0.200.927 by Jelmer Vernooij
Remove explicit use of rich root formats.
448
            to_location, force_new_tree=False)
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
449
        checkout = checkout_branch.bzrdir
450
        checkout_branch.bind(self)
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
451
        # 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.
452
        # branch tip correctly, and seed it with history.
453
        checkout_branch.pull(self, stop_revision=revision_id)
454
        return checkout.create_workingtree(revision_id, hardlink=hardlink)
455
0.200.57 by Jelmer Vernooij
Fix more tests.
456
    def _gen_revision_history(self):
0.200.58 by Jelmer Vernooij
Fix remaining tests.
457
        if self.head is None:
458
            return []
0.200.1279 by Jelmer Vernooij
Avoid using deprecated Repository.iter_reverse_revision_history.
459
        graph = self.repository.get_graph()
460
        ret = list(graph.iter_lefthand_ancestry(self.last_revision(),
461
            (revision.NULL_REVISION, )))
0.200.59 by Jelmer Vernooij
Add more tests, fix revision history.
462
        ret.reverse()
0.200.57 by Jelmer Vernooij
Fix more tests.
463
        return ret
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
464
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
465
    def _get_head(self):
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
466
        try:
0.200.918 by Jelmer Vernooij
Cope with 'self.ref is None' in a couple more places.
467
            return self.repository._git.ref(self.ref or "HEAD")
0.200.480 by Jelmer Vernooij
Cope with API changes in Dulwich.
468
        except KeyError:
469
            return None
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
470
0.200.1228 by Jelmer Vernooij
Provide Branch._read_last_revision_info.
471
    def _read_last_revision_info(self):
472
        last_revid = self.last_revision()
473
        graph = self.repository.get_graph()
474
        revno = graph.find_distance_to_null(last_revid,
475
            [(revision.NULL_REVISION, 0)])
476
        return revno, last_revid
477
478
    def set_last_revision_info(self, revno, revision_id):
479
        self.set_last_revision(revision_id)
480
        self._last_revision_info_cache = revno, revision_id
0.200.507 by Jelmer Vernooij
Implement set_last_revision{_info,}.
481
482
    def set_last_revision(self, revid):
0.200.1233 by Jelmer Vernooij
Implement Repository.iter_files_bytes.
483
        if not revid or not isinstance(revid, basestring):
484
            raise errors.InvalidRevisionId(revision_id=revid, branch=self)
0.200.1218 by Jelmer Vernooij
Support set_last_revision('null:').
485
        if revid == NULL_REVISION:
486
            newhead = ZERO_SHA
487
        else:
488
            (newhead, self.mapping) = self.repository.lookup_bzr_revision_id(revid)
489
            if self.mapping is None:
490
                raise AssertionError
491
        self._set_head(newhead)
0.200.507 by Jelmer Vernooij
Implement set_last_revision{_info,}.
492
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
493
    def _set_head(self, value):
494
        self._head = value
0.200.918 by Jelmer Vernooij
Cope with 'self.ref is None' in a couple more places.
495
        self.repository._git.refs[self.ref or "HEAD"] = self._head
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
496
        self._clear_cached_state()
497
498
    head = property(_get_head, _set_head)
499
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
500
    def get_config(self):
501
        return GitBranchConfig(self)
502
503
    def get_push_location(self):
504
        """See Branch.get_push_location."""
505
        push_loc = self.get_config().get_user_option('push_location')
506
        return push_loc
507
508
    def set_push_location(self, location):
509
        """See Branch.set_push_location."""
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
510
        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.
511
                                          store=config.STORE_LOCATION)
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
512
513
    def supports_tags(self):
0.200.82 by Jelmer Vernooij
Support listing tags.
514
        return True
0.200.956 by Jelmer Vernooij
Add some more format tests.
515
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
516
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
517
def _quick_lookup_revno(local_branch, remote_branch, revid):
518
    assert isinstance(revid, str), "was %r" % revid
519
    # Try in source branch first, it'll be faster
520
    try:
521
        return local_branch.revision_id_to_revno(revid)
522
    except errors.NoSuchRevision:
523
        graph = local_branch.repository.get_graph()
524
        try:
525
            return graph.find_distance_to_null(revid)
526
        except errors.GhostRevisionsHaveNoRevno:
527
            # FIXME: Check using graph.find_distance_to_null() ?
528
            return remote_branch.revision_id_to_revno(revid)
529
530
0.200.342 by Jelmer Vernooij
Report git sha during pull.
531
class GitBranchPullResult(branch.PullResult):
532
0.252.36 by Jelmer Vernooij
Fix pull.
533
    def __init__(self):
534
        super(GitBranchPullResult, self).__init__()
535
        self.new_git_head = None
536
        self._old_revno = None
537
        self._new_revno = None
538
0.200.342 by Jelmer Vernooij
Report git sha during pull.
539
    def report(self, to_file):
540
        if not is_quiet():
541
            if self.old_revid == self.new_revid:
542
                to_file.write('No revisions to pull.\n')
0.200.728 by Jelmer Vernooij
Fix pulling when all revisions are already in the repo.
543
            elif self.new_git_head is not None:
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
544
                to_file.write('Now on revision %d (git sha: %s).\n' %
0.200.342 by Jelmer Vernooij
Report git sha during pull.
545
                        (self.new_revno, self.new_git_head))
0.200.728 by Jelmer Vernooij
Fix pulling when all revisions are already in the repo.
546
            else:
547
                to_file.write('Now on revision %d.\n' % (self.new_revno,))
0.200.342 by Jelmer Vernooij
Report git sha during pull.
548
        self._show_tag_conficts(to_file)
549
0.252.36 by Jelmer Vernooij
Fix pull.
550
    def _lookup_revno(self, revid):
0.200.1185 by Jelmer Vernooij
Some formatting fixes.
551
        return _quick_lookup_revno(self.target_branch, self.source_branch,
552
                revid)
0.252.36 by Jelmer Vernooij
Fix pull.
553
554
    def _get_old_revno(self):
555
        if self._old_revno is not None:
556
            return self._old_revno
557
        return self._lookup_revno(self.old_revid)
558
559
    def _set_old_revno(self, revno):
560
        self._old_revno = revno
561
562
    old_revno = property(_get_old_revno, _set_old_revno)
563
564
    def _get_new_revno(self):
565
        if self._new_revno is not None:
566
            return self._new_revno
567
        return self._lookup_revno(self.new_revid)
568
569
    def _set_new_revno(self, revno):
570
        self._new_revno = revno
0.200.956 by Jelmer Vernooij
Add some more format tests.
571
0.252.36 by Jelmer Vernooij
Fix pull.
572
    new_revno = property(_get_new_revno, _set_new_revno)
573
0.200.342 by Jelmer Vernooij
Report git sha during pull.
574
0.200.504 by Jelmer Vernooij
Lazily find revno's for git branches.
575
class GitBranchPushResult(branch.BranchPushResult):
576
577
    def _lookup_revno(self, revid):
0.200.1185 by Jelmer Vernooij
Some formatting fixes.
578
        return _quick_lookup_revno(self.source_branch, self.target_branch,
579
            revid)
0.200.504 by Jelmer Vernooij
Lazily find revno's for git branches.
580
581
    @property
582
    def old_revno(self):
583
        return self._lookup_revno(self.old_revid)
584
585
    @property
586
    def new_revno(self):
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
587
        new_original_revno = getattr(self, "new_original_revno", None)
588
        if new_original_revno:
589
            return new_original_revno
590
        if getattr(self, "new_original_revid", None) is not None:
591
            return self._lookup_revno(self.new_original_revid)
0.200.504 by Jelmer Vernooij
Lazily find revno's for git branches.
592
        return self._lookup_revno(self.new_revid)
593
594
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
595
class InterFromGitBranch(branch.GenericInterBranch):
0.200.261 by Jelmer Vernooij
More formatting fixes.
596
    """InterBranch implementation that pulls from Git into bzr."""
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
597
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
598
    @staticmethod
599
    def _get_branch_formats_to_test():
0.200.1100 by Jelmer Vernooij
Provide test combinations for InterBranch implementations.
600
        try:
601
            default_format = branch.format_registry.get_default()
602
        except AttributeError:
603
            default_format = branch.BranchFormat._default_format
604
        return [
605
            (GitBranchFormat(), GitBranchFormat()),
606
            (GitBranchFormat(), default_format)]
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
607
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
608
    @classmethod
0.200.692 by Jelmer Vernooij
Refuse pulling into non-rich-root branches rather than erroring out with an AttributeError.
609
    def _get_interrepo(self, source, target):
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
610
        return _mod_repository.InterRepository.get(source.repository, target.repository)
0.200.692 by Jelmer Vernooij
Refuse pulling into non-rich-root branches rather than erroring out with an AttributeError.
611
612
    @classmethod
613
    def is_compatible(cls, source, target):
0.200.1222 by Jelmer Vernooij
Better checks in is_compatible methods.
614
        if not isinstance(source, GitBranch):
615
            return False
616
        if isinstance(target, GitBranch):
617
            # InterLocalGitRemoteGitBranch or InterToGitBranch should be used
618
            return False
619
        if getattr(cls._get_interrepo(source, target), "fetch_objects", None) is None:
620
            # fetch_objects is necessary for this to work
621
            return False
622
        return True
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
623
0.200.1265 by Jelmer Vernooij
Support limit option to Branch.fetch.
624
    def fetch(self, stop_revision=None, fetch_tags=True, limit=None):
625
        self.fetch_objects(stop_revision, fetch_tags=fetch_tags, limit=limit)
0.260.1 by Jelmer Vernooij
Fix fetch from remote during merge.
626
0.200.1265 by Jelmer Vernooij
Support limit option to Branch.fetch.
627
    def fetch_objects(self, stop_revision, fetch_tags, limit=None):
0.200.692 by Jelmer Vernooij
Refuse pulling into non-rich-root branches rather than erroring out with an AttributeError.
628
        interrepo = self._get_interrepo(self.source, self.target)
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
629
        def determine_wants(heads):
0.200.917 by Jelmer Vernooij
Cope with implicit branches during pull.
630
            if self.source.ref is not None and not self.source.ref in heads:
0.200.777 by Jelmer Vernooij
Fix colocated remote branches.
631
                raise NoSuchRef(self.source.ref, heads.keys())
0.259.6 by Jelmer Vernooij
Fetch tags during pull.
632
633
            if stop_revision is None:
0.200.917 by Jelmer Vernooij
Cope with implicit branches during pull.
634
                if self.source.ref is not None:
635
                    head = heads[self.source.ref]
636
                else:
637
                    head = heads["HEAD"]
0.252.44 by Jelmer Vernooij
Properly look up Bazaar revision ids for revision parents in case they are round-tripped.
638
                self._last_revid = self.source.lookup_foreign_revision_id(head)
0.259.6 by Jelmer Vernooij
Fetch tags during pull.
639
            else:
640
                self._last_revid = stop_revision
641
            real = interrepo.get_determine_wants_revids(
0.260.1 by Jelmer Vernooij
Fix fetch from remote during merge.
642
                [self._last_revid], include_tags=fetch_tags)
0.259.6 by Jelmer Vernooij
Fetch tags during pull.
643
            return real(heads)
0.200.1002 by Jelmer Vernooij
Fix regression in git-import.
644
        pack_hint, head, refs = interrepo.fetch_objects(
0.200.1265 by Jelmer Vernooij
Support limit option to Branch.fetch.
645
            determine_wants, self.source.mapping, limit=limit)
0.252.45 by Jelmer Vernooij
Finish fetching roundtripped revisions back into bzr.
646
        if (pack_hint is not None and
647
            self.target.repository._format.pack_compresses):
0.248.5 by Jelmer Vernooij
Reformatting, fix dpush.
648
            self.target.repository.pack(hint=pack_hint)
0.260.1 by Jelmer Vernooij
Fix fetch from remote during merge.
649
        return head, refs
650
0.200.1219 by Jelmer Vernooij
Remove InterBranch.update_revisions.
651
    def _update_revisions(self, stop_revision=None, overwrite=False):
0.260.1 by Jelmer Vernooij
Fix fetch from remote during merge.
652
        head, refs = self.fetch_objects(stop_revision, fetch_tags=True)
0.200.313 by Jelmer Vernooij
Support overwrite parameter.
653
        if overwrite:
0.200.314 by Jelmer Vernooij
Support stop_revision.
654
            prev_last_revid = None
0.200.313 by Jelmer Vernooij
Support overwrite parameter.
655
        else:
0.200.314 by Jelmer Vernooij
Support stop_revision.
656
            prev_last_revid = self.target.last_revision()
0.248.5 by Jelmer Vernooij
Reformatting, fix dpush.
657
        self.target.generate_revision_history(self._last_revid,
0.259.6 by Jelmer Vernooij
Fetch tags during pull.
658
            prev_last_revid, self.source)
0.200.1062 by Jelmer Vernooij
Pass remote refs along in _update_revisions.
659
        return head, refs
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
660
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
661
    def pull(self, overwrite=False, stop_revision=None,
662
             possible_transports=None, _hook_master=None, run_hooks=True,
0.200.1150 by Jelmer Vernooij
merge compatibility fixes for bzr 2.4, support for fetching tags.
663
             _override_hook_target=None, local=False):
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
664
        """See Branch.pull.
665
666
        :param _hook_master: Private parameter - set the branch to
667
            be supplied as the master to pull hooks.
668
        :param run_hooks: Private parameter - if false, this branch
669
            is being called because it's the master of the primary branch,
670
            so it should not run its hooks.
671
        :param _override_hook_target: Private parameter - set the branch to be
672
            supplied as the target_branch to pull hooks.
673
        """
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
674
        # This type of branch can't be bound.
675
        if local:
676
            raise errors.LocalRequiresBoundBranch()
0.200.342 by Jelmer Vernooij
Report git sha during pull.
677
        result = GitBranchPullResult()
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
678
        result.source_branch = self.source
679
        if _override_hook_target is None:
680
            result.target_branch = self.target
681
        else:
682
            result.target_branch = _override_hook_target
683
        self.source.lock_read()
684
        try:
685
            # We assume that during 'pull' the target repository is closer than
686
            # the source one.
0.200.726 by Jelmer Vernooij
Factor out conversion of branch names to refs.
687
            (result.old_revno, result.old_revid) = \
688
                self.target.last_revision_info()
0.200.1219 by Jelmer Vernooij
Remove InterBranch.update_revisions.
689
            result.new_git_head, remote_refs = self._update_revisions(
690
                stop_revision, overwrite=overwrite)
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
691
            result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
692
                overwrite)
0.200.726 by Jelmer Vernooij
Factor out conversion of branch names to refs.
693
            (result.new_revno, result.new_revid) = \
694
                self.target.last_revision_info()
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
695
            if _hook_master:
696
                result.master_branch = _hook_master
697
                result.local_branch = result.target_branch
698
            else:
699
                result.master_branch = result.target_branch
700
                result.local_branch = None
701
            if run_hooks:
702
                for hook in branch.Branch.hooks['post_pull']:
703
                    hook(result)
704
        finally:
705
            self.source.unlock()
706
        return result
707
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
708
    def _basic_push(self, overwrite=False, stop_revision=None):
709
        result = branch.BranchPushResult()
710
        result.source_branch = self.source
711
        result.target_branch = self.target
712
        result.old_revno, result.old_revid = self.target.last_revision_info()
0.200.1219 by Jelmer Vernooij
Remove InterBranch.update_revisions.
713
        result.new_git_head, remote_refs = self._update_revisions(
714
            stop_revision, overwrite=overwrite)
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
715
        result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
716
            overwrite)
717
        result.new_revno, result.new_revid = self.target.last_revision_info()
718
        return result
719
0.200.338 by Jelmer Vernooij
Fix dpushing without changes necessary.
720
0.200.512 by Jelmer Vernooij
Support pushing git->git.
721
class InterGitBranch(branch.GenericInterBranch):
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
722
    """InterBranch implementation that pulls between Git branches."""
723
0.200.512 by Jelmer Vernooij
Support pushing git->git.
724
0.200.1176 by Jelmer Vernooij
Fix fetch return value for inter git fetching.
725
class InterLocalGitRemoteGitBranch(InterGitBranch):
0.200.512 by Jelmer Vernooij
Support pushing git->git.
726
    """InterBranch that copies from a local to a remote git branch."""
727
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
728
    @staticmethod
729
    def _get_branch_formats_to_test():
0.200.1100 by Jelmer Vernooij
Provide test combinations for InterBranch implementations.
730
        # FIXME
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
731
        return []
732
0.200.512 by Jelmer Vernooij
Support pushing git->git.
733
    @classmethod
734
    def is_compatible(self, source, target):
735
        from bzrlib.plugins.git.remote import RemoteGitBranch
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
736
        return (isinstance(source, LocalGitBranch) and
0.200.512 by Jelmer Vernooij
Support pushing git->git.
737
                isinstance(target, RemoteGitBranch))
738
739
    def _basic_push(self, overwrite=False, stop_revision=None):
740
        result = GitBranchPushResult()
741
        result.source_branch = self.source
742
        result.target_branch = self.target
743
        if stop_revision is None:
744
            stop_revision = self.source.last_revision()
745
        # FIXME: Check for diverged branches
746
        def get_changed_refs(old_refs):
0.252.44 by Jelmer Vernooij
Properly look up Bazaar revision ids for revision parents in case they are round-tripped.
747
            result.old_revid = self.target.lookup_foreign_revision_id(old_refs.get(self.target.ref, ZERO_SHA))
0.200.822 by Jelmer Vernooij
Fix indication of number of revisions pushed in dpush.
748
            refs = { self.target.ref: self.source.repository.lookup_bzr_revision_id(stop_revision)[0] }
0.200.512 by Jelmer Vernooij
Support pushing git->git.
749
            result.new_revid = stop_revision
750
            for name, sha in self.source.repository._git.refs.as_dict("refs/tags").iteritems():
0.200.875 by Jelmer Vernooij
Use new tag_name_to_ref function.
751
                refs[tag_name_to_ref(name)] = sha
0.200.512 by Jelmer Vernooij
Support pushing git->git.
752
            return refs
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
753
        self.target.repository.send_pack(get_changed_refs,
0.200.726 by Jelmer Vernooij
Factor out conversion of branch names to refs.
754
            self.source.repository._git.object_store.generate_pack_contents)
0.200.512 by Jelmer Vernooij
Support pushing git->git.
755
        return result
756
757
0.200.1176 by Jelmer Vernooij
Fix fetch return value for inter git fetching.
758
class InterGitLocalGitBranch(InterGitBranch):
0.200.512 by Jelmer Vernooij
Support pushing git->git.
759
    """InterBranch that copies from a remote to a local git branch."""
760
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
761
    @staticmethod
762
    def _get_branch_formats_to_test():
0.200.1100 by Jelmer Vernooij
Provide test combinations for InterBranch implementations.
763
        # FIXME
0.200.996 by Jelmer Vernooij
Fix test run of InterBranches.
764
        return []
765
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
766
    @classmethod
767
    def is_compatible(self, source, target):
0.200.1176 by Jelmer Vernooij
Fix fetch return value for inter git fetching.
768
        return (isinstance(source, GitBranch) and
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
769
                isinstance(target, LocalGitBranch))
770
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
771
    def _basic_push(self, overwrite=False, stop_revision=None):
772
        result = branch.BranchPushResult()
773
        result.source_branch = self.source
774
        result.target_branch = self.target
775
        result.old_revid = self.target.last_revision()
776
        refs, stop_revision = self.update_refs(stop_revision)
777
        self.target.generate_revision_history(stop_revision, result.old_revid)
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
778
        result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
779
            source_refs=refs, overwrite=overwrite)
0.200.505 by Jelmer Vernooij
Remove duplicate code.
780
        result.new_revid = self.target.last_revision()
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
781
        return result
782
783
    def update_refs(self, stop_revision=None):
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
784
        interrepo = _mod_repository.InterRepository.get(self.source.repository,
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
785
            self.target.repository)
786
        if stop_revision is None:
0.200.940 by Jelmer Vernooij
Avoid confusion between different fetch functions with different semantics.
787
            refs = interrepo.fetch(branches=["HEAD"])
0.252.44 by Jelmer Vernooij
Properly look up Bazaar revision ids for revision parents in case they are round-tripped.
788
            stop_revision = self.target.lookup_foreign_revision_id(refs["HEAD"])
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
789
        else:
0.200.940 by Jelmer Vernooij
Avoid confusion between different fetch functions with different semantics.
790
            refs = interrepo.fetch(revision_id=stop_revision)
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
791
        return refs, stop_revision
792
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
793
    def pull(self, stop_revision=None, overwrite=False,
0.200.732 by Jelmer Vernooij
Support run_hooks argument to InterGitRemoteLocalBranch.pull().
794
        possible_transports=None, run_hooks=True,local=False):
0.200.446 by Jelmer Vernooij
Support new 'local' argument.
795
        # This type of branch can't be bound.
796
        if local:
797
            raise errors.LocalRequiresBoundBranch()
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
798
        result = GitPullResult()
799
        result.source_branch = self.source
800
        result.target_branch = self.target
801
        result.old_revid = self.target.last_revision()
0.200.501 by Jelmer Vernooij
Support push from git into bzr.
802
        refs, stop_revision = self.update_refs(stop_revision)
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
803
        self.target.generate_revision_history(stop_revision, result.old_revid)
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
804
        result.tag_conflicts = self.source.tags.merge_to(self.target.tags,
805
            overwrite=overwrite, source_refs=refs)
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
806
        result.new_revid = self.target.last_revision()
807
        return result
808
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
809
0.200.960 by Jelmer Vernooij
Use GenericInterBranch.
810
class InterToGitBranch(branch.GenericInterBranch):
0.200.1185 by Jelmer Vernooij
Some formatting fixes.
811
    """InterBranch implementation that pulls into a Git branch."""
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
812
0.200.939 by Jelmer Vernooij
Use InterRepo directly.
813
    def __init__(self, source, target):
814
        super(InterToGitBranch, self).__init__(source, target)
0.200.1097 by Jelmer Vernooij
Implement GitBranchFormat.initialize.
815
        self.interrepo = _mod_repository.InterRepository.get(source.repository,
0.200.939 by Jelmer Vernooij
Use InterRepo directly.
816
                                           target.repository)
817
0.200.631 by Jelmer Vernooij
Raise proper exception in Branch.get_stacked_on_url().
818
    @staticmethod
819
    def _get_branch_formats_to_test():
0.200.1100 by Jelmer Vernooij
Provide test combinations for InterBranch implementations.
820
        try:
821
            default_format = branch.format_registry.get_default()
822
        except AttributeError:
823
            default_format = branch.BranchFormat._default_format
824
        return [(default_format, GitBranchFormat())]
0.200.631 by Jelmer Vernooij
Raise proper exception in Branch.get_stacked_on_url().
825
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
826
    @classmethod
827
    def is_compatible(self, source, target):
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
828
        return (not isinstance(source, GitBranch) and
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
829
                isinstance(target, GitBranch))
830
0.252.38 by Jelmer Vernooij
Minor cleanups.
831
    def _get_new_refs(self, stop_revision=None):
832
        if stop_revision is None:
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
833
            (stop_revno, stop_revision) = self.source.last_revision_info()
0.263.1 by Jelmer Vernooij
Fix dpush for certain branches.
834
        else:
835
            stop_revno = self.source.revision_id_to_revno(stop_revision)
0.200.969 by Jelmer Vernooij
Use tuples with bzr revid and git sha to avoid lookups.
836
        assert type(stop_revision) is str
0.200.916 by Jelmer Vernooij
Set refs/heads/master if no ref is set yet.
837
        main_ref = self.target.ref or "refs/heads/master"
0.200.969 by Jelmer Vernooij
Use tuples with bzr revid and git sha to avoid lookups.
838
        refs = { main_ref: (None, stop_revision) }
0.252.37 by Jelmer Vernooij
Factor out some common code for finding refs to send.
839
        for name, revid in self.source.tags.get_tag_dict().iteritems():
840
            if self.source.repository.has_revision(revid):
0.200.969 by Jelmer Vernooij
Use tuples with bzr revid and git sha to avoid lookups.
841
                refs[tag_name_to_ref(name)] = (None, revid)
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
842
        return refs, main_ref, (stop_revno, stop_revision)
0.252.37 by Jelmer Vernooij
Factor out some common code for finding refs to send.
843
0.252.36 by Jelmer Vernooij
Fix pull.
844
    def pull(self, overwrite=False, stop_revision=None, local=False,
0.200.1131 by Jelmer Vernooij
Accept run_hooks argument to InterToGitBranch.pull().
845
             possible_transports=None, run_hooks=True):
0.252.36 by Jelmer Vernooij
Fix pull.
846
        result = GitBranchPullResult()
847
        result.source_branch = self.source
848
        result.target_branch = self.target
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
849
        new_refs, main_ref, stop_revinfo = self._get_new_refs(stop_revision)
0.200.941 by Jelmer Vernooij
Pass update_refs argument to fetch_refs.
850
        def update_refs(old_refs):
851
            refs = dict(old_refs)
0.200.945 by Jelmer Vernooij
Move fixmes
852
            # FIXME: Check for diverged branches
0.200.941 by Jelmer Vernooij
Pass update_refs argument to fetch_refs.
853
            refs.update(new_refs)
854
            return refs
0.200.1156 by Jelmer Vernooij
Disable push.
855
        try:
856
            old_refs, new_refs = self.interrepo.fetch_refs(update_refs)
857
        except NoPushSupport:
0.200.1161 by Jelmer Vernooij
Fix exception type.
858
            raise errors.NoRoundtrippingSupport(self.source, self.target)
0.200.1042 by Jelmer Vernooij
Fix pull into git branches.
859
        (result.old_revid, old_sha1) = old_refs.get(main_ref, (ZERO_SHA, NULL_REVISION))
860
        if result.old_revid is None:
861
            result.old_revid = self.target.lookup_foreign_revision_id(old_sha1)
862
        result.new_revid = new_refs[main_ref][1]
0.252.36 by Jelmer Vernooij
Fix pull.
863
        return result
864
0.200.1260 by Jelmer Vernooij
Cope with new lossy argument.
865
    def push(self, overwrite=False, stop_revision=None, lossy=False,
0.200.472 by Jelmer Vernooij
Fix printing error when user attempts to push into git.
866
             _override_hook_source_branch=None):
0.252.5 by Jelmer Vernooij
enable 'bzr push'.
867
        result = GitBranchPushResult()
868
        result.source_branch = self.source
869
        result.target_branch = self.target
0.200.1048 by Jelmer Vernooij
Make lookup of revno's after push/pull as efficient as possible.
870
        new_refs, main_ref, stop_revinfo = self._get_new_refs(stop_revision)
0.200.941 by Jelmer Vernooij
Pass update_refs argument to fetch_refs.
871
        def update_refs(old_refs):
872
            refs = dict(old_refs)
0.200.945 by Jelmer Vernooij
Move fixmes
873
            # FIXME: Check for diverged branches
0.200.941 by Jelmer Vernooij
Pass update_refs argument to fetch_refs.
874
            refs.update(new_refs)
875
            return refs
0.200.1260 by Jelmer Vernooij
Cope with new lossy argument.
876
        if lossy:
877
            result.revidmap, old_refs, new_refs = self.interrepo.dfetch_refs(
878
                update_refs)
879
        else:
880
            try:
881
                old_refs, new_refs = self.interrepo.fetch_refs(update_refs)
882
            except NoPushSupport:
883
                raise errors.NoRoundtrippingSupport(self.source, self.target)
0.200.1035 by Jelmer Vernooij
Cope with tuples in refs dictionary.
884
        (result.old_revid, old_sha1) = old_refs.get(main_ref, (ZERO_SHA, NULL_REVISION))
885
        if result.old_revid is None:
886
            result.old_revid = self.target.lookup_foreign_revision_id(old_sha1)
0.200.1042 by Jelmer Vernooij
Fix pull into git branches.
887
        result.new_revid = new_refs[main_ref][1]
0.200.1260 by Jelmer Vernooij
Cope with new lossy argument.
888
        (result.new_original_revno, result.new_original_revid) = stop_revinfo
0.252.5 by Jelmer Vernooij
enable 'bzr push'.
889
        return result
0.200.472 by Jelmer Vernooij
Fix printing error when user attempts to push into git.
890
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
891
    def lossy_push(self, stop_revision=None):
0.200.1261 by Jelmer Vernooij
add note about compatibility
892
        # For compatibility with bzr < 2.4
0.200.1260 by Jelmer Vernooij
Cope with new lossy argument.
893
        return self.push(lossy=True, stop_revision=stop_revision)
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
894
0.200.334 by Jelmer Vernooij
Support pulling from git to git.
895
0.200.1176 by Jelmer Vernooij
Fix fetch return value for inter git fetching.
896
branch.InterBranch.register_optimiser(InterGitLocalGitBranch)
0.200.468 by Jelmer Vernooij
Move dpush logic onto InterBranch.
897
branch.InterBranch.register_optimiser(InterFromGitBranch)
898
branch.InterBranch.register_optimiser(InterToGitBranch)
0.200.1176 by Jelmer Vernooij
Fix fetch return value for inter git fetching.
899
branch.InterBranch.register_optimiser(InterLocalGitRemoteGitBranch)