Status: | Merged |
---|---|
Approved by: | Vincent Ladeuil |
Approved revision: | no longer in the source branch. |
Merged at revision: | 5218 |
Proposed branch: | lp:~jelmer/bzr/more-colo |
Merge into: | lp:bzr |
Prerequisite: | lp:~jelmer/bzr/colo-doc |
Diff against target: |
292 lines (+64/-34) 7 files modified
bzrlib/branch.py (+11/-7) bzrlib/bzrdir.py (+20/-10) bzrlib/remote.py (+8/-5) bzrlib/switch.py (+1/-1) bzrlib/tests/per_branch/test_branch.py (+2/-1) bzrlib/tests/per_bzrdir_colo/test_unsupported.py (+21/-9) bzrlib/tests/test_remote.py (+1/-1) |
To merge this branch: | bzr merge lp:~jelmer/bzr/more-colo |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Vincent Ladeuil | Approve | ||
bzr-core | Pending | ||
Review via email: mp+23592@code.launchpad.net |
This proposal supersedes a proposal from 2010-04-12.
Commit message
Description of the change
Pass the colocated branch name along in more places, add extra tests.
Vincent Ladeuil (vila) wrote : Posted in a previous version of this proposal | # |
Jelmer Vernooij (jelmer) wrote : | # |
[15:06] <vila> jelmer: lowering the alert level about using name=name instead of name, it was due to an overly aggressively blind local patch to bzr-loom,
[15:07] <vila> jelmer: the remark still stand though, since you're adding a keyword arg than can be None, better use the name= syntax to avoid breakage
[15:07] <jelmer> vila: I agree it's a good idea to use name= anyway
I've now change the patch to use name= where relevant.
Vincent Ladeuil (vila) wrote : | # |
@Jelmer: the conflicts don't help here can you update that branch ?
Also, is there some bits waiting from https:/
Jelmer Vernooij (jelmer) wrote : | # |
Should be fixed now. This branch is a prerequisite for the other one, lp:~jelmer/bzr/colo-urls
Vincent Ladeuil (vila) wrote : | # |
Good ! Sorry for the delay.
I'll land it.
Preview Diff
1 | === modified file 'bzrlib/branch.py' | |||
2 | --- bzrlib/branch.py 2010-04-28 09:40:23 +0000 | |||
3 | +++ bzrlib/branch.py 2010-04-29 09:01:37 +0000 | |||
4 | @@ -1346,6 +1346,8 @@ | |||
5 | 1346 | """ | 1346 | """ |
6 | 1347 | # XXX: Fix the bzrdir API to allow getting the branch back from the | 1347 | # XXX: Fix the bzrdir API to allow getting the branch back from the |
7 | 1348 | # clone call. Or something. 20090224 RBC/spiv. | 1348 | # clone call. Or something. 20090224 RBC/spiv. |
8 | 1349 | # XXX: Should this perhaps clone colocated branches as well, | ||
9 | 1350 | # rather than just the default branch? 20100319 JRV | ||
10 | 1349 | if revision_id is None: | 1351 | if revision_id is None: |
11 | 1350 | revision_id = self.last_revision() | 1352 | revision_id = self.last_revision() |
12 | 1351 | dir_to = self.bzrdir.clone_on_transport(to_transport, | 1353 | dir_to = self.bzrdir.clone_on_transport(to_transport, |
13 | @@ -1521,7 +1523,7 @@ | |||
14 | 1521 | """Return the current default format.""" | 1523 | """Return the current default format.""" |
15 | 1522 | return klass._default_format | 1524 | return klass._default_format |
16 | 1523 | 1525 | ||
18 | 1524 | def get_reference(self, a_bzrdir): | 1526 | def get_reference(self, a_bzrdir, name=None): |
19 | 1525 | """Get the target reference of the branch in a_bzrdir. | 1527 | """Get the target reference of the branch in a_bzrdir. |
20 | 1526 | 1528 | ||
21 | 1527 | format probing must have been completed before calling | 1529 | format probing must have been completed before calling |
22 | @@ -1529,12 +1531,13 @@ | |||
23 | 1529 | in a_bzrdir is correct. | 1531 | in a_bzrdir is correct. |
24 | 1530 | 1532 | ||
25 | 1531 | :param a_bzrdir: The bzrdir to get the branch data from. | 1533 | :param a_bzrdir: The bzrdir to get the branch data from. |
26 | 1534 | :param name: Name of the colocated branch to fetch | ||
27 | 1532 | :return: None if the branch is not a reference branch. | 1535 | :return: None if the branch is not a reference branch. |
28 | 1533 | """ | 1536 | """ |
29 | 1534 | return None | 1537 | return None |
30 | 1535 | 1538 | ||
31 | 1536 | @classmethod | 1539 | @classmethod |
33 | 1537 | def set_reference(self, a_bzrdir, to_branch): | 1540 | def set_reference(self, a_bzrdir, name, to_branch): |
34 | 1538 | """Set the target reference of the branch in a_bzrdir. | 1541 | """Set the target reference of the branch in a_bzrdir. |
35 | 1539 | 1542 | ||
36 | 1540 | format probing must have been completed before calling | 1543 | format probing must have been completed before calling |
37 | @@ -1542,6 +1545,7 @@ | |||
38 | 1542 | in a_bzrdir is correct. | 1545 | in a_bzrdir is correct. |
39 | 1543 | 1546 | ||
40 | 1544 | :param a_bzrdir: The bzrdir to set the branch reference for. | 1547 | :param a_bzrdir: The bzrdir to set the branch reference for. |
41 | 1548 | :param name: Name of colocated branch to set, None for default | ||
42 | 1545 | :param to_branch: branch that the checkout is to reference | 1549 | :param to_branch: branch that the checkout is to reference |
43 | 1546 | """ | 1550 | """ |
44 | 1547 | raise NotImplementedError(self.set_reference) | 1551 | raise NotImplementedError(self.set_reference) |
45 | @@ -2157,14 +2161,14 @@ | |||
46 | 2157 | """See BranchFormat.get_format_description().""" | 2161 | """See BranchFormat.get_format_description().""" |
47 | 2158 | return "Checkout reference format 1" | 2162 | return "Checkout reference format 1" |
48 | 2159 | 2163 | ||
50 | 2160 | def get_reference(self, a_bzrdir): | 2164 | def get_reference(self, a_bzrdir, name=None): |
51 | 2161 | """See BranchFormat.get_reference().""" | 2165 | """See BranchFormat.get_reference().""" |
53 | 2162 | transport = a_bzrdir.get_branch_transport(None) | 2166 | transport = a_bzrdir.get_branch_transport(None, name=name) |
54 | 2163 | return transport.get_bytes('location') | 2167 | return transport.get_bytes('location') |
55 | 2164 | 2168 | ||
57 | 2165 | def set_reference(self, a_bzrdir, to_branch): | 2169 | def set_reference(self, a_bzrdir, name, to_branch): |
58 | 2166 | """See BranchFormat.set_reference().""" | 2170 | """See BranchFormat.set_reference().""" |
60 | 2167 | transport = a_bzrdir.get_branch_transport(None) | 2171 | transport = a_bzrdir.get_branch_transport(None, name=name) |
61 | 2168 | location = transport.put_bytes('location', to_branch.base) | 2172 | location = transport.put_bytes('location', to_branch.base) |
62 | 2169 | 2173 | ||
63 | 2170 | def initialize(self, a_bzrdir, name=None, target_branch=None): | 2174 | def initialize(self, a_bzrdir, name=None, target_branch=None): |
64 | @@ -2221,7 +2225,7 @@ | |||
65 | 2221 | raise AssertionError("wrong format %r found for %r" % | 2225 | raise AssertionError("wrong format %r found for %r" % |
66 | 2222 | (format, self)) | 2226 | (format, self)) |
67 | 2223 | if location is None: | 2227 | if location is None: |
69 | 2224 | location = self.get_reference(a_bzrdir) | 2228 | location = self.get_reference(a_bzrdir, name) |
70 | 2225 | real_bzrdir = bzrdir.BzrDir.open( | 2229 | real_bzrdir = bzrdir.BzrDir.open( |
71 | 2226 | location, possible_transports=possible_transports) | 2230 | location, possible_transports=possible_transports) |
72 | 2227 | result = real_bzrdir.open_branch(name=name, | 2231 | result = real_bzrdir.open_branch(name=name, |
73 | 2228 | 2232 | ||
74 | === modified file 'bzrlib/bzrdir.py' | |||
75 | --- bzrlib/bzrdir.py 2010-04-28 07:03:38 +0000 | |||
76 | +++ bzrlib/bzrdir.py 2010-04-29 09:01:37 +0000 | |||
77 | @@ -737,13 +737,18 @@ | |||
78 | 737 | raise errors.NoRepositoryPresent(self) | 737 | raise errors.NoRepositoryPresent(self) |
79 | 738 | return found_repo | 738 | return found_repo |
80 | 739 | 739 | ||
82 | 740 | def get_branch_reference(self): | 740 | def get_branch_reference(self, name=None): |
83 | 741 | """Return the referenced URL for the branch in this bzrdir. | 741 | """Return the referenced URL for the branch in this bzrdir. |
84 | 742 | 742 | ||
85 | 743 | :param name: Optional colocated branch name | ||
86 | 743 | :raises NotBranchError: If there is no Branch. | 744 | :raises NotBranchError: If there is no Branch. |
87 | 745 | :raises NoColocatedBranchSupport: If a branch name was specified | ||
88 | 746 | but colocated branches are not supported. | ||
89 | 744 | :return: The URL the branch in this bzrdir references if it is a | 747 | :return: The URL the branch in this bzrdir references if it is a |
90 | 745 | reference branch, or None for regular branches. | 748 | reference branch, or None for regular branches. |
91 | 746 | """ | 749 | """ |
92 | 750 | if name is not None: | ||
93 | 751 | raise errors.NoColocatedBranchSupport(self) | ||
94 | 747 | return None | 752 | return None |
95 | 748 | 753 | ||
96 | 749 | def get_branch_transport(self, branch_format, name=None): | 754 | def get_branch_transport(self, branch_format, name=None): |
97 | @@ -994,9 +999,11 @@ | |||
98 | 994 | raise errors.NotBranchError(path=url) | 999 | raise errors.NotBranchError(path=url) |
99 | 995 | a_transport = new_t | 1000 | a_transport = new_t |
100 | 996 | 1001 | ||
102 | 997 | def _get_tree_branch(self): | 1002 | def _get_tree_branch(self, name=None): |
103 | 998 | """Return the branch and tree, if any, for this bzrdir. | 1003 | """Return the branch and tree, if any, for this bzrdir. |
104 | 999 | 1004 | ||
105 | 1005 | :param name: Name of colocated branch to open. | ||
106 | 1006 | |||
107 | 1000 | Return None for tree if not present or inaccessible. | 1007 | Return None for tree if not present or inaccessible. |
108 | 1001 | Raise NotBranchError if no branch is present. | 1008 | Raise NotBranchError if no branch is present. |
109 | 1002 | :return: (tree, branch) | 1009 | :return: (tree, branch) |
110 | @@ -1005,9 +1012,12 @@ | |||
111 | 1005 | tree = self.open_workingtree() | 1012 | tree = self.open_workingtree() |
112 | 1006 | except (errors.NoWorkingTree, errors.NotLocalUrl): | 1013 | except (errors.NoWorkingTree, errors.NotLocalUrl): |
113 | 1007 | tree = None | 1014 | tree = None |
115 | 1008 | branch = self.open_branch() | 1015 | branch = self.open_branch(name=name) |
116 | 1009 | else: | 1016 | else: |
118 | 1010 | branch = tree.branch | 1017 | if name is not None: |
119 | 1018 | branch = self.open_branch(name=name) | ||
120 | 1019 | else: | ||
121 | 1020 | branch = tree.branch | ||
122 | 1011 | return tree, branch | 1021 | return tree, branch |
123 | 1012 | 1022 | ||
124 | 1013 | @classmethod | 1023 | @classmethod |
125 | @@ -1736,13 +1746,13 @@ | |||
126 | 1736 | def destroy_workingtree_metadata(self): | 1746 | def destroy_workingtree_metadata(self): |
127 | 1737 | self.transport.delete_tree('checkout') | 1747 | self.transport.delete_tree('checkout') |
128 | 1738 | 1748 | ||
130 | 1739 | def find_branch_format(self): | 1749 | def find_branch_format(self, name=None): |
131 | 1740 | """Find the branch 'format' for this bzrdir. | 1750 | """Find the branch 'format' for this bzrdir. |
132 | 1741 | 1751 | ||
133 | 1742 | This might be a synthetic object for e.g. RemoteBranch and SVN. | 1752 | This might be a synthetic object for e.g. RemoteBranch and SVN. |
134 | 1743 | """ | 1753 | """ |
135 | 1744 | from bzrlib.branch import BranchFormat | 1754 | from bzrlib.branch import BranchFormat |
137 | 1745 | return BranchFormat.find_format(self) | 1755 | return BranchFormat.find_format(self, name=name) |
138 | 1746 | 1756 | ||
139 | 1747 | def _get_mkdir_mode(self): | 1757 | def _get_mkdir_mode(self): |
140 | 1748 | """Figure out the mode to use when creating a bzrdir subdir.""" | 1758 | """Figure out the mode to use when creating a bzrdir subdir.""" |
141 | @@ -1750,11 +1760,11 @@ | |||
142 | 1750 | lockable_files.TransportLock) | 1760 | lockable_files.TransportLock) |
143 | 1751 | return temp_control._dir_mode | 1761 | return temp_control._dir_mode |
144 | 1752 | 1762 | ||
146 | 1753 | def get_branch_reference(self): | 1763 | def get_branch_reference(self, name=None): |
147 | 1754 | """See BzrDir.get_branch_reference().""" | 1764 | """See BzrDir.get_branch_reference().""" |
148 | 1755 | from bzrlib.branch import BranchFormat | 1765 | from bzrlib.branch import BranchFormat |
151 | 1756 | format = BranchFormat.find_format(self) | 1766 | format = BranchFormat.find_format(self, name=name) |
152 | 1757 | return format.get_reference(self) | 1767 | return format.get_reference(self, name=name) |
153 | 1758 | 1768 | ||
154 | 1759 | def get_branch_transport(self, branch_format, name=None): | 1769 | def get_branch_transport(self, branch_format, name=None): |
155 | 1760 | """See BzrDir.get_branch_transport().""" | 1770 | """See BzrDir.get_branch_transport().""" |
156 | @@ -1854,7 +1864,7 @@ | |||
157 | 1854 | def open_branch(self, name=None, unsupported=False, | 1864 | def open_branch(self, name=None, unsupported=False, |
158 | 1855 | ignore_fallbacks=False): | 1865 | ignore_fallbacks=False): |
159 | 1856 | """See BzrDir.open_branch.""" | 1866 | """See BzrDir.open_branch.""" |
161 | 1857 | format = self.find_branch_format() | 1867 | format = self.find_branch_format(name=name) |
162 | 1858 | self._check_supported(format, unsupported) | 1868 | self._check_supported(format, unsupported) |
163 | 1859 | return format.open(self, name=name, | 1869 | return format.open(self, name=name, |
164 | 1860 | _found=True, ignore_fallbacks=ignore_fallbacks) | 1870 | _found=True, ignore_fallbacks=ignore_fallbacks) |
165 | 1861 | 1871 | ||
166 | === modified file 'bzrlib/remote.py' | |||
167 | --- bzrlib/remote.py 2010-04-28 07:03:38 +0000 | |||
168 | +++ bzrlib/remote.py 2010-04-29 09:01:37 +0000 | |||
169 | @@ -272,16 +272,19 @@ | |||
170 | 272 | def create_workingtree(self, revision_id=None, from_branch=None): | 272 | def create_workingtree(self, revision_id=None, from_branch=None): |
171 | 273 | raise errors.NotLocalUrl(self.transport.base) | 273 | raise errors.NotLocalUrl(self.transport.base) |
172 | 274 | 274 | ||
174 | 275 | def find_branch_format(self): | 275 | def find_branch_format(self, name=None): |
175 | 276 | """Find the branch 'format' for this bzrdir. | 276 | """Find the branch 'format' for this bzrdir. |
176 | 277 | 277 | ||
177 | 278 | This might be a synthetic object for e.g. RemoteBranch and SVN. | 278 | This might be a synthetic object for e.g. RemoteBranch and SVN. |
178 | 279 | """ | 279 | """ |
180 | 280 | b = self.open_branch() | 280 | b = self.open_branch(name=name) |
181 | 281 | return b._format | 281 | return b._format |
182 | 282 | 282 | ||
184 | 283 | def get_branch_reference(self): | 283 | def get_branch_reference(self, name=None): |
185 | 284 | """See BzrDir.get_branch_reference().""" | 284 | """See BzrDir.get_branch_reference().""" |
186 | 285 | if name is not None: | ||
187 | 286 | # XXX JRV20100304: Support opening colocated branches | ||
188 | 287 | raise errors.NoColocatedBranchSupport(self) | ||
189 | 285 | response = self._get_branch_reference() | 288 | response = self._get_branch_reference() |
190 | 286 | if response[0] == 'ref': | 289 | if response[0] == 'ref': |
191 | 287 | return response[1] | 290 | return response[1] |
192 | @@ -318,9 +321,9 @@ | |||
193 | 318 | raise errors.UnexpectedSmartServerResponse(response) | 321 | raise errors.UnexpectedSmartServerResponse(response) |
194 | 319 | return response | 322 | return response |
195 | 320 | 323 | ||
197 | 321 | def _get_tree_branch(self): | 324 | def _get_tree_branch(self, name=None): |
198 | 322 | """See BzrDir._get_tree_branch().""" | 325 | """See BzrDir._get_tree_branch().""" |
200 | 323 | return None, self.open_branch() | 326 | return None, self.open_branch(name=name) |
201 | 324 | 327 | ||
202 | 325 | def open_branch(self, name=None, unsupported=False, | 328 | def open_branch(self, name=None, unsupported=False, |
203 | 326 | ignore_fallbacks=False): | 329 | ignore_fallbacks=False): |
204 | 327 | 330 | ||
205 | === modified file 'bzrlib/switch.py' | |||
206 | --- bzrlib/switch.py 2010-04-26 23:38:10 +0000 | |||
207 | +++ bzrlib/switch.py 2010-04-29 09:01:37 +0000 | |||
208 | @@ -78,7 +78,7 @@ | |||
209 | 78 | branch_format = control.find_branch_format() | 78 | branch_format = control.find_branch_format() |
210 | 79 | if branch_format.get_reference(control) is not None: | 79 | if branch_format.get_reference(control) is not None: |
211 | 80 | # Lightweight checkout: update the branch reference | 80 | # Lightweight checkout: update the branch reference |
213 | 81 | branch_format.set_reference(control, to_branch) | 81 | branch_format.set_reference(control, None, to_branch) |
214 | 82 | else: | 82 | else: |
215 | 83 | b = control.open_branch() | 83 | b = control.open_branch() |
216 | 84 | bound_branch = b.get_bound_location() | 84 | bound_branch = b.get_bound_location() |
217 | 85 | 85 | ||
218 | === modified file 'bzrlib/tests/per_branch/test_branch.py' | |||
219 | --- bzrlib/tests/per_branch/test_branch.py 2010-04-21 04:12:25 +0000 | |||
220 | +++ bzrlib/tests/per_branch/test_branch.py 2010-04-29 09:01:37 +0000 | |||
221 | @@ -668,7 +668,8 @@ | |||
222 | 668 | this_branch = self.make_branch('this') | 668 | this_branch = self.make_branch('this') |
223 | 669 | other_branch = self.make_branch('other') | 669 | other_branch = self.make_branch('other') |
224 | 670 | try: | 670 | try: |
226 | 671 | this_branch._format.set_reference(this_branch.bzrdir, other_branch) | 671 | this_branch._format.set_reference(this_branch.bzrdir, None, |
227 | 672 | other_branch) | ||
228 | 672 | except NotImplementedError: | 673 | except NotImplementedError: |
229 | 673 | # that's ok | 674 | # that's ok |
230 | 674 | pass | 675 | pass |
231 | 675 | 676 | ||
232 | === modified file 'bzrlib/tests/per_bzrdir_colo/test_unsupported.py' | |||
233 | --- bzrlib/tests/per_bzrdir_colo/test_unsupported.py 2010-04-11 19:40:23 +0000 | |||
234 | +++ bzrlib/tests/per_bzrdir_colo/test_unsupported.py 2010-04-29 09:01:37 +0000 | |||
235 | @@ -35,15 +35,7 @@ | |||
236 | 35 | 35 | ||
237 | 36 | class TestNoColocatedSupport(TestCaseWithBzrDir): | 36 | class TestNoColocatedSupport(TestCaseWithBzrDir): |
238 | 37 | 37 | ||
248 | 38 | def test_destroy_colocated_branch(self): | 38 | def make_bzrdir_with_repo(self): |
240 | 39 | branch = self.make_branch('branch') | ||
241 | 40 | # Colocated branches should not be supported *or* | ||
242 | 41 | # destroy_branch should not be supported at all | ||
243 | 42 | self.assertRaises( | ||
244 | 43 | (errors.NoColocatedBranchSupport, errors.UnsupportedOperation), | ||
245 | 44 | branch.bzrdir.destroy_branch, 'colo') | ||
246 | 45 | |||
247 | 46 | def test_create_colo_branch(self): | ||
249 | 47 | # a bzrdir can construct a branch and repository for itself. | 39 | # a bzrdir can construct a branch and repository for itself. |
250 | 48 | if not self.bzrdir_format.is_supported(): | 40 | if not self.bzrdir_format.is_supported(): |
251 | 49 | # unsupported formats are not loopback testable | 41 | # unsupported formats are not loopback testable |
252 | @@ -53,7 +45,27 @@ | |||
253 | 53 | t = get_transport(self.get_url()) | 45 | t = get_transport(self.get_url()) |
254 | 54 | made_control = self.bzrdir_format.initialize(t.base) | 46 | made_control = self.bzrdir_format.initialize(t.base) |
255 | 55 | made_repo = made_control.create_repository() | 47 | made_repo = made_control.create_repository() |
256 | 48 | return made_control | ||
257 | 49 | |||
258 | 50 | def test_destroy_colocated_branch(self): | ||
259 | 51 | branch = self.make_branch('branch') | ||
260 | 52 | # Colocated branches should not be supported *or* | ||
261 | 53 | # destroy_branch should not be supported at all | ||
262 | 54 | self.assertRaises( | ||
263 | 55 | (errors.NoColocatedBranchSupport, errors.UnsupportedOperation), | ||
264 | 56 | branch.bzrdir.destroy_branch, 'colo') | ||
265 | 57 | |||
266 | 58 | def test_create_colo_branch(self): | ||
267 | 59 | made_control = self.make_bzrdir_with_repo() | ||
268 | 56 | self.assertRaises(errors.NoColocatedBranchSupport, | 60 | self.assertRaises(errors.NoColocatedBranchSupport, |
269 | 57 | made_control.create_branch, "colo") | 61 | made_control.create_branch, "colo") |
270 | 58 | 62 | ||
271 | 63 | def test_branch_transport(self): | ||
272 | 64 | made_control = self.make_bzrdir_with_repo() | ||
273 | 65 | self.assertRaises(errors.NoColocatedBranchSupport, | ||
274 | 66 | made_control.get_branch_transport, None, "colo") | ||
275 | 59 | 67 | ||
276 | 68 | def test_get_branch_reference(self): | ||
277 | 69 | made_control = self.make_bzrdir_with_repo() | ||
278 | 70 | self.assertRaises(errors.NoColocatedBranchSupport, | ||
279 | 71 | made_control.get_branch_reference, "colo") | ||
280 | 60 | 72 | ||
281 | === modified file 'bzrlib/tests/test_remote.py' | |||
282 | --- bzrlib/tests/test_remote.py 2010-04-20 00:20:00 +0000 | |||
283 | +++ bzrlib/tests/test_remote.py 2010-04-29 09:01:37 +0000 | |||
284 | @@ -584,7 +584,7 @@ | |||
285 | 584 | # _get_tree_branch is a form of open_branch, but it should only ask for | 584 | # _get_tree_branch is a form of open_branch, but it should only ask for |
286 | 585 | # branch opening, not any other network requests. | 585 | # branch opening, not any other network requests. |
287 | 586 | calls = [] | 586 | calls = [] |
289 | 587 | def open_branch(): | 587 | def open_branch(name=None): |
290 | 588 | calls.append("Called") | 588 | calls.append("Called") |
291 | 589 | return "a-branch" | 589 | return "a-branch" |
292 | 590 | transport = MemoryTransport() | 590 | transport = MemoryTransport() |
Heads-up: please, consider *always* using name=name instead of a bare 'name'.
Examples: find_format( self, name)
57 + return BranchFormat.
66 + format = self.find_ branch_ format( name)
85 + b = self.open_ branch( name)
I may have missed some.
This patch and a previous one (nick: use-branch-open ?) are breaking bzr-loom without a way to catch up with your modifications.
And since I didn't track the changes closely I'm not even clear about what loom should do with this parameter and patching blindly sounds like as sure recipe to disaster, help !