22
22
At the moment remote branches are only for HTTP and only for read
28
30
from cStringIO import StringIO
31
32
from errors import BzrError, BzrCheckError
32
from branch import Branch, BZR_BRANCH_FORMAT
33
from trace import mutter
33
from branch import Branch
35
35
# velocitynet.com.au transparently proxies connections and thereby
36
36
# breaks keep-alive -- sucks!
39
ENABLE_URLGRABBER = True
40
ENABLE_URLGRABBER = False
42
def get_url(url, compressed=False):
46
url_f = urllib2.urlopen(url)
48
return gzip.GzipFile(fileobj=StringIO(url_f.read()))
42
52
if ENABLE_URLGRABBER:
56
65
return gzip.GzipFile(fileobj=StringIO(url_f.read()))
57
66
except urllib2.URLError, e:
58
67
raise BzrError("remote fetch failed: %r: %s" % (url, e))
60
def get_url(url, compressed=False):
64
mutter("get_url %s" % url)
65
url_f = urllib2.urlopen(url)
67
return gzip.GzipFile(fileobj=StringIO(url_f.read()))
73
def _find_remote_root(url):
74
"""Return the prefix URL that corresponds to the branch root."""
78
ff = get_url(url + '/.bzr/branch-format')
83
fmt = fmt.rstrip('\r\n')
84
if fmt != BZR_BRANCH_FORMAT.rstrip('\r\n'):
85
raise BzrError("sorry, branch format %r not supported at url %s"
89
except urllib2.URLError:
95
raise BzrError('no branch root found for URL %s' % orig_url)
101
70
class RemoteBranch(Branch):
102
def __init__(self, baseurl, find_root=True):
71
def __init__(self, baseurl):
103
72
"""Create new proxy for a remote branch."""
105
self.baseurl = _find_remote_root(baseurl)
107
self.baseurl = baseurl
110
self.inventory_store = RemoteStore(baseurl + '/.bzr/inventory-store/')
111
self.text_store = RemoteStore(baseurl + '/.bzr/text-store/')
114
b = getattr(self, 'baseurl', 'undefined')
115
return '%s(%r)' % (self.__class__.__name__, b)
73
self.baseurl = baseurl
119
76
def controlfile(self, filename, mode):
120
77
if mode not in ('rb', 'rt', 'r'):
121
78
raise BzrError("file mode %r not supported for remote branches" % mode)
122
79
return get_url(self.baseurl + '/.bzr/' + filename, False)
125
def lock(self, mode):
127
raise BzrError('lock mode %r not supported for remote branch %r' % (mode, self))
81
def _need_readlock(self):
82
# remote branch always safe for read
133
def relpath(self, path):
134
if not path.startswith(self.baseurl):
135
raise BzrError('path %r is not under base URL %r'
136
% (path, self.baseurl))
137
pl = len(self.baseurl)
138
return path[pl:].lstrip('/')
85
def _need_writelock(self):
86
raise BzrError("cannot get write lock on HTTP remote branch")
140
88
def get_revision(self, revision_id):
141
89
from revision import Revision
146
94
raise BzrCheckError('revision stored as {%s} actually contains {%s}'
147
95
% (revision_id, r.revision_id))
151
class RemoteStore(object):
152
def __init__(self, baseurl):
153
self._baseurl = baseurl
156
def _path(self, name):
158
raise ValueError('invalid store id', name)
159
return self._baseurl + '/' + name
161
def __getitem__(self, fileid):
162
p = self._path(fileid)
163
return get_url(p, compressed=True)
166
99
def simple_walk():
167
"""For experimental purposes, traverse many parts of a remote branch"""
168
100
from revision import Revision
169
101
from branch import Branch
170
102
from inventory import Inventory
175
107
print 'read history'
176
108
history = get_url('/.bzr/revision-history').readlines()