13
13
# You should have received a copy of the GNU General Public License
14
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
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
"""Server-side branch related request implmentations."""
33
33
def do(self, path, *args):
34
34
"""Execute a request for a branch at path.
36
36
All Branch requests take a path to the branch as their first argument.
38
38
If the branch is a branch reference, NotBranchError is raised.
45
45
bzrdir = BzrDir.open_from_transport(transport)
46
46
if bzrdir.get_branch_reference() is not None:
47
47
raise errors.NotBranchError(transport.base)
48
branch = bzrdir.open_branch()
48
branch = bzrdir.open_branch(ignore_fallbacks=True)
49
49
return self.do_with_branch(branch, *args)
76
76
class SmartServerBranchGetConfigFile(SmartServerBranchRequest):
78
78
def do_with_branch(self, branch):
79
79
"""Return the content of branch.conf
81
81
The body is not utf8 decoded - its the literal bytestream from disk.
83
# This was at one time called by RemoteBranchLockableFiles
84
# intercepting access to this file; as of 1.5 it is not called by the
85
# client but retained for compatibility. It may be called again to
86
# allow the client to get the configuration without needing vfs
89
84
content = branch._transport.get_bytes('branch.conf')
90
85
except errors.NoSuchFile:
92
87
return SuccessfulSmartServerResponse( ('ok', ), content)
90
class SmartServerBranchGetParent(SmartServerBranchRequest):
92
def do_with_branch(self, branch):
93
"""Return the parent of branch."""
94
parent = branch._get_parent_location() or ''
95
return SuccessfulSmartServerResponse((parent,))
98
class SmartServerBranchGetTagsBytes(SmartServerBranchRequest):
100
def do_with_branch(self, branch):
101
"""Return the _get_tags_bytes for a branch."""
102
bytes = branch._get_tags_bytes()
103
return SuccessfulSmartServerResponse((bytes,))
106
class SmartServerBranchSetTagsBytes(SmartServerLockedBranchRequest):
108
def __init__(self, backing_transport, root_client_path='/', jail_root=None):
109
SmartServerLockedBranchRequest.__init__(
110
self, backing_transport, root_client_path, jail_root)
113
def do_with_locked_branch(self, branch):
114
"""Call _set_tags_bytes for a branch.
118
# We need to keep this branch locked until we get a body with the tags
121
self.branch.lock_write()
124
def do_body(self, bytes):
125
self.branch._set_tags_bytes(bytes)
126
return SuccessfulSmartServerResponse(())
129
# TODO: this request shouldn't have to do this housekeeping manually.
130
# Some of this logic probably belongs in a base class.
132
# We never acquired the branch successfully in the first place, so
133
# there's nothing more to do.
136
return SmartServerLockedBranchRequest.do_end(self)
138
# Only try unlocking if we locked successfully in the first place
95
142
class SmartServerBranchRequestGetStackedOnURL(SmartServerBranchRequest):
97
144
def do_with_branch(self, branch):
114
161
class SmartServerBranchRequestLastRevisionInfo(SmartServerBranchRequest):
116
163
def do_with_branch(self, branch):
117
164
"""Return branch.last_revision_info().
119
166
The revno is encoded in decimal, the revision_id is encoded as utf8.
121
168
revno, last_revision = branch.last_revision_info()
137
184
return FailedSmartServerResponse(('TipChangeRejected', msg))
187
class SmartServerBranchRequestSetConfigOption(SmartServerLockedBranchRequest):
188
"""Set an option in the branch configuration."""
190
def do_with_locked_branch(self, branch, value, name, section):
193
branch._get_config().set_option(value.decode('utf8'), name, section)
194
return SuccessfulSmartServerResponse(())
140
197
class SmartServerBranchRequestSetLastRevision(SmartServerSetTipRequest):
142
199
def do_tip_change_with_locked_branch(self, branch, new_last_revision_id):
143
200
if new_last_revision_id == 'null:':
144
201
branch.set_revision_history([])
146
203
if not branch.repository.has_revision(new_last_revision_id):
147
204
return FailedSmartServerResponse(
148
205
('NoSuchRevision', new_last_revision_id))
149
branch.generate_revision_history(new_last_revision_id)
206
branch.set_revision_history(branch._lefthand_history(
207
new_last_revision_id, None, None))
150
208
return SuccessfulSmartServerResponse(('ok',))
153
211
class SmartServerBranchRequestSetLastRevisionEx(SmartServerSetTipRequest):
155
213
def do_tip_change_with_locked_branch(self, branch, new_last_revision_id,
156
214
allow_divergence, allow_overwrite_descendant):
157
215
"""Set the last revision of the branch.
161
219
:param new_last_revision_id: the revision ID to set as the last
162
220
revision of the branch.
163
221
:param allow_divergence: A flag. If non-zero, change the revision ID
215
273
return SuccessfulSmartServerResponse(('ok',))
276
class SmartServerBranchRequestSetParentLocation(SmartServerLockedBranchRequest):
277
"""Set the parent location for a branch.
279
Takes a location to set, which must be utf8 encoded.
282
def do_with_locked_branch(self, branch, location):
283
branch._set_parent_location(location)
284
return SuccessfulSmartServerResponse(())
218
287
class SmartServerBranchRequestLockWrite(SmartServerBranchRequest):
220
289
def do_with_branch(self, branch, branch_token='', repo_token=''):
221
290
if branch_token == '':
222
291
branch_token = None