~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to zap.py

  • Committer: Aaron Bentley
  • Date: 2011-01-26 01:15:21 UTC
  • Revision ID: aaron@aaronbentley.com-20110126011521-nl09rwxzrymt2gva
Update version to 2.4

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
 
 
19
1
from shutil import rmtree
20
2
 
21
3
from bzrlib import (
23
5
    revision as _mod_revision,
24
6
    )
25
7
from bzrlib.branch import Branch
26
 
from bzrlib.errors import BzrCommandError, NoWorkingTree, NotBranchError
27
 
from bzrlib import registry
 
8
from bzrlib.errors import NoWorkingTree, NotBranchError
28
9
from bzrlib.workingtree import WorkingTree
29
10
 
30
11
from errors import (NotCheckout, UncommittedCheckout, ParentMissingRevisions,
31
12
                    NoParent)
32
13
 
33
14
 
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):
 
15
def zap(path, remove_branch=False, allow_modified=False):
87
16
    try:
88
17
        wt = bzrdir.BzrDir.open(path).open_workingtree(path,
89
18
                                                       recommend_upgrade=False)
94
23
    branch_base = branch.bzrdir.transport.base
95
24
    if tree_base == branch_base:
96
25
        raise NotCheckout(path)
97
 
    policy.check_changed(wt, remove_branch)
 
26
    if not allow_modified:
 
27
        delta = wt.changes_from(wt.basis_tree(), want_unchanged=False)
 
28
        if delta.has_changed():
 
29
            raise UncommittedCheckout()
98
30
    if remove_branch:
99
31
        parent_loc = branch.get_parent()
100
32
        if parent_loc is None:
120
52
 
121
53
    from bzrlib.tests import TestCaseInTempDir
122
54
 
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
 
 
136
55
    class TestZap(TestCaseInTempDir):
137
56
 
138
57
        def make_checkout(self):
175
94
            checkout.commit('commit changes to branch')
176
95
            zap('checkout')
177
96
 
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
97
        def test_allow_modified(self):
185
 
            self.make_modified_checkout()
 
98
            checkout = self.make_checkout()
 
99
            os.mkdir('checkout/foo')
 
100
            checkout.add('foo')
186
101
            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)
 
102
            zap('checkout', allow_modified=True)
211
103
 
212
104
    return makeSuite(TestZap)