~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to zap.py

  • Committer: Aaron Bentley
  • Date: 2011-07-13 19:38:50 UTC
  • Revision ID: aaron@aaronbentley.com-20110713193850-ef5x4jtqt0qut7cr
Update NEWS

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
 
3
21
from bzrlib import (
5
23
    revision as _mod_revision,
6
24
    )
7
25
from bzrlib.branch import Branch
8
 
from bzrlib.errors import NoWorkingTree, NotBranchError
 
26
from bzrlib.errors import BzrCommandError, NoWorkingTree, NotBranchError
 
27
from bzrlib import registry
9
28
from bzrlib.workingtree import WorkingTree
10
29
 
11
30
from errors import (NotCheckout, UncommittedCheckout, ParentMissingRevisions,
12
31
                    NoParent)
13
32
 
14
33
 
15
 
def zap(path, remove_branch=False, allow_modified=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):
16
87
    try:
17
88
        wt = bzrdir.BzrDir.open(path).open_workingtree(path,
18
89
                                                       recommend_upgrade=False)
23
94
    branch_base = branch.bzrdir.transport.base
24
95
    if tree_base == branch_base:
25
96
        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()
 
97
    policy.check_changed(wt, remove_branch)
30
98
    if remove_branch:
31
99
        parent_loc = branch.get_parent()
32
100
        if parent_loc is None:
52
120
 
53
121
    from bzrlib.tests import TestCaseInTempDir
54
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
 
55
136
    class TestZap(TestCaseInTempDir):
56
137
 
57
138
        def make_checkout(self):
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
 
97
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)
98
207
            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)
 
208
            branch = self.make_branch('branch')
 
209
            checkout.branch.set_parent(branch.base)
 
210
            zap('checkout', policy=StoreChanges, remove_branch=True)
103
211
 
104
212
    return makeSuite(TestZap)