Merge lp:~jelmer/bzr/private-update-revisions into lp:bzr
- private-update-revisions
- Merge into bzr.dev
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Vincent Ladeuil | ||||
Approved revision: | no longer in the source branch. | ||||
Merged at revision: | 5828 | ||||
Proposed branch: | lp:~jelmer/bzr/private-update-revisions | ||||
Merge into: | lp:bzr | ||||
Diff against target: |
325 lines (+39/-181) 5 files modified
bzrlib/branch.py (+32/-62) bzrlib/tests/per_branch/test_update.py (+0/-48) bzrlib/tests/per_interbranch/__init__.py (+0/-1) bzrlib/tests/per_interbranch/test_update_revisions.py (+0/-70) doc/en/release-notes/bzr-2.4.txt (+7/-0) |
||||
To merge this branch: | bzr merge lp:~jelmer/bzr/private-update-revisions | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Vincent Ladeuil | Approve | ||
Review via email: mp+59228@code.launchpad.net |
Commit message
Make InterBranch.
Description of the change
Remove Branch.
InterBranch.
and InterBranch.push, this makes it private and removes the interface tests
for it (so non-GenericInte
The individual tests for .push and .pull already had proper test coverage.
Jelmer Vernooij (jelmer) wrote : | # |
It merged a branch which has landed since this MP was created, which makes the diff for this branch appear larger than it actually is.
The other branch that was merged (and removes fetch_spec as argument) can be found here: https:/
Jelmer Vernooij (jelmer) wrote : | # |
Thanks for the reviews \o/
Jelmer Vernooij (jelmer) wrote : | # |
sent to pqm by email
Jelmer Vernooij (jelmer) wrote : | # |
sent to pqm by email
Preview Diff
1 | === modified file 'bzrlib/branch.py' | |||
2 | --- bzrlib/branch.py 2011-04-27 10:55:49 +0000 | |||
3 | +++ bzrlib/branch.py 2011-05-04 20:05:59 +0000 | |||
4 | @@ -994,21 +994,6 @@ | |||
5 | 994 | else: | 994 | else: |
6 | 995 | return (0, _mod_revision.NULL_REVISION) | 995 | return (0, _mod_revision.NULL_REVISION) |
7 | 996 | 996 | ||
8 | 997 | def update_revisions(self, other, stop_revision=None, overwrite=False, | ||
9 | 998 | graph=None): | ||
10 | 999 | """Pull in new perfect-fit revisions. | ||
11 | 1000 | |||
12 | 1001 | :param other: Another Branch to pull from | ||
13 | 1002 | :param stop_revision: Updated until the given revision | ||
14 | 1003 | :param overwrite: Always set the branch pointer, rather than checking | ||
15 | 1004 | to see if it is a proper descendant. | ||
16 | 1005 | :param graph: A Graph object that can be used to query history | ||
17 | 1006 | information. This can be None. | ||
18 | 1007 | :return: None | ||
19 | 1008 | """ | ||
20 | 1009 | return InterBranch.get(other, self).update_revisions(stop_revision, | ||
21 | 1010 | overwrite, graph) | ||
22 | 1011 | |||
23 | 1012 | @deprecated_method(deprecated_in((2, 4, 0))) | 997 | @deprecated_method(deprecated_in((2, 4, 0))) |
24 | 1013 | def import_last_revision_info(self, source_repo, revno, revid): | 998 | def import_last_revision_info(self, source_repo, revno, revid): |
25 | 1014 | """Set the last revision info, importing from another repo if necessary. | 999 | """Set the last revision info, importing from another repo if necessary. |
26 | @@ -2611,27 +2596,6 @@ | |||
27 | 2611 | pass | 2596 | pass |
28 | 2612 | return None | 2597 | return None |
29 | 2613 | 2598 | ||
30 | 2614 | def _basic_push(self, target, overwrite, stop_revision): | ||
31 | 2615 | """Basic implementation of push without bound branches or hooks. | ||
32 | 2616 | |||
33 | 2617 | Must be called with source read locked and target write locked. | ||
34 | 2618 | """ | ||
35 | 2619 | result = BranchPushResult() | ||
36 | 2620 | result.source_branch = self | ||
37 | 2621 | result.target_branch = target | ||
38 | 2622 | result.old_revno, result.old_revid = target.last_revision_info() | ||
39 | 2623 | self.update_references(target) | ||
40 | 2624 | if result.old_revid != stop_revision: | ||
41 | 2625 | # We assume that during 'push' this repository is closer than | ||
42 | 2626 | # the target. | ||
43 | 2627 | graph = self.repository.get_graph(target.repository) | ||
44 | 2628 | target.update_revisions(self, stop_revision, | ||
45 | 2629 | overwrite=overwrite, graph=graph) | ||
46 | 2630 | if self._push_should_merge_tags(): | ||
47 | 2631 | result.tag_conflicts = self.tags.merge_to(target.tags, overwrite) | ||
48 | 2632 | result.new_revno, result.new_revid = target.last_revision_info() | ||
49 | 2633 | return result | ||
50 | 2634 | |||
51 | 2635 | def get_stacked_on_url(self): | 2599 | def get_stacked_on_url(self): |
52 | 2636 | raise errors.UnstackableBranchFormat(self._format, self.user_url) | 2600 | raise errors.UnstackableBranchFormat(self._format, self.user_url) |
53 | 2637 | 2601 | ||
54 | @@ -3287,20 +3251,6 @@ | |||
55 | 3287 | raise NotImplementedError(self.pull) | 3251 | raise NotImplementedError(self.pull) |
56 | 3288 | 3252 | ||
57 | 3289 | @needs_write_lock | 3253 | @needs_write_lock |
58 | 3290 | def update_revisions(self, stop_revision=None, overwrite=False, | ||
59 | 3291 | graph=None): | ||
60 | 3292 | """Pull in new perfect-fit revisions. | ||
61 | 3293 | |||
62 | 3294 | :param stop_revision: Updated until the given revision | ||
63 | 3295 | :param overwrite: Always set the branch pointer, rather than checking | ||
64 | 3296 | to see if it is a proper descendant. | ||
65 | 3297 | :param graph: A Graph object that can be used to query history | ||
66 | 3298 | information. This can be None. | ||
67 | 3299 | :return: None | ||
68 | 3300 | """ | ||
69 | 3301 | raise NotImplementedError(self.update_revisions) | ||
70 | 3302 | |||
71 | 3303 | @needs_write_lock | ||
72 | 3304 | def push(self, overwrite=False, stop_revision=None, | 3254 | def push(self, overwrite=False, stop_revision=None, |
73 | 3305 | _override_hook_source_branch=None): | 3255 | _override_hook_source_branch=None): |
74 | 3306 | """Mirror the source branch into the target branch. | 3256 | """Mirror the source branch into the target branch. |
75 | @@ -3384,9 +3334,8 @@ | |||
76 | 3384 | self.source.unlock() | 3334 | self.source.unlock() |
77 | 3385 | 3335 | ||
78 | 3386 | @needs_write_lock | 3336 | @needs_write_lock |
80 | 3387 | def update_revisions(self, stop_revision=None, overwrite=False, | 3337 | def _update_revisions(self, stop_revision=None, overwrite=False, |
81 | 3388 | graph=None): | 3338 | graph=None): |
82 | 3389 | """See InterBranch.update_revisions().""" | ||
83 | 3390 | other_revno, other_last_revision = self.source.last_revision_info() | 3339 | other_revno, other_last_revision = self.source.last_revision_info() |
84 | 3391 | stop_revno = None # unknown | 3340 | stop_revno = None # unknown |
85 | 3392 | if stop_revision is None: | 3341 | if stop_revision is None: |
86 | @@ -3478,6 +3427,28 @@ | |||
87 | 3478 | finally: | 3427 | finally: |
88 | 3479 | self.source.unlock() | 3428 | self.source.unlock() |
89 | 3480 | 3429 | ||
90 | 3430 | def _basic_push(self, overwrite, stop_revision): | ||
91 | 3431 | """Basic implementation of push without bound branches or hooks. | ||
92 | 3432 | |||
93 | 3433 | Must be called with source read locked and target write locked. | ||
94 | 3434 | """ | ||
95 | 3435 | result = BranchPushResult() | ||
96 | 3436 | result.source_branch = self.source | ||
97 | 3437 | result.target_branch = self.target | ||
98 | 3438 | result.old_revno, result.old_revid = self.target.last_revision_info() | ||
99 | 3439 | self.source.update_references(self.target) | ||
100 | 3440 | if result.old_revid != stop_revision: | ||
101 | 3441 | # We assume that during 'push' this repository is closer than | ||
102 | 3442 | # the target. | ||
103 | 3443 | graph = self.source.repository.get_graph(self.target.repository) | ||
104 | 3444 | self._update_revisions(stop_revision, overwrite=overwrite, | ||
105 | 3445 | graph=graph) | ||
106 | 3446 | if self.source._push_should_merge_tags(): | ||
107 | 3447 | result.tag_conflicts = self.source.tags.merge_to(self.target.tags, | ||
108 | 3448 | overwrite) | ||
109 | 3449 | result.new_revno, result.new_revid = self.target.last_revision_info() | ||
110 | 3450 | return result | ||
111 | 3451 | |||
112 | 3481 | def _push_with_bound_branches(self, overwrite, stop_revision, | 3452 | def _push_with_bound_branches(self, overwrite, stop_revision, |
113 | 3482 | _override_hook_source_branch=None): | 3453 | _override_hook_source_branch=None): |
114 | 3483 | """Push from source into target, and into target's master if any. | 3454 | """Push from source into target, and into target's master if any. |
115 | @@ -3498,12 +3469,12 @@ | |||
116 | 3498 | master_branch.lock_write() | 3469 | master_branch.lock_write() |
117 | 3499 | try: | 3470 | try: |
118 | 3500 | # push into the master from the source branch. | 3471 | # push into the master from the source branch. |
125 | 3501 | self.source._basic_push(master_branch, overwrite, stop_revision) | 3472 | master_inter = InterBranch.get(self.source, master_branch) |
126 | 3502 | # and push into the target branch from the source. Note that we | 3473 | master_inter._basic_push(overwrite, stop_revision) |
127 | 3503 | # push from the source branch again, because it's considered the | 3474 | # and push into the target branch from the source. Note that |
128 | 3504 | # highest bandwidth repository. | 3475 | # we push from the source branch again, because it's considered |
129 | 3505 | result = self.source._basic_push(self.target, overwrite, | 3476 | # the highest bandwidth repository. |
130 | 3506 | stop_revision) | 3477 | result = self._basic_push(overwrite, stop_revision) |
131 | 3507 | result.master_branch = master_branch | 3478 | result.master_branch = master_branch |
132 | 3508 | result.local_branch = self.target | 3479 | result.local_branch = self.target |
133 | 3509 | _run_hooks() | 3480 | _run_hooks() |
134 | @@ -3512,8 +3483,7 @@ | |||
135 | 3512 | master_branch.unlock() | 3483 | master_branch.unlock() |
136 | 3513 | else: | 3484 | else: |
137 | 3514 | # no master branch | 3485 | # no master branch |
140 | 3515 | result = self.source._basic_push(self.target, overwrite, | 3486 | result = self._basic_push(overwrite, stop_revision) |
139 | 3516 | stop_revision) | ||
141 | 3517 | # TODO: Why set master_branch and local_branch if there's no | 3487 | # TODO: Why set master_branch and local_branch if there's no |
142 | 3518 | # binding? Maybe cleaner to just leave them unset? -- mbp | 3488 | # binding? Maybe cleaner to just leave them unset? -- mbp |
143 | 3519 | # 20070504 | 3489 | # 20070504 |
144 | @@ -3562,8 +3532,8 @@ | |||
145 | 3562 | # -- JRV20090506 | 3532 | # -- JRV20090506 |
146 | 3563 | result.old_revno, result.old_revid = \ | 3533 | result.old_revno, result.old_revid = \ |
147 | 3564 | self.target.last_revision_info() | 3534 | self.target.last_revision_info() |
150 | 3565 | self.target.update_revisions(self.source, stop_revision, | 3535 | self._update_revisions(stop_revision, overwrite=overwrite, |
151 | 3566 | overwrite=overwrite, graph=graph) | 3536 | graph=graph) |
152 | 3567 | # TODO: The old revid should be specified when merging tags, | 3537 | # TODO: The old revid should be specified when merging tags, |
153 | 3568 | # so a tags implementation that versions tags can only | 3538 | # so a tags implementation that versions tags can only |
154 | 3569 | # pull in the most recent changes. -- JRV20090506 | 3539 | # pull in the most recent changes. -- JRV20090506 |
155 | 3570 | 3540 | ||
156 | === modified file 'bzrlib/tests/per_branch/test_update.py' | |||
157 | --- bzrlib/tests/per_branch/test_update.py 2011-01-10 21:31:59 +0000 | |||
158 | +++ bzrlib/tests/per_branch/test_update.py 2011-05-04 20:05:59 +0000 | |||
159 | @@ -70,54 +70,6 @@ | |||
160 | 70 | self.assertEqual('foo', child_tree.branch.update()) | 70 | self.assertEqual('foo', child_tree.branch.update()) |
161 | 71 | self.assertEqual(['bar'], child_tree.branch.revision_history()) | 71 | self.assertEqual(['bar'], child_tree.branch.revision_history()) |
162 | 72 | 72 | ||
163 | 73 | |||
164 | 74 | class TestUpdateRevisions(per_branch.TestCaseWithBranch): | ||
165 | 75 | |||
166 | 76 | def test_accepts_graph(self): | ||
167 | 77 | # An implementation may not use it, but it should allow a 'graph' to be | ||
168 | 78 | # supplied | ||
169 | 79 | tree1 = self.make_branch_and_tree('tree1') | ||
170 | 80 | rev1 = tree1.commit('one') | ||
171 | 81 | tree2 = tree1.bzrdir.sprout('tree2').open_workingtree() | ||
172 | 82 | rev2 = tree2.commit('two') | ||
173 | 83 | |||
174 | 84 | tree1.lock_write() | ||
175 | 85 | self.addCleanup(tree1.unlock) | ||
176 | 86 | tree2.lock_read() | ||
177 | 87 | self.addCleanup(tree2.unlock) | ||
178 | 88 | graph = tree2.branch.repository.get_graph(tree1.branch.repository) | ||
179 | 89 | |||
180 | 90 | tree1.branch.update_revisions(tree2.branch, graph=graph) | ||
181 | 91 | self.assertEqual((2, rev2), tree1.branch.last_revision_info()) | ||
182 | 92 | |||
183 | 93 | def test_overwrite_ignores_diverged(self): | ||
184 | 94 | tree1 = self.make_branch_and_tree('tree1') | ||
185 | 95 | rev1 = tree1.commit('one') | ||
186 | 96 | tree2 = tree1.bzrdir.sprout('tree2').open_workingtree() | ||
187 | 97 | rev2 = tree1.commit('two') | ||
188 | 98 | rev2b = tree2.commit('alt two') | ||
189 | 99 | |||
190 | 100 | self.assertRaises(errors.DivergedBranches, | ||
191 | 101 | tree1.branch.update_revisions, | ||
192 | 102 | tree2.branch, overwrite=False) | ||
193 | 103 | # However, the revision should be copied into the repository | ||
194 | 104 | self.assertTrue(tree1.branch.repository.has_revision(rev2b)) | ||
195 | 105 | |||
196 | 106 | tree1.branch.update_revisions(tree2.branch, overwrite=True) | ||
197 | 107 | self.assertEqual((2, rev2b), tree1.branch.last_revision_info()) | ||
198 | 108 | |||
199 | 109 | def test_ignores_older_unless_overwrite(self): | ||
200 | 110 | tree1 = self.make_branch_and_tree('tree1') | ||
201 | 111 | rev1 = tree1.commit('one') | ||
202 | 112 | tree2 = tree1.bzrdir.sprout('tree2').open_workingtree() | ||
203 | 113 | rev2 = tree1.commit('two') | ||
204 | 114 | |||
205 | 115 | tree1.branch.update_revisions(tree2.branch) | ||
206 | 116 | self.assertEqual((2, rev2), tree1.branch.last_revision_info()) | ||
207 | 117 | |||
208 | 118 | tree1.branch.update_revisions(tree2.branch, overwrite=True) | ||
209 | 119 | self.assertEqual((1, rev1), tree1.branch.last_revision_info()) | ||
210 | 120 | |||
211 | 121 | def test_update_in_checkout_of_readonly(self): | 73 | def test_update_in_checkout_of_readonly(self): |
212 | 122 | tree1 = self.make_branch_and_tree('tree1') | 74 | tree1 = self.make_branch_and_tree('tree1') |
213 | 123 | rev1 = tree1.commit('one') | 75 | rev1 = tree1.commit('one') |
214 | 124 | 76 | ||
215 | === modified file 'bzrlib/tests/per_interbranch/__init__.py' | |||
216 | --- bzrlib/tests/per_interbranch/__init__.py 2011-03-26 01:53:34 +0000 | |||
217 | +++ bzrlib/tests/per_interbranch/__init__.py 2011-05-04 20:05:59 +0000 | |||
218 | @@ -171,7 +171,6 @@ | |||
219 | 171 | 'bzrlib.tests.per_interbranch.test_copy_content_into', | 171 | 'bzrlib.tests.per_interbranch.test_copy_content_into', |
220 | 172 | 'bzrlib.tests.per_interbranch.test_pull', | 172 | 'bzrlib.tests.per_interbranch.test_pull', |
221 | 173 | 'bzrlib.tests.per_interbranch.test_push', | 173 | 'bzrlib.tests.per_interbranch.test_push', |
222 | 174 | 'bzrlib.tests.per_interbranch.test_update_revisions', | ||
223 | 175 | ]) | 174 | ]) |
224 | 176 | scenarios = make_scenarios(default_test_list()) | 175 | scenarios = make_scenarios(default_test_list()) |
225 | 177 | return multiply_tests(submod_tests, scenarios, standard_tests) | 176 | return multiply_tests(submod_tests, scenarios, standard_tests) |
226 | 178 | 177 | ||
227 | === removed file 'bzrlib/tests/per_interbranch/test_update_revisions.py' | |||
228 | --- bzrlib/tests/per_interbranch/test_update_revisions.py 2010-06-17 09:23:19 +0000 | |||
229 | +++ bzrlib/tests/per_interbranch/test_update_revisions.py 1970-01-01 00:00:00 +0000 | |||
230 | @@ -1,70 +0,0 @@ | |||
231 | 1 | # Copyright (C) 2009, 2010 Canonical Ltd | ||
232 | 2 | # | ||
233 | 3 | # This program is free software; you can redistribute it and/or modify | ||
234 | 4 | # it under the terms of the GNU General Public License as published by | ||
235 | 5 | # the Free Software Foundation; either version 2 of the License, or | ||
236 | 6 | # (at your option) any later version. | ||
237 | 7 | # | ||
238 | 8 | # This program is distributed in the hope that it will be useful, | ||
239 | 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
240 | 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
241 | 11 | # GNU General Public License for more details. | ||
242 | 12 | # | ||
243 | 13 | # You should have received a copy of the GNU General Public License | ||
244 | 14 | # along with this program; if not, write to the Free Software | ||
245 | 15 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
246 | 16 | |||
247 | 17 | from bzrlib import ( | ||
248 | 18 | errors, | ||
249 | 19 | ) | ||
250 | 20 | from bzrlib.tests.per_interbranch import ( | ||
251 | 21 | TestCaseWithInterBranch, | ||
252 | 22 | ) | ||
253 | 23 | |||
254 | 24 | |||
255 | 25 | class TestUpdateRevisions(TestCaseWithInterBranch): | ||
256 | 26 | |||
257 | 27 | def setUp(self): | ||
258 | 28 | super(TestUpdateRevisions, self).setUp() | ||
259 | 29 | self.tree1 = self.make_from_branch_and_tree('tree1') | ||
260 | 30 | rev1 = self.tree1.commit('one') | ||
261 | 31 | branch2 = self.make_to_branch('tree2') | ||
262 | 32 | branch2.repository.fetch(self.tree1.branch.repository) | ||
263 | 33 | self.tree1.branch.copy_content_into(branch2) | ||
264 | 34 | self.tree2 = branch2.bzrdir.create_workingtree() | ||
265 | 35 | |||
266 | 36 | def test_accepts_graph(self): | ||
267 | 37 | # An implementation may not use it, but it should allow a 'graph' to be | ||
268 | 38 | # supplied | ||
269 | 39 | rev2 = self.tree2.commit('two') | ||
270 | 40 | |||
271 | 41 | self.tree1.lock_write() | ||
272 | 42 | self.addCleanup(self.tree1.unlock) | ||
273 | 43 | self.tree2.lock_read() | ||
274 | 44 | self.addCleanup(self.tree2.unlock) | ||
275 | 45 | graph = self.tree2.branch.repository.get_graph( | ||
276 | 46 | self.tree1.branch.repository) | ||
277 | 47 | |||
278 | 48 | self.tree1.branch.update_revisions(self.tree2.branch, graph=graph) | ||
279 | 49 | self.assertEqual((2, rev2), self.tree1.branch.last_revision_info()) | ||
280 | 50 | |||
281 | 51 | def test_overwrite_ignores_diverged(self): | ||
282 | 52 | rev2 = self.tree1.commit('two') | ||
283 | 53 | rev2b = self.tree2.commit('alt two') | ||
284 | 54 | |||
285 | 55 | self.assertRaises(errors.DivergedBranches, | ||
286 | 56 | self.tree1.branch.update_revisions, | ||
287 | 57 | self.tree2.branch, overwrite=False) | ||
288 | 58 | # However, the revision should be copied into the repository | ||
289 | 59 | self.assertTrue(self.tree1.branch.repository.has_revision(rev2b)) | ||
290 | 60 | |||
291 | 61 | self.tree1.branch.update_revisions(self.tree2.branch, overwrite=True) | ||
292 | 62 | self.assertEqual((2, rev2b), self.tree1.branch.last_revision_info()) | ||
293 | 63 | |||
294 | 64 | def test_ignores_older_unless_overwrite(self): | ||
295 | 65 | rev2 = self.tree1.commit('two') | ||
296 | 66 | |||
297 | 67 | self.tree1.branch.update_revisions(self.tree2.branch) | ||
298 | 68 | self.assertEqual((2, rev2), self.tree1.branch.last_revision_info()) | ||
299 | 69 | |||
300 | 70 | self.tree1.branch.update_revisions(self.tree2.branch, overwrite=True) | ||
301 | 71 | 0 | ||
302 | === modified file 'doc/en/release-notes/bzr-2.4.txt' | |||
303 | --- doc/en/release-notes/bzr-2.4.txt 2011-04-28 14:12:08 +0000 | |||
304 | +++ doc/en/release-notes/bzr-2.4.txt 2011-05-04 20:05:59 +0000 | |||
305 | @@ -171,6 +171,10 @@ | |||
306 | 171 | .. Changes that may require updates in plugins or other code that uses | 171 | .. Changes that may require updates in plugins or other code that uses |
307 | 172 | bzrlib. | 172 | bzrlib. |
308 | 173 | 173 | ||
309 | 174 | * ``Branch.update_revisions`` has been made private and should no | ||
310 | 175 | longer be used by external users. Use ``Branch.pull`` or ``Branch.push`` | ||
311 | 176 | instead. (Jelmer Vernooij, #771765) | ||
312 | 177 | |||
313 | 174 | * Commands now have an `invoked_as` attribute, showing the name under | 178 | * Commands now have an `invoked_as` attribute, showing the name under |
314 | 175 | which they were called before alias expansion. | 179 | which they were called before alias expansion. |
315 | 176 | (Martin Pool) | 180 | (Martin Pool) |
316 | @@ -425,6 +429,9 @@ | |||
317 | 425 | ``RepositoryFormat.supports_leaving_lock`` flags have been added. | 429 | ``RepositoryFormat.supports_leaving_lock`` flags have been added. |
318 | 426 | (Jelmer Vernooij) | 430 | (Jelmer Vernooij) |
319 | 427 | 431 | ||
320 | 432 | * ``Branch.fetch`` implementations must now accept an optional | ||
321 | 433 | ``fetch_tags`` keyword argument. (Andrew Bennetts) | ||
322 | 434 | |||
323 | 428 | * ``Branch.import_last_revision_info`` is deprecated. Use the | 435 | * ``Branch.import_last_revision_info`` is deprecated. Use the |
324 | 429 | ``import_last_revision_info_and_tags`` method instead. | 436 | ``import_last_revision_info_and_tags`` method instead. |
325 | 430 | (Andrew Bennetts) | 437 | (Andrew Bennetts) |
There is something weird in the way the diff is presented here and reviewing locally also present a different one >-/
Anyway, digging a bit to clear my surprise about:
8 - def fetch(self, from_branch, last_revision=None, fetch_spec=None): None):
9 + def fetch(self, from_branch, last_revision=
This seems to have already landed on trunk anyway.
So: approve