/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
411 by Martin Pool
- start adding more useful RemoteBranch() class
1
#! /usr/bin/env python
2
188 by mbp at sourcefrog
- experimental remote-branch support
3
# Copyright (C) 2005 Canonical Ltd
4
5
# This program is free software; you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 2 of the License, or
8
# (at your option) any later version.
9
10
# This program is distributed in the hope that it will be useful,
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
# GNU General Public License for more details.
14
15
# You should have received a copy of the GNU General Public License
16
# along with this program; if not, write to the Free Software
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
19
412 by Martin Pool
- RemoteBranch displays the log of a remote branch.
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
192 by mbp at sourcefrog
- exercise the network more towards doing a remote clone
29
from sets import Set
30
from cStringIO import StringIO
188 by mbp at sourcefrog
- experimental remote-branch support
31
412 by Martin Pool
- RemoteBranch displays the log of a remote branch.
32
from errors import BzrError, BzrCheckError
411 by Martin Pool
- start adding more useful RemoteBranch() class
33
from branch import Branch
188 by mbp at sourcefrog
- experimental remote-branch support
34
193 by mbp at sourcefrog
more experiments with http get
35
# velocitynet.com.au transparently proxies connections and thereby
36
# breaks keep-alive -- sucks!
37
38
39
412 by Martin Pool
- RemoteBranch displays the log of a remote branch.
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))
188 by mbp at sourcefrog
- experimental remote-branch support
68
192 by mbp at sourcefrog
- exercise the network more towards doing a remote clone
69
411 by Martin Pool
- start adding more useful RemoteBranch() class
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")
412 by Martin Pool
- RemoteBranch displays the log of a 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
188 by mbp at sourcefrog
- experimental remote-branch support
97
    
411 by Martin Pool
- start adding more useful RemoteBranch() class
98
99
def simple_walk():
413 by Martin Pool
- more indicators at top of test output
100
    from revision import Revision
101
    from branch import Branch
102
    from inventory import Inventory
103
411 by Martin Pool
- start adding more useful RemoteBranch() class
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,
192 by mbp at sourcefrog
- exercise the network more towards doing a remote clone
118
                        compressed=True)
411 by Martin Pool
- start adding more useful RemoteBranch() class
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():
413 by Martin Pool
- more indicators at top of test output
147
    BASE_URL = 'http://bazaar-ng.org/bzr/bzr.dev/'
411 by Martin Pool
- start adding more useful RemoteBranch() class
148
    b = RemoteBranch(BASE_URL)
412 by Martin Pool
- RemoteBranch displays the log of a remote branch.
149
    ## print '\n'.join(b.revision_history())
150
    from log import show_log
151
    show_log(b)
411 by Martin Pool
- start adding more useful RemoteBranch() class
152
153
154
if __name__ == '__main__':
155
    try_me()
156