bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 
2796.2.1
by Aaron Bentley
 Begin work on reconfigure command  | 
1  | 
# Copyright (C) 2007 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  | 
"""Reconfigure a bzrdir into a new tree/branch/repository layout"""
 | 
|
18  | 
||
19  | 
from bzrlib import (  | 
|
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
20  | 
branch,  | 
| 
2796.2.1
by Aaron Bentley
 Begin work on reconfigure command  | 
21  | 
errors,  | 
22  | 
    )
 | 
|
23  | 
||
24  | 
class Reconfigure(object):  | 
|
25  | 
||
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
26  | 
def __init__(self, bzrdir, new_bound_location=None):  | 
| 
2796.2.1
by Aaron Bentley
 Begin work on reconfigure command  | 
27  | 
self.bzrdir = bzrdir  | 
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
28  | 
self.new_bound_location = new_bound_location  | 
| 
2796.2.1
by Aaron Bentley
 Begin work on reconfigure command  | 
29  | 
try:  | 
| 
2796.2.10
by Aaron Bentley
 Ensure that shared repositories are used where possible  | 
30  | 
self.repository = self.bzrdir.find_repository()  | 
| 
2796.2.7
by Aaron Bentley
 Implement converting a lightweight checkout to a branch  | 
31  | 
except errors.NoRepositoryPresent:  | 
32  | 
self.repository = None  | 
|
33  | 
try:  | 
|
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
34  | 
branch = self.bzrdir.open_branch()  | 
35  | 
if branch.bzrdir.root_transport.base == bzrdir.root_transport.base:  | 
|
36  | 
self.local_branch = branch  | 
|
37  | 
self.referenced_branch = None  | 
|
38  | 
else:  | 
|
39  | 
self.local_branch = None  | 
|
40  | 
self.referenced_branch = branch  | 
|
| 
2796.2.1
by Aaron Bentley
 Begin work on reconfigure command  | 
41  | 
except errors.NotBranchError:  | 
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
42  | 
self.local_branch = None  | 
| 
2796.2.9
by Aaron Bentley
 Ensure conversion from lightweight checkout works  | 
43  | 
self.referenced_branch = None  | 
| 
2796.2.1
by Aaron Bentley
 Begin work on reconfigure command  | 
44  | 
try:  | 
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
45  | 
self.tree = bzrdir.open_workingtree()  | 
| 
2796.2.1
by Aaron Bentley
 Begin work on reconfigure command  | 
46  | 
except errors.NoWorkingTree:  | 
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
47  | 
self.tree = None  | 
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
48  | 
self._unbind = False  | 
49  | 
self._bind = False  | 
|
50  | 
self._destroy_reference = False  | 
|
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
51  | 
self._create_reference = False  | 
52  | 
self._destroy_branch = False  | 
|
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
53  | 
self._create_branch = False  | 
54  | 
self._destroy_tree = False  | 
|
55  | 
self._create_tree = False  | 
|
56  | 
self._create_repository = False  | 
|
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
57  | 
self._destroy_repository = False  | 
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
58  | 
|
59  | 
    @staticmethod
 | 
|
60  | 
def to_branch(bzrdir):  | 
|
| 
2796.2.16
by Aaron Bentley
 Documentation updates from review  | 
61  | 
"""Return a Reconfiguration to convert this bzrdir into a branch  | 
62  | 
||
63  | 
        :param bzrdir: The bzrdir to reconfigure
 | 
|
64  | 
        :raise errors.AlreadyBranch: if bzrdir is already a branch
 | 
|
65  | 
        """
 | 
|
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
66  | 
reconfiguration = Reconfigure(bzrdir)  | 
| 
2796.2.15
by Aaron Bentley
 More updates from review  | 
67  | 
reconfiguration._plan_changes(want_tree=False, want_branch=True,  | 
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
68  | 
want_bound=False, want_reference=False)  | 
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
69  | 
if not reconfiguration.changes_planned():  | 
| 
2796.2.1
by Aaron Bentley
 Begin work on reconfigure command  | 
70  | 
raise errors.AlreadyBranch(bzrdir)  | 
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
71  | 
return reconfiguration  | 
72  | 
||
73  | 
    @staticmethod
 | 
|
74  | 
def to_tree(bzrdir):  | 
|
| 
2796.2.16
by Aaron Bentley
 Documentation updates from review  | 
75  | 
"""Return a Reconfiguration to convert this bzrdir into a tree  | 
76  | 
||
77  | 
        :param bzrdir: The bzrdir to reconfigure
 | 
|
78  | 
        :raise errors.AlreadyTree: if bzrdir is already a tree
 | 
|
79  | 
        """
 | 
|
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
80  | 
reconfiguration = Reconfigure(bzrdir)  | 
| 
2796.2.15
by Aaron Bentley
 More updates from review  | 
81  | 
reconfiguration._plan_changes(want_tree=True, want_branch=True,  | 
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
82  | 
want_bound=False, want_reference=False)  | 
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
83  | 
if not reconfiguration.changes_planned():  | 
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
84  | 
raise errors.AlreadyTree(bzrdir)  | 
85  | 
return reconfiguration  | 
|
86  | 
||
87  | 
    @staticmethod
 | 
|
88  | 
def to_checkout(bzrdir, bound_location=None):  | 
|
| 
2796.2.16
by Aaron Bentley
 Documentation updates from review  | 
89  | 
"""Return a Reconfiguration to convert this bzrdir into a checkout  | 
90  | 
||
91  | 
        :param bzrdir: The bzrdir to reconfigure
 | 
|
92  | 
        :param bound_location: The location the checkout should be bound to.
 | 
|
93  | 
        :raise errors.AlreadyCheckout: if bzrdir is already a checkout
 | 
|
94  | 
        """
 | 
|
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
95  | 
reconfiguration = Reconfigure(bzrdir, bound_location)  | 
| 
2796.2.15
by Aaron Bentley
 More updates from review  | 
96  | 
reconfiguration._plan_changes(want_tree=True, want_branch=True,  | 
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
97  | 
want_bound=True, want_reference=False)  | 
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
98  | 
if not reconfiguration.changes_planned():  | 
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
99  | 
raise errors.AlreadyCheckout(bzrdir)  | 
100  | 
return reconfiguration  | 
|
101  | 
||
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
102  | 
    @classmethod
 | 
103  | 
def to_lightweight_checkout(klass, bzrdir, reference_location=None):  | 
|
104  | 
"""Make a Reconfiguration to convert bzrdir into a lightweight checkout  | 
|
105  | 
||
106  | 
        :param bzrdir: The bzrdir to reconfigure
 | 
|
107  | 
        :param bound_location: The location the checkout should be bound to.
 | 
|
108  | 
        :raise errors.AlreadyLightweightCheckout: if bzrdir is already a
 | 
|
109  | 
            lightweight checkout
 | 
|
110  | 
        """
 | 
|
111  | 
reconfiguration = klass(bzrdir, reference_location)  | 
|
112  | 
reconfiguration._plan_changes(want_tree=True, want_branch=False,  | 
|
113  | 
want_bound=False, want_reference=True)  | 
|
114  | 
if not reconfiguration.changes_planned():  | 
|
115  | 
raise errors.AlreadyLightweightCheckout(bzrdir)  | 
|
116  | 
return reconfiguration  | 
|
117  | 
||
118  | 
def _plan_changes(self, want_tree, want_branch, want_bound,  | 
|
119  | 
want_reference):  | 
|
| 
2796.2.10
by Aaron Bentley
 Ensure that shared repositories are used where possible  | 
120  | 
"""Determine which changes are needed to assume the configuration"""  | 
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
121  | 
if not want_branch and not want_reference:  | 
122  | 
raise errors.ReconfigurationNotSupported(self.bzrdir)  | 
|
123  | 
if want_branch and want_reference:  | 
|
124  | 
raise errors.ReconfigurationNotSupported(self.bzrdir)  | 
|
| 
2796.2.7
by Aaron Bentley
 Implement converting a lightweight checkout to a branch  | 
125  | 
if self.repository is None:  | 
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
126  | 
if not want_reference:  | 
127  | 
self._create_repository = True  | 
|
128  | 
else:  | 
|
129  | 
if want_reference and (self.repository.bzrdir.root_transport.base  | 
|
130  | 
== self.bzrdir.root_transport.base):  | 
|
| 
2796.2.25
by Aaron Bentley
 Avoid destroying shared repositories  | 
131  | 
if not self.repository.is_shared():  | 
132  | 
self._destroy_repository = True  | 
|
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
133  | 
if self.referenced_branch is None:  | 
134  | 
if want_reference:  | 
|
135  | 
self._create_reference = True  | 
|
136  | 
else:  | 
|
137  | 
if not want_reference:  | 
|
138  | 
self._destroy_reference = True  | 
|
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
139  | 
if self.local_branch is None:  | 
| 
2796.2.15
by Aaron Bentley
 More updates from review  | 
140  | 
if want_branch is True:  | 
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
141  | 
self._create_branch = True  | 
142  | 
if want_bound:  | 
|
143  | 
self._bind = True  | 
|
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
144  | 
else:  | 
| 
2796.2.15
by Aaron Bentley
 More updates from review  | 
145  | 
if want_bound:  | 
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
146  | 
if self.local_branch.get_bound_location() is None:  | 
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
147  | 
self._bind = True  | 
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
148  | 
else:  | 
149  | 
if self.local_branch.get_bound_location() is not None:  | 
|
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
150  | 
self._unbind = True  | 
| 
2796.2.15
by Aaron Bentley
 More updates from review  | 
151  | 
if not want_tree and self.tree is not None:  | 
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
152  | 
self._destroy_tree = True  | 
| 
2796.2.15
by Aaron Bentley
 More updates from review  | 
153  | 
if want_tree and self.tree is None:  | 
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
154  | 
self._create_tree = True  | 
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
155  | 
|
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
156  | 
def changes_planned(self):  | 
| 
2796.2.11
by Aaron Bentley
 Cleanups  | 
157  | 
"""Return True if changes are planned, False otherwise"""  | 
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
158  | 
return (self._unbind or self._bind or self._destroy_tree  | 
159  | 
or self._create_tree or self._destroy_reference  | 
|
| 
2796.2.26
by Aaron Bentley
 Support converting standalone tree to lightweight checkout  | 
160  | 
or self._create_branch or self._create_repository  | 
161  | 
or self._create_reference)  | 
|
| 
2796.2.1
by Aaron Bentley
 Begin work on reconfigure command  | 
162  | 
|
163  | 
def _check(self):  | 
|
| 
2796.2.11
by Aaron Bentley
 Cleanups  | 
164  | 
"""Raise if reconfiguration would destroy local changes"""  | 
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
165  | 
if self._destroy_tree:  | 
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
166  | 
changes = self.tree.changes_from(self.tree.basis_tree())  | 
167  | 
if changes.has_changed():  | 
|
168  | 
raise errors.UncommittedChanges(self.tree)  | 
|
169  | 
||
170  | 
def _select_bind_location(self):  | 
|
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
171  | 
"""Select a location to bind or create a reference to.  | 
| 
2796.2.11
by Aaron Bentley
 Cleanups  | 
172  | 
|
173  | 
        Preference is:
 | 
|
174  | 
        1. user specified location
 | 
|
175  | 
        2. branch reference location (it's a kind of bind location)
 | 
|
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
176  | 
        3. current bind location
 | 
177  | 
        4. previous bind location (it was a good choice once)
 | 
|
178  | 
        5. push location (it's writeable, so committable)
 | 
|
179  | 
        6. parent location (it's pullable, so update-from-able)
 | 
|
| 
2796.2.11
by Aaron Bentley
 Cleanups  | 
180  | 
        """
 | 
181  | 
if self.new_bound_location is not None:  | 
|
182  | 
return self.new_bound_location  | 
|
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
183  | 
if self.local_branch is not None:  | 
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
184  | 
bound = self.local_branch.get_bound_location()  | 
185  | 
if bound is not None:  | 
|
186  | 
return bound  | 
|
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
187  | 
old_bound = self.local_branch.get_old_bound_location()  | 
188  | 
if old_bound is not None:  | 
|
189  | 
return old_bound  | 
|
190  | 
push_location = self.local_branch.get_push_location()  | 
|
191  | 
if push_location is not None:  | 
|
192  | 
return push_location  | 
|
193  | 
parent = self.local_branch.get_parent()  | 
|
194  | 
if parent is not None:  | 
|
195  | 
return parent  | 
|
| 
2796.2.9
by Aaron Bentley
 Ensure conversion from lightweight checkout works  | 
196  | 
elif self.referenced_branch is not None:  | 
197  | 
return self.referenced_branch.base  | 
|
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
198  | 
raise errors.NoBindLocation(self.bzrdir)  | 
| 
2796.2.1
by Aaron Bentley
 Begin work on reconfigure command  | 
199  | 
|
200  | 
def apply(self, force=False):  | 
|
| 
2796.2.16
by Aaron Bentley
 Documentation updates from review  | 
201  | 
"""Apply the reconfiguration  | 
202  | 
||
203  | 
        :param force: If true, the reconfiguration is applied even if it will
 | 
|
204  | 
            destroy local changes.
 | 
|
205  | 
        :raise errors.UncommittedChanges: if the local tree is to be destroyed
 | 
|
206  | 
            but contains uncommitted changes.
 | 
|
207  | 
        :raise errors.NoBindLocation: if no bind location was specified and
 | 
|
208  | 
            none could be autodetected.
 | 
|
209  | 
        """
 | 
|
| 
2796.2.1
by Aaron Bentley
 Begin work on reconfigure command  | 
210  | 
if not force:  | 
211  | 
self._check()  | 
|
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
212  | 
if self._create_repository:  | 
| 
2796.2.10
by Aaron Bentley
 Ensure that shared repositories are used where possible  | 
213  | 
repo = self.bzrdir.create_repository()  | 
214  | 
else:  | 
|
215  | 
repo = self.repository  | 
|
| 
2796.2.23
by Aaron Bentley
 Add support for reconfiguring repositories into branches or trees  | 
216  | 
if self._create_branch and self.referenced_branch is not None:  | 
| 
2796.2.10
by Aaron Bentley
 Ensure that shared repositories are used where possible  | 
217  | 
repo.fetch(self.referenced_branch.repository,  | 
218  | 
self.referenced_branch.last_revision())  | 
|
| 
2796.2.23
by Aaron Bentley
 Add support for reconfiguring repositories into branches or trees  | 
219  | 
last_revision_info = None  | 
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
220  | 
if self._destroy_reference:  | 
| 
2796.2.23
by Aaron Bentley
 Add support for reconfiguring repositories into branches or trees  | 
221  | 
last_revision_info = self.referenced_branch.last_revision_info()  | 
| 
2796.2.7
by Aaron Bentley
 Implement converting a lightweight checkout to a branch  | 
222  | 
self.bzrdir.destroy_branch()  | 
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
223  | 
if self._destroy_branch:  | 
| 
2796.2.23
by Aaron Bentley
 Add support for reconfiguring repositories into branches or trees  | 
224  | 
last_revision_info = self.local_branch.last_revision_info()  | 
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
225  | 
self.bzrdir.destroy_branch()  | 
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
226  | 
if self._create_branch:  | 
| 
2796.2.9
by Aaron Bentley
 Ensure conversion from lightweight checkout works  | 
227  | 
local_branch = self.bzrdir.create_branch()  | 
| 
2796.2.23
by Aaron Bentley
 Add support for reconfiguring repositories into branches or trees  | 
228  | 
if last_revision_info is not None:  | 
229  | 
local_branch.set_last_revision_info(*last_revision_info)  | 
|
| 
2796.2.9
by Aaron Bentley
 Ensure conversion from lightweight checkout works  | 
230  | 
else:  | 
231  | 
local_branch = self.local_branch  | 
|
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
232  | 
if self._create_reference:  | 
233  | 
reference_branch = branch.Branch.open(self._select_bind_location())  | 
|
234  | 
format = branch.BranchReferenceFormat().initialize(self.bzrdir,  | 
|
235  | 
reference_branch)  | 
|
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
236  | 
if self._destroy_tree:  | 
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
237  | 
self.bzrdir.destroy_workingtree()  | 
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
238  | 
if self._create_tree:  | 
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
239  | 
self.bzrdir.create_workingtree()  | 
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
240  | 
if self._unbind:  | 
| 
2796.2.3
by Aaron Bentley
 Implement conversion to tree and checkout  | 
241  | 
self.local_branch.unbind()  | 
| 
2796.2.14
by Aaron Bentley
 Updates from review  | 
242  | 
if self._bind:  | 
| 
2796.2.11
by Aaron Bentley
 Cleanups  | 
243  | 
bind_location = self._select_bind_location()  | 
| 
2796.2.9
by Aaron Bentley
 Ensure conversion from lightweight checkout works  | 
244  | 
local_branch.bind(branch.Branch.open(bind_location))  | 
| 
2796.2.19
by Aaron Bentley
 Support reconfigure --lightweight-checkout  | 
245  | 
if self._destroy_repository:  | 
246  | 
if self._create_reference:  | 
|
247  | 
reference_branch.repository.fetch(self.repository)  | 
|
248  | 
self.bzrdir.destroy_repository()  |