~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/per_branch/test_stacking.py

(spiv) Fix Branch._unstack to work with repeatedly locked RemoteBranch
 objects. (#551525) (Andrew Bennetts)

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
    errors,
24
24
    )
25
25
from bzrlib.revision import NULL_REVISION
26
 
from bzrlib.smart import server
27
 
from bzrlib.tests import TestNotApplicable, KnownFailure, transport_util
 
26
from bzrlib.tests import TestNotApplicable, transport_util
28
27
from bzrlib.tests.per_branch import TestCaseWithBranch
29
28
 
30
29
 
206
205
        self.assertRaises(errors.NotStacked,
207
206
            new_branch.get_stacked_on_url)
208
207
 
 
208
    def test_unstack_already_locked(self):
 
209
        """Removing the stacked-on branch with an already write-locked branch
 
210
        works.
 
211
 
 
212
        This was bug 551525.
 
213
        """
 
214
        try:
 
215
            stacked_bzrdir = self.make_stacked_bzrdir()
 
216
        except unstackable_format_errors, e:
 
217
            raise TestNotApplicable(e)
 
218
        stacked_branch = stacked_bzrdir.open_branch()
 
219
        stacked_branch.lock_write()
 
220
        stacked_branch.set_stacked_on_url(None)
 
221
        stacked_branch.unlock()
 
222
 
 
223
    def test_unstack_already_multiple_locked(self):
 
224
        """Unstacking a branch preserves the lock count (even though it
 
225
        replaces the br.repository object).
 
226
 
 
227
        This is a more extreme variation of test_unstack_already_locked.
 
228
        """
 
229
        try:
 
230
            stacked_bzrdir = self.make_stacked_bzrdir()
 
231
        except unstackable_format_errors, e:
 
232
            raise TestNotApplicable(e)
 
233
        stacked_branch = stacked_bzrdir.open_branch()
 
234
        stacked_branch.lock_write()
 
235
        stacked_branch.lock_write()
 
236
        stacked_branch.lock_write()
 
237
        stacked_branch.set_stacked_on_url(None)
 
238
        stacked_branch.unlock()
 
239
        stacked_branch.unlock()
 
240
        stacked_branch.unlock()
 
241
 
209
242
    def make_stacked_bzrdir(self, in_directory=None):
210
243
        """Create a stacked branch and return its bzrdir.
211
244
 
221
254
        tree = self.make_branch_and_tree(prefix + 'stacked-on')
222
255
        tree.commit('Added foo')
223
256
        stacked_bzrdir = tree.branch.bzrdir.sprout(
224
 
            prefix + 'stacked', tree.branch.last_revision(), stacked=True)
 
257
            self.get_url(prefix + 'stacked'), tree.branch.last_revision(),
 
258
            stacked=True)
225
259
        return stacked_bzrdir
226
260
 
227
261
    def test_clone_from_stacked_branch_preserve_stacking(self):
249
283
        except unstackable_format_errors, e:
250
284
            raise TestNotApplicable(e)
251
285
        stacked_bzrdir.open_branch().set_stacked_on_url('../stacked-on')
252
 
        cloned_bzrdir = stacked_bzrdir.clone('cloned', preserve_stacking=True)
 
286
        cloned_bzrdir = stacked_bzrdir.clone(
 
287
            self.get_url('cloned'), preserve_stacking=True)
253
288
        self.assertEqual(
254
289
            '../dir/stacked-on',
255
290
            cloned_bzrdir.open_branch().get_stacked_on_url())