[merge][rfc] New command: 'bzr remove-tree'

Daniel Silverstone dsilvers at digital-scurf.org
Sat Nov 11 13:09:30 GMT 2006


On Fri, 2006-11-10 at 17:20 -0600, John Arbash Meinel wrote:
[snip]
> I'd be happy to merge a cleaned up patch.

Attached.

Also available on http://bzr.digital-scurf.org/trees/dsilvers/bzr.dev

D.

-- 
Daniel Silverstone                         http://www.digital-scurf.org/
PGP mail accepted and encouraged.            Key Id: 2BC8 4016 2068 7895

-------------- next part --------------
# Bazaar revision bundle v0.8
#
# message:
#   Refactor the remove-tree stuff after review from J-A-M
# committer: Daniel Silverstone <dsilvers at digital-scurf.org>
# date: Sat 2006-11-11 13:04:54.219000101 +0000

=== added file bzrlib/tests/blackbox/test_remove_tree.py // file-id:test_remove
... _tree.py-20061110192919-5j3xjciiaqbs2dvo-1
--- /dev/null
+++ bzrlib/tests/blackbox/test_remove_tree.py
@@ -0,0 +1,111 @@
+# Copyright (C) 2006 Canonical Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+"""Black-box tests for bzr remove-tree."""
+
+import os
+
+from bzrlib.tests.blackbox import ExternalBase
+
+
+class TestRemoveTree(ExternalBase):
+
+    def setUp(self):
+        super(TestRemoveTree, self).setUp()
+        self.tree = self.make_branch_and_tree('branch1')
+        self.build_tree(['branch1/foo'])
+        self.tree.add('foo')
+        self.tree.commit('1')
+        self.failUnlessExists('branch1/foo')
+
+    # Success modes
+
+    def test_remove_tree_original_branch(self):
+        os.chdir('branch1')
+        self.run_bzr('remove-tree')
+        self.failIfExists('foo')
+    
+    def test_remove_tree_original_branch_explicit(self):
+        self.run_bzr('remove-tree', 'branch1')
+        self.failIfExists('branch1/foo')
+
+    def test_remove_tree_sprouted_branch(self):
+        self.tree.bzrdir.sprout('branch2')
+        self.failUnlessExists('branch2/foo')
+        os.chdir('branch2')
+        self.run_bzr('remove-tree')
+        self.failIfExists('foo')
+    
+    def test_remove_tree_sprouted_branch_explicit(self):
+        self.tree.bzrdir.sprout('branch2')
+        self.failUnlessExists('branch2/foo')
+        self.run_bzr('remove-tree', 'branch2')
+        self.failIfExists('branch2/foo')
+
+    def test_remove_tree_checkout(self):
+        self.tree.branch.create_checkout('branch2', lightweight=False)
+        self.failUnlessExists('branch2/foo')
+        os.chdir('branch2')
+        self.run_bzr('remove-tree')
+        self.failIfExists('foo')
+        os.chdir('..')
+        self.failUnlessExists('branch1/foo')
+    
+    def test_remove_tree_checkout_explicit(self):
+        self.tree.branch.create_checkout('branch2', lightweight=False)
+        self.failUnlessExists('branch2/foo')
+        self.run_bzr('remove-tree', 'branch2')
+        self.failIfExists('branch2/foo')
+        self.failUnlessExists('branch1/foo')
+
+    # Failure modes
+
+    def test_remove_tree_lightweight_checkout(self):
+        self.tree.branch.create_checkout('branch2', lightweight=True)
+        self.failUnlessExists('branch2/foo')
+        os.chdir('branch2')
+        output = self.run_bzr_error(
+            ["Cannot remove working tree from lightweight checkout"],
+            'remove-tree', retcode=3)
+        self.failUnlessExists('foo')
+        os.chdir('..')
+        self.failUnlessExists('branch1/foo')
+    
+    def test_remove_tree_lightweight_checkout_explicit(self):
+        self.tree.branch.create_checkout('branch2', lightweight=True)
+        self.failUnlessExists('branch2/foo')
+        output = self.run_bzr(
+            ["Cannot remove working tree from lightweight checkout"],
+            'remove-tree', 'branch2', retcode=3)
+        self.failUnlessExists('branch2/foo')
+        self.failUnlessExists('branch1/foo')
+
+    def test_remove_tree_empty_dir(self):
+        os.mkdir('branch2')
+        os.chdir('branch2')
+        output = self.run_bzr(["Not a branch"],
+                              'remove-tree', retcode=3)
+
+    def test_remove_tree_repeatedly(self):
+        self.run_bzr('remove-tree', 'branch1')
+        self.failIfExists('branch1/foo')
+        output = self.run_bzr_error(["No working tree to remove"],
+                                    'remove-tree', 'branch1', retcode=3)
+
+    def test_remove_tree_remote_path(self):
+        # TODO: I can't think of a way to implement this...
+        pass

=== modified file NEWS // last-changed:dsilvers at digital-scurf.org-2006111019302
... 6-773bf69678268da9
--- NEWS
+++ NEWS
@@ -2,6 +2,10 @@
 
   IMPROVEMENTS:
 
+    * New command ``bzr remove-tree`` allows the removal of the working
+      tree from a branch.
+      (Daniel Silverstone)
+
     * ``bzr export`` allows an optional branch parameter, to export a bzr
       tree from some other url. For example:
       ``bzr export bzr.tar.gz http://bazaar-vcs.org/bzr/bzr.dev``

=== modified file bzrlib/builtins.py
--- bzrlib/builtins.py
+++ bzrlib/builtins.py
@@ -213,6 +213,37 @@
                 self.outf.write(b.repository.get_revision_xml(rev_id).decode('utf-8'))
     
 
+class cmd_remove_tree(Command):
+    """Remove the working tree from a given branch/checkout.
+
+    Since a lightweight checkout is little more than a working tree
+    this will refuse to run against one.
+    """
+
+    hidden = True
+
+    takes_args = ['location?']
+
+    def run(self, location='.'):
+        d = bzrdir.BzrDir.open(location)
+        
+        try:
+            working = d.open_workingtree()
+        except errors.NoWorkingTree:
+            raise errors.BzrCommandError("No working tree to remove")
+        except errors.NotLocalUrl:
+            raise errors.BzrCommandError("You cannot remove the working tree of a "
+                                         "remote path")
+        
+        working_path = working.bzrdir.root_transport.base
+        branch_path = working.branch.bzrdir.root_transport.base
+        if working_path != branch_path:
+            raise errors.BzrCommandError("You cannot remove the working tree from "
+                                         "a lightweight checkout")
+        
+        d.destroy_workingtree()
+        
+
 class cmd_revno(Command):
     """Show current revision number.
 

=== modified file bzrlib/tests/blackbox/__init__.py // last-changed:dsilvers at di
... gital-scurf.org-20061110193026-773bf69678268da9
--- bzrlib/tests/blackbox/__init__.py
+++ bzrlib/tests/blackbox/__init__.py
@@ -76,6 +76,7 @@
                      'bzrlib.tests.blackbox.test_remerge',
                      'bzrlib.tests.blackbox.test_remove',
                      'bzrlib.tests.blackbox.test_re_sign',
+                     'bzrlib.tests.blackbox.test_remove_tree',
                      'bzrlib.tests.blackbox.test_revert',
                      'bzrlib.tests.blackbox.test_revno',
                      'bzrlib.tests.blackbox.test_revision_history',

# revision id: dsilvers at digital-scurf.org-20061111130454-12fc35cbbf0a331f
# sha1: de955f64a766fef678f894963911b6c69e0f4b09
# inventory sha1: 8b4da000efd1763cc53570b07287995d7861cc98
# parent ids:
#   dsilvers at digital-scurf.org-20061110193026-773bf69678268da9
# base id: pqm at pqm.ubuntu.com-20061110033744-421471bcb63181ca
# properties:
#   branch-nick: bzr.dev

# message:
#   Add remove-tree and its blackbox tests
# committer: Daniel Silverstone <dsilvers at digital-scurf.org>
# date: Fri 2006-11-10 19:30:26.000000000 +0000

=== added file bzrlib/tests/blackbox/test_remove_tree.py // file-id:test_remove
... _tree.py-20061110192919-5j3xjciiaqbs2dvo-1 // encoding:base64
LS0tIC9kZXYvbnVsbAorKysgYnpybGliL3Rlc3RzL2JsYWNrYm94L3Rlc3RfcmVtb3ZlX3RyZWUu
cHkKQEAgLTAsMCArMSw4MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDUgQ2Fub25pY2FsIEx0ZAor
IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkK
KyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUg
TGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMg
VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07
IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwg
NTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQor
CisKKyIiIkJsYWNrLWJveCB0ZXN0cyBmb3IgYnpyIHJlbW92ZS10cmVlLgorIiIiCisKK2ltcG9y
dCBvcworCitmcm9tIGJ6cmxpYi50ZXN0cy5ibGFja2JveCBpbXBvcnQgRXh0ZXJuYWxCYXNlCisK
K2NsYXNzIFRlc3RSZW1vdmVUcmVlKEV4dGVybmFsQmFzZSk6CisKKyAgICBkZWYgX3ByZXNlbnQo
c2VsZiwgZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9zLnBhdGguZXhpc3RzKGYpLCBU
cnVlKQorCisgICAgZGVmIF9hYnNlbnQoc2VsZiwgZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWxzKG9zLnBhdGguZXhpc3RzKGYpLCBGYWxzZSkKKworCisgICAgZGVmIHRlc3RfcmVtb3ZlX3Ry
ZWUoc2VsZik6CisKKyAgICAgICAgZGVmIGJ6cigqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAg
ICAgcmV0dXJuIHNlbGYucnVuX2J6cigqYXJncywgKiprd2FyZ3MpWzBdCisKKyAgICAgICAgb3Mu
bWtkaXIoJ2JyYW5jaDEnKQorICAgICAgICBvcy5jaGRpcignYnJhbmNoMScpCisgICAgICAgIGJ6
cignaW5pdCcpCisgICAgICAgIGY9b3BlbignZm9vJywnd2InKQorICAgICAgICBmLndyaXRlKCJm
b29cbiIpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBienIoJ2FkZCcsICdmb28nKQorCisg
ICAgICAgIGJ6cignY29tbWl0JywgJy1tJywgJzEnKQorCisgICAgICAgIG9zLmNoZGlyKCIuLiIp
CisKKyAgICAgICAgc2VsZi5fcHJlc2VudCgiYnJhbmNoMS9mb28iKQorICAgICAgICBienIoJ2Jy
YW5jaCcsICdicmFuY2gxJywgJ2JyYW5jaDInKQorICAgICAgICBzZWxmLl9wcmVzZW50KCJicmFu
Y2gyL2ZvbyIpCisgICAgICAgIGJ6cignY2hlY2tvdXQnLCAnYnJhbmNoMScsICdicmFuY2gzJykK
KyAgICAgICAgc2VsZi5fcHJlc2VudCgiYnJhbmNoMy9mb28iKQorICAgICAgICBienIoJ2NoZWNr
b3V0JywgJy0tbGlnaHR3ZWlnaHQnLCAnYnJhbmNoMScsICdicmFuY2g0JykKKyAgICAgICAgc2Vs
Zi5fcHJlc2VudCgiYnJhbmNoNC9mb28iKQorCisgICAgICAgICMgYnJhbmNoMSA9PSBicmFuY2gK
KyAgICAgICAgIyBicmFuY2gyID09IGJyYW5jaCBvZiBicmFuY2gxCisgICAgICAgICMgYnJhbmNo
MyA9PSBjaGVja291dCBvZiBicmFuY2gxCisgICAgICAgICMgYnJhbmNoNCA9PSBsaWdodHdlaWdo
dCBjaGVja291dCBvZiBicmFuY2gxCisKKyAgICAgICAgIyBienIgcmVtb3ZlLXRyZWUgKENXRCkK
KyAgICAgICAgb3MuY2hkaXIoImJyYW5jaDEiKQorICAgICAgICBienIoJ3JlbW92ZS10cmVlJykK
KyAgICAgICAgb3MuY2hkaXIoIi4uIikKKyAgICAgICAgc2VsZi5fYWJzZW50KCJicmFuY2gxL2Zv
byIpCisKKyAgICAgICAgIyBienIgcmVtb3ZlLXRyZWUgKHBhdGgpCisgICAgICAgIGJ6cigncmVt
b3ZlLXRyZWUnLCAnYnJhbmNoMicpCisgICAgICAgIHNlbGYuX2Fic2VudCgiYnJhbmNoMi9mb28i
KQorCisgICAgICAgICMgYnpyIHJlbW92ZS10cmVlIChjaGVja291dCkKKyAgICAgICAgYnpyKCdy
ZW1vdmUtdHJlZScsICdicmFuY2gzJykKKyAgICAgICAgc2VsZi5fYWJzZW50KCJicmFuY2gzL2Zv
byIpCisKKyAgICAgICAgIyBienIgcmVtb3ZlLXRyZWUgKGxpZ2h0d2VpZ2h0IGNoZWNrb3V0LCBy
ZWZ1c2UpCisgICAgICAgIGJ6cigncmVtb3ZlLXRyZWUnLCAnYnJhbmNoNCcsIHJldGNvZGU9MykK
KyAgICAgICAgc2VsZi5fcHJlc2VudCgiYnJhbmNoNC9mb28iKQoK

=== modified file NEWS // encoding:base64
LS0tIE5FV1MKKysrIE5FV1MKQEAgLTIsNiArMiwxMCBAQAogCiAgIElNUFJPVkVNRU5UUzoKIAor
ICAgICogTmV3IGNvbW1hbmQgYGBienIgcmVtb3ZlLXRyZWVgYCBhbGxvd3MgdGhlIHJlbW92YWwg
b2YgdGhlIHdvcmtpbmcKKyAgICAgIHRyZWUgZnJvbSBhIGJyYW5jaC4KKyAgICAgIChEYW5pZWwg
U2lsdmVyc3RvbmUpCisKICAgICAqIGBgYnpyIGV4cG9ydGBgIGFsbG93cyBhbiBvcHRpb25hbCBi
cmFuY2ggcGFyYW1ldGVyLCB0byBleHBvcnQgYSBienIKICAgICAgIHRyZWUgZnJvbSBzb21lIG90
aGVyIHVybC4gRm9yIGV4YW1wbGU6CiAgICAgICBgYGJ6ciBleHBvcnQgYnpyLnRhci5neiBodHRw
Oi8vYmF6YWFyLXZjcy5vcmcvYnpyL2J6ci5kZXZgYAoK

=== modified file bzrlib/builtins.py // encoding:base64
LS0tIGJ6cmxpYi9idWlsdGlucy5weQorKysgYnpybGliL2J1aWx0aW5zLnB5CkBAIC0yMTMsNiAr
MjEzLDI5IEBACiAgICAgICAgICAgICAgICAgc2VsZi5vdXRmLndyaXRlKGIucmVwb3NpdG9yeS5n
ZXRfcmV2aXNpb25feG1sKHJldl9pZCkuZGVjb2RlKCd1dGYtOCcpKQogICAgIAogCitjbGFzcyBj
bWRfcmVtb3ZlX3RyZWUoQ29tbWFuZCk6CisgICAgIiIiUmVtb3ZlIHRoZSB3b3JraW5nIHRyZWUg
ZnJvbSBhIGdpdmVuIGJyYW5jaC9jaGVja291dC4KKworICAgIFNpbmNlIGEgbGlnaHR3ZWlnaHQg
Y2hlY2tvdXQgaXMgbGl0dGxlIG1vcmUgdGhhbiBhIHdvcmtpbmcgdHJlZQorICAgIHRoaXMgd2ls
bCByZWZ1c2UgdG8gcnVuIGFnYWluc3Qgb25lLgorICAgICIiIgorCisgICAgdGFrZXNfYXJncyA9
IFsnbG9jYXRpb24/J10KKworICAgIGRlZiBydW4oc2VsZiwgbG9jYXRpb249dScuJyk6CisgICAg
ICAgIGQgPSBienJkaXIuQnpyRGlyLm9wZW5fY29udGFpbmluZyhsb2NhdGlvbilbMF0KKyAgICAg
ICAgdHJ5OgorICAgICAgICAgICAgd29ya2luZyA9IGQub3Blbl93b3JraW5ndHJlZSgpCisgICAg
ICAgICAgICB3b3JraW5nX3BhdGggPSB3b3JraW5nLmJ6cmRpci5yb290X3RyYW5zcG9ydC5iYXNl
CisgICAgICAgICAgICBicmFuY2hfcGF0aCA9IHdvcmtpbmcuYnJhbmNoLmJ6cmRpci5yb290X3Ry
YW5zcG9ydC5iYXNlCisgICAgICAgICAgICBpZiB3b3JraW5nX3BhdGggIT0gYnJhbmNoX3BhdGg6
CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3JzLkJ6ckNvbW1hbmRFcnJvcigiQ2Fubm90IHJl
bW92ZSB3b3JraW5nIHRyZWUgZnJvbSBsaWdodHdlaWdodCBjaGVja291dCIpCisgICAgICAgIGV4
Y2VwdCAoZXJyb3JzLk5vV29ya2luZ1RyZWUsIGVycm9ycy5Ob3RMb2NhbFVybCk6CisgICAgICAg
ICAgICByYWlzZSBlcnJvcnMuQnpyQ29tbWFuZEVycm9yKCJObyB3b3JraW5nIHRyZWUgdG8gcmVt
b3ZlIikKKyAgICAgICAgCisgICAgICAgIGQuZGVzdHJveV93b3JraW5ndHJlZSgpCisgICAgICAg
IAorCiBjbGFzcyBjbWRfcmV2bm8oQ29tbWFuZCk6CiAgICAgIiIiU2hvdyBjdXJyZW50IHJldmlz
aW9uIG51bWJlci4KIAoK

=== modified file bzrlib/tests/blackbox/__init__.py // encoding:base64
LS0tIGJ6cmxpYi90ZXN0cy9ibGFja2JveC9fX2luaXRfXy5weQorKysgYnpybGliL3Rlc3RzL2Js
YWNrYm94L19faW5pdF9fLnB5CkBAIC03Niw2ICs3Niw3IEBACiAgICAgICAgICAgICAgICAgICAg
ICAnYnpybGliLnRlc3RzLmJsYWNrYm94LnRlc3RfcmVtZXJnZScsCiAgICAgICAgICAgICAgICAg
ICAgICAnYnpybGliLnRlc3RzLmJsYWNrYm94LnRlc3RfcmVtb3ZlJywKICAgICAgICAgICAgICAg
ICAgICAgICdienJsaWIudGVzdHMuYmxhY2tib3gudGVzdF9yZV9zaWduJywKKyAgICAgICAgICAg
ICAgICAgICAgICdienJsaWIudGVzdHMuYmxhY2tib3gudGVzdF9yZW1vdmVfdHJlZScsCiAgICAg
ICAgICAgICAgICAgICAgICAnYnpybGliLnRlc3RzLmJsYWNrYm94LnRlc3RfcmV2ZXJ0JywKICAg
ICAgICAgICAgICAgICAgICAgICdienJsaWIudGVzdHMuYmxhY2tib3gudGVzdF9yZXZubycsCiAg
ICAgICAgICAgICAgICAgICAgICAnYnpybGliLnRlc3RzLmJsYWNrYm94LnRlc3RfcmV2aXNpb25f
aGlzdG9yeScsCgo=

# revision id: dsilvers at digital-scurf.org-20061110193026-773bf69678268da9
# sha1: b94ebe90702265d5645706047fa8d327e9e5c8bc
# inventory sha1: ffbfaaddddd97b8efb36e456491cf0ff414bddf3
# parent ids:
#   pqm at pqm.ubuntu.com-20061110033744-421471bcb63181ca
# properties:
#   branch-nick: bzr.dev



More information about the bazaar mailing list