~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/smart/bzrdir.py

  • Committer: Aaron Bentley
  • Date: 2008-03-11 14:29:08 UTC
  • mto: This revision was merged to the branch mainline in revision 3264.
  • Revision ID: aaron@aaronbentley.com-20080311142908-yyrvcpn2mldt0fnn
Update documentation to reflect conflict-handling difference

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
21
from bzrlib.bzrdir import BzrDir, BzrDirFormat
 
22
from bzrlib.smart.request import (
 
23
    FailedSmartServerResponse,
 
24
    SmartServerRequest,
 
25
    SuccessfulSmartServerResponse,
 
26
    )
 
27
 
 
28
 
 
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'
 
42
        return SuccessfulSmartServerResponse((answer,))
 
43
 
 
44
 
 
45
class SmartServerRequestFindRepository(SmartServerRequest):
 
46
 
 
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):
 
54
        """try to find a repository from path upwards
 
55
        
 
56
        This operates precisely like 'bzrdir.find_repository'.
 
57
        
 
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.
 
63
        """
 
64
        bzrdir = BzrDir.open_from_transport(self._backing_transport.clone(path))
 
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
 
 
114
        This is the second edition of this method introduced in bzr 1.3, which
 
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))
 
124
        except errors.NoRepositoryPresent:
 
125
            return FailedSmartServerResponse(('norepository', ))
 
126
 
 
127
 
 
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)
 
138
        return SuccessfulSmartServerResponse(('ok', ))
 
139
 
 
140
 
 
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
        """
 
149
        bzrdir = BzrDir.open_from_transport(self._backing_transport.clone(path))
 
150
        try:
 
151
            reference_url = bzrdir.get_branch_reference()
 
152
            if reference_url is None:
 
153
                return SuccessfulSmartServerResponse(('ok', ''))
 
154
            else:
 
155
                return SuccessfulSmartServerResponse(('ok', reference_url))
 
156
        except errors.NotBranchError:
 
157
            return FailedSmartServerResponse(('nobranch', ))