~abentley/bzrtools/bzrtools.dev

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
from shutil import rmtree

from bzrlib import bzrdir
from bzrlib.branch import Branch
from bzrlib.errors import NoWorkingTree, NotLocalUrl, NotBranchError
from bzrlib.workingtree import WorkingTree

from errors import (NotCheckout, UncommittedCheckout, ParentMissingRevisions,
                    NoParent)


def zap(path, remove_branch=False):
    try:
        wt = bzrdir.BzrDir.open(path).open_workingtree(path,
                                                       recommend_upgrade=False)
    except (NoWorkingTree, NotBranchError):
        raise NotCheckout(path)
    tree_base = wt.bzrdir.transport.base
    branch = wt.branch
    branch_base = branch.bzrdir.transport.base
    if tree_base == branch_base:
        raise NotCheckout(path)
    delta = wt.changes_from(wt.basis_tree(), want_unchanged=False)
    if delta.has_changed():
        raise UncommittedCheckout()
    if remove_branch:
        parent_loc = branch.get_parent()
        if parent_loc is None:
            raise NoParent()
        parent = Branch.open(parent_loc)
        p_ancestry = parent.repository.get_ancestry(parent.last_revision())
        if branch.last_revision() not in p_ancestry:
            raise ParentMissingRevisions(branch.get_parent())
    rmtree(path)
    if remove_branch:
        t = branch.bzrdir.transport
        while t.base != branch_base:
            t = t.clone('..')
        t = t.clone('..')
        t.delete_tree('')


def test_suite():
    import os
    from unittest import makeSuite

    from bzrlib.bzrdir import BzrDir, BzrDirMetaFormat1
    from bzrlib.branch import BranchReferenceFormat
    from bzrlib.tests import TestCaseInTempDir

    class TestZap(TestCaseInTempDir):

        def make_checkout(self):
            wt = BzrDir.create_standalone_workingtree('source')
            os.mkdir('checkout')
            checkout = BzrDirMetaFormat1().initialize('checkout')
            BranchReferenceFormat().initialize(checkout, wt.branch)
            return checkout.create_workingtree()

        def make_checkout2(self):
            wt = self.make_checkout()
            wt2 = wt.branch.bzrdir.sprout('source2').open_workingtree()
            os.mkdir('checkout2')
            checkout = BzrDirMetaFormat1().initialize('checkout2')
            BranchReferenceFormat().initialize(checkout, wt2.branch)
            return checkout.create_workingtree()

        def test_is_checkout(self):
            self.assertRaises(NotCheckout, zap, '.')
            wt = BzrDir.create_standalone_workingtree('.')
            self.assertRaises(NotCheckout, zap, '.')

        def test_zap_works(self):
            self.make_checkout()
            self.assertIs(True, os.path.exists('checkout'))
            zap('checkout')
            self.assertIs(False, os.path.exists('checkout'))
            self.assertIs(True, os.path.exists('source'))

	def test_zap_branch(self):
            self.make_checkout2()
            base = WorkingTree.open('checkout').branch.base
            self.assertIs(True, os.path.exists('checkout'))
            self.assertRaises(NoParent, zap, 'checkout', remove_branch=True)
            self.assertIs(True, os.path.exists('checkout'))
            self.assertIs(True, os.path.exists('source'))
            zap('checkout2', remove_branch=True)
            self.assertIs(False, os.path.exists('checkout2'))
            self.assertIs(False, os.path.exists('source2'))

        def test_checks_modified(self):
            checkout = self.make_checkout()
            os.mkdir('checkout/foo')
            checkout.add('foo')
            self.assertRaises(UncommittedCheckout, zap, 'checkout')
            checkout.commit('commit changes to branch')
            zap('checkout')

    return makeSuite(TestZap)