~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
47
    def do(self, path):
48
        """try to find a repository from path upwards
49
        
50
        This operates precisely like 'bzrdir.find_repository'.
51
        
52
        If a bzrdir is not present, an exception is propogated
53
        rather than 'no branch' because these are different conditions.
54
55
        :return: norepository or ok, relpath.
56
        """
57
        bzrdir = BzrDir.open_from_transport(self._backing_transport.clone(path))
58
        try:
59
            repository = bzrdir.find_repository()
60
            # the relpath of the bzrdir in the found repository gives us the 
61
            # path segments to pop-out.
62
            relpath = repository.bzrdir.root_transport.relpath(bzrdir.root_transport.base)
63
            if len(relpath):
64
                segments = ['..'] * len(relpath.split('/'))
65
            else:
66
                segments = []
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
67
            if repository.supports_rich_root():
2018.5.166 by Andrew Bennetts
Small changes in response to Aaron's review.
68
                rich_root = 'yes'
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
69
            else:
2018.5.166 by Andrew Bennetts
Small changes in response to Aaron's review.
70
                rich_root = 'no'
2018.5.138 by Robert Collins
Merge bzr.dev.
71
            if repository._format.supports_tree_reference:
2018.5.166 by Andrew Bennetts
Small changes in response to Aaron's review.
72
                tree_ref = 'yes'
2018.5.118 by Robert Collins
Fix RemoteRepositoryFormat to have appropriate rich_root_data and support_tree_reference.
73
            else:
2018.5.166 by Andrew Bennetts
Small changes in response to Aaron's review.
74
                tree_ref = 'no'
2432.4.5 by Robert Collins
Make using SuccessfulSmartServerResponse and FailedSmartServerResponse mandatory rather than optional in smart server logic.
75
            return SuccessfulSmartServerResponse(('ok', '/'.join(segments), rich_root, tree_ref))
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
76
        except errors.NoRepositoryPresent:
2432.4.5 by Robert Collins
Make using SuccessfulSmartServerResponse and FailedSmartServerResponse mandatory rather than optional in smart server logic.
77
            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.
78
79
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
80
class SmartServerRequestInitializeBzrDir(SmartServerRequest):
81
82
    def do(self, path):
83
        """Initialize a bzrdir at path.
84
85
        The default format of the server is used.
86
        :return: SmartServerResponse(('ok', ))
87
        """
88
        target_transport = self._backing_transport.clone(path)
89
        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.
90
        return SuccessfulSmartServerResponse(('ok', ))
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
91
92
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
93
class SmartServerRequestOpenBranch(SmartServerRequest):
94
95
    def do(self, path):
96
        """try to open a branch at path and return ok/nobranch.
97
        
98
        If a bzrdir is not present, an exception is propogated
99
        rather than 'no branch' because these are different conditions.
100
        """
2018.5.34 by Robert Collins
Get test_remote.BasicRemoteObjectTests.test_open_remote_branch passing by implementing a remote method BzrDir.find_repository.
101
        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.
102
        try:
103
            reference_url = bzrdir.get_branch_reference()
104
            if reference_url is None:
2432.4.5 by Robert Collins
Make using SuccessfulSmartServerResponse and FailedSmartServerResponse mandatory rather than optional in smart server logic.
105
                return SuccessfulSmartServerResponse(('ok', ''))
2018.6.1 by Robert Collins
Implement a BzrDir.open_branch smart server method for opening a branch without VFS.
106
            else:
2432.4.5 by Robert Collins
Make using SuccessfulSmartServerResponse and FailedSmartServerResponse mandatory rather than optional in smart server logic.
107
                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.
108
        except errors.NotBranchError:
2432.4.5 by Robert Collins
Make using SuccessfulSmartServerResponse and FailedSmartServerResponse mandatory rather than optional in smart server logic.
109
            return FailedSmartServerResponse(('nobranch', ))