[MERGE] Allow changing --[no-]trees with reconfigure (bug 145033)

Matthew D. Fuller fullermd at over-yonder.net
Mon Jan 19 08:56:36 GMT 2009


> In fact, I think I'll do just that.

And so I do.  Updated bundle attached.  Since I was touching it
anyway, I also make the docstring fix Ian pointed out and merged it up
with bzr.dev.

I did add a test that --with-no-trees doesn't screw with an existing
working tree (the rewrite should make that impossible anyway).  I'm
not real happy with the test; it sorta takes a long stroll around the
garden to check if a door it just opened is open.  There has to be a
less absurd way of writing it, but that's far past my competence.


-- 
Matthew Fuller     (MF4839)   |  fullermd at over-yonder.net
Systems/Network Administrator |  http://www.over-yonder.net/~fullermd/
           On the Internet, nobody can hear you scream.
-------------- next part --------------
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: fullermd at over-yonder.net-20090119084821-\
#   jdk3jaz91d0mkm94
# target_branch: ../tmp
# testament_sha1: c0d653d10d266a6b9083258d69b29ec274e62b96
# timestamp: 2009-01-19 02:50:52 -0600
# base_revision_id: pqm at pqm.ubuntu.com-20090119030630-3xdyyi4xj69md8e4
# 
# Begin patch
=== modified file 'NEWS'
--- NEWS	2009-01-15 22:51:27 +0000
+++ NEWS	2009-01-19 08:46:48 +0000
@@ -44,6 +44,10 @@
       a new ``until_no_eintr`` helper function in ``bzrlib.osutils``.
       (Andrew Bennetts)
 
+    * ``bzr reconfigure`` now supports --with-trees and --with-no-trees
+      options to change the default tree-creation policy of shared
+      repositories. (Matthew Fuller, #145033)
+
   DOCUMENTATION:
 
   API CHANGES:

=== modified file 'bzrlib/builtins.py'
--- bzrlib/builtins.py	2009-01-15 05:18:22 +0000
+++ bzrlib/builtins.py	2009-01-19 08:45:49 +0000
@@ -4733,7 +4733,11 @@
                      ' checkout (with no local history).',
                      standalone='Reconfigure to be a standalone branch '
                         '(i.e. stop using shared repository).',
-                     use_shared='Reconfigure to use a shared repository.'),
+                     use_shared='Reconfigure to use a shared repository.',
+                     with_trees='Reconfigure repository to create '
+                        'working trees on branches by default',
+                     with_no_trees='Reconfigure repository to not create '
+                        'working trees on branches by default'),
                      Option('bind-to', help='Branch to bind checkout to.',
                             type=str),
                      Option('force',
@@ -4759,6 +4763,12 @@
             reconfiguration = reconfigure.Reconfigure.to_use_shared(directory)
         elif target_type == 'standalone':
             reconfiguration = reconfigure.Reconfigure.to_standalone(directory)
+        elif target_type == 'with-trees':
+            reconfiguration = reconfigure.Reconfigure.set_repository_trees(
+                directory, True)
+        elif target_type == 'with-no-trees':
+            reconfiguration = reconfigure.Reconfigure.set_repository_trees(
+                directory, False)
         reconfiguration.apply(force)
 
 

=== modified file 'bzrlib/errors.py'
--- bzrlib/errors.py	2009-01-13 05:16:26 +0000
+++ bzrlib/errors.py	2009-01-19 08:45:49 +0000
@@ -2744,6 +2744,18 @@
     _fmt = "'%(display_url)s' is already standalone."
 
 
+class AlreadyWithTrees(BzrDirError):
+
+    _fmt = "Shared repository '%(display_url)s' already creates " \
+           "working trees."
+
+
+class AlreadyWithNoTrees(BzrDirError):
+
+    _fmt = "Shared repository '%(display_url)s' already doesn't create " \
+           "working trees."
+
+
 class ReconfigurationNotSupported(BzrDirError):
 
     _fmt = "Requested reconfiguration of '%(display_url)s' is not supported."

=== modified file 'bzrlib/reconfigure.py'
--- bzrlib/reconfigure.py	2008-04-24 04:58:42 +0000
+++ bzrlib/reconfigure.py	2009-01-19 08:48:21 +0000
@@ -24,9 +24,10 @@
 
 class Reconfigure(object):
 
-    def __init__(self, bzrdir, new_bound_location=None):
+    def __init__(self, bzrdir, new_bound_location=None, with_trees=None):
         self.bzrdir = bzrdir
         self.new_bound_location = new_bound_location
+        self.with_trees = with_trees
         try:
             self.repository = self.bzrdir.find_repository()
         except errors.NoRepositoryPresent:
@@ -62,6 +63,8 @@
         self._create_tree = False
         self._create_repository = False
         self._destroy_repository = False
+        self._set_with_trees = False
+        self._set_with_no_trees = False
 
     @staticmethod
     def to_branch(bzrdir):
@@ -140,6 +143,25 @@
             raise errors.AlreadyStandalone(bzrdir)
         return reconfiguration
 
+    @classmethod
+    def set_repository_trees(klass, bzrdir, with_trees):
+        """Adjust a repository's working tree presense default"""
+        reconfiguration = klass(bzrdir, with_trees=with_trees)
+        if not reconfiguration.repository.is_shared():
+            raise errors.ReconfigurationNotSupported(reconfiguration.bzrdir)
+        if reconfiguration.with_trees is True and \
+            not reconfiguration.repository.make_working_trees():
+            reconfiguration._set_with_trees = True
+        elif reconfiguration.with_trees is False and \
+            reconfiguration.repository.make_working_trees():
+            reconfiguration._set_with_no_trees = True
+        if not reconfiguration.changes_planned():
+            if with_trees:
+                raise errors.AlreadyWithTrees(bzrdir)
+            else:
+                raise errors.AlreadyWithNoTrees(bzrdir)
+        return reconfiguration
+
     def _plan_changes(self, want_tree, want_branch, want_bound,
                       want_reference):
         """Determine which changes are needed to assume the configuration"""
@@ -195,7 +217,8 @@
         return (self._unbind or self._bind or self._destroy_tree
                 or self._create_tree or self._destroy_reference
                 or self._create_branch or self._create_repository
-                or self._create_reference or self._destroy_repository)
+                or self._create_reference or self._destroy_repository
+                or self._set_with_trees or self._set_with_no_trees)
 
     def _check(self):
         """Raise if reconfiguration would destroy local changes"""
@@ -302,3 +325,7 @@
             local_branch.bind(branch.Branch.open(bind_location))
         if self._destroy_repository:
             self.bzrdir.destroy_repository()
+        if self._set_with_trees:
+            self.repository.set_make_working_trees(True)
+        if self._set_with_no_trees:
+            self.repository.set_make_working_trees(False)

=== modified file 'bzrlib/tests/blackbox/test_reconfigure.py'
--- bzrlib/tests/blackbox/test_reconfigure.py	2008-04-12 05:48:07 +0000
+++ bzrlib/tests/blackbox/test_reconfigure.py	2009-01-19 08:44:02 +0000
@@ -86,3 +86,48 @@
         tree = workingtree.WorkingTree.open('repo/tree')
         self.assertEqual(tree.bzrdir.root_transport.base,
             tree.branch.repository.bzrdir.root_transport.base)
+
+    def test_make_with_trees(self):
+        repo = self.make_repository('repo', shared=True)
+        repo.set_make_working_trees(False)
+        self.run_bzr('reconfigure --with-trees', working_dir='repo')
+        self.assertIs(True, repo.make_working_trees())
+
+    def test_make_with_trees_already_trees(self):
+        repo = self.make_repository('repo', shared=True)
+        repo.set_make_working_trees(True)
+        self.run_bzr_error([" already creates working trees"],
+                            'reconfigure --with-trees repo')
+
+    def test_make_without_trees(self):
+        repo = self.make_repository('repo', shared=True)
+        repo.set_make_working_trees(True)
+        self.run_bzr('reconfigure --with-no-trees', working_dir='repo')
+        self.assertIs(False, repo.make_working_trees())
+
+    def test_make_without_trees_already_no_trees(self):
+        repo = self.make_repository('repo', shared=True)
+        repo.set_make_working_trees(False)
+        self.run_bzr_error([" already doesn't create working trees"],
+                            'reconfigure --with-no-trees repo')
+
+    def test_make_with_trees_nonshared_repo(self):
+        branch = self.make_branch('branch')
+        self.run_bzr_error(
+            ["Requested reconfiguration of '.*' is not supported"],
+            'reconfigure --with-trees branch')
+
+    def test_make_without_trees_leaves_tree_alone(self):
+        # There has to be a better way of doing this...
+        repo = self.make_repository('repo', shared=True)
+        branch = self.make_branch('repo/branch')
+        self.run_bzr('reconfigure --use-shared',
+            working_dir='repo/branch')
+        tree = branch.bzrdir.create_workingtree()
+        self.build_tree(['repo/branch/foo'])
+        tree.add('foo')
+        tree.commit('x')
+        self.run_bzr('reconfigure --with-no-trees',
+            working_dir='repo/branch')
+        self.failUnlessExists('repo/branch/foo')
+

=== modified file 'bzrlib/tests/test_reconfigure.py'
--- bzrlib/tests/test_reconfigure.py	2008-04-25 22:16:00 +0000
+++ bzrlib/tests/test_reconfigure.py	2009-01-08 08:13:29 +0000
@@ -377,3 +377,33 @@
     def test_unsynced_branch_to_lightweight_checkout_forced(self):
         reconfiguration = self.make_unsynced_branch_reconfiguration()
         reconfiguration.apply(force=True)
+
+    def make_repository_with_without_trees(self, with_trees):
+        repo = self.make_repository('repo', shared=True)
+        repo.set_make_working_trees(with_trees)
+        return repo
+
+    def test_make_with_trees(self):
+        repo = self.make_repository_with_without_trees(False)
+        reconfiguration = reconfigure.Reconfigure.set_repository_trees(
+            repo.bzrdir, True)
+        reconfiguration.apply()
+        self.assertIs(True, repo.make_working_trees())
+
+    def test_make_without_trees(self):
+        repo = self.make_repository_with_without_trees(True)
+        reconfiguration = reconfigure.Reconfigure.set_repository_trees(
+            repo.bzrdir, False)
+        reconfiguration.apply()
+        self.assertIs(False, repo.make_working_trees())
+
+    def test_make_with_trees_already_with_trees(self):
+        repo = self.make_repository_with_without_trees(True)
+        self.assertRaises(errors.AlreadyWithTrees,
+            reconfigure.Reconfigure.set_repository_trees, repo.bzrdir, True)
+
+    def test_make_without_trees_already_no_trees(self):
+        repo = self.make_repository_with_without_trees(False)
+        self.assertRaises(errors.AlreadyWithNoTrees,
+            reconfigure.Reconfigure.set_repository_trees, repo.bzrdir, False)
+

# Begin bundle
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


More information about the bazaar mailing list