~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to zap.py

  • Committer: Aaron Bentley
  • Date: 2011-04-15 02:33:36 UTC
  • mto: This revision was merged to the branch mainline in revision 761.
  • Revision ID: aaron@aaronbentley.com-20110415023336-o00049lbrfpmt1ae
Update compatibility-checking code.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from shutil import rmtree
 
2
 
 
3
from bzrlib import (
 
4
    bzrdir,
 
5
    revision as _mod_revision,
 
6
    )
 
7
from bzrlib.branch import Branch
 
8
from bzrlib.errors import NoWorkingTree, NotBranchError
 
9
from bzrlib.workingtree import WorkingTree
 
10
 
 
11
from errors import (NotCheckout, UncommittedCheckout, ParentMissingRevisions,
 
12
                    NoParent)
 
13
 
 
14
 
 
15
def zap(path, remove_branch=False, allow_modified=False):
 
16
    try:
 
17
        wt = bzrdir.BzrDir.open(path).open_workingtree(path,
 
18
                                                       recommend_upgrade=False)
 
19
    except (NoWorkingTree, NotBranchError):
 
20
        raise NotCheckout(path)
 
21
    tree_base = wt.bzrdir.transport.base
 
22
    branch = wt.branch
 
23
    branch_base = branch.bzrdir.transport.base
 
24
    if tree_base == branch_base:
 
25
        raise NotCheckout(path)
 
26
    if not allow_modified:
 
27
        delta = wt.changes_from(wt.basis_tree(), want_unchanged=False)
 
28
        if delta.has_changed():
 
29
            raise UncommittedCheckout()
 
30
    if remove_branch:
 
31
        parent_loc = branch.get_parent()
 
32
        if parent_loc is None:
 
33
            raise NoParent()
 
34
        parent = Branch.open(parent_loc)
 
35
        last_revision = _mod_revision.ensure_null(parent.last_revision())
 
36
        p_ancestry = parent.repository.get_ancestry(last_revision)
 
37
        if (last_revision != _mod_revision.NULL_REVISION and
 
38
            branch.last_revision() not in p_ancestry):
 
39
            raise ParentMissingRevisions(branch.get_parent())
 
40
    rmtree(path)
 
41
    if remove_branch:
 
42
        t = branch.bzrdir.transport
 
43
        while t.base != branch_base:
 
44
            t = t.clone('..')
 
45
        t = t.clone('..')
 
46
        t.delete_tree('')
 
47
 
 
48
 
 
49
def test_suite():
 
50
    import os
 
51
    from unittest import makeSuite
 
52
 
 
53
    from bzrlib.tests import TestCaseInTempDir
 
54
 
 
55
    class TestZap(TestCaseInTempDir):
 
56
 
 
57
        def make_checkout(self):
 
58
            wt = bzrdir.BzrDir.create_standalone_workingtree('source')
 
59
            return wt.branch.create_checkout('checkout', lightweight=True)
 
60
 
 
61
        def make_checkout2(self):
 
62
            wt = self.make_checkout()
 
63
            wt2 = wt.branch.bzrdir.sprout('source2').open_workingtree()
 
64
            return wt2.branch.create_checkout('checkout2', lightweight=True)
 
65
 
 
66
        def test_is_checkout(self):
 
67
            self.assertRaises(NotCheckout, zap, '.')
 
68
            wt = bzrdir.BzrDir.create_standalone_workingtree('.')
 
69
            self.assertRaises(NotCheckout, zap, '.')
 
70
 
 
71
        def test_zap_works(self):
 
72
            self.make_checkout()
 
73
            self.assertIs(True, os.path.exists('checkout'))
 
74
            zap('checkout')
 
75
            self.assertIs(False, os.path.exists('checkout'))
 
76
            self.assertIs(True, os.path.exists('source'))
 
77
 
 
78
        def test_zap_branch(self):
 
79
            self.make_checkout2()
 
80
            base = WorkingTree.open('checkout').branch.base
 
81
            self.assertIs(True, os.path.exists('checkout'))
 
82
            self.assertRaises(NoParent, zap, 'checkout', remove_branch=True)
 
83
            self.assertIs(True, os.path.exists('checkout'))
 
84
            self.assertIs(True, os.path.exists('source'))
 
85
            zap('checkout2', remove_branch=True)
 
86
            self.assertIs(False, os.path.exists('checkout2'))
 
87
            self.assertIs(False, os.path.exists('source2'))
 
88
 
 
89
        def test_checks_modified(self):
 
90
            checkout = self.make_checkout()
 
91
            os.mkdir('checkout/foo')
 
92
            checkout.add('foo')
 
93
            self.assertRaises(UncommittedCheckout, zap, 'checkout')
 
94
            checkout.commit('commit changes to branch')
 
95
            zap('checkout')
 
96
 
 
97
        def test_allow_modified(self):
 
98
            checkout = self.make_checkout()
 
99
            os.mkdir('checkout/foo')
 
100
            checkout.add('foo')
 
101
            self.assertRaises(UncommittedCheckout, zap, 'checkout')
 
102
            zap('checkout', allow_modified=True)
 
103
 
 
104
    return makeSuite(TestZap)