~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 05:42:06 UTC
  • Revision ID: mbp@sourcefrog.net-20050509054206-26985f0b24ec2ec8
- start adding more useful RemoteBranch() class

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
27
29
 
28
30
from errors import BzrError
29
31
from revision import Revision
 
32
from branch import Branch
30
33
from inventory import Inventory
31
34
 
32
35
# h = HTTPConnection('localhost:8000')
41
44
 
42
45
import urlgrabber
43
46
 
44
 
prefix = 'http://localhost:8000'
45
 
# prefix = 'http://bazaar-ng.org/bzr/main/'
 
47
# prefix = 'http://localhost:8000'
 
48
BASE_URL = 'http://bazaar-ng.org/bzr/bzr.dev/'
46
49
 
47
50
def get_url(path, compressed=False):
48
51
    try:
49
 
        url = prefix + path
 
52
        url = path
50
53
        if compressed:
51
54
            url += '.gz'
52
55
        url_f = urlgrabber.urlopen(url, keepalive=1, close_connection=0)
58
61
        raise BzrError("remote fetch failed: %r: %s" % (url, e))
59
62
 
60
63
 
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
 
64
class RemoteBranch(Branch):
 
65
    def __init__(self, baseurl):
 
66
        """Create new proxy for a remote branch."""
 
67
        self.baseurl = baseurl
 
68
        self._check_format()
 
69
 
 
70
 
 
71
    def controlfile(self, filename, mode):
 
72
        if mode not in ('rb', 'rt', 'r'):
 
73
            raise BzrError("file mode %r not supported for remote branches" % mode)
 
74
        return get_url(self.baseurl + '/.bzr/' + filename, False)
 
75
 
 
76
    def _need_readlock(self):
 
77
        # remote branch always safe for read
 
78
        pass
 
79
 
 
80
    def _need_writelock(self):
 
81
        raise BzrError("cannot get write lock on HTTP remote branch")
73
82
    
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,
 
83
 
 
84
 
 
85
def simple_walk():
 
86
    got_invs = Set()
 
87
    got_texts = Set()
 
88
 
 
89
    print 'read history'
 
90
    history = get_url('/.bzr/revision-history').readlines()
 
91
    num_revs = len(history)
 
92
    for i, rev_id in enumerate(history):
 
93
        rev_id = rev_id.rstrip()
 
94
        print 'read revision %d/%d' % (i, num_revs)
 
95
 
 
96
        # python gzip needs a seekable file (!!) but the HTTP response
 
97
        # isn't, so we need to buffer it
 
98
 
 
99
        rev_f = get_url('/.bzr/revision-store/%s' % rev_id,
83
100
                        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 '----'
 
101
 
 
102
        rev = Revision.read_xml(rev_f)
 
103
        print rev.message
 
104
        inv_id = rev.inventory_id
 
105
        if inv_id not in got_invs:
 
106
            print 'get inventory %s' % inv_id
 
107
            inv_f = get_url('/.bzr/inventory-store/%s' % inv_id,
 
108
                            compressed=True)
 
109
            inv = Inventory.read_xml(inv_f)
 
110
            print '%4d inventory entries' % len(inv)
 
111
 
 
112
            for path, ie in inv.iter_entries():
 
113
                text_id = ie.text_id
 
114
                if text_id == None:
 
115
                    continue
 
116
                if text_id in got_texts:
 
117
                    continue
 
118
                print '  fetch %s text {%s}' % (path, text_id)
 
119
                text_f = get_url('/.bzr/text-store/%s' % text_id,
 
120
                                 compressed=True)
 
121
                got_texts.add(text_id)
 
122
 
 
123
            got_invs.add(inv_id)
 
124
 
 
125
        print '----'
 
126
 
 
127
 
 
128
def try_me():
 
129
    b = RemoteBranch(BASE_URL)
 
130
    print '\n'.join(b.revision_history())
 
131
 
 
132
 
 
133
if __name__ == '__main__':
 
134
    try_me()
 
135