~bzr-pqm/bzr/bzr.dev

2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
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 bzrdir related request implmentations."""
18
19
20
from bzrlib import errors
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
21
from bzrlib.bzrdir import BzrDir, BzrDirFormat
2432.4.5 by Robert Collins
Make using SuccessfulSmartServerResponse and FailedSmartServerResponse mandatory rather than optional in smart server logic.
22
from bzrlib.smart.request import (
23
    FailedSmartServerResponse,
24
    SmartServerRequest,
25
    SuccessfulSmartServerResponse,
26
    )
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
27
28
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
29
class SmartServerRequestOpenBzrDir(SmartServerRequest):
30
31
    def do(self, path):
32
        from bzrlib.bzrdir import BzrDirFormat
33
        t = self._backing_transport.clone(path)
34
        default_format = BzrDirFormat.get_default_format()
35
        real_bzrdir = default_format.open(t, _found=True)
36
        try:
37
            real_bzrdir._format.probe_transport(t)
38
        except (errors.NotBranchError, errors.UnknownFormatError):
39
            answer = 'no'
40
        else:
41
            answer = 'yes'
2432.4.5 by Robert Collins
Make using SuccessfulSmartServerResponse and FailedSmartServerResponse mandatory rather than optional in smart server logic.
42
        return SuccessfulSmartServerResponse((answer,))
2018.5.163 by Andrew Bennetts
Deal with various review comments from Robert.
43
44
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
45
class SmartServerRequestFindRepository(SmartServerRequest):
46
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
47
    def _boolean_to_yes_no(self, a_boolean):
48
        if a_boolean:
49
            return 'yes'
50
        else:
51
            return 'no'
52
53
    def _find(self, path):
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
54
        """try to find a repository from path upwards
55
        
56
        This operates precisely like 'bzrdir.find_repository'.
57
        
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
58
        :return: (relpath, rich_root, tree_ref, external_lookup) flags. All are
59
            strings, relpath is a / prefixed path, and the other three are
60
            either 'yes' or 'no'.
61
        :raises errors.NoRepositoryPresent: When there is no repository
62
            present.
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
63
        """
64
        bzrdir = BzrDir.open_from_transport(self._backing_transport.clone(path))
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
65
        repository = bzrdir.find_repository()
66
        # the relpath of the bzrdir in the found repository gives us the 
67
        # path segments to pop-out.
68
        relpath = repository.bzrdir.root_transport.relpath(bzrdir.root_transport.base)
69
        if len(relpath):
70
            segments = ['..'] * len(relpath.split('/'))
71
        else:
72
            segments = []
73
        rich_root = self._boolean_to_yes_no(repository.supports_rich_root())
74
        tree_ref = self._boolean_to_yes_no(
75
            repository._format.supports_tree_reference)
76
        external_lookup = self._boolean_to_yes_no(
77
            repository._format.supports_external_lookups)
78
        return '/'.join(segments), rich_root, tree_ref, external_lookup
79
80
81
class SmartServerRequestFindRepositoryV1(SmartServerRequestFindRepository):
82
83
    def do(self, path):
84
        """try to find a repository from path upwards
85
        
86
        This operates precisely like 'bzrdir.find_repository'.
87
        
88
        If a bzrdir is not present, an exception is propogated
89
        rather than 'no branch' because these are different conditions.
90
91
        This is the initial version of this method introduced with the smart
92
        server. Modern clients will try the V2 method that adds support for the
93
        supports_external_lookups attribute.
94
95
        :return: norepository or ok, relpath.
96
        """
97
        try:
98
            path, rich_root, tree_ref, external_lookup = self._find(path)
99
            return SuccessfulSmartServerResponse(('ok', path, rich_root, tree_ref))
100
        except errors.NoRepositoryPresent:
101
            return FailedSmartServerResponse(('norepository', ))
102
103
104
class SmartServerRequestFindRepositoryV2(SmartServerRequestFindRepository):
105
106
    def do(self, path):
107
        """try to find a repository from path upwards
108
        
109
        This operates precisely like 'bzrdir.find_repository'.
110
        
111
        If a bzrdir is not present, an exception is propogated
112
        rather than 'no branch' because these are different conditions.
113
3221.3.3 by Robert Collins
* Hook up the new remote method ``RemoteBzrDir.find_repositoryV2`` so
114
        This is the second edition of this method introduced in bzr 1.3, which
3221.3.2 by Robert Collins
* New remote method ``RemoteBzrDir.find_repositoryV2`` adding support for
115
        returns information about the supports_external_lookups format
116
        attribute too.
117
118
        :return: norepository or ok, relpath.
119
        """
120
        try:
121
            path, rich_root, tree_ref, external_lookup = self._find(path)
122
            return SuccessfulSmartServerResponse(
123
                ('ok', path, rich_root, tree_ref, external_lookup))
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
124
        except errors.NoRepositoryPresent:
2432.4.5 by Robert Collins
Make using SuccessfulSmartServerResponse and FailedSmartServerResponse mandatory rather than optional in smart server logic.
125
            return FailedSmartServerResponse(('norepository', ))
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
126
127
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
128
class SmartServerRequestInitializeBzrDir(SmartServerRequest):
129
130
    def do(self, path):
131
        """Initialize a bzrdir at path.
132
133
        The default format of the server is used.
134
        :return: SmartServerResponse(('ok', ))
135
        """
136
        target_transport = self._backing_transport.clone(path)
137
        BzrDirFormat.get_default_format().initialize_on_transport(target_transport)
2432.4.5 by Robert Collins
Make using SuccessfulSmartServerResponse and FailedSmartServerResponse mandatory rather than optional in smart server logic.
138
        return SuccessfulSmartServerResponse(('ok', ))
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
139
140
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
141
class SmartServerRequestOpenBranch(SmartServerRequest):
142
143
    def do(self, path):
144
        """try to open a branch at path and return ok/nobranch.
145
        
146
        If a bzrdir is not present, an exception is propogated
147
        rather than 'no branch' because these are different conditions.
148
        """
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
149
        bzrdir = BzrDir.open_from_transport(self._backing_transport.clone(path))
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
150
        try:
151
            reference_url = bzrdir.get_branch_reference()
152
            if reference_url is None:
2432.4.5 by Robert Collins
Make using SuccessfulSmartServerResponse and FailedSmartServerResponse mandatory rather than optional in smart server logic.
153
                return SuccessfulSmartServerResponse(('ok', ''))
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
154
            else:
2432.4.5 by Robert Collins
Make using SuccessfulSmartServerResponse and FailedSmartServerResponse mandatory rather than optional in smart server logic.
155
                return SuccessfulSmartServerResponse(('ok', reference_url))
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
156
        except errors.NotBranchError:
2432.4.5 by Robert Collins
Make using SuccessfulSmartServerResponse and FailedSmartServerResponse mandatory rather than optional in smart server logic.
157
            return FailedSmartServerResponse(('nobranch', ))