/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: John Arbash Meinel
  • Date: 2008-10-08 21:56:12 UTC
  • mto: This revision was merged to the branch mainline in revision 3773.
  • Revision ID: john@arbash-meinel.com-20081008215612-y9v94tqxreqoangx
Simplify the --raw mode.

I didn't realize, but the only node that is special cased is the 'root' node,
and to read it, you actually have to parse it directly, because the
compressed bytes start immediately after the end of the header, rather than
having any padding before the zlib bytes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007 Canonical Ltd
2
 
#
3
 
# This program is free software; you can redistribute it and/or modify
4
 
# it under the terms of the GNU General Public License as published by
5
 
# the Free Software Foundation; either version 2 of the License, or
6
 
# (at your option) any later version.
7
 
#
8
 
# This program is distributed in the hope that it will be useful,
9
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
 
# GNU General Public License for more details.
12
 
#
13
 
# You should have received a copy of the GNU General Public License
14
 
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
 
 
17
 
"""An adapter between a Git Branch and a Bazaar Branch"""
18
 
 
19
 
from bzrlib import (
20
 
    branch,
21
 
    config,
22
 
    revision,
23
 
    tag,
24
 
    )
25
 
from bzrlib.decorators import needs_read_lock
26
 
 
27
 
from bzrlib.plugins.git.foreign import ForeignBranch
28
 
from bzrlib.plugins.git.mapping import default_mapping
29
 
 
30
 
class GitTagDict(tag.BasicTags):
31
 
 
32
 
    def __init__(self, branch):
33
 
        self.branch = branch
34
 
        self.repository = branch.repository
35
 
 
36
 
    def get_tag_dict(self):
37
 
        ret = {}
38
 
        for tag in self.repository._git.tags:
39
 
            ret[tag.name] = self.branch.mapping.revision_id_foreign_to_bzr(tag.commit.id)
40
 
        return ret
41
 
 
42
 
    def set_tag(self, name, revid):
43
 
        raise NotImplementedError(self.set_tag)
44
 
 
45
 
 
46
 
class GitBranchConfig(config.BranchConfig):
47
 
    """BranchConfig that uses locations.conf in place of branch.conf"""
48
 
 
49
 
    def __init__(self, branch):
50
 
        config.BranchConfig.__init__(self, branch)
51
 
        # do not provide a BranchDataConfig
52
 
        self.option_sources = self.option_sources[0], self.option_sources[2]
53
 
 
54
 
    def set_user_option(self, name, value, local=False):
55
 
        """Force local to True"""
56
 
        config.BranchConfig.set_user_option(self, name, value, local=True)
57
 
 
58
 
 
59
 
class GitBranchFormat(branch.BranchFormat):
60
 
 
61
 
    def get_format_description(self):
62
 
        return 'Git Branch'
63
 
 
64
 
    def supports_tags(self):
65
 
        return True
66
 
 
67
 
 
68
 
class GitBranch(ForeignBranch):
69
 
    """An adapter to git repositories for bzr Branch objects."""
70
 
 
71
 
    def __init__(self, bzrdir, repository, head, base, lockfiles):
72
 
        self.repository = repository
73
 
        super(GitBranch, self).__init__(default_mapping)
74
 
        self.control_files = lockfiles
75
 
        self.bzrdir = bzrdir
76
 
        self.head = head
77
 
        self.base = base
78
 
        self._format = GitBranchFormat()
79
 
 
80
 
    def lock_write(self):
81
 
        self.control_files.lock_write()
82
 
 
83
 
    @needs_read_lock
84
 
    def last_revision(self):
85
 
        # perhaps should escape this ?
86
 
        if self.head is None:
87
 
            return revision.NULL_REVISION
88
 
        return self.mapping.revision_id_foreign_to_bzr(self.head)
89
 
 
90
 
    def _make_tags(self):
91
 
        return GitTagDict(self)
92
 
 
93
 
    def get_parent(self):
94
 
        """See Branch.get_parent()."""
95
 
        return None
96
 
 
97
 
    def get_stacked_on_url(self):
98
 
        return None
99
 
 
100
 
    def _gen_revision_history(self):
101
 
        if self.head is None:
102
 
            return []
103
 
        skip = 0
104
 
        cms = None
105
 
        ret = []
106
 
        max_count = 1000
107
 
        nextid = self.head
108
 
        while cms != []:
109
 
            cms = self.repository._git.commits(self.head, max_count=max_count, skip=skip)
110
 
            skip += max_count
111
 
            for cm in cms:
112
 
                if cm.id == nextid:
113
 
                    ret.append(self.mapping.revision_id_foreign_to_bzr(cm.id))
114
 
                    if cm.parents == []:
115
 
                        nextid = None
116
 
                    else:
117
 
                        nextid = cm.parents[0].id
118
 
        ret.reverse()
119
 
        return ret
120
 
 
121
 
    def get_config(self):
122
 
        return GitBranchConfig(self)
123
 
 
124
 
    def lock_read(self):
125
 
        self.control_files.lock_read()
126
 
 
127
 
    def unlock(self):
128
 
        self.control_files.unlock()
129
 
 
130
 
    def get_physical_lock_status(self):
131
 
        return False
132
 
 
133
 
    def get_push_location(self):
134
 
        """See Branch.get_push_location."""
135
 
        push_loc = self.get_config().get_user_option('push_location')
136
 
        return push_loc
137
 
 
138
 
    def set_push_location(self, location):
139
 
        """See Branch.set_push_location."""
140
 
        self.get_config().set_user_option('push_location', location,
141
 
                                          local=True)
142
 
 
143
 
    def supports_tags(self):
144
 
        return True
145
 
 
146
 
    def sprout(self, to_bzrdir, revision_id=None):
147
 
        """See Branch.sprout()."""
148
 
        result = to_bzrdir.create_branch()
149
 
        self.copy_content_into(result, revision_id=revision_id)
150
 
        result.set_parent(self.bzrdir.root_transport.base)
151
 
        return result
152