/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/remote.py

terminal_width can now returns None.

* bzrlib/win32utils.py:
(get_console_size): Fix typo in comment.

* bzrlib/ui/text.py:
(TextProgressView._show_line): Handle the no terminal present case.

* bzrlib/tests/test_osutils.py:
(TestTerminalWidth): Update tests.

* bzrlib/tests/blackbox/test_too_much.py:
Fix some imports.
(OldTests.test_bzr): Handle the no terminal present case.

* bzrlib/tests/__init__.py:
(VerboseTestResult.report_test_start): Handle the no terminal
present case.

* bzrlib/status.py:
(show_pending_merges): Handle the no terminal present case.
(show_pending_merges.show_log_message): Factor out some
code. Handle the no terminal present case.

* bzrlib/osutils.py:
(terminal_width): Return None if no precise value can be found.

* bzrlib/log.py:
(LineLogFormatter.__init__): Handle the no terminal present case.
(LineLogFormatter.truncate): Accept None as max_len meaning no
truncation.
(LineLogFormatter.log_string): 

* bzrlib/help.py:
(_help_commands_to_text): Handle the no terminal present case.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2006, 2007, 2008, 2009 Canonical Ltd
2
2
#
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
27
27
    lock,
28
28
    lockdir,
29
29
    repository,
30
 
    repository as _mod_repository,
31
30
    revision,
32
31
    revision as _mod_revision,
33
 
    static_tuple,
34
32
    symbol_versioning,
35
33
)
36
 
from bzrlib.branch import BranchReferenceFormat, BranchWriteLockResult
 
34
from bzrlib.branch import BranchReferenceFormat
37
35
from bzrlib.bzrdir import BzrDir, RemoteBzrDirFormat
38
36
from bzrlib.decorators import needs_read_lock, needs_write_lock, only_raises
39
37
from bzrlib.errors import (
43
41
from bzrlib.lockable_files import LockableFiles
44
42
from bzrlib.smart import client, vfs, repository as smart_repo
45
43
from bzrlib.revision import ensure_null, NULL_REVISION
46
 
from bzrlib.repository import RepositoryWriteLockResult
47
44
from bzrlib.trace import mutter, note, warning
48
45
 
49
46
 
117
114
 
118
115
        self._probe_bzrdir()
119
116
 
120
 
    def __repr__(self):
121
 
        return '%s(%r)' % (self.__class__.__name__, self._client)
122
 
 
123
117
    def _probe_bzrdir(self):
124
118
        medium = self._client._medium
125
119
        path = self._path_for_remote_call(self._client)
160
154
        Used before calls to self._real_bzrdir.
161
155
        """
162
156
        if not self._real_bzrdir:
163
 
            if 'hpssvfs' in debug.debug_flags:
164
 
                import traceback
165
 
                warning('VFS BzrDir access triggered\n%s',
166
 
                    ''.join(traceback.format_stack()))
167
157
            self._real_bzrdir = BzrDir.open_from_transport(
168
158
                self.root_transport, _server_formats=False)
169
159
            self._format._network_name = \
245
235
        self._ensure_real()
246
236
        self._real_bzrdir.destroy_repository()
247
237
 
248
 
    def create_branch(self, name=None):
 
238
    def create_branch(self):
249
239
        # as per meta1 formats - just delegate to the format object which may
250
240
        # be parameterised.
251
 
        real_branch = self._format.get_branch_format().initialize(self,
252
 
            name=name)
 
241
        real_branch = self._format.get_branch_format().initialize(self)
253
242
        if not isinstance(real_branch, RemoteBranch):
254
 
            result = RemoteBranch(self, self.find_repository(), real_branch,
255
 
                                  name=name)
 
243
            result = RemoteBranch(self, self.find_repository(), real_branch)
256
244
        else:
257
245
            result = real_branch
258
246
        # BzrDir.clone_on_transport() uses the result of create_branch but does
264
252
        self._next_open_branch_result = result
265
253
        return result
266
254
 
267
 
    def destroy_branch(self, name=None):
 
255
    def destroy_branch(self):
268
256
        """See BzrDir.destroy_branch"""
269
257
        self._ensure_real()
270
 
        self._real_bzrdir.destroy_branch(name=name)
 
258
        self._real_bzrdir.destroy_branch()
271
259
        self._next_open_branch_result = None
272
260
 
273
261
    def create_workingtree(self, revision_id=None, from_branch=None):
274
262
        raise errors.NotLocalUrl(self.transport.base)
275
263
 
276
 
    def find_branch_format(self, name=None):
 
264
    def find_branch_format(self):
277
265
        """Find the branch 'format' for this bzrdir.
278
266
 
279
267
        This might be a synthetic object for e.g. RemoteBranch and SVN.
280
268
        """
281
 
        b = self.open_branch(name=name)
 
269
        b = self.open_branch()
282
270
        return b._format
283
271
 
284
 
    def get_branch_reference(self, name=None):
 
272
    def get_branch_reference(self):
285
273
        """See BzrDir.get_branch_reference()."""
286
 
        if name is not None:
287
 
            # XXX JRV20100304: Support opening colocated branches
288
 
            raise errors.NoColocatedBranchSupport(self)
289
274
        response = self._get_branch_reference()
290
275
        if response[0] == 'ref':
291
276
            return response[1]
295
280
    def _get_branch_reference(self):
296
281
        path = self._path_for_remote_call(self._client)
297
282
        medium = self._client._medium
298
 
        candidate_calls = [
299
 
            ('BzrDir.open_branchV3', (2, 1)),
300
 
            ('BzrDir.open_branchV2', (1, 13)),
301
 
            ('BzrDir.open_branch', None),
302
 
            ]
303
 
        for verb, required_version in candidate_calls:
304
 
            if required_version and medium._is_remote_before(required_version):
305
 
                continue
 
283
        if not medium._is_remote_before((1, 13)):
306
284
            try:
307
 
                response = self._call(verb, path)
 
285
                response = self._call('BzrDir.open_branchV2', path)
 
286
                if response[0] not in ('ref', 'branch'):
 
287
                    raise errors.UnexpectedSmartServerResponse(response)
 
288
                return response
308
289
            except errors.UnknownSmartMethod:
309
 
                if required_version is None:
310
 
                    raise
311
 
                medium._remember_remote_is_before(required_version)
312
 
            else:
313
 
                break
314
 
        if verb == 'BzrDir.open_branch':
315
 
            if response[0] != 'ok':
316
 
                raise errors.UnexpectedSmartServerResponse(response)
317
 
            if response[1] != '':
318
 
                return ('ref', response[1])
319
 
            else:
320
 
                return ('branch', '')
321
 
        if response[0] not in ('ref', 'branch'):
 
290
                medium._remember_remote_is_before((1, 13))
 
291
        response = self._call('BzrDir.open_branch', path)
 
292
        if response[0] != 'ok':
322
293
            raise errors.UnexpectedSmartServerResponse(response)
323
 
        return response
 
294
        if response[1] != '':
 
295
            return ('ref', response[1])
 
296
        else:
 
297
            return ('branch', '')
324
298
 
325
 
    def _get_tree_branch(self, name=None):
 
299
    def _get_tree_branch(self):
326
300
        """See BzrDir._get_tree_branch()."""
327
 
        return None, self.open_branch(name=name)
 
301
        return None, self.open_branch()
328
302
 
329
 
    def open_branch(self, name=None, unsupported=False,
330
 
                    ignore_fallbacks=False):
331
 
        if unsupported:
 
303
    def open_branch(self, _unsupported=False, ignore_fallbacks=False):
 
304
        if _unsupported:
332
305
            raise NotImplementedError('unsupported flag support not implemented yet.')
333
306
        if self._next_open_branch_result is not None:
334
307
            # See create_branch for details.
339
312
        if response[0] == 'ref':
340
313
            # a branch reference, use the existing BranchReference logic.
341
314
            format = BranchReferenceFormat()
342
 
            return format.open(self, name=name, _found=True,
343
 
                location=response[1], ignore_fallbacks=ignore_fallbacks)
 
315
            return format.open(self, _found=True, location=response[1],
 
316
                ignore_fallbacks=ignore_fallbacks)
344
317
        branch_format_name = response[1]
345
318
        if not branch_format_name:
346
319
            branch_format_name = None
347
320
        format = RemoteBranchFormat(network_name=branch_format_name)
348
321
        return RemoteBranch(self, self.find_repository(), format=format,
349
 
            setup_stacking=not ignore_fallbacks, name=name)
 
322
            setup_stacking=not ignore_fallbacks)
350
323
 
351
324
    def _open_repo_v1(self, path):
352
325
        verb = 'BzrDir.find_repository'
429
402
        """Return the path to be used for this bzrdir in a remote call."""
430
403
        return client.remote_path_from_transport(self.root_transport)
431
404
 
432
 
    def get_branch_transport(self, branch_format, name=None):
 
405
    def get_branch_transport(self, branch_format):
433
406
        self._ensure_real()
434
 
        return self._real_bzrdir.get_branch_transport(branch_format, name=name)
 
407
        return self._real_bzrdir.get_branch_transport(branch_format)
435
408
 
436
409
    def get_repository_transport(self, repository_format):
437
410
        self._ensure_real()
624
597
        return self._custom_format._fetch_reconcile
625
598
 
626
599
    def get_format_description(self):
627
 
        self._ensure_real()
628
 
        return 'Remote: ' + self._custom_format.get_format_description()
 
600
        return 'bzr remote repository'
629
601
 
630
602
    def __eq__(self, other):
631
603
        return self.__class__ is other.__class__
647
619
        return self._custom_format._serializer
648
620
 
649
621
 
650
 
class RemoteRepository(_RpcHelper, lock._RelockDebugMixin,
651
 
    bzrdir.ControlComponent):
 
622
class RemoteRepository(_RpcHelper, lock._RelockDebugMixin):
652
623
    """Repository accessed over rpc.
653
624
 
654
625
    For the moment most operations are performed using local transport-backed
697
668
        # Additional places to query for data.
698
669
        self._fallback_repositories = []
699
670
 
700
 
    @property
701
 
    def user_transport(self):
702
 
        return self.bzrdir.user_transport
703
 
 
704
 
    @property
705
 
    def control_transport(self):
706
 
        # XXX: Normally you shouldn't directly get at the remote repository
707
 
        # transport, but I'm not sure it's worth making this method
708
 
        # optional -- mbp 2010-04-21
709
 
        return self.bzrdir.get_repository_transport(None)
710
 
        
711
671
    def __str__(self):
712
672
        return "%s(%s)" % (self.__class__.__name__, self.base)
713
673
 
921
881
        parents_provider = self._make_parents_provider(other_repository)
922
882
        return graph.Graph(parents_provider)
923
883
 
924
 
    @needs_read_lock
925
 
    def get_known_graph_ancestry(self, revision_ids):
926
 
        """Return the known graph for a set of revision ids and their ancestors.
927
 
        """
928
 
        st = static_tuple.StaticTuple
929
 
        revision_keys = [st(r_id).intern() for r_id in revision_ids]
930
 
        known_graph = self.revisions.get_known_graph_ancestry(revision_keys)
931
 
        return graph.GraphThunkIdsToKeys(known_graph)
932
 
 
933
884
    def gather_stats(self, revid=None, committers=None):
934
885
        """See Repository.gather_stats()."""
935
886
        path = self.bzrdir._path_for_remote_call(self._client)
995
946
    def is_write_locked(self):
996
947
        return self._lock_mode == 'w'
997
948
 
998
 
    def _warn_if_deprecated(self, branch=None):
999
 
        # If we have a real repository, the check will be done there, if we
1000
 
        # don't the check will be done remotely.
1001
 
        pass
1002
 
 
1003
949
    def lock_read(self):
1004
 
        """Lock the repository for read operations.
1005
 
 
1006
 
        :return: A bzrlib.lock.LogicalLockResult.
1007
 
        """
1008
950
        # wrong eventually - want a local lock cache context
1009
951
        if not self._lock_mode:
1010
952
            self._note_lock('r')
1017
959
                repo.lock_read()
1018
960
        else:
1019
961
            self._lock_count += 1
1020
 
        return lock.LogicalLockResult(self.unlock)
1021
962
 
1022
963
    def _remote_lock_write(self, token):
1023
964
        path = self.bzrdir._path_for_remote_call(self._client)
1063
1004
            raise errors.ReadOnlyError(self)
1064
1005
        else:
1065
1006
            self._lock_count += 1
1066
 
        return RepositoryWriteLockResult(self.unlock, self._lock_token or None)
 
1007
        return self._lock_token or None
1067
1008
 
1068
1009
    def leave_lock_in_place(self):
1069
1010
        if not self._lock_token:
1249
1190
            # state, so always add a lock here. If a caller passes us a locked
1250
1191
            # repository, they are responsible for unlocking it later.
1251
1192
            repository.lock_read()
1252
 
        self._check_fallback_repository(repository)
1253
1193
        self._fallback_repositories.append(repository)
1254
1194
        # If self._real_repository was parameterised already (e.g. because a
1255
1195
        # _real_branch had its get_stacked_on_url method called), then the
1256
1196
        # repository to be added may already be in the _real_repositories list.
1257
1197
        if self._real_repository is not None:
1258
 
            fallback_locations = [repo.user_url for repo in
 
1198
            fallback_locations = [repo.bzrdir.root_transport.base for repo in
1259
1199
                self._real_repository._fallback_repositories]
1260
 
            if repository.user_url not in fallback_locations:
 
1200
            if repository.bzrdir.root_transport.base not in fallback_locations:
1261
1201
                self._real_repository.add_fallback_repository(repository)
1262
1202
 
1263
 
    def _check_fallback_repository(self, repository):
1264
 
        """Check that this repository can fallback to repository safely.
1265
 
 
1266
 
        Raise an error if not.
1267
 
 
1268
 
        :param repository: A repository to fallback to.
1269
 
        """
1270
 
        return _mod_repository.InterRepository._assert_same_model(
1271
 
            self, repository)
1272
 
 
1273
1203
    def add_inventory(self, revid, inv, parents):
1274
1204
        self._ensure_real()
1275
1205
        return self._real_repository.add_inventory(revid, inv, parents)
1276
1206
 
1277
1207
    def add_inventory_by_delta(self, basis_revision_id, delta, new_revision_id,
1278
 
            parents, basis_inv=None, propagate_caches=False):
 
1208
                               parents):
1279
1209
        self._ensure_real()
1280
1210
        return self._real_repository.add_inventory_by_delta(basis_revision_id,
1281
 
            delta, new_revision_id, parents, basis_inv=basis_inv,
1282
 
            propagate_caches=propagate_caches)
 
1211
            delta, new_revision_id, parents)
1283
1212
 
1284
1213
    def add_revision(self, rev_id, rev, inv=None, config=None):
1285
1214
        self._ensure_real()
1315
1244
        return self._real_repository.make_working_trees()
1316
1245
 
1317
1246
    def refresh_data(self):
1318
 
        """Re-read any data needed to synchronise with disk.
 
1247
        """Re-read any data needed to to synchronise with disk.
1319
1248
 
1320
1249
        This method is intended to be called after another repository instance
1321
1250
        (such as one used by a smart server) has inserted data into the
1322
 
        repository. On all repositories this will work outside of write groups.
1323
 
        Some repository formats (pack and newer for bzrlib native formats)
1324
 
        support refresh_data inside write groups. If called inside a write
1325
 
        group on a repository that does not support refreshing in a write group
1326
 
        IsInWriteGroupError will be raised.
 
1251
        repository. It may not be called during a write group, but may be
 
1252
        called at any other time.
1327
1253
        """
 
1254
        if self.is_in_write_group():
 
1255
            raise errors.InternalBzrError(
 
1256
                "May not refresh_data while in a write group.")
1328
1257
        if self._real_repository is not None:
1329
1258
            self._real_repository.refresh_data()
1330
1259
 
1544
1473
        return self._real_repository.get_signature_text(revision_id)
1545
1474
 
1546
1475
    @needs_read_lock
1547
 
    def _get_inventory_xml(self, revision_id):
1548
 
        self._ensure_real()
1549
 
        return self._real_repository._get_inventory_xml(revision_id)
 
1476
    def get_inventory_xml(self, revision_id):
 
1477
        self._ensure_real()
 
1478
        return self._real_repository.get_inventory_xml(revision_id)
 
1479
 
 
1480
    def deserialise_inventory(self, revision_id, xml):
 
1481
        self._ensure_real()
 
1482
        return self._real_repository.deserialise_inventory(revision_id, xml)
1550
1483
 
1551
1484
    def reconcile(self, other=None, thorough=False):
1552
1485
        self._ensure_real()
1628
1561
        return self._real_repository.inventories
1629
1562
 
1630
1563
    @needs_write_lock
1631
 
    def pack(self, hint=None, clean_obsolete_packs=False):
 
1564
    def pack(self, hint=None):
1632
1565
        """Compress the data within the repository.
1633
1566
 
1634
1567
        This is not currently implemented within the smart server.
1635
1568
        """
1636
1569
        self._ensure_real()
1637
 
        return self._real_repository.pack(hint=hint, clean_obsolete_packs=clean_obsolete_packs)
 
1570
        return self._real_repository.pack(hint=hint)
1638
1571
 
1639
1572
    @property
1640
1573
    def revisions(self):
2062
1995
                self._network_name)
2063
1996
 
2064
1997
    def get_format_description(self):
2065
 
        self._ensure_real()
2066
 
        return 'Remote: ' + self._custom_format.get_format_description()
 
1998
        return 'Remote BZR Branch'
2067
1999
 
2068
2000
    def network_name(self):
2069
2001
        return self._network_name
2070
2002
 
2071
 
    def open(self, a_bzrdir, name=None, ignore_fallbacks=False):
2072
 
        return a_bzrdir.open_branch(name=name, 
2073
 
            ignore_fallbacks=ignore_fallbacks)
 
2003
    def open(self, a_bzrdir, ignore_fallbacks=False):
 
2004
        return a_bzrdir.open_branch(ignore_fallbacks=ignore_fallbacks)
2074
2005
 
2075
 
    def _vfs_initialize(self, a_bzrdir, name):
 
2006
    def _vfs_initialize(self, a_bzrdir):
2076
2007
        # Initialisation when using a local bzrdir object, or a non-vfs init
2077
2008
        # method is not available on the server.
2078
2009
        # self._custom_format is always set - the start of initialize ensures
2079
2010
        # that.
2080
2011
        if isinstance(a_bzrdir, RemoteBzrDir):
2081
2012
            a_bzrdir._ensure_real()
2082
 
            result = self._custom_format.initialize(a_bzrdir._real_bzrdir,
2083
 
                name)
 
2013
            result = self._custom_format.initialize(a_bzrdir._real_bzrdir)
2084
2014
        else:
2085
2015
            # We assume the bzrdir is parameterised; it may not be.
2086
 
            result = self._custom_format.initialize(a_bzrdir, name)
 
2016
            result = self._custom_format.initialize(a_bzrdir)
2087
2017
        if (isinstance(a_bzrdir, RemoteBzrDir) and
2088
2018
            not isinstance(result, RemoteBranch)):
2089
 
            result = RemoteBranch(a_bzrdir, a_bzrdir.find_repository(), result,
2090
 
                                  name=name)
 
2019
            result = RemoteBranch(a_bzrdir, a_bzrdir.find_repository(), result)
2091
2020
        return result
2092
2021
 
2093
 
    def initialize(self, a_bzrdir, name=None):
 
2022
    def initialize(self, a_bzrdir):
2094
2023
        # 1) get the network name to use.
2095
2024
        if self._custom_format:
2096
2025
            network_name = self._custom_format.network_name()
2102
2031
            network_name = reference_format.network_name()
2103
2032
        # Being asked to create on a non RemoteBzrDir:
2104
2033
        if not isinstance(a_bzrdir, RemoteBzrDir):
2105
 
            return self._vfs_initialize(a_bzrdir, name=name)
 
2034
            return self._vfs_initialize(a_bzrdir)
2106
2035
        medium = a_bzrdir._client._medium
2107
2036
        if medium._is_remote_before((1, 13)):
2108
 
            return self._vfs_initialize(a_bzrdir, name=name)
 
2037
            return self._vfs_initialize(a_bzrdir)
2109
2038
        # Creating on a remote bzr dir.
2110
2039
        # 2) try direct creation via RPC
2111
2040
        path = a_bzrdir._path_for_remote_call(a_bzrdir._client)
2112
 
        if name is not None:
2113
 
            # XXX JRV20100304: Support creating colocated branches
2114
 
            raise errors.NoColocatedBranchSupport(self)
2115
2041
        verb = 'BzrDir.create_branch'
2116
2042
        try:
2117
2043
            response = a_bzrdir._call(verb, path, network_name)
2118
2044
        except errors.UnknownSmartMethod:
2119
2045
            # Fallback - use vfs methods
2120
2046
            medium._remember_remote_is_before((1, 13))
2121
 
            return self._vfs_initialize(a_bzrdir, name=name)
 
2047
            return self._vfs_initialize(a_bzrdir)
2122
2048
        if response[0] != 'ok':
2123
2049
            raise errors.UnexpectedSmartServerResponse(response)
2124
2050
        # Turn the response into a RemoteRepository object.
2132
2058
                a_bzrdir._client)
2133
2059
        remote_repo = RemoteRepository(repo_bzrdir, repo_format)
2134
2060
        remote_branch = RemoteBranch(a_bzrdir, remote_repo,
2135
 
            format=format, setup_stacking=False, name=name)
 
2061
            format=format, setup_stacking=False)
2136
2062
        # XXX: We know this is a new branch, so it must have revno 0, revid
2137
2063
        # NULL_REVISION. Creating the branch locked would make this be unable
2138
2064
        # to be wrong; here its simply very unlikely to be wrong. RBC 20090225
2165
2091
    """
2166
2092
 
2167
2093
    def __init__(self, remote_bzrdir, remote_repository, real_branch=None,
2168
 
        _client=None, format=None, setup_stacking=True, name=None):
 
2094
        _client=None, format=None, setup_stacking=True):
2169
2095
        """Create a RemoteBranch instance.
2170
2096
 
2171
2097
        :param real_branch: An optional local implementation of the branch
2177
2103
        :param setup_stacking: If True make an RPC call to determine the
2178
2104
            stacked (or not) status of the branch. If False assume the branch
2179
2105
            is not stacked.
2180
 
        :param name: Colocated branch name
2181
2106
        """
2182
2107
        # We intentionally don't call the parent class's __init__, because it
2183
2108
        # will try to assign to self.tags, which is a property in this subclass.
2202
2127
            self._real_branch = None
2203
2128
        # Fill out expected attributes of branch for bzrlib API users.
2204
2129
        self._clear_cached_state()
2205
 
        # TODO: deprecate self.base in favor of user_url
2206
 
        self.base = self.bzrdir.user_url
2207
 
        self._name = name
 
2130
        self.base = self.bzrdir.root_transport.base
2208
2131
        self._control_files = None
2209
2132
        self._lock_mode = None
2210
2133
        self._lock_token = None
2275
2198
                    'to use vfs implementation')
2276
2199
            self.bzrdir._ensure_real()
2277
2200
            self._real_branch = self.bzrdir._real_bzrdir.open_branch(
2278
 
                ignore_fallbacks=self._real_ignore_fallbacks, name=self._name)
 
2201
                ignore_fallbacks=self._real_ignore_fallbacks)
2279
2202
            if self.repository._real_repository is None:
2280
2203
                # Give the remote repository the matching real repo.
2281
2204
                real_repo = self._real_branch.repository
2396
2319
            self._vfs_set_tags_bytes(bytes)
2397
2320
 
2398
2321
    def lock_read(self):
2399
 
        """Lock the branch for read operations.
2400
 
 
2401
 
        :return: A bzrlib.lock.LogicalLockResult.
2402
 
        """
2403
2322
        self.repository.lock_read()
2404
2323
        if not self._lock_mode:
2405
2324
            self._note_lock('r')
2409
2328
                self._real_branch.lock_read()
2410
2329
        else:
2411
2330
            self._lock_count += 1
2412
 
        return lock.LogicalLockResult(self.unlock)
2413
2331
 
2414
2332
    def _remote_lock_write(self, token):
2415
2333
        if token is None:
2416
2334
            branch_token = repo_token = ''
2417
2335
        else:
2418
2336
            branch_token = token
2419
 
            repo_token = self.repository.lock_write().repository_token
 
2337
            repo_token = self.repository.lock_write()
2420
2338
            self.repository.unlock()
2421
2339
        err_context = {'token': token}
2422
2340
        response = self._call(
2459
2377
            self._lock_count += 1
2460
2378
            # Re-lock the repository too.
2461
2379
            self.repository.lock_write(self._repo_lock_token)
2462
 
        return BranchWriteLockResult(self.unlock, self._lock_token or None)
 
2380
        return self._lock_token or None
2463
2381
 
2464
2382
    def _unlock(self, branch_token, repo_token):
2465
2383
        err_context = {'token': str((branch_token, repo_token))}
2894
2812
        raise NoSuchRevision(find('branch'), err.error_args[0])
2895
2813
    elif err.error_verb == 'nosuchrevision':
2896
2814
        raise NoSuchRevision(find('repository'), err.error_args[0])
2897
 
    elif err.error_verb == 'nobranch':
2898
 
        if len(err.error_args) >= 1:
2899
 
            extra = err.error_args[0]
2900
 
        else:
2901
 
            extra = None
2902
 
        raise errors.NotBranchError(path=find('bzrdir').root_transport.base,
2903
 
            detail=extra)
 
2815
    elif err.error_tuple == ('nobranch',):
 
2816
        raise errors.NotBranchError(path=find('bzrdir').root_transport.base)
2904
2817
    elif err.error_verb == 'norepository':
2905
2818
        raise errors.NoRepositoryPresent(find('bzrdir'))
2906
2819
    elif err.error_verb == 'LockContention':