~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to zap.py

  • Committer: Aaron Bentley
  • Date: 2012-01-20 02:07:15 UTC
  • Revision ID: aaron@aaronbentley.com-20120120020715-ar6jbqnrjcuebggz
Tags: release-2.5
Update for 2.5 release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2006-2007, 2010-2011 Aaron Bentley <aaron@aaronbentley.com>
 
2
# Copyright (C) 2007 Charlie Shepherd <masterdriverz@gentoo.org>
 
3
# Copyright (C) 2011 Canonical Ltd.
 
4
#
 
5
#    This program is free software; you can redistribute it and/or modify
 
6
#    it under the terms of the GNU General Public License as published by
 
7
#    the Free Software Foundation; either version 2 of the License, or
 
8
#    (at your option) any later version.
 
9
#
 
10
#    This program is distributed in the hope that it will be useful,
 
11
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
#    GNU General Public License for more details.
 
14
#
 
15
#    You should have received a copy of the GNU General Public License
 
16
#    along with this program; if not, write to the Free Software
 
17
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
18
 
1
19
from shutil import rmtree
2
20
 
 
21
from bzrlib import (
 
22
    bzrdir,
 
23
    revision as _mod_revision,
 
24
    )
3
25
from bzrlib.branch import Branch
4
 
from bzrlib.errors import NoWorkingTree, NotLocalUrl, NotBranchError
 
26
from bzrlib.errors import BzrCommandError, NoWorkingTree, NotBranchError
 
27
from bzrlib import registry
5
28
from bzrlib.workingtree import WorkingTree
6
29
 
7
 
from errors import (NotCheckout, UncommittedCheckout, ParentMissingRevisions, 
 
30
from errors import (NotCheckout, UncommittedCheckout, ParentMissingRevisions,
8
31
                    NoParent)
9
32
 
10
33
 
11
 
def zap(path, remove_branch=False):
 
34
class AllowChanged(object):
 
35
 
 
36
    @classmethod
 
37
    def check_changed(klass, wt, remove_branch):
 
38
        pass
 
39
 
 
40
 
 
41
class CheckChanged(object):
 
42
 
 
43
    @classmethod
 
44
    def check_changed(klass, wt, remove_branch):
 
45
        delta = wt.changes_from(wt.basis_tree(), want_unchanged=False)
 
46
        if delta.has_changed():
 
47
            klass.handle_changed(wt, remove_branch)
 
48
 
 
49
 
 
50
class HaltOnChange(CheckChanged):
 
51
 
 
52
    @staticmethod
 
53
    def handle_changed(wt, remove_branch):
 
54
        raise UncommittedCheckout()
 
55
 
 
56
 
 
57
class StoreChanges(CheckChanged):
 
58
 
 
59
    @staticmethod
 
60
    def handle_changed(wt, remove_branch):
 
61
        from bzrlib.plugins.pipeline.pipeline import PipeManager
 
62
        if remove_branch:
 
63
            raise BzrCommandError('Cannot store changes in deleted branch.')
 
64
        PipeManager.from_checkout(wt).store_uncommitted()
 
65
 
 
66
 
 
67
change_policy_registry = registry.Registry()
 
68
 
 
69
 
 
70
change_policy_registry.register('force', AllowChanged,
 
71
                                'Delete tree even if contents are modified.')
 
72
 
 
73
 
 
74
change_policy_registry.register('store', StoreChanges,
 
75
                                'Store changes in branch.  (Requires'
 
76
                                ' bzr-pipeline.)')
 
77
 
 
78
 
 
79
change_policy_registry.register('check', HaltOnChange,
 
80
                                'Stop if tree contents are modified.')
 
81
 
 
82
 
 
83
change_policy_registry.default_key = 'check'
 
84
 
 
85
 
 
86
def zap(path, remove_branch=False, policy=HaltOnChange):
12
87
    try:
13
 
        wt = WorkingTree.open(path)
 
88
        wt = bzrdir.BzrDir.open(path).open_workingtree(path,
 
89
                                                       recommend_upgrade=False)
14
90
    except (NoWorkingTree, NotBranchError):
15
91
        raise NotCheckout(path)
16
92
    tree_base = wt.bzrdir.transport.base
18
94
    branch_base = branch.bzrdir.transport.base
19
95
    if tree_base == branch_base:
20
96
        raise NotCheckout(path)
21
 
    delta = wt.changes_from(wt.basis_tree(), want_unchanged=False)
22
 
    if delta.has_changed():
23
 
        raise UncommittedCheckout()
 
97
    policy.check_changed(wt, remove_branch)
24
98
    if remove_branch:
25
99
        parent_loc = branch.get_parent()
26
100
        if parent_loc is None:
27
101
            raise NoParent()
28
102
        parent = Branch.open(parent_loc)
29
 
        p_ancestry = parent.repository.get_ancestry(parent.last_revision())
30
 
        if branch.last_revision() not in p_ancestry:
 
103
        last_revision = _mod_revision.ensure_null(parent.last_revision())
 
104
        p_ancestry = parent.repository.get_ancestry(last_revision)
 
105
        if (last_revision != _mod_revision.NULL_REVISION and
 
106
            branch.last_revision() not in p_ancestry):
31
107
            raise ParentMissingRevisions(branch.get_parent())
32
108
    rmtree(path)
33
109
    if remove_branch:
41
117
def test_suite():
42
118
    import os
43
119
    from unittest import makeSuite
44
 
    
45
 
    from bzrlib.bzrdir import BzrDir, BzrDirMetaFormat1
46
 
    from bzrlib.branch import BranchReferenceFormat
 
120
 
47
121
    from bzrlib.tests import TestCaseInTempDir
48
122
 
 
123
 
 
124
    class PipelinePluginFeature:
 
125
 
 
126
        @staticmethod
 
127
        def available():
 
128
            try:
 
129
                import bzrlib.plugins.pipeline
 
130
            except ImportError:
 
131
                return False
 
132
            else:
 
133
                return True
 
134
 
 
135
 
49
136
    class TestZap(TestCaseInTempDir):
50
137
 
51
138
        def make_checkout(self):
52
 
            wt = BzrDir.create_standalone_workingtree('source')
53
 
            os.mkdir('checkout')
54
 
            checkout = BzrDirMetaFormat1().initialize('checkout')
55
 
            BranchReferenceFormat().initialize(checkout, wt.branch)
56
 
            return checkout.create_workingtree()
 
139
            wt = bzrdir.BzrDir.create_standalone_workingtree('source')
 
140
            return wt.branch.create_checkout('checkout', lightweight=True)
57
141
 
58
142
        def make_checkout2(self):
59
143
            wt = self.make_checkout()
60
144
            wt2 = wt.branch.bzrdir.sprout('source2').open_workingtree()
61
 
            os.mkdir('checkout2')
62
 
            checkout = BzrDirMetaFormat1().initialize('checkout2')
63
 
            BranchReferenceFormat().initialize(checkout, wt2.branch)
64
 
            return checkout.create_workingtree()
 
145
            return wt2.branch.create_checkout('checkout2', lightweight=True)
65
146
 
66
147
        def test_is_checkout(self):
67
148
            self.assertRaises(NotCheckout, zap, '.')
68
 
            wt = BzrDir.create_standalone_workingtree('.')
 
149
            wt = bzrdir.BzrDir.create_standalone_workingtree('.')
69
150
            self.assertRaises(NotCheckout, zap, '.')
70
151
 
71
152
        def test_zap_works(self):
75
156
            self.assertIs(False, os.path.exists('checkout'))
76
157
            self.assertIs(True, os.path.exists('source'))
77
158
 
78
 
        def test_zap_branch(self):
 
159
        def test_zap_branch(self):
79
160
            self.make_checkout2()
80
161
            base = WorkingTree.open('checkout').branch.base
81
162
            self.assertIs(True, os.path.exists('checkout'))
94
175
            checkout.commit('commit changes to branch')
95
176
            zap('checkout')
96
177
 
 
178
        def make_modified_checkout(self):
 
179
            checkout = self.make_checkout()
 
180
            os.mkdir('checkout/foo')
 
181
            checkout.add('foo')
 
182
            return checkout
 
183
 
 
184
        def test_allow_modified(self):
 
185
            self.make_modified_checkout()
 
186
            self.assertRaises(UncommittedCheckout, zap, 'checkout')
 
187
            zap('checkout', policy=AllowChanged)
 
188
 
 
189
        def test_store(self):
 
190
            self.requireFeature(PipelinePluginFeature)
 
191
            checkout = self.make_modified_checkout()
 
192
            zap('checkout', policy=StoreChanges)
 
193
            self.assertIn('stored-transform',
 
194
                checkout.branch.bzrdir.transport.list_dir('branch'))
 
195
 
 
196
        def test_store_remove_branch(self):
 
197
            self.requireFeature(PipelinePluginFeature)
 
198
            checkout = self.make_modified_checkout()
 
199
            branch = self.make_branch('branch')
 
200
            checkout.branch.set_parent(branch.base)
 
201
            e = self.assertRaises(BzrCommandError, zap, 'checkout',
 
202
                                  policy=StoreChanges, remove_branch=True)
 
203
            self.assertEqual('Cannot store changes in deleted branch.', str(e))
 
204
 
 
205
        def test_store_remove_branch_unmodified(self):
 
206
            self.requireFeature(PipelinePluginFeature)
 
207
            checkout = self.make_checkout()
 
208
            branch = self.make_branch('branch')
 
209
            checkout.branch.set_parent(branch.base)
 
210
            zap('checkout', policy=StoreChanges, remove_branch=True)
 
211
 
97
212
    return makeSuite(TestZap)