Rev 5284: (spiv) Add --directory option to 8 more commands. (Martin von Gagern) in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Mon Jun 7 03:38:08 BST 2010


At file:///home/pqm/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 5284 [merge]
revision-id: pqm at pqm.ubuntu.com-20100607023804-g0tttwnphcv00q2o
parent: pqm at pqm.ubuntu.com-20100604112653-cq02travi8dfqxo2
parent: andrew.bennetts at canonical.com-20100607011610-jw3z4ekp30ygv1am
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Mon 2010-06-07 03:38:04 +0100
message:
  (spiv) Add --directory option to 8 more commands. (Martin von Gagern)
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
  bzrlib/conflicts.py            conflicts.py-20051001061850-78ef952ba63d2b42
  bzrlib/tests/blackbox/test_conflicts.py test_conflicts.py-20060228151432-9723ebb925b999cf
  bzrlib/tests/blackbox/test_merge_directive.py test_merge_directive-20070302012039-zh7uhy39biairtn0-1
  bzrlib/tests/blackbox/test_missing.py test_missing.py-20051211212735-a2cf4c1840bb84c4
  bzrlib/tests/blackbox/test_shelve.py test_ls_shelf.py-20081202053526-thlo8yt0pi1cgor1-1
  bzrlib/tests/blackbox/test_switch.py test_switch.py-20071122111948-0c5en6uz92bwl76h-1
  bzrlib/tests/blackbox/test_whoami.py test_whoami.py-20060629025641-8h3m2ch7kutqx7ug-1
=== modified file 'NEWS'
--- a/NEWS	2010-06-04 11:26:53 +0000
+++ b/NEWS	2010-06-07 02:38:04 +0000
@@ -17,6 +17,10 @@
 New Features
 ************
 
+* Support ``--directory`` option for a number of additional commands:
+  conflicts, merge-directive, missing, resolve, shelve, switch,
+  unshelve, whoami. (Martin von Gagern, #527878)
+
 Bug Fixes
 *********
 

=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py	2010-06-04 10:10:50 +0000
+++ b/bzrlib/builtins.py	2010-06-07 02:38:04 +0000
@@ -3311,7 +3311,8 @@
 
             bzr whoami "Frank Chu <fchu at example.com>"
     """
-    takes_options = [ Option('email',
+    takes_options = [ 'directory',
+                      Option('email',
                              help='Display email address only.'),
                       Option('branch',
                              help='Set identity for the current branch instead of '
@@ -3321,13 +3322,16 @@
     encoding_type = 'replace'
 
     @display_command
-    def run(self, email=False, branch=False, name=None):
+    def run(self, email=False, branch=False, name=None, directory=None):
         if name is None:
-            # use branch if we're inside one; otherwise global config
-            try:
-                c = Branch.open_containing('.')[0].get_config()
-            except errors.NotBranchError:
-                c = config.GlobalConfig()
+            if directory is None:
+                # use branch if we're inside one; otherwise global config
+                try:
+                    c = Branch.open_containing(u'.')[0].get_config()
+                except errors.NotBranchError:
+                    c = config.GlobalConfig()
+            else:
+                c = Branch.open(directory).get_config()
             if email:
                 self.outf.write(c.user_email() + '\n')
             else:
@@ -3343,7 +3347,10 @@
 
         # use global config unless --branch given
         if branch:
-            c = Branch.open_containing('.')[0].get_config()
+            if directory is None:
+                c = Branch.open_containing(u'.')[0].get_config()
+            else:
+                c = Branch.open(directory).get_config()
         else:
             c = config.GlobalConfig()
         c.set_user_option('email', name)
@@ -4291,6 +4298,7 @@
     _see_also = ['merge', 'pull']
     takes_args = ['other_branch?']
     takes_options = [
+        'directory',
         Option('reverse', 'Reverse the order of revisions.'),
         Option('mine-only',
                'Display changes in the local branch only.'),
@@ -4318,7 +4326,8 @@
             theirs_only=False,
             log_format=None, long=False, short=False, line=False,
             show_ids=False, verbose=False, this=False, other=False,
-            include_merges=False, revision=None, my_revision=None):
+            include_merges=False, revision=None, my_revision=None,
+            directory=u'.'):
         from bzrlib.missing import find_unmerged, iter_log_revisions
         def message(s):
             if not is_quiet():
@@ -4337,7 +4346,7 @@
         elif theirs_only:
             restrict = 'remote'
 
-        local_branch = Branch.open_containing(u".")[0]
+        local_branch = Branch.open_containing(directory)[0]
         self.add_cleanup(local_branch.lock_read().unlock)
 
         parent = local_branch.get_parent()
@@ -5014,6 +5023,7 @@
     _see_also = ['send']
 
     takes_options = [
+        'directory',
         RegistryOption.from_kwargs('patch-type',
             'The type of patch to include in the directive.',
             title='Patch type',
@@ -5032,14 +5042,15 @@
     encoding_type = 'exact'
 
     def run(self, submit_branch=None, public_branch=None, patch_type='bundle',
-            sign=False, revision=None, mail_to=None, message=None):
+            sign=False, revision=None, mail_to=None, message=None,
+            directory=u'.'):
         from bzrlib.revision import ensure_null, NULL_REVISION
         include_patch, include_bundle = {
             'plain': (False, False),
             'diff': (True, False),
             'bundle': (True, True),
             }[patch_type]
-        branch = Branch.open('.')
+        branch = Branch.open(directory)
         stored_submit_branch = branch.get_submit_branch()
         if submit_branch is None:
             submit_branch = stored_submit_branch
@@ -5533,7 +5544,8 @@
     """
 
     takes_args = ['to_location?']
-    takes_options = [Option('force',
+    takes_options = ['directory',
+                     Option('force',
                         help='Switch even if local commits will be lost.'),
                      'revision',
                      Option('create-branch', short_name='b',
@@ -5542,16 +5554,16 @@
                     ]
 
     def run(self, to_location=None, force=False, create_branch=False,
-            revision=None):
+            revision=None, directory=u'.'):
         from bzrlib import switch
-        tree_location = '.'
+        tree_location = directory
         revision = _get_one_revision('switch', revision)
         control_dir = bzrdir.BzrDir.open_containing(tree_location)[0]
         if to_location is None:
             if revision is None:
                 raise errors.BzrCommandError('You must supply either a'
                                              ' revision or a location')
-            to_location = '.'
+            to_location = tree_location
         try:
             branch = control_dir.open_branch()
             had_explicit_nick = branch.get_config().has_explicit_nickname()
@@ -5832,6 +5844,7 @@
     takes_args = ['file*']
 
     takes_options = [
+        'directory',
         'revision',
         Option('all', help='Shelve all changes.'),
         'message',
@@ -5846,7 +5859,7 @@
     _see_also = ['unshelve']
 
     def run(self, revision=None, all=False, file_list=None, message=None,
-            writer=None, list=False, destroy=False):
+            writer=None, list=False, destroy=False, directory=u'.'):
         if list:
             return self.run_for_list()
         from bzrlib.shelf_ui import Shelver
@@ -5854,7 +5867,7 @@
             writer = bzrlib.option.diff_writer_registry.get()
         try:
             shelver = Shelver.from_args(writer(sys.stdout), revision, all,
-                file_list, message, destroy=destroy)
+                file_list, message, destroy=destroy, directory=directory)
             try:
                 shelver.run()
             finally:
@@ -5888,6 +5901,7 @@
 
     takes_args = ['shelf_id?']
     takes_options = [
+        'directory',
         RegistryOption.from_kwargs(
             'action', help="The action to perform.",
             enum_switch=False, value_switches=True,
@@ -5901,9 +5915,9 @@
     ]
     _see_also = ['shelve']
 
-    def run(self, shelf_id=None, action='apply'):
+    def run(self, shelf_id=None, action='apply', directory=u'.'):
         from bzrlib.shelf_ui import Unshelver
-        unshelver = Unshelver.from_args(shelf_id, action)
+        unshelver = Unshelver.from_args(shelf_id, action, directory=directory)
         try:
             unshelver.run()
         finally:

=== modified file 'bzrlib/conflicts.py'
--- a/bzrlib/conflicts.py	2010-04-30 11:35:43 +0000
+++ b/bzrlib/conflicts.py	2010-05-28 14:15:28 +0000
@@ -59,13 +59,14 @@
     Use bzr resolve when you have fixed a problem.
     """
     takes_options = [
+            'directory',
             option.Option('text',
                           help='List paths of files with text conflicts.'),
         ]
     _see_also = ['resolve', 'conflict-types']
 
-    def run(self, text=False):
-        wt = workingtree.WorkingTree.open_containing(u'.')[0]
+    def run(self, text=False, directory=u'.'):
+        wt = workingtree.WorkingTree.open_containing(directory)[0]
         for conflict in wt.conflicts():
             if text:
                 if conflict.typestring != 'text conflict':
@@ -112,16 +113,17 @@
     aliases = ['resolved']
     takes_args = ['file*']
     takes_options = [
+            'directory',
             option.Option('all', help='Resolve all conflicts in this tree.'),
             ResolveActionOption(),
             ]
     _see_also = ['conflicts']
-    def run(self, file_list=None, all=False, action=None):
+    def run(self, file_list=None, all=False, action=None, directory=u'.'):
         if all:
             if file_list:
                 raise errors.BzrCommandError("If --all is specified,"
                                              " no FILE may be provided")
-            tree = workingtree.WorkingTree.open_containing('.')[0]
+            tree = workingtree.WorkingTree.open_containing(directory)[0]
             if action is None:
                 action = 'done'
         else:

=== modified file 'bzrlib/tests/blackbox/test_conflicts.py'
--- a/bzrlib/tests/blackbox/test_conflicts.py	2010-02-10 17:52:08 +0000
+++ b/bzrlib/tests/blackbox/test_conflicts.py	2010-05-28 14:15:28 +0000
@@ -70,6 +70,12 @@
         out, err = self.run_bzr('conflicts --text')
         self.assertEqual(['my_other_file', 'myfile'], out.splitlines())
 
+    def test_conflicts_directory(self):
+        """Test --directory option"""
+        out, err = self.run_bzr('conflicts --directory a', working_dir='.')
+        self.assertEqual(3, len(out.splitlines()))
+        self.assertEqual('', err)
+
 
 class TestResolve(TestConflictsBase):
 
@@ -113,3 +119,10 @@
         self.build_tree_contents([('tree/file', 'a\n')])
         note = self.run_bzr('resolve', working_dir='tree')[1]
         self.assertContainsRe(note, 'All conflicts resolved.')
+
+    def test_resolve_all_directory(self):
+        """Test --directory option"""
+        out, err = self.run_bzr('resolve --all -d a', working_dir='.')
+        self.assertEqual('', err)
+        out, err = self.run_bzr('conflicts')
+        self.assertEqual(0, len(out.splitlines()))

=== modified file 'bzrlib/tests/blackbox/test_merge_directive.py'
--- a/bzrlib/tests/blackbox/test_merge_directive.py	2009-03-23 14:59:43 +0000
+++ b/bzrlib/tests/blackbox/test_merge_directive.py	2010-05-28 14:15:28 +0000
@@ -248,3 +248,15 @@
         tree1, tree2 = self.prepare_merge_directive()
         tree1.commit(u'messag\xe9')
         self.run_bzr('merge-directive ../tree2') # no exception raised
+
+    def test_merge_directive_directory(self):
+        """Test --directory option"""
+        import re
+        re_timestamp = re.compile(r'^# timestamp: .*', re.M)
+        self.prepare_merge_directive()
+        md1 = self.run_bzr('merge-directive ../tree2')[0]
+        md1 = re_timestamp.sub('# timestamp: XXX', md1)
+        os.chdir('..')
+        md2 = self.run_bzr('merge-directive --directory tree1 tree2')[0]
+        md2 = re_timestamp.sub('# timestamp: XXX', md2)
+        self.assertEqualDiff(md1.replace('../tree2', 'tree2'), md2)

=== modified file 'bzrlib/tests/blackbox/test_missing.py'
--- a/bzrlib/tests/blackbox/test_missing.py	2009-03-23 14:59:43 +0000
+++ b/bzrlib/tests/blackbox/test_missing.py	2010-05-28 14:15:28 +0000
@@ -200,3 +200,23 @@
                           'Branches are up to date.\n' % location,
                           lines)
         self.assertEquals('', err)
+
+    def test_missing_directory(self):
+        """Test --directory option"""
+
+        # create a source branch
+        a_tree = self.make_branch_and_tree('a')
+        self.build_tree_contents([('a/a', 'initial\n')])
+        a_tree.add('a')
+        a_tree.commit(message='initial')
+
+        # clone and add a differing revision
+        b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
+        self.build_tree_contents([('b/a', 'initial\nmore\n')])
+        b_tree.commit(message='more')
+        
+        out2, err2 = self.run_bzr('missing --directory a b', retcode=1)
+        os.chdir('a')
+        out1, err1 = self.run_bzr('missing ../b', retcode=1)
+        self.assertEqualDiff(out1, out2)
+        self.assertEqualDiff(err1, err2)

=== modified file 'bzrlib/tests/blackbox/test_shelve.py'
--- a/bzrlib/tests/blackbox/test_shelve.py	2010-05-20 18:23:17 +0000
+++ b/bzrlib/tests/blackbox/test_shelve.py	2010-05-28 14:15:28 +0000
@@ -97,3 +97,18 @@
         tree.add('file')
         os.chdir('tree/dir')
         self.run_bzr('shelve --all ../file')
+
+
+class TestShelveUnshelve(TestCaseWithTransport):
+
+    def test_directory(self):
+        """Test --directory option"""
+        tree = self.make_branch_and_tree('tree')
+        self.build_tree_contents([('tree/a', 'initial\n')])
+        tree.add('a')
+        tree.commit(message='committed')
+        self.build_tree_contents([('tree/a', 'initial\nmore\n')])
+        self.run_bzr('shelve -d tree --all')
+        self.assertFileEqual('initial\n', 'tree/a')
+        self.run_bzr('unshelve --directory tree')
+        self.assertFileEqual('initial\nmore\n', 'tree/a')

=== modified file 'bzrlib/tests/blackbox/test_switch.py'
--- a/bzrlib/tests/blackbox/test_switch.py	2010-04-28 07:53:34 +0000
+++ b/bzrlib/tests/blackbox/test_switch.py	2010-05-28 14:15:28 +0000
@@ -252,3 +252,21 @@
         self.assertLength(0, calls)
         out, err = self.run_bzr('switch ../branch2')
         self.assertLength(1, calls)
+
+    def test_switch_lightweight_directory(self):
+        """Test --directory option"""
+
+        # create a source branch
+        a_tree = self.make_branch_and_tree('a')
+        self.build_tree_contents([('a/a', 'initial\n')])
+        a_tree.add('a')
+        a_tree.commit(message='initial')
+
+        # clone and add a differing revision
+        b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
+        self.build_tree_contents([('b/a', 'initial\nmore\n')])
+        b_tree.commit(message='more')
+
+        self.run_bzr('checkout --lightweight a checkout')
+        self.run_bzr('switch --directory checkout b')
+        self.assertFileEqual('initial\nmore\n', 'checkout/a')

=== modified file 'bzrlib/tests/blackbox/test_whoami.py'
--- a/bzrlib/tests/blackbox/test_whoami.py	2010-04-27 17:09:48 +0000
+++ b/bzrlib/tests/blackbox/test_whoami.py	2010-06-07 01:16:10 +0000
@@ -20,8 +20,10 @@
 import os
 
 import bzrlib
-from bzrlib import osutils
-from bzrlib.branch import Branch
+from bzrlib import (
+    osutils,
+    config,
+    )
 from bzrlib.tests.blackbox import ExternalBase
 
 
@@ -43,45 +45,29 @@
         b = bzrlib.branch.Branch.open('.')
         b.get_config().set_user_option('email',
                                        'Branch Identity <branch at identi.ty>')
-        bzr_email = os.environ.get('BZR_EMAIL')
-        if bzr_email is not None:
-            del os.environ['BZR_EMAIL']
-        try:
-            whoami = self.run_bzr("whoami")[0]
-            self.assertEquals('Branch Identity <branch at identi.ty>\n', whoami)
-            whoami_email = self.run_bzr("whoami --email")[0]
-            self.assertEquals('branch at identi.ty\n', whoami_email)
+        whoami = self.run_bzr("whoami")[0]
+        self.assertEquals('Branch Identity <branch at identi.ty>\n', whoami)
+        whoami_email = self.run_bzr("whoami --email")[0]
+        self.assertEquals('branch at identi.ty\n', whoami_email)
 
-            # Verify that the environment variable overrides the value
-            # in the file
-            os.environ['BZR_EMAIL'] = 'Different ID <other at environ.ment>'
-            whoami = self.run_bzr("whoami")[0]
-            self.assertEquals('Different ID <other at environ.ment>\n', whoami)
-            whoami_email = self.run_bzr("whoami --email")[0]
-            self.assertEquals('other at environ.ment\n', whoami_email)
-            del os.environ['BZR_EMAIL']
-        finally:
-            if bzr_email is not None:
-                os.environ['BZR_EMAIL'] = bzr_email
+        # Verify that the environment variable overrides the value
+        # in the file
+        os.environ['BZR_EMAIL'] = 'Different ID <other at environ.ment>'
+        whoami = self.run_bzr("whoami")[0]
+        self.assertEquals('Different ID <other at environ.ment>\n', whoami)
+        whoami_email = self.run_bzr("whoami --email")[0]
+        self.assertEquals('other at environ.ment\n', whoami_email)
 
     def test_whoami_utf8(self):
         """verify that an identity can be in utf-8."""
         wt = self.make_branch_and_tree('.')
         self.run_bzr(['whoami', u'Branch Identity \u20ac <branch at identi.ty>'],
                      encoding='utf-8')
-        bzr_email = os.environ.get('BZR_EMAIL')
-        if bzr_email is not None:
-            del os.environ['BZR_EMAIL']
-        try:
-            whoami = self.run_bzr("whoami", encoding='utf-8')[0]
-            self.assertEquals('Branch Identity \xe2\x82\xac ' +
-                              '<branch at identi.ty>\n', whoami)
-            whoami_email = self.run_bzr("whoami --email",
-                                        encoding='utf-8')[0]
-            self.assertEquals('branch at identi.ty\n', whoami_email)
-        finally:
-            if bzr_email is not None:
-                os.environ['BZR_EMAIL'] = bzr_email
+        whoami = self.run_bzr("whoami", encoding='utf-8')[0]
+        self.assertEquals('Branch Identity \xe2\x82\xac ' +
+                          '<branch at identi.ty>\n', whoami)
+        whoami_email = self.run_bzr("whoami --email", encoding='utf-8')[0]
+        self.assertEquals('branch at identi.ty\n', whoami_email)
 
     def test_whoami_ascii(self):
         """
@@ -92,18 +78,10 @@
         b = bzrlib.branch.Branch.open('.')
         b.get_config().set_user_option('email', u'Branch Identity \u20ac ' +
                                        '<branch at identi.ty>')
-        bzr_email = os.environ.get('BZR_EMAIL')
-        if bzr_email is not None:
-            del os.environ['BZR_EMAIL']
-        try:
-            whoami = self.run_bzr("whoami", encoding='ascii')[0]
-            self.assertEquals('Branch Identity ? <branch at identi.ty>\n', whoami)
-            whoami_email = self.run_bzr("whoami --email",
-                                        encoding='ascii')[0]
-            self.assertEquals('branch at identi.ty\n', whoami_email)
-        finally:
-            if bzr_email is not None:
-                os.environ['BZR_EMAIL'] = bzr_email
+        whoami = self.run_bzr("whoami", encoding='ascii')[0]
+        self.assertEquals('Branch Identity ? <branch at identi.ty>\n', whoami)
+        whoami_email = self.run_bzr("whoami --email", encoding='ascii')[0]
+        self.assertEquals('branch at identi.ty\n', whoami_email)
 
     def test_warning(self):
         """verify that a warning is displayed if no email is given."""
@@ -120,3 +98,39 @@
         osutils.set_or_unset_env('BZR_EMAIL', None)
         out, err = self.run_bzr(['whoami'], 3)
         self.assertContainsRe(err, 'Unable to determine your name')
+
+    def test_whoami_directory(self):
+        """Test --directory option."""
+        wt = self.make_branch_and_tree('subdir')
+        c = wt.branch.get_config()
+        c.set_user_option('email', 'Branch Identity <branch at identi.ty>')
+        out, err = self.run_bzr("whoami --directory subdir")
+        self.assertEquals('Branch Identity <branch at identi.ty>\n', out)
+        self.run_bzr(['whoami', '--directory', 'subdir', '--branch',
+                      'Changed Identity <changed at identi.ty>'])
+        self.assertEquals('Changed Identity <changed at identi.ty>',
+                          c.get_user_option('email'))
+
+    def test_whoami_remote_directory(self):
+        """Test --directory option with a remote directory."""
+        wt = self.make_branch_and_tree('subdir')
+        c = wt.branch.get_config()
+        c.set_user_option('email', 'Branch Identity <branch at identi.ty>')
+        url = self.get_readonly_url() + '/subdir'
+        out, err = self.run_bzr(['whoami', '--directory', url])
+        self.assertEquals('Branch Identity <branch at identi.ty>\n', out)
+        url = self.get_url('subdir')
+        self.run_bzr(['whoami', '--directory', url, '--branch',
+                      'Changed Identity <changed at identi.ty>'])
+        # The identity has been set in the branch config (but not the global
+        # config)
+        self.assertEquals('Changed Identity <changed at identi.ty>',
+                          c.get_user_option('email'))
+        global_conf = config.GlobalConfig()
+        self.assertEquals(None, global_conf.get_user_option('email'))
+
+    def test_whoami_nonbranch_directory(self):
+        """Test --directory mentioning a non-branch directory."""
+        wt = self.build_tree(['subdir/'])
+        out, err = self.run_bzr("whoami --directory subdir", retcode=3)
+        self.assertContainsRe(err, 'ERROR: Not a branch')




More information about the bazaar-commits mailing list