~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/remotebranch.py

  • Committer: Martin Pool
  • Date: 2005-07-16 00:07:40 UTC
  • mfrom: (909.1.5)
  • Revision ID: mbp@sourcefrog.net-20050716000740-f2dcb8894a23fd2d
- merge aaron's bugfix branch
  up to abentley@panoramicfeedback.com-20050715134354-78f2bca607acb415

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
 
22
22
At the moment remote branches are only for HTTP and only for read
23
23
access.
24
 
 
25
24
"""
26
25
 
27
26
 
28
27
import gzip
29
 
from sets import Set
30
28
from cStringIO import StringIO
31
29
import urllib2
32
30
 
38
36
# breaks keep-alive -- sucks!
39
37
 
40
38
 
41
 
 
42
 
ENABLE_URLGRABBER = False
43
 
 
44
 
def get_url(url, compressed=False):
45
 
    import urllib2
46
 
    if compressed:
47
 
        url += '.gz'
48
 
    mutter("get_url %s" % url)
49
 
    url_f = urllib2.urlopen(url)
50
 
    if compressed:
51
 
        return gzip.GzipFile(fileobj=StringIO(url_f.read()))
52
 
    else:
53
 
        return url_f
 
39
ENABLE_URLGRABBER = True
54
40
 
55
41
 
56
42
if ENABLE_URLGRABBER:
62
48
            url = path
63
49
            if compressed:
64
50
                url += '.gz'
 
51
            mutter("grab url %s" % url)
65
52
            url_f = urlgrabber.urlopen(url, keepalive=1, close_connection=0)
66
53
            if not compressed:
67
54
                return url_f
69
56
                return gzip.GzipFile(fileobj=StringIO(url_f.read()))
70
57
        except urllib2.URLError, e:
71
58
            raise BzrError("remote fetch failed: %r: %s" % (url, e))
 
59
else:
 
60
    def get_url(url, compressed=False):
 
61
        import urllib2
 
62
        if compressed:
 
63
            url += '.gz'
 
64
        mutter("get_url %s" % url)
 
65
        url_f = urllib2.urlopen(url)
 
66
        if compressed:
 
67
            return gzip.GzipFile(fileobj=StringIO(url_f.read()))
 
68
        else:
 
69
            return url_f
72
70
 
73
71
 
74
72
 
101
99
 
102
100
 
103
101
class RemoteBranch(Branch):
104
 
    def __init__(self, baseurl, find_root=True, lock_mode='r'):
 
102
    def __init__(self, baseurl, find_root=True):
105
103
        """Create new proxy for a remote branch."""
106
 
        if lock_mode not in ('', 'r'):
107
 
            raise BzrError('lock mode %r is not supported for remote branches'
108
 
                           % lock_mode)
109
 
 
110
104
        if find_root:
111
105
            self.baseurl = _find_remote_root(baseurl)
112
106
        else:
113
107
            self.baseurl = baseurl
114
108
            self._check_format()
115
109
 
 
110
        self.inventory_store = RemoteStore(baseurl + '/.bzr/inventory-store/')
 
111
        self.text_store = RemoteStore(baseurl + '/.bzr/text-store/')
 
112
        self.revision_store = RemoteStore(baseurl + '/.bzr/revision-store/')
 
113
 
116
114
    def __str__(self):
117
 
        return '%s(%r)' % (self.__class__.__name__, self.baseurl)
 
115
        b = getattr(self, 'baseurl', 'undefined')
 
116
        return '%s(%r)' % (self.__class__.__name__, b)
118
117
 
119
118
    __repr__ = __str__
120
119
 
123
122
            raise BzrError("file mode %r not supported for remote branches" % mode)
124
123
        return get_url(self.baseurl + '/.bzr/' + filename, False)
125
124
 
126
 
    def _need_readlock(self):
127
 
        # remote branch always safe for read
128
 
        pass
129
 
 
130
 
    def _need_writelock(self):
131
 
        raise BzrError("cannot get write lock on HTTP remote branch")
 
125
 
 
126
    def lock_read(self):
 
127
        # no locking for remote branches yet
 
128
        pass
 
129
 
 
130
    def lock_write(self):
 
131
        from errors import LockError
 
132
        raise LockError("write lock not supported for remote branch %s"
 
133
                        % self.baseurl)
 
134
 
 
135
    def unlock(self):
 
136
        pass
 
137
    
132
138
 
133
139
    def relpath(self, path):
134
140
        if not path.startswith(self.baseurl):
137
143
        pl = len(self.baseurl)
138
144
        return path[pl:].lstrip('/')
139
145
 
 
146
 
140
147
    def get_revision(self, revision_id):
141
 
        from revision import Revision
142
 
        revf = get_url(self.baseurl + '/.bzr/revision-store/' + revision_id,
143
 
                       True)
144
 
        r = Revision.read_xml(revf)
 
148
        from bzrlib.revision import Revision
 
149
        from bzrlib.xml import unpack_xml
 
150
        revf = self.revision_store[revision_id]
 
151
        r = unpack_xml(Revision, revf)
145
152
        if r.revision_id != revision_id:
146
153
            raise BzrCheckError('revision stored as {%s} actually contains {%s}'
147
154
                                % (revision_id, r.revision_id))
148
155
        return r
 
156
 
 
157
 
 
158
class RemoteStore(object):
 
159
    def __init__(self, baseurl):
 
160
        self._baseurl = baseurl
 
161
        
 
162
 
 
163
    def _path(self, name):
 
164
        if '/' in name:
 
165
            raise ValueError('invalid store id', name)
 
166
        return self._baseurl + '/' + name
 
167
        
 
168
    def __getitem__(self, fileid):
 
169
        p = self._path(fileid)
 
170
        return get_url(p, compressed=True)
149
171
    
150
172
 
151
 
def simple_walk():
152
 
    from revision import Revision
153
 
    from branch import Branch
154
 
    from inventory import Inventory
155
 
 
156
 
    got_invs = Set()
157
 
    got_texts = Set()
158
 
 
159
 
    print 'read history'
160
 
    history = get_url('/.bzr/revision-history').readlines()
161
 
    num_revs = len(history)
162
 
    for i, rev_id in enumerate(history):
163
 
        rev_id = rev_id.rstrip()
164
 
        print 'read revision %d/%d' % (i, num_revs)
165
 
 
166
 
        # python gzip needs a seekable file (!!) but the HTTP response
167
 
        # isn't, so we need to buffer it
168
 
 
169
 
        rev_f = get_url('/.bzr/revision-store/%s' % rev_id,
170
 
                        compressed=True)
171
 
 
172
 
        rev = Revision.read_xml(rev_f)
173
 
        print rev.message
174
 
        inv_id = rev.inventory_id
175
 
        if inv_id not in got_invs:
176
 
            print 'get inventory %s' % inv_id
177
 
            inv_f = get_url('/.bzr/inventory-store/%s' % inv_id,
178
 
                            compressed=True)
179
 
            inv = Inventory.read_xml(inv_f)
180
 
            print '%4d inventory entries' % len(inv)
181
 
 
182
 
            for path, ie in inv.iter_entries():
183
 
                text_id = ie.text_id
184
 
                if text_id == None:
185
 
                    continue
186
 
                if text_id in got_texts:
187
 
                    continue
188
 
                print '  fetch %s text {%s}' % (path, text_id)
189
 
                text_f = get_url('/.bzr/text-store/%s' % text_id,
190
 
                                 compressed=True)
191
 
                got_texts.add(text_id)
192
 
 
193
 
            got_invs.add(inv_id)
194
 
 
195
 
        print '----'
196
 
 
197
 
 
198
 
def try_me():
199
 
    BASE_URL = 'http://bazaar-ng.org/bzr/bzr.dev/'
200
 
    b = RemoteBranch(BASE_URL)
201
 
    ## print '\n'.join(b.revision_history())
202
 
    from log import show_log
203
 
    show_log(b)
204
 
 
205
 
 
206
 
if __name__ == '__main__':
207
 
    try_me()
208
173