27
27
from bzrlib.smart import request
30
# vfs_commands is the set of commands handlers for the version 1 protocol.
31
vfs_commands = request.version_one_commands.copy()
33
def register_command(command):
34
vfs_commands[command.method] = command
37
30
def _deserialise_optional_mode(mode):
38
31
# XXX: FIXME this should be on the protocol object. Later protocol versions
39
32
# might serialise modes differently.
46
39
class HasRequest(request.SmartServerRequest):
50
41
def do(self, relpath):
51
42
r = self._backing_transport.has(relpath) and 'yes' or 'no'
52
43
return request.SmartServerResponse((r,))
53
register_command(HasRequest)
56
46
class GetRequest(request.SmartServerRequest):
60
48
def do(self, relpath):
61
49
backing_bytes = self._backing_transport.get_bytes(relpath)
62
50
return request.SmartServerResponse(('ok',), backing_bytes)
63
register_command(GetRequest)
66
53
class AppendRequest(request.SmartServerRequest):
70
55
def do(self, relpath, mode):
71
56
self._relpath = relpath
72
57
self._mode = _deserialise_optional_mode(mode)
76
61
self._relpath, body_bytes, self._mode)
77
62
return request.SmartServerResponse(('appended', '%d' % old_length))
79
register_command(AppendRequest)
82
65
class DeleteRequest(request.SmartServerRequest):
86
67
def do(self, relpath):
87
68
self._backing_transport.delete(relpath)
88
69
return request.SmartServerResponse(('ok', ))
89
register_command(DeleteRequest)
92
72
class IterFilesRecursive(request.SmartServerRequest):
94
method = 'iter_files_recursive'
96
74
def do(self, relpath):
97
75
transport = self._backing_transport.clone(relpath)
98
76
filenames = transport.iter_files_recursive()
99
77
return request.SmartServerResponse(('names',) + tuple(filenames))
100
register_command(IterFilesRecursive)
103
80
class ListDirRequest(request.SmartServerRequest):
107
82
def do(self, relpath):
108
83
filenames = self._backing_transport.list_dir(relpath)
109
84
return request.SmartServerResponse(('names',) + tuple(filenames))
110
register_command(ListDirRequest)
113
87
class MkdirCommand(request.SmartServerRequest):
117
89
def do(self, relpath, mode):
118
90
self._backing_transport.mkdir(relpath,
119
91
_deserialise_optional_mode(mode))
120
92
return request.SmartServerResponse(('ok',))
121
register_command(MkdirCommand)
124
95
class MoveCommand(request.SmartServerRequest):
128
97
def do(self, rel_from, rel_to):
129
98
self._backing_transport.move(rel_from, rel_to)
130
99
return request.SmartServerResponse(('ok',))
131
register_command(MoveCommand)
134
102
class PutCommand(request.SmartServerRequest):
138
104
def do(self, relpath, mode):
139
105
self._relpath = relpath
140
106
self._mode = _deserialise_optional_mode(mode)
142
108
def do_body(self, body_bytes):
143
109
self._backing_transport.put_bytes(self._relpath, body_bytes, self._mode)
144
110
return request.SmartServerResponse(('ok',))
145
register_command(PutCommand)
148
113
class PutNonAtomicCommand(request.SmartServerRequest):
150
method = 'put_non_atomic'
152
115
def do(self, relpath, mode, create_parent, dir_mode):
153
116
self._relpath = relpath
154
117
self._dir_mode = _deserialise_optional_mode(dir_mode)
163
126
create_parent_dir=self._create_parent,
164
127
dir_mode=self._dir_mode)
165
128
return request.SmartServerResponse(('ok',))
166
register_command(PutNonAtomicCommand)
169
131
class ReadvCommand(request.SmartServerRequest):
173
133
def do(self, relpath):
174
134
self._relpath = relpath
189
149
start, length = line.split(',')
190
150
offsets.append((int(start), int(length)))
192
register_command(ReadvCommand)
195
154
class RenameCommand(request.SmartServerRequest):
199
156
def do(self, rel_from, rel_to):
200
157
self._backing_transport.rename(rel_from, rel_to)
201
158
return request.SmartServerResponse(('ok', ))
202
register_command(RenameCommand)
205
161
class RmdirCommand(request.SmartServerRequest):
209
163
def do(self, relpath):
210
164
self._backing_transport.rmdir(relpath)
211
165
return request.SmartServerResponse(('ok', ))
212
register_command(RmdirCommand)
215
168
class StatCommand(request.SmartServerRequest):
219
170
def do(self, relpath):
220
171
stat = self._backing_transport.stat(relpath)
221
172
return request.SmartServerResponse(
222
173
('stat', str(stat.st_size), oct(stat.st_mode)))
223
register_command(StatCommand)