/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to branch.py

  • Committer: Eric Anderson
  • Date: 2008-11-25 01:45:22 UTC
  • mto: (0.200.116 trunk)
  • mto: This revision was merged to the branch mainline in revision 6960.
  • Revision ID: eric@pixelwareinc.com-20081125014522-leeq8vts9nv3awjm
When reading branch use active branch instead of first branch.

This allows us to interact with whatever is set as the current active 
branch instead of being limited to only the first branch (master). 
Useful for creating a branch from somewhere other than master.

Limited in its usefulness as I believe git only allows switching 
branches in a non-bare repositories and most trees being branched from 
are bare repositories. Also requiring the source repository to switch
its active branch is pretty intrusive. But something is better than
nothing.

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
from bzrlib import (
20
20
    branch,
21
21
    config,
22
 
    repository,
23
22
    revision,
24
23
    tag,
25
24
    )
26
25
from bzrlib.decorators import needs_read_lock
27
 
from bzrlib.trace import mutter
28
 
 
29
 
from bzrlib.plugins.git.foreign import ForeignBranch
30
 
from bzrlib.plugins.git.errors import LightWeightCheckoutsNotSupported
31
 
 
32
 
from dulwich.objects import (
33
 
        Commit,
34
 
        Tag,
35
 
        )
 
26
 
 
27
from bzrlib.plugins.git.mapping import default_mapping
36
28
 
37
29
class GitTagDict(tag.BasicTags):
38
30
 
42
34
 
43
35
    def get_tag_dict(self):
44
36
        ret = {}
45
 
        for k,v in self.repository._git.tags.iteritems():
46
 
            obj = self.repository._git.get_object(v)
47
 
            while isinstance(obj, Tag):
48
 
                v = obj.object[1]
49
 
                obj = self.repository._git.get_object(v)
50
 
            if not isinstance(obj, Commit):
51
 
                mutter("Tag %s points at object %r that is not a commit, ignoring", k, obj)
52
 
                continue
53
 
            ret[k] = self.branch.mapping.revision_id_foreign_to_bzr(v)
 
37
        for tag in self.repository._git.tags:
 
38
            ret[tag.name] = default_mapping.revision_id_foreign_to_bzr(tag.commit.id)
54
39
        return ret
55
40
 
56
41
    def set_tag(self, name, revid):
57
 
        self.repository._git.tags[name] = revid
 
42
        raise NotImplementedError(self.set_tag)
58
43
 
59
44
 
60
45
class GitBranchConfig(config.BranchConfig):
65
50
        # do not provide a BranchDataConfig
66
51
        self.option_sources = self.option_sources[0], self.option_sources[2]
67
52
 
68
 
    def set_user_option(self, name, value, store=config.STORE_BRANCH, warn_masked=False):
 
53
    def set_user_option(self, name, value, local=False):
69
54
        """Force local to True"""
70
 
        config.BranchConfig.set_user_option(self, name, value, store=config.STORE_LOCATION, warn_masked=warn_masked)
 
55
        config.BranchConfig.set_user_option(self, name, value, local=True)
71
56
 
72
57
 
73
58
class GitBranchFormat(branch.BranchFormat):
79
64
        return True
80
65
 
81
66
 
82
 
class GitBranch(ForeignBranch):
 
67
class GitBranch(branch.Branch):
83
68
    """An adapter to git repositories for bzr Branch objects."""
84
69
 
85
 
    def __init__(self, bzrdir, repository, name, head, lockfiles):
 
70
    def __init__(self, bzrdir, repository, head, base, lockfiles):
86
71
        self.repository = repository
87
 
        super(GitBranch, self).__init__(repository.get_mapping())
 
72
        super(GitBranch, self).__init__()
88
73
        self.control_files = lockfiles
89
74
        self.bzrdir = bzrdir
90
 
        self.name = name
91
75
        self.head = head
92
 
        self.base = bzrdir.transport.base
 
76
        self.base = base
93
77
        self._format = GitBranchFormat()
94
78
 
95
 
    def dpull(self, source, stop_revision=None):
96
 
        if stop_revision is None:
97
 
            stop_revision = source.last_revision()
98
 
        # FIXME: Check for diverged branches
99
 
        revidmap = self.repository.dfetch(source.repository, stop_revision)
100
 
        self.head, self.mapping = self.mapping.revision_id_bzr_to_foreign(revidmap[stop_revision])
101
 
        return revidmap
102
 
 
103
79
    def lock_write(self):
104
80
        self.control_files.lock_write()
105
81
 
106
 
    def get_stacked_on_url(self):
107
 
        # Git doesn't do stacking (yet...)
108
 
        return None
109
 
 
110
 
    def get_parent(self):
111
 
        """See Branch.get_parent()."""
112
 
        return None
113
 
 
114
 
    def set_parent(self, url):
115
 
        pass
116
 
 
117
 
    def lock_read(self):
118
 
        self.control_files.lock_read()
119
 
 
120
 
    def unlock(self):
121
 
        self.control_files.unlock()
122
 
 
123
 
    def get_physical_lock_status(self):
124
 
        return False
125
 
 
126
 
 
127
 
class LocalGitBranch(GitBranch):
128
 
 
129
82
    @needs_read_lock
130
83
    def last_revision(self):
131
84
        # perhaps should escape this ?
132
85
        if self.head is None:
133
86
            return revision.NULL_REVISION
134
 
        return self.mapping.revision_id_foreign_to_bzr(self.head)
135
 
 
136
 
    def create_checkout(self, to_location, revision_id=None, 
137
 
                        lightweight=False, accelerator_tree=None, hardlink=False):
138
 
        if lightweight:
139
 
            raise LightWeightCheckoutsNotSupported()
140
 
        return self._create_heavyweight_checkout(to_location, revision_id, hardlink)
141
 
 
142
 
    def _create_heavyweight_checkout(self, to_location, revision_id=None, 
143
 
                                     hardlink=False):
144
 
        """Create a new heavyweight checkout of this branch.
145
 
 
146
 
        :param to_location: URL of location to create the new checkout in.
147
 
        :param revision_id: Revision that should be the tip of the checkout.
148
 
        :param hardlink: Whether to hardlink
149
 
        :return: WorkingTree object of checkout.
150
 
        """
151
 
        checkout_branch = BzrDir.create_branch_convenience(
152
 
            to_location, force_new_tree=False, format=get_rich_root_format())
153
 
        checkout = checkout_branch.bzrdir
154
 
        checkout_branch.bind(self)
155
 
        # pull up to the specified revision_id to set the initial 
156
 
        # branch tip correctly, and seed it with history.
157
 
        checkout_branch.pull(self, stop_revision=revision_id)
158
 
        return checkout.create_workingtree(revision_id, hardlink=hardlink)
 
87
        return default_mapping.revision_id_foreign_to_bzr(self.head)
159
88
 
160
89
    def _make_tags(self):
161
90
        return GitTagDict(self)
162
91
 
 
92
    def get_parent(self):
 
93
        """See Branch.get_parent()."""
 
94
        return None
 
95
 
 
96
    def get_stacked_on_url(self):
 
97
        return None
 
98
 
163
99
    def _gen_revision_history(self):
164
100
        if self.head is None:
165
101
            return []
166
 
        ret = list(self.repository.iter_reverse_revision_history(self.last_revision()))
 
102
        skip = 0
 
103
        cms = None
 
104
        ret = []
 
105
        max_count = 1000
 
106
        nextid = self.head
 
107
        while cms != []:
 
108
            cms = self.repository._git.commits(self.head, max_count=max_count, skip=skip)
 
109
            skip += max_count
 
110
            for cm in cms:
 
111
                if cm.id == nextid:
 
112
                    ret.append(default_mapping.revision_id_foreign_to_bzr(cm.id))
 
113
                    if cm.parents == []:
 
114
                        nextid = None
 
115
                    else:
 
116
                        nextid = cm.parents[0].id
167
117
        ret.reverse()
168
118
        return ret
169
119
 
170
120
    def get_config(self):
171
121
        return GitBranchConfig(self)
172
122
 
 
123
    def lock_read(self):
 
124
        self.control_files.lock_read()
 
125
 
 
126
    def unlock(self):
 
127
        self.control_files.unlock()
 
128
 
 
129
    def get_physical_lock_status(self):
 
130
        return False
 
131
 
173
132
    def get_push_location(self):
174
133
        """See Branch.get_push_location."""
175
134
        push_loc = self.get_config().get_user_option('push_location')
178
137
    def set_push_location(self, location):
179
138
        """See Branch.set_push_location."""
180
139
        self.get_config().set_user_option('push_location', location,
181
 
                                          store=config.STORE_LOCATION)
 
140
                                          local=True)
182
141
 
183
142
    def supports_tags(self):
184
143
        return True
190
149
        result.set_parent(self.bzrdir.root_transport.base)
191
150
        return result
192
151
 
193
 
 
194
 
class InterGitGenericBranch(branch.InterBranch):
195
 
 
196
 
    @classmethod
197
 
    def is_compatible(self, source, target):
198
 
        return isinstance(source, GitBranch)
199
 
 
200
 
    def update_revisions(self, stop_revision=None, overwrite=False,
201
 
        graph=None):
202
 
        """See InterBranch.update_revisions()."""
203
 
        # TODO: stop_revision, overwrite
204
 
        interrepo = repository.InterRepository.get(self.source.repository, self.target.repository)
205
 
        self._last_revid = None
206
 
        def determine_wants(heads):
207
 
            if not self.source.name in heads:
208
 
                raise BzrError("No such remote branch '%s', found: %r" % (
209
 
                    self.source.name, heads.keys()))
210
 
            head = heads[self.source.name]
211
 
            self._last_revid = self.source.mapping.revision_id_foreign_to_bzr(head)
212
 
            if self.target.repository.has_revision(self._last_revid):
213
 
                return []
214
 
            return [head]
215
 
        interrepo.fetch_objects(determine_wants, self.source.mapping)
216
 
        self.target.generate_revision_history(self._last_revid)
217
 
 
218
 
 
219
 
branch.InterBranch.register_optimiser(InterGitGenericBranch)