/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
188 by mbp at sourcefrog
- experimental remote-branch support
1
# Copyright (C) 2005 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
412 by Martin Pool
- RemoteBranch displays the log of a remote branch.
18
"""Proxy object for access to remote branches.
19
20
At the moment remote branches are only for HTTP and only for read
21
access.
22
"""
23
24
25
import gzip
192 by mbp at sourcefrog
- exercise the network more towards doing a remote clone
26
from cStringIO import StringIO
1185.1.2 by Martin Pool
- merge various windows and other fixes from Ollie Rutherfurd
27
import os
419 by Martin Pool
- RemoteBranch.__str__ and repr
28
import urllib2
1185.1.4 by Martin Pool
- fix _find_remote_branch to avoid strange error for nonexistent branch
29
import urlparse
188 by mbp at sourcefrog
- experimental remote-branch support
30
1185.1.3 by Martin Pool
- fix up imports in remotebranch
31
from bzrlib.errors import BzrError, BzrCheckError
1185.2.17 by Lalo Martins
unbreaking RemoteBranch, by (temporarily) making it a subclass of LocalBranch.
32
from bzrlib.branch import Branch, LocalBranch, BZR_BRANCH_FORMAT
1185.1.3 by Martin Pool
- fix up imports in remotebranch
33
from bzrlib.trace import mutter
34
from bzrlib.xml import serializer_v4
193 by mbp at sourcefrog
more experiments with http get
35
36
974.1.53 by aaron.bentley at utoronto
Disabled urlgrabber
37
ENABLE_URLGRABBER = False
412 by Martin Pool
- RemoteBranch displays the log of a remote branch.
38
974.1.51 by aaron.bentley at utoronto
Caused remotebranch to throw a NoSuchRevision when appropriate
39
from bzrlib.errors import BzrError, NoSuchRevision
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
40
41
class GetFailed(BzrError):
42
    def __init__(self, url, status):
43
        BzrError.__init__(self, "Get %s failed with status %s" % (url, status))
44
        self.url = url
45
        self.status = status
417 by Martin Pool
- trace when we fetch a URL
46
412 by Martin Pool
- RemoteBranch displays the log of a remote branch.
47
if ENABLE_URLGRABBER:
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
48
    import util.urlgrabber
49
    import util.urlgrabber.keepalive
50
    util.urlgrabber.keepalive.DEBUG = 0
412 by Martin Pool
- RemoteBranch displays the log of a remote branch.
51
    def get_url(path, compressed=False):
52
        try:
53
            url = path
54
            if compressed:
55
                url += '.gz'
450 by Martin Pool
- Use urlgrabber by default
56
            mutter("grab url %s" % url)
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
57
            url_f = util.urlgrabber.urlopen(url, keepalive=1, close_connection=0)
58
            if url_f.status != 200:
59
                raise GetFailed(url, url_f.status)
412 by Martin Pool
- RemoteBranch displays the log of a remote branch.
60
            if not compressed:
61
                return url_f
62
            else:
63
                return gzip.GzipFile(fileobj=StringIO(url_f.read()))
64
        except urllib2.URLError, e:
65
            raise BzrError("remote fetch failed: %r: %s" % (url, e))
450 by Martin Pool
- Use urlgrabber by default
66
else:
67
    def get_url(url, compressed=False):
68
        import urllib2
69
        if compressed:
70
            url += '.gz'
71
        mutter("get_url %s" % url)
72
        url_f = urllib2.urlopen(url)
73
        if compressed:
74
            return gzip.GzipFile(fileobj=StringIO(url_f.read()))
75
        else:
76
            return url_f
188 by mbp at sourcefrog
- experimental remote-branch support
77
192 by mbp at sourcefrog
- exercise the network more towards doing a remote clone
78
416 by Martin Pool
- bzr log and bzr root now accept an http URL
79
def _find_remote_root(url):
80
    """Return the prefix URL that corresponds to the branch root."""
81
    orig_url = url
82
    while True:
83
        try:
1185.1.4 by Martin Pool
- fix _find_remote_branch to avoid strange error for nonexistent branch
84
            fmt_url = url + '/.bzr/branch-format'
85
            ff = get_url(fmt_url)
419 by Martin Pool
- RemoteBranch.__str__ and repr
86
            fmt = ff.read()
416 by Martin Pool
- bzr log and bzr root now accept an http URL
87
            ff.close()
419 by Martin Pool
- RemoteBranch.__str__ and repr
88
89
            fmt = fmt.rstrip('\r\n')
90
            if fmt != BZR_BRANCH_FORMAT.rstrip('\r\n'):
91
                raise BzrError("sorry, branch format %r not supported at url %s"
92
                               % (fmt, url))
93
            
416 by Martin Pool
- bzr log and bzr root now accept an http URL
94
            return url
418 by Martin Pool
- fix typo
95
        except urllib2.URLError:
416 by Martin Pool
- bzr log and bzr root now accept an http URL
96
            pass
97
1185.1.4 by Martin Pool
- fix _find_remote_branch to avoid strange error for nonexistent branch
98
        scheme, host, path = list(urlparse.urlparse(url))[:3]
99
        # discard params, query, fragment
100
        
101
        # strip off one component of the path component
102
        idx = path.rfind('/')
103
        if idx == -1 or path == '/':
104
            raise BzrError('no branch root found for URL %s'
105
                           ' or enclosing directories'
106
                           % orig_url)
107
        path = path[:idx]
108
        url = urlparse.urlunparse((scheme, host, path, '', '', ''))
416 by Martin Pool
- bzr log and bzr root now accept an http URL
109
        
110
111
1185.2.17 by Lalo Martins
unbreaking RemoteBranch, by (temporarily) making it a subclass of LocalBranch.
112
class RemoteBranch(LocalBranch):
1092.2.2 by Robert Collins
move RemoteStore to store.py
113
580 by Martin Pool
- Use explicit lock methods on a branch, rather than doing it
114
    def __init__(self, baseurl, find_root=True):
411 by Martin Pool
- start adding more useful RemoteBranch() class
115
        """Create new proxy for a remote branch."""
1092.2.2 by Robert Collins
move RemoteStore to store.py
116
        # circular import protection
117
        from bzrlib.store import RemoteStore
419 by Martin Pool
- RemoteBranch.__str__ and repr
118
        if find_root:
1185.2.3 by Lalo Martins
unifying 'base' (from Branch) and 'baseurl' (from RemoteBranch) attributes;
119
            self.base = _find_remote_root(baseurl)
419 by Martin Pool
- RemoteBranch.__str__ and repr
120
        else:
1185.2.3 by Lalo Martins
unifying 'base' (from Branch) and 'baseurl' (from RemoteBranch) attributes;
121
            self.base = baseurl
419 by Martin Pool
- RemoteBranch.__str__ and repr
122
            self._check_format()
534 by Martin Pool
- new RemoteStore class
123
        self.inventory_store = RemoteStore(baseurl + '/.bzr/inventory-store/')
124
        self.text_store = RemoteStore(baseurl + '/.bzr/text-store/')
613 by Martin Pool
- fix locking for RemoteBranch
125
        self.revision_store = RemoteStore(baseurl + '/.bzr/revision-store/')
534 by Martin Pool
- new RemoteStore class
126
417 by Martin Pool
- trace when we fetch a URL
127
    def __str__(self):
585 by Martin Pool
- make RemoteBranch.__str__ more robust
128
        b = getattr(self, 'baseurl', 'undefined')
129
        return '%s(%r)' % (self.__class__.__name__, b)
417 by Martin Pool
- trace when we fetch a URL
130
131
    __repr__ = __str__
132
1185.2.12 by Lalo Martins
killed find_cached_root()
133
    def setup_caching(self, cache_root):
134
        """Set up cached stores located under cache_root"""
135
        from bzrlib.meta_store import CachedStore
136
        for store_name in ('inventory_store', 'text_store', 'revision_store'):
137
            if not isinstance(getattr(self, store_name), CachedStore):
138
                cache_path = os.path.join(cache_root, store_name)
139
                os.mkdir(cache_path)
140
                new_store = CachedStore(getattr(self, store_name), cache_path)
141
                setattr(self, store_name, new_store)
142
411 by Martin Pool
- start adding more useful RemoteBranch() class
143
    def controlfile(self, filename, mode):
144
        if mode not in ('rb', 'rt', 'r'):
145
            raise BzrError("file mode %r not supported for remote branches" % mode)
1185.2.3 by Lalo Martins
unifying 'base' (from Branch) and 'baseurl' (from RemoteBranch) attributes;
146
        return get_url(self.base + '/.bzr/' + filename, False)
411 by Martin Pool
- start adding more useful RemoteBranch() class
147
580 by Martin Pool
- Use explicit lock methods on a branch, rather than doing it
148
613 by Martin Pool
- fix locking for RemoteBranch
149
    def lock_read(self):
150
        # no locking for remote branches yet
151
        pass
152
153
    def lock_write(self):
154
        from errors import LockError
155
        raise LockError("write lock not supported for remote branch %s"
1185.2.3 by Lalo Martins
unifying 'base' (from Branch) and 'baseurl' (from RemoteBranch) attributes;
156
                        % self.base)
580 by Martin Pool
- Use explicit lock methods on a branch, rather than doing it
157
158
    def unlock(self):
411 by Martin Pool
- start adding more useful RemoteBranch() class
159
        pass
580 by Martin Pool
- Use explicit lock methods on a branch, rather than doing it
160
    
412 by Martin Pool
- RemoteBranch displays the log of a remote branch.
161
416 by Martin Pool
- bzr log and bzr root now accept an http URL
162
    def relpath(self, path):
1185.2.3 by Lalo Martins
unifying 'base' (from Branch) and 'baseurl' (from RemoteBranch) attributes;
163
        if not path.startswith(self.base):
416 by Martin Pool
- bzr log and bzr root now accept an http URL
164
            raise BzrError('path %r is not under base URL %r'
1185.2.3 by Lalo Martins
unifying 'base' (from Branch) and 'baseurl' (from RemoteBranch) attributes;
165
                           % (path, self.base))
166
        pl = len(self.base)
416 by Martin Pool
- bzr log and bzr root now accept an http URL
167
        return path[pl:].lstrip('/')
168
802 by Martin Pool
- Remove XMLMixin class in favour of simple pack_xml, unpack_xml functions
169
412 by Martin Pool
- RemoteBranch displays the log of a remote branch.
170
    def get_revision(self, revision_id):
974.1.51 by aaron.bentley at utoronto
Caused remotebranch to throw a NoSuchRevision when appropriate
171
        try:
172
            revf = self.revision_store[revision_id]
173
        except KeyError:
174
            raise NoSuchRevision(self, revision_id)
1182 by Martin Pool
- more disentangling of xml storage format from objects
175
        r = serializer_v4.read_revision(revf)
412 by Martin Pool
- RemoteBranch displays the log of a remote branch.
176
        if r.revision_id != revision_id:
177
            raise BzrCheckError('revision stored as {%s} actually contains {%s}'
178
                                % (revision_id, r.revision_id))
179
        return r
534 by Martin Pool
- new RemoteStore class
180
181