~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/remotebranch.py

  • Committer: Martin Pool
  • Date: 2005-05-09 06:09:42 UTC
  • Revision ID: mbp@sourcefrog.net-20050509060942-d9c9efd7feed0894
- more indicators at top of test output
- tidy up remotebranch stuff

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#! /usr/bin/env python
 
2
 
1
3
# Copyright (C) 2005 Canonical Ltd
2
4
 
3
5
# This program is free software; you can redistribute it and/or modify
15
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
18
 
17
19
 
18
 
## XXX: This is pretty slow on high-latency connections because it
19
 
## doesn't keep the HTTP connection alive.  If you have a smart local
20
 
## proxy it may be much better.  Eventually I want to switch to
21
 
## urlgrabber which should use HTTP much more efficiently.
22
 
 
23
 
 
24
 
import urllib2, gzip, zlib
 
20
"""Proxy object for access to remote branches.
 
21
 
 
22
At the moment remote branches are only for HTTP and only for read
 
23
access.
 
24
 
 
25
"""
 
26
 
 
27
 
 
28
import gzip
25
29
from sets import Set
26
30
from cStringIO import StringIO
27
31
 
28
 
from errors import BzrError
29
 
from revision import Revision
30
 
from inventory import Inventory
31
 
 
32
 
# h = HTTPConnection('localhost:8000')
33
 
# h = HTTPConnection('bazaar-ng.org')
 
32
from errors import BzrError, BzrCheckError
 
33
from branch import Branch
34
34
 
35
35
# velocitynet.com.au transparently proxies connections and thereby
36
36
# breaks keep-alive -- sucks!
37
37
 
38
38
 
39
 
import urlgrabber.keepalive
40
 
urlgrabber.keepalive.DEBUG = 2
41
 
 
42
 
import urlgrabber
43
 
 
44
 
prefix = 'http://localhost:8000'
45
 
# prefix = 'http://bazaar-ng.org/bzr/main/'
46
 
 
47
 
def get_url(path, compressed=False):
48
 
    try:
49
 
        url = prefix + path
50
 
        if compressed:
51
 
            url += '.gz'
52
 
        url_f = urlgrabber.urlopen(url, keepalive=1, close_connection=0)
53
 
        if not compressed:
54
 
            return url_f
55
 
        else:
56
 
            return gzip.GzipFile(fileobj=StringIO(url_f.read()))
57
 
    except urllib2.URLError, e:
58
 
        raise BzrError("remote fetch failed: %r: %s" % (url, e))
59
 
 
60
 
 
61
 
got_invs = Set()
62
 
got_texts = Set()
63
 
 
64
 
print 'read history'
65
 
history = get_url('/.bzr/revision-history').readlines()
66
 
num_revs = len(history)
67
 
for i, rev_id in enumerate(history):
68
 
    rev_id = rev_id.rstrip()
69
 
    print 'read revision %d/%d' % (i, num_revs)
70
 
 
71
 
    # python gzip needs a seekable file (!!) but the HTTP response
72
 
    # isn't, so we need to buffer it
 
39
 
 
40
ENABLE_URLGRABBER = False
 
41
 
 
42
def get_url(url, compressed=False):
 
43
    import urllib2
 
44
    if compressed:
 
45
        url += '.gz'
 
46
    url_f = urllib2.urlopen(url)
 
47
    if compressed:
 
48
        return gzip.GzipFile(fileobj=StringIO(url_f.read()))
 
49
    else:
 
50
        return url_f
 
51
 
 
52
if ENABLE_URLGRABBER:
 
53
    import urlgrabber
 
54
    import urlgrabber.keepalive
 
55
    urlgrabber.keepalive.DEBUG = 0
 
56
    def get_url(path, compressed=False):
 
57
        try:
 
58
            url = path
 
59
            if compressed:
 
60
                url += '.gz'
 
61
            url_f = urlgrabber.urlopen(url, keepalive=1, close_connection=0)
 
62
            if not compressed:
 
63
                return url_f
 
64
            else:
 
65
                return gzip.GzipFile(fileobj=StringIO(url_f.read()))
 
66
        except urllib2.URLError, e:
 
67
            raise BzrError("remote fetch failed: %r: %s" % (url, e))
 
68
 
 
69
 
 
70
class RemoteBranch(Branch):
 
71
    def __init__(self, baseurl):
 
72
        """Create new proxy for a remote branch."""
 
73
        self.baseurl = baseurl
 
74
        self._check_format()
 
75
 
 
76
    def controlfile(self, filename, mode):
 
77
        if mode not in ('rb', 'rt', 'r'):
 
78
            raise BzrError("file mode %r not supported for remote branches" % mode)
 
79
        return get_url(self.baseurl + '/.bzr/' + filename, False)
 
80
 
 
81
    def _need_readlock(self):
 
82
        # remote branch always safe for read
 
83
        pass
 
84
 
 
85
    def _need_writelock(self):
 
86
        raise BzrError("cannot get write lock on HTTP remote branch")
 
87
 
 
88
    def get_revision(self, revision_id):
 
89
        from revision import Revision
 
90
        revf = get_url(self.baseurl + '/.bzr/revision-store/' + revision_id,
 
91
                       True)
 
92
        r = Revision.read_xml(revf)
 
93
        if r.revision_id != revision_id:
 
94
            raise BzrCheckError('revision stored as {%s} actually contains {%s}'
 
95
                                % (revision_id, r.revision_id))
 
96
        return r
73
97
    
74
 
    rev_f = get_url('/.bzr/revision-store/%s' % rev_id,
75
 
                    compressed=True)
76
 
 
77
 
    rev = Revision.read_xml(rev_f)
78
 
    print rev.message
79
 
    inv_id = rev.inventory_id
80
 
    if inv_id not in got_invs:
81
 
        print 'get inventory %s' % inv_id
82
 
        inv_f = get_url('/.bzr/inventory-store/%s' % inv_id,
 
98
 
 
99
def simple_walk():
 
100
    from revision import Revision
 
101
    from branch import Branch
 
102
    from inventory import Inventory
 
103
 
 
104
    got_invs = Set()
 
105
    got_texts = Set()
 
106
 
 
107
    print 'read history'
 
108
    history = get_url('/.bzr/revision-history').readlines()
 
109
    num_revs = len(history)
 
110
    for i, rev_id in enumerate(history):
 
111
        rev_id = rev_id.rstrip()
 
112
        print 'read revision %d/%d' % (i, num_revs)
 
113
 
 
114
        # python gzip needs a seekable file (!!) but the HTTP response
 
115
        # isn't, so we need to buffer it
 
116
 
 
117
        rev_f = get_url('/.bzr/revision-store/%s' % rev_id,
83
118
                        compressed=True)
84
 
        inv = Inventory.read_xml(inv_f)
85
 
        print '%4d inventory entries' % len(inv)
86
 
 
87
 
        for path, ie in inv.iter_entries():
88
 
            text_id = ie.text_id
89
 
            if text_id == None:
90
 
                continue
91
 
            if text_id in got_texts:
92
 
                continue
93
 
            print '  fetch %s text {%s}' % (path, text_id)
94
 
            text_f = get_url('/.bzr/text-store/%s' % text_id,
95
 
                             compressed=True)
96
 
            got_texts.add(text_id)
97
 
            
98
 
        got_invs.add(inv_id)
99
 
 
100
 
    print '----'
 
119
 
 
120
        rev = Revision.read_xml(rev_f)
 
121
        print rev.message
 
122
        inv_id = rev.inventory_id
 
123
        if inv_id not in got_invs:
 
124
            print 'get inventory %s' % inv_id
 
125
            inv_f = get_url('/.bzr/inventory-store/%s' % inv_id,
 
126
                            compressed=True)
 
127
            inv = Inventory.read_xml(inv_f)
 
128
            print '%4d inventory entries' % len(inv)
 
129
 
 
130
            for path, ie in inv.iter_entries():
 
131
                text_id = ie.text_id
 
132
                if text_id == None:
 
133
                    continue
 
134
                if text_id in got_texts:
 
135
                    continue
 
136
                print '  fetch %s text {%s}' % (path, text_id)
 
137
                text_f = get_url('/.bzr/text-store/%s' % text_id,
 
138
                                 compressed=True)
 
139
                got_texts.add(text_id)
 
140
 
 
141
            got_invs.add(inv_id)
 
142
 
 
143
        print '----'
 
144
 
 
145
 
 
146
def try_me():
 
147
    BASE_URL = 'http://bazaar-ng.org/bzr/bzr.dev/'
 
148
    b = RemoteBranch(BASE_URL)
 
149
    ## print '\n'.join(b.revision_history())
 
150
    from log import show_log
 
151
    show_log(b)
 
152
 
 
153
 
 
154
if __name__ == '__main__':
 
155
    try_me()
 
156