1
# Copyright (C) 2006 Canonical Ltd
1
# Copyright (C) 2006-2010 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
17
17
"""Server-side branch related request implmentations."""
20
from bzrlib import errors
21
from bzrlib.bzrdir import BzrDir
23
revision as _mod_revision,
25
from bzrlib.controldir import ControlDir
22
26
from bzrlib.smart.request import (
23
27
FailedSmartServerResponse,
24
28
SmartServerRequest,
42
46
:return: A SmartServerResponse from self.do_with_branch().
44
48
transport = self.transport_from_client_path(path)
45
bzrdir = BzrDir.open_from_transport(transport)
46
if bzrdir.get_branch_reference() is not None:
49
controldir = ControlDir.open_from_transport(transport)
50
if controldir.get_branch_reference() is not None:
47
51
raise errors.NotBranchError(transport.base)
48
branch = bzrdir.open_branch(ignore_fallbacks=True)
52
branch = controldir.open_branch(ignore_fallbacks=True)
49
53
return self.do_with_branch(branch, *args)
81
85
The body is not utf8 decoded - its the literal bytestream from disk.
84
content = branch._transport.get_bytes('branch.conf')
88
content = branch.control_transport.get_bytes('branch.conf')
85
89
except errors.NoSuchFile:
87
91
return SuccessfulSmartServerResponse( ('ok', ), content)
94
class SmartServerBranchPutConfigFile(SmartServerBranchRequest):
95
"""Set the configuration data for a branch.
100
def do_with_branch(self, branch, branch_token, repo_token):
101
"""Set the content of branch.conf.
103
The body is not utf8 decoded - its the literal bytestream for disk.
105
self._branch = branch
106
self._branch_token = branch_token
107
self._repo_token = repo_token
108
# Signal we want a body
111
def do_body(self, body_bytes):
112
self._branch.repository.lock_write(token=self._repo_token)
114
self._branch.lock_write(token=self._branch_token)
116
self._branch.control_transport.put_bytes(
117
'branch.conf', body_bytes)
119
self._branch.unlock()
121
self._branch.repository.unlock()
122
return SuccessfulSmartServerResponse(('ok', ))
90
125
class SmartServerBranchGetParent(SmartServerBranchRequest):
92
127
def do_with_branch(self, branch):
139
174
self.branch.unlock()
177
class SmartServerBranchHeadsToFetch(SmartServerBranchRequest):
179
def do_with_branch(self, branch):
180
"""Return the heads-to-fetch for a Branch as two bencoded lists.
182
See Branch.heads_to_fetch.
186
must_fetch, if_present_fetch = branch.heads_to_fetch()
187
return SuccessfulSmartServerResponse(
188
(list(must_fetch), list(if_present_fetch)))
142
191
class SmartServerBranchRequestGetStackedOnURL(SmartServerBranchRequest):
144
193
def do_with_branch(self, branch):
154
203
The revision list is returned as the body content,
155
204
with each revision utf8 encoded and \x00 joined.
208
graph = branch.repository.get_graph()
209
stop_revisions = (None, _mod_revision.NULL_REVISION)
210
history = list(graph.iter_lefthand_ancestry(
211
branch.last_revision(), stop_revisions))
157
214
return SuccessfulSmartServerResponse(
158
('ok', ), ('\x00'.join(branch.revision_history())))
215
('ok', ), ('\x00'.join(reversed(history))))
161
218
class SmartServerBranchRequestLastRevisionInfo(SmartServerBranchRequest):
194
251
return SuccessfulSmartServerResponse(())
254
class SmartServerBranchRequestSetConfigOptionDict(SmartServerLockedBranchRequest):
255
"""Set an option in the branch configuration.
260
def do_with_locked_branch(self, branch, value_dict, name, section):
261
utf8_dict = bencode.bdecode(value_dict)
263
for key, value in utf8_dict.items():
264
value_dict[key.decode('utf8')] = value.decode('utf8')
267
branch._get_config().set_option(value_dict, name, section)
268
return SuccessfulSmartServerResponse(())
197
271
class SmartServerBranchRequestSetLastRevision(SmartServerSetTipRequest):
199
273
def do_tip_change_with_locked_branch(self, branch, new_last_revision_id):
200
274
if new_last_revision_id == 'null:':
201
branch.set_revision_history([])
275
branch._set_revision_history([])
203
277
if not branch.repository.has_revision(new_last_revision_id):
204
278
return FailedSmartServerResponse(
205
279
('NoSuchRevision', new_last_revision_id))
206
branch.set_revision_history(branch._lefthand_history(
280
branch._set_revision_history(branch._lefthand_history(
207
281
new_last_revision_id, None, None))
208
282
return SuccessfulSmartServerResponse(('ok',))
292
366
if repo_token == '':
293
367
repo_token = None
295
repo_token = branch.repository.lock_write(token=repo_token)
369
repo_token = branch.repository.lock_write(
370
token=repo_token).repository_token
297
branch_token = branch.lock_write(token=branch_token)
372
branch_token = branch.lock_write(
373
token=branch_token).branch_token
299
375
# this leaves the repository with 1 lock
300
376
branch.repository.unlock()