/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
1
# Copyright (C) 2007 Canonical Ltd
0.200.252 by Jelmer Vernooij
Clarify history, copyright.
2
# Copyright (C) 2009 Jelmer Vernooij <jelmer@samba.org>
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
18
"""An adapter between a Git Branch and a Bazaar Branch"""
19
0.200.261 by Jelmer Vernooij
More formatting fixes.
20
from dulwich.objects import (
21
    Commit,
22
    Tag,
23
    )
24
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
25
from bzrlib import (
26
    branch,
27
    config,
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
28
    repository,
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
29
    revision,
0.200.82 by Jelmer Vernooij
Support listing tags.
30
    tag,
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
31
    )
0.200.261 by Jelmer Vernooij
More formatting fixes.
32
from bzrlib.decorators import (
33
    needs_read_lock,
34
    )
35
from bzrlib.trace import (
36
    mutter,
37
    )
38
0.200.278 by Jelmer Vernooij
Update branch head appropriately during dpull.
39
from bzrlib.plugins.git.errors import (
40
    NoSuchRef,
41
    )
0.200.261 by Jelmer Vernooij
More formatting fixes.
42
from bzrlib.plugins.git.foreign import (
43
    ForeignBranch,
44
    )
45
from bzrlib.plugins.git.errors import (
46
    LightWeightCheckoutsNotSupported,
47
    )
48
49
50
class LocalGitTagDict(tag.BasicTags):
51
    """Dictionary with tags in a local repository."""
0.200.82 by Jelmer Vernooij
Support listing tags.
52
0.200.89 by Jelmer Vernooij
Support sprouting branches.
53
    def __init__(self, branch):
54
        self.branch = branch
55
        self.repository = branch.repository
0.200.82 by Jelmer Vernooij
Support listing tags.
56
57
    def get_tag_dict(self):
58
        ret = {}
0.200.180 by Jelmer Vernooij
Simplify tag handling.
59
        for k,v in self.repository._git.tags.iteritems():
0.200.194 by Jelmer Vernooij
Look for commit object in heavyweight tags.
60
            obj = self.repository._git.get_object(v)
61
            while isinstance(obj, Tag):
62
                v = obj.object[1]
63
                obj = self.repository._git.get_object(v)
64
            if not isinstance(obj, Commit):
0.200.261 by Jelmer Vernooij
More formatting fixes.
65
                mutter("Tag %s points at object %r that is not a commit, "
66
                       "ignoring", k, obj)
0.200.194 by Jelmer Vernooij
Look for commit object in heavyweight tags.
67
                continue
0.200.180 by Jelmer Vernooij
Simplify tag handling.
68
            ret[k] = self.branch.mapping.revision_id_foreign_to_bzr(v)
0.200.82 by Jelmer Vernooij
Support listing tags.
69
        return ret
70
0.200.86 by Jelmer Vernooij
Clearer error when setting tags.
71
    def set_tag(self, name, revid):
0.200.181 by Jelmer Vernooij
Support setting tags.
72
        self.repository._git.tags[name] = revid
0.200.86 by Jelmer Vernooij
Clearer error when setting tags.
73
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
74
75
class GitBranchConfig(config.BranchConfig):
76
    """BranchConfig that uses locations.conf in place of branch.conf"""
77
78
    def __init__(self, branch):
79
        config.BranchConfig.__init__(self, branch)
80
        # do not provide a BranchDataConfig
81
        self.option_sources = self.option_sources[0], self.option_sources[2]
82
0.200.261 by Jelmer Vernooij
More formatting fixes.
83
    def set_user_option(self, name, value, store=config.STORE_BRANCH,
84
            warn_masked=False):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
85
        """Force local to True"""
0.200.261 by Jelmer Vernooij
More formatting fixes.
86
        config.BranchConfig.set_user_option(self, name, value,
87
            store=config.STORE_LOCATION, warn_masked=warn_masked)
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
88
89
90
class GitBranchFormat(branch.BranchFormat):
91
0.200.70 by Jelmer Vernooij
Implement GitBranchFormat.get_format_description.
92
    def get_format_description(self):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
93
        return 'Git Branch'
94
0.200.82 by Jelmer Vernooij
Support listing tags.
95
    def supports_tags(self):
96
        return True
97
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
98
    def make_tags(self, branch):
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
99
        if getattr(branch.repository, "get_refs", None) is not None:
100
            from bzrlib.plugins.git.remote import RemoteGitTagDict
101
            return RemoteGitTagDict(branch)
0.200.261 by Jelmer Vernooij
More formatting fixes.
102
        else:
103
            return LocalGitTagDict(branch)
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
104
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
105
0.200.111 by Jelmer Vernooij
Merge bzr-foreign.
106
class GitBranch(ForeignBranch):
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
107
    """An adapter to git repositories for bzr Branch objects."""
108
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
109
    def __init__(self, bzrdir, repository, name, head, lockfiles):
0.200.82 by Jelmer Vernooij
Support listing tags.
110
        self.repository = repository
0.200.246 by Jelmer Vernooij
Cope with API changes in 1.13.
111
        self._format = GitBranchFormat()
0.222.1 by Jelmer Vernooij
Retrieve mapping from repository rather than just using the default mapping.
112
        super(GitBranch, self).__init__(repository.get_mapping())
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
113
        self.control_files = lockfiles
0.200.59 by Jelmer Vernooij
Add more tests, fix revision history.
114
        self.bzrdir = bzrdir
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
115
        self.name = name
0.200.57 by Jelmer Vernooij
Fix more tests.
116
        self.head = head
0.200.143 by Jelmer Vernooij
Reoncile InterGitRepository objects.
117
        self.base = bzrdir.transport.base
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
118
0.200.211 by Jelmer Vernooij
Add basic infrastructure for dpush.
119
    def dpull(self, source, stop_revision=None):
120
        if stop_revision is None:
121
            stop_revision = source.last_revision()
122
        # FIXME: Check for diverged branches
123
        revidmap = self.repository.dfetch(source.repository, stop_revision)
0.200.261 by Jelmer Vernooij
More formatting fixes.
124
        self.head, self.mapping = self.mapping.revision_id_bzr_to_foreign(
125
            revidmap[stop_revision])
0.200.278 by Jelmer Vernooij
Update branch head appropriately during dpull.
126
        self.repository._git.set_ref(self.name, self.head)
0.200.211 by Jelmer Vernooij
Add basic infrastructure for dpush.
127
        return revidmap
128
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
129
    def lock_write(self):
130
        self.control_files.lock_write()
131
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
132
    def get_stacked_on_url(self):
133
        # Git doesn't do stacking (yet...)
134
        return None
135
136
    def get_parent(self):
137
        """See Branch.get_parent()."""
138
        return None
139
0.200.175 by Jelmer Vernooij
Add optimized handling when fetching from git to git.
140
    def set_parent(self, url):
141
        pass
142
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
143
    def lock_read(self):
144
        self.control_files.lock_read()
145
146
    def unlock(self):
147
        self.control_files.unlock()
148
149
    def get_physical_lock_status(self):
150
        return False
151
152
 
153
class LocalGitBranch(GitBranch):
0.200.261 by Jelmer Vernooij
More formatting fixes.
154
    """A local Git branch."""
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
155
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
156
    @needs_read_lock
157
    def last_revision(self):
158
        # perhaps should escape this ?
0.200.57 by Jelmer Vernooij
Fix more tests.
159
        if self.head is None:
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
160
            return revision.NULL_REVISION
0.200.112 by Jelmer Vernooij
Fix the build.
161
        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.
162
0.200.261 by Jelmer Vernooij
More formatting fixes.
163
    def create_checkout(self, to_location, revision_id=None, lightweight=False,
164
        accelerator_tree=None, hardlink=False):
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
165
        if lightweight:
166
            raise LightWeightCheckoutsNotSupported()
0.200.261 by Jelmer Vernooij
More formatting fixes.
167
        return self._create_heavyweight_checkout(to_location, revision_id,
168
            hardlink)
0.200.210 by Jelmer Vernooij
properly error out about not support lightweight checkouts.
169
170
    def _create_heavyweight_checkout(self, to_location, revision_id=None, 
171
                                     hardlink=False):
172
        """Create a new heavyweight checkout of this branch.
173
174
        :param to_location: URL of location to create the new checkout in.
175
        :param revision_id: Revision that should be the tip of the checkout.
176
        :param hardlink: Whether to hardlink
177
        :return: WorkingTree object of checkout.
178
        """
179
        checkout_branch = BzrDir.create_branch_convenience(
180
            to_location, force_new_tree=False, format=get_rich_root_format())
181
        checkout = checkout_branch.bzrdir
182
        checkout_branch.bind(self)
183
        # pull up to the specified revision_id to set the initial 
184
        # branch tip correctly, and seed it with history.
185
        checkout_branch.pull(self, stop_revision=revision_id)
186
        return checkout.create_workingtree(revision_id, hardlink=hardlink)
187
0.200.57 by Jelmer Vernooij
Fix more tests.
188
    def _gen_revision_history(self):
0.200.58 by Jelmer Vernooij
Fix remaining tests.
189
        if self.head is None:
190
            return []
0.200.261 by Jelmer Vernooij
More formatting fixes.
191
        ret = list(self.repository.iter_reverse_revision_history(
192
            self.last_revision()))
0.200.59 by Jelmer Vernooij
Add more tests, fix revision history.
193
        ret.reverse()
0.200.57 by Jelmer Vernooij
Fix more tests.
194
        return ret
0.200.18 by John Arbash Meinel
Start splitting up the Git{Branch,Dir,Repository} into separate modules, etc.
195
196
    def get_config(self):
197
        return GitBranchConfig(self)
198
199
    def get_push_location(self):
200
        """See Branch.get_push_location."""
201
        push_loc = self.get_config().get_user_option('push_location')
202
        return push_loc
203
204
    def set_push_location(self, location):
205
        """See Branch.set_push_location."""
0.200.19 by John Arbash Meinel
More refactoring. Add some direct tests for GitModel.
206
        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.
207
                                          store=config.STORE_LOCATION)
0.200.43 by David Allouche
Ultra-experimental support for "bzr pull". No test. No sanity.
208
209
    def supports_tags(self):
0.200.82 by Jelmer Vernooij
Support listing tags.
210
        return True
0.200.96 by Jelmer Vernooij
Fix branch.
211
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
212
213
class InterGitGenericBranch(branch.InterBranch):
0.200.261 by Jelmer Vernooij
More formatting fixes.
214
    """InterBranch implementation that pulls from Git into bzr."""
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
215
216
    @classmethod
217
    def is_compatible(self, source, target):
218
        return isinstance(source, GitBranch)
219
220
    def update_revisions(self, stop_revision=None, overwrite=False,
221
        graph=None):
222
        """See InterBranch.update_revisions()."""
223
        # TODO: stop_revision, overwrite
0.226.2 by Jelmer Vernooij
Cope with new fetch_spec argument.
224
        interrepo = repository.InterRepository.get(self.source.repository, 
225
            self.target.repository)
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
226
        self._last_revid = None
227
        def determine_wants(heads):
228
            if not self.source.name in heads:
0.200.278 by Jelmer Vernooij
Update branch head appropriately during dpull.
229
                raise NoSuchRef(self.source.name, heads.keys())
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
230
            head = heads[self.source.name]
0.200.261 by Jelmer Vernooij
More formatting fixes.
231
            self._last_revid = self.source.mapping.revision_id_foreign_to_bzr(
232
                head)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
233
            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.
234
                return []
235
            return [head]
236
        interrepo.fetch_objects(determine_wants, self.source.mapping)
0.225.2 by Jelmer Vernooij
Handle situation when repository is already up to date during pull.
237
        self.target.generate_revision_history(self._last_revid)
0.200.225 by Jelmer Vernooij
Implement custom InterBranch to support fetching from remote git branches.
238
239
240
branch.InterBranch.register_optimiser(InterGitGenericBranch)