/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: Martin Pool
  • Date: 2007-10-03 08:06:44 UTC
  • mto: This revision was merged to the branch mainline in revision 2901.
  • Revision ID: mbp@sourcefrog.net-20071003080644-oivy0gkg98sex0ed
Avoid internal error tracebacks on failure to lock on readonly transport (#129701).

Add new LockFailed, which doesn't imply that we failed to get it because of
contention.  Raise this if we fail to create the pending or lock directories
because of Transport errors.

UnlockableTransport is not an internal error.

ReadOnlyLockError has a message which didn't match its name or usage; it's now
deprecated and callers are updated to use LockFailed which is more appropriate.

Add zero_ninetytwo deprecation symbol.

Unify assertMatchesRe with TestCase.assertContainsRe.

When the constructor is deprecated, just say that the class is deprecated, not
the __init__ method - this works better with applyDeprecated in tests.

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
 
from bzrlib.trace import mutter
27
 
 
28
 
from bzrlib.plugins.git.foreign import ForeignBranch
29
 
 
30
 
from dulwich.objects import (
31
 
        Commit,
32
 
        Tag,
33
 
        )
34
 
 
35
 
class GitTagDict(tag.BasicTags):
36
 
 
37
 
    def __init__(self, branch):
38
 
        self.branch = branch
39
 
        self.repository = branch.repository
40
 
 
41
 
    def get_tag_dict(self):
42
 
        ret = {}
43
 
        for k,v in self.repository._git.tags.iteritems():
44
 
            obj = self.repository._git.get_object(v)
45
 
            while isinstance(obj, Tag):
46
 
                v = obj.object[1]
47
 
                obj = self.repository._git.get_object(v)
48
 
            if not isinstance(obj, Commit):
49
 
                mutter("Tag %s points at object %r that is not a commit, ignoring", k, obj)
50
 
                continue
51
 
            ret[k] = self.branch.mapping.revision_id_foreign_to_bzr(v)
52
 
        return ret
53
 
 
54
 
    def set_tag(self, name, revid):
55
 
        self.repository._git.tags[name] = revid
56
 
 
57
 
 
58
 
class GitBranchConfig(config.BranchConfig):
59
 
    """BranchConfig that uses locations.conf in place of branch.conf"""
60
 
 
61
 
    def __init__(self, branch):
62
 
        config.BranchConfig.__init__(self, branch)
63
 
        # do not provide a BranchDataConfig
64
 
        self.option_sources = self.option_sources[0], self.option_sources[2]
65
 
 
66
 
    def set_user_option(self, name, value, local=False):
67
 
        """Force local to True"""
68
 
        config.BranchConfig.set_user_option(self, name, value, local=True)
69
 
 
70
 
 
71
 
class GitBranchFormat(branch.BranchFormat):
72
 
 
73
 
    def get_format_description(self):
74
 
        return 'Git Branch'
75
 
 
76
 
    def supports_tags(self):
77
 
        return True
78
 
 
79
 
 
80
 
class GitBranch(ForeignBranch):
81
 
    """An adapter to git repositories for bzr Branch objects."""
82
 
 
83
 
    def __init__(self, bzrdir, repository, name, head, lockfiles):
84
 
        self.repository = repository
85
 
        super(GitBranch, self).__init__(repository.get_mapping())
86
 
        self.control_files = lockfiles
87
 
        self.bzrdir = bzrdir
88
 
        self.name = name
89
 
        self.head = head
90
 
        self.base = bzrdir.transport.base
91
 
        self._format = GitBranchFormat()
92
 
 
93
 
    def lock_write(self):
94
 
        self.control_files.lock_write()
95
 
 
96
 
    def get_stacked_on_url(self):
97
 
        # Git doesn't do stacking (yet...)
98
 
        return None
99
 
 
100
 
    def get_parent(self):
101
 
        """See Branch.get_parent()."""
102
 
        return None
103
 
 
104
 
    def set_parent(self, url):
105
 
        pass
106
 
 
107
 
    def lock_read(self):
108
 
        self.control_files.lock_read()
109
 
 
110
 
    def unlock(self):
111
 
        self.control_files.unlock()
112
 
 
113
 
    def get_physical_lock_status(self):
114
 
        return False
115
 
 
116
 
 
117
 
class LocalGitBranch(GitBranch):
118
 
 
119
 
    @needs_read_lock
120
 
    def last_revision(self):
121
 
        # perhaps should escape this ?
122
 
        if self.head is None:
123
 
            return revision.NULL_REVISION
124
 
        return self.mapping.revision_id_foreign_to_bzr(self.head)
125
 
 
126
 
    def _make_tags(self):
127
 
        return GitTagDict(self)
128
 
 
129
 
    def _gen_revision_history(self):
130
 
        if self.head is None:
131
 
            return []
132
 
        ret = list(self.repository.iter_reverse_revision_history(self.last_revision()))
133
 
        ret.reverse()
134
 
        return ret
135
 
 
136
 
    def get_config(self):
137
 
        return GitBranchConfig(self)
138
 
 
139
 
    def get_push_location(self):
140
 
        """See Branch.get_push_location."""
141
 
        push_loc = self.get_config().get_user_option('push_location')
142
 
        return push_loc
143
 
 
144
 
    def set_push_location(self, location):
145
 
        """See Branch.set_push_location."""
146
 
        self.get_config().set_user_option('push_location', location,
147
 
                                          local=True)
148
 
 
149
 
    def supports_tags(self):
150
 
        return True
151
 
 
152
 
    def sprout(self, to_bzrdir, revision_id=None):
153
 
        """See Branch.sprout()."""
154
 
        result = to_bzrdir.create_branch()
155
 
        self.copy_content_into(result, revision_id=revision_id)
156
 
        result.set_parent(self.bzrdir.root_transport.base)
157
 
        return result
158