/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« 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
 
 
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
 
 
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
 
29
from sets import Set
 
30
from cStringIO import StringIO
 
31
 
 
32
from errors import BzrError, BzrCheckError
 
33
from branch import Branch
 
34
 
 
35
# velocitynet.com.au transparently proxies connections and thereby
 
36
# breaks keep-alive -- sucks!
 
37
 
 
38
 
 
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
 
97
    
 
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,
 
118
                        compressed=True)
 
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