~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to zap.py

  • Committer: Aaron Bentley
  • Date: 2006-12-13 06:53:20 UTC
  • Revision ID: aaron.bentley@utoronto.ca-20061213065320-33dwsj7qqbdkuuqo
Tolerate commit ids with no email

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
 
from bzrlib import (
22
 
    bzrdir,
23
 
    revision as _mod_revision,
24
 
    )
25
3
from bzrlib.branch import Branch
26
 
from bzrlib.errors import BzrCommandError, NoWorkingTree, NotBranchError
27
 
from bzrlib import registry
 
4
from bzrlib.errors import NoWorkingTree, NotLocalUrl, NotBranchError
28
5
from bzrlib.workingtree import WorkingTree
29
6
 
30
 
from errors import (NotCheckout, UncommittedCheckout, ParentMissingRevisions,
 
7
from errors import (NotCheckout, UncommittedCheckout, ParentMissingRevisions, 
31
8
                    NoParent)
32
9
 
33
10
 
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):
 
11
def zap(path, remove_branch=False):
87
12
    try:
88
 
        wt = bzrdir.BzrDir.open(path).open_workingtree(path,
89
 
                                                       recommend_upgrade=False)
 
13
        wt = WorkingTree.open(path)
90
14
    except (NoWorkingTree, NotBranchError):
91
15
        raise NotCheckout(path)
92
16
    tree_base = wt.bzrdir.transport.base
94
18
    branch_base = branch.bzrdir.transport.base
95
19
    if tree_base == branch_base:
96
20
        raise NotCheckout(path)
97
 
    policy.check_changed(wt, remove_branch)
 
21
    delta = wt.changes_from(wt.basis_tree(), want_unchanged=False)
 
22
    if delta.has_changed():
 
23
        raise UncommittedCheckout()
98
24
    if remove_branch:
99
25
        parent_loc = branch.get_parent()
100
26
        if parent_loc is None:
101
27
            raise NoParent()
102
28
        parent = Branch.open(parent_loc)
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):
 
29
        p_ancestry = parent.repository.get_ancestry(parent.last_revision())
 
30
        if branch.last_revision() not in p_ancestry:
107
31
            raise ParentMissingRevisions(branch.get_parent())
108
32
    rmtree(path)
109
33
    if remove_branch:
117
41
def test_suite():
118
42
    import os
119
43
    from unittest import makeSuite
120
 
 
 
44
    
 
45
    from bzrlib.bzrdir import BzrDir, BzrDirMetaFormat1
 
46
    from bzrlib.branch import BranchReferenceFormat
121
47
    from bzrlib.tests import TestCaseInTempDir
122
48
 
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
49
    class TestZap(TestCaseInTempDir):
137
50
 
138
51
        def make_checkout(self):
139
 
            wt = bzrdir.BzrDir.create_standalone_workingtree('source')
140
 
            return wt.branch.create_checkout('checkout', lightweight=True)
 
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()
141
57
 
142
58
        def make_checkout2(self):
143
59
            wt = self.make_checkout()
144
60
            wt2 = wt.branch.bzrdir.sprout('source2').open_workingtree()
145
 
            return wt2.branch.create_checkout('checkout2', lightweight=True)
 
61
            os.mkdir('checkout2')
 
62
            checkout = BzrDirMetaFormat1().initialize('checkout2')
 
63
            BranchReferenceFormat().initialize(checkout, wt2.branch)
 
64
            return checkout.create_workingtree()
146
65
 
147
66
        def test_is_checkout(self):
148
67
            self.assertRaises(NotCheckout, zap, '.')
149
 
            wt = bzrdir.BzrDir.create_standalone_workingtree('.')
 
68
            wt = BzrDir.create_standalone_workingtree('.')
150
69
            self.assertRaises(NotCheckout, zap, '.')
151
70
 
152
71
        def test_zap_works(self):
156
75
            self.assertIs(False, os.path.exists('checkout'))
157
76
            self.assertIs(True, os.path.exists('source'))
158
77
 
159
 
        def test_zap_branch(self):
 
78
        def test_zap_branch(self):
160
79
            self.make_checkout2()
161
80
            base = WorkingTree.open('checkout').branch.base
162
81
            self.assertIs(True, os.path.exists('checkout'))
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
 
        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
 
 
212
97
    return makeSuite(TestZap)