/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
1
# Copyright (C) 2010 Jelmer Vernooij <jelmer@samba.org>
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
"""Conversion between refs and Bazaar revision pointers."""
18
0.200.873 by Jelmer Vernooij
Add convenience command for accessing virtual git refs.
19
from dulwich.repo import (
20
    RefsContainer,
21
    )
22
23
from bzrlib import (
24
    errors,
25
    )
26
27
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
28
def extract_tags(refs):
29
    """Extract the tags from a refs dictionary.
30
31
    :param refs: Refs to extract the tags from.
32
    :return: Dictionary mapping tag names to SHA1s.
33
    """
34
    ret = {}
35
    for k,v in refs.iteritems():
36
        if k.startswith("refs/tags/") and not k.endswith("^{}"):
37
            v = refs.get(k+"^{}", v)
38
            ret[k[len("refs/tags/"):]] = v
39
    return ret
40
41
42
def branch_name_to_ref(name, default=None):
43
    """Map a branch name to a ref.
44
45
    :param name: Branch name
46
    :return: ref string
47
    """
48
    if name is None:
49
        return default
50
    if name == "HEAD":
0.200.915 by Jelmer Vernooij
Cope with the fact that the old format didn't export file ids.
51
        return name
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
52
    if not name.startswith("refs/"):
53
        return "refs/heads/%s" % name
54
    else:
55
        return name
56
57
0.200.874 by Jelmer Vernooij
Support tag refs.
58
def tag_name_to_ref(name):
59
    """Map a tag name to a ref.
60
61
    :param name: Tag name
62
    :return: ref string
63
    """
64
    return "refs/tags/%s" % name
65
66
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
67
def ref_to_branch_name(ref):
68
    """Map a ref to a branch name
69
70
    :param ref: Ref
71
    :return: A branch name
72
    """
0.200.916 by Jelmer Vernooij
Set refs/heads/master if no ref is set yet.
73
    if ref in (None, "HEAD"):
0.200.915 by Jelmer Vernooij
Cope with the fact that the old format didn't export file ids.
74
        return ref
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
75
    if ref.startswith("refs/heads/"):
76
        return ref[len("refs/heads/"):]
0.200.874 by Jelmer Vernooij
Support tag refs.
77
    raise ValueError("unable to map ref %s back to branch name" % ref)
78
79
80
def ref_to_tag_name(ref):
81
    if ref.startswith("refs/tags/"):
82
        return ref[len('refs/tags/'):]
83
    raise ValueError("unable to map ref %s back to branch name" % ref)
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
84
0.200.873 by Jelmer Vernooij
Add convenience command for accessing virtual git refs.
85
86
class BazaarRefsContainer(RefsContainer):
87
88
    def __init__(self, dir, object_store):
89
        self.dir = dir
90
        self.object_store = object_store
91
92
    def set_symbolic_ref(self, name, other):
93
        if name == "HEAD":
94
            pass # FIXME: Switch default branch
95
        else:
96
            raise NotImplementedError(
97
                "Symbolic references not supported for anything other than "
98
                "HEAD")
99
0.200.874 by Jelmer Vernooij
Support tag refs.
100
    def _get_revid_by_tag_name(self, tag_name):
101
        for branch in self.dir.list_branches():
102
            try:
103
                # FIXME: This is ambiguous!
104
                return branch.tags.lookup_tag(tag_name)
105
            except errors.NoSuchTag:
106
                pass
107
        return None
108
109
    def _get_revid_by_branch_name(self, branch_name):
0.200.873 by Jelmer Vernooij
Add convenience command for accessing virtual git refs.
110
        try:
111
            branch = self.dir.open_branch(branch_name)
112
        except errors.NoColocatedBranchSupport:
0.252.47 by Jelmer Vernooij
Fix handling of HEAD refs.
113
            if branch_name in ("HEAD", "master"):
0.252.45 by Jelmer Vernooij
Finish fetching roundtripped revisions back into bzr.
114
                branch = self.dir.open_branch()
115
            else:
116
                raise
0.200.874 by Jelmer Vernooij
Support tag refs.
117
        return branch.last_revision()
118
119
    def read_loose_ref(self, ref):
120
        try:
121
            branch_name = ref_to_branch_name(ref)
122
        except ValueError:
123
            tag_name = ref_to_tag_name(ref)
124
            revid = self._get_revid_by_tag_name(tag_name)
125
        else:
126
            revid = self._get_revid_by_branch_name(branch_name)
127
        return self.object_store._lookup_revision_sha1(revid)
0.200.873 by Jelmer Vernooij
Add convenience command for accessing virtual git refs.
128
129
    def allkeys(self):
130
        keys = set()
131
        for branch in self.dir.list_branches():
0.200.876 by Jelmer Vernooij
Filter out objects that aren't actually present locally.
132
            repo = branch.repository
133
            if repo.has_revision(branch.last_revision()):
0.252.47 by Jelmer Vernooij
Fix handling of HEAD refs.
134
                ref = branch_name_to_ref(branch.name, "refs/heads/master")
135
                keys.add(ref)
136
                if branch.name is None:
137
                    keys.add("HEAD")
0.200.876 by Jelmer Vernooij
Filter out objects that aren't actually present locally.
138
            for tag_name, revid in branch.tags.get_tag_dict().iteritems():
139
                if repo.has_revision(revid):
140
                    keys.add(tag_name_to_ref(tag_name))
0.200.873 by Jelmer Vernooij
Add convenience command for accessing virtual git refs.
141
        return keys
142
143
    def __delitem__(self, ref):
144
        try:
145
            branch_name = ref_to_branch_name(ref)
146
        except ValueError:
147
            return # FIXME: Cope with tags!
148
        self.dir.destroy_branch(branch_name)
149
150
    def __setitem__(self, ref, sha):
151
        try:
152
            branch_name = ref_to_branch_name(ref)
153
        except ValueError:
154
            # FIXME: Cope with tags!
155
            return
156
        try:
157
            target_branch = self.repo_dir.open_branch(branch_name)
158
        except errors.NotBranchError:
159
            target_branch = self.repo.create_branch(branch_name)
160
161
        rev_id = self.mapping.revision_id_foreign_to_bzr(sha)
162
        target_branch.lock_write()
163
        try:
164
            target_branch.generate_revision_history(rev_id)
165
        finally:
166
            target_branch.unlock()