/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2018.5.40 by Robert Collins
Implement a remote Repository.has_revision method.
1
# Copyright (C) 2006 Canonical Ltd
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
"""Server-side repository related request implmentations."""
18
19
20
from bzrlib import errors
21
from bzrlib.bzrdir import BzrDir
22
from bzrlib.smart.request import SmartServerRequest, SmartServerResponse
23
24
2018.5.56 by Robert Collins
Factor out code we expect to be common in SmartServerRequestHasRevision to SmartServerRepositoryRequest (Robert Collins, Vincent Ladeuil).
25
class SmartServerRepositoryRequest(SmartServerRequest):
26
    """Common base class for Repository requests."""
27
28
    def do(self, path, *args):
29
        """Execute a repository request.
30
        
2018.5.40 by Robert Collins
Implement a remote Repository.has_revision method.
31
        The repository must be at the exact path - no searching is done.
32
2018.5.56 by Robert Collins
Factor out code we expect to be common in SmartServerRequestHasRevision to SmartServerRepositoryRequest (Robert Collins, Vincent Ladeuil).
33
        The actual logic is delegated to self.do_repository_request.
34
2018.5.40 by Robert Collins
Implement a remote Repository.has_revision method.
35
        :param path: The path for the repository.
2018.5.56 by Robert Collins
Factor out code we expect to be common in SmartServerRequestHasRevision to SmartServerRepositoryRequest (Robert Collins, Vincent Ladeuil).
36
        :return: A smart server from self.do_repository_request().
37
        """
38
        transport = self._backing_transport.clone(path)
39
        bzrdir = BzrDir.open_from_transport(transport)
40
        repository = bzrdir.open_repository()
41
        return self.do_repository_request(repository, *args)
42
43
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
44
class SmartServerRepositoryGetRevisionGraph(SmartServerRepositoryRequest):
45
    
46
    def do_repository_request(self, repository, revision_id):
47
        """Return the result of repository.get_revision_graph(revision_id).
48
        
49
        :param repository: The repository to query in.
50
        :param revision_id: The utf8 encoded revision_id to get a graph from.
51
        :return: A smart server response where the body contains an utf8
52
            encoded flattened list of the revision graph.
53
        """
2018.5.83 by Andrew Bennetts
Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.
54
        if not revision_id:
55
            revision_id = None
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
56
57
        lines = []
58
        try:
2018.5.83 by Andrew Bennetts
Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.
59
            revision_graph = repository.get_revision_graph(revision_id)
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
60
        except errors.NoSuchRevision:
2018.14.1 by Andrew Bennetts
Update to current hpss branch? Fix lots of test failures.
61
            # Note that we return an empty body, rather than omitting the body.
62
            # This way the client knows that it can always expect to find a body
63
            # in the response for this method, even in the error case.
64
            return SmartServerResponse(('nosuchrevision', revision_id), '')
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
65
66
        for revision, parents in revision_graph.items():
67
            lines.append(' '.join([revision,] + parents))
68
2018.5.83 by Andrew Bennetts
Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.
69
        return SmartServerResponse(('ok', ), '\n'.join(lines))
2018.5.67 by Wouter van Heyst
Implement RemoteRepository.get_revision_graph (Wouter van Heyst, Robert Collins)
70
71
2018.5.56 by Robert Collins
Factor out code we expect to be common in SmartServerRequestHasRevision to SmartServerRepositoryRequest (Robert Collins, Vincent Ladeuil).
72
class SmartServerRequestHasRevision(SmartServerRepositoryRequest):
73
74
    def do_repository_request(self, repository, revision_id):
75
        """Return ok if a specific revision is in the repository at path.
76
77
        :param repository: The repository to query in.
2018.5.40 by Robert Collins
Implement a remote Repository.has_revision method.
78
        :param revision_id: The utf8 encoded revision_id to lookup.
79
        :return: A smart server response of ('ok', ) if the revision is
80
            present.
81
        """
2018.5.83 by Andrew Bennetts
Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.
82
        if repository.has_revision(revision_id):
2018.5.40 by Robert Collins
Implement a remote Repository.has_revision method.
83
            return SmartServerResponse(('ok', ))
84
        else:
85
            return SmartServerResponse(('no', ))
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
86
87
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
88
class SmartServerRepositoryGatherStats(SmartServerRepositoryRequest):
89
90
    def do_repository_request(self, repository, revid, committers):
91
        """Return the result of repository.gather_stats().
92
93
        :param repository: The repository to query in.
94
        :param revid: utf8 encoded rev id or an empty string to indicate None
95
        :param committers: 'yes' or 'no'.
96
97
        :return: A SmartServerResponse ('ok',), a encoded body looking like
98
              committers: 1
99
              firstrev: 1234.230 0
100
              latestrev: 345.700 3600
101
              revisions: 2
102
              size:45
103
104
              But containing only fields returned by the gather_stats() call
105
        """
106
        if revid == '':
107
            decoded_revision_id = None
108
        else:
2018.5.83 by Andrew Bennetts
Fix some test failures caused by the switch from unicode to UTF-8-encoded strs for revision IDs.
109
            decoded_revision_id = revid
2018.10.2 by v.ladeuil+lp at free
gather_stats server side and request registration
110
        if committers == 'yes':
111
            decoded_committers = True
112
        else:
113
            decoded_committers = None
114
        stats = repository.gather_stats(decoded_revision_id, decoded_committers)
115
116
        body = ''
117
        if stats.has_key('committers'):
118
            body += 'committers: %d\n' % stats['committers']
119
        if stats.has_key('firstrev'):
120
            body += 'firstrev: %.3f %d\n' % stats['firstrev']
121
        if stats.has_key('latestrev'):
122
             body += 'latestrev: %.3f %d\n' % stats['latestrev']
123
        if stats.has_key('revisions'):
124
            body += 'revisions: %d\n' % stats['revisions']
125
        if stats.has_key('size'):
126
            body += 'size: %d\n' % stats['size']
127
128
        return SmartServerResponse(('ok', ), body)
129
130
2018.5.57 by Robert Collins
Implement RemoteRepository.is_shared (Robert Collins, Vincent Ladeuil).
131
class SmartServerRepositoryIsShared(SmartServerRepositoryRequest):
132
133
    def do_repository_request(self, repository):
134
        """Return the result of repository.is_shared().
135
136
        :param repository: The repository to query in.
137
        :return: A smart server response of ('yes', ) if the repository is
138
            shared, and ('no', ) if it is not.
139
        """
140
        if repository.is_shared():
141
            return SmartServerResponse(('yes', ))
142
        else:
143
            return SmartServerResponse(('no', ))
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
144
145
146
class SmartServerRepositoryLockWrite(SmartServerRepositoryRequest):
147
2018.5.79 by Andrew Bennetts
Implement RemoteBranch.lock_write/unlock as smart operations.
148
    def do_repository_request(self, repository, token=''):
2018.5.78 by Andrew Bennetts
Implement RemoteRepository.lock_write/unlock to expect and send tokens over the
149
        # XXX: this probably should not have a token.
150
        if token == '':
151
            token = None
152
        try:
153
            token = repository.lock_write(token=token)
154
        except errors.LockContention, e:
155
            return SmartServerResponse(('LockContention',))
156
        repository.leave_lock_in_place()
157
        repository.unlock()
158
        if token is None:
159
            token = ''
160
        return SmartServerResponse(('ok', token))
161
162
163
class SmartServerRepositoryUnlock(SmartServerRepositoryRequest):
164
165
    def do_repository_request(self, repository, token):
166
        try:
167
            repository.lock_write(token=token)
168
        except errors.TokenMismatch, e:
169
            return SmartServerResponse(('TokenMismatch',))
170
        repository.dont_leave_lock_in_place()
171
        repository.unlock()
172
        return SmartServerResponse(('ok',))
173