[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