[MERGE] (fixes 239523) bzr tag and other builtins respect --quiet

Neil Martinsen-Burrell nmb at wartburg.edu
Mon Jun 23 07:53:53 BST 2008


Aaron Bentley <aaron <at> aaronbentley.com> writes:

> 
> Aaron Bentley has voted resubmit.
> Status is now: Resubmit
> Comment:
> Optional/informational output should be written with bzrlib.trace.note, 
> not by disabling it when is_quiet is true.

Duly note()'d.

# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: nmb at wartburg.edu-20080623023100-ycn8p5wzg3hefgi2
# target_branch: ../bzr.dev
# testament_sha1: f9b408475c3fdb4768eb78f00fb998296ec7ed77
# timestamp: 2008-06-23 01:51:00 -0500
# base_revision_id: pqm at pqm.ubuntu.com-20080620010918-64z4xylh1ap5hgyf
# 
# Begin patch
=== modified file 'NEWS'
--- NEWS	2008-06-20 00:44:46 +0000
+++ NEWS	2008-06-21 20:55:07 +0000
@@ -16,6 +16,9 @@
 
   BUGFIXES:
 
+    * `bzr tag` and other commands now respect the --quiet option.
+      (Neil Martinsen-Burrell, #239523)
+
     * Clearer message about how to set the PYTHONPATH if bzrlib can't be
       loaded. 
       (Martin Pool, #205230)

=== modified file 'bzrlib/branch.py'
--- bzrlib/branch.py	2008-06-18 05:14:28 +0000
+++ bzrlib/branch.py	2008-06-21 20:55:07 +0000
@@ -2187,10 +2187,11 @@
 
     def report(self, to_file):
         """Write a human-readable description of the result."""
-        if self.old_revid == self.new_revid:
-            to_file.write('No new revisions to push.\n')
-        else:
-            to_file.write('Pushed up to revision %d.\n' % self.new_revno)
+        if not is_quiet():
+            if self.old_revid == self.new_revid:
+                to_file.write('No new revisions to push.\n')
+            else:
+                to_file.write('Pushed up to revision %d.\n' % self.new_revno)
         self._show_tag_conficts(to_file)
 
 

=== modified file 'bzrlib/builtins.py'
--- bzrlib/builtins.py	2008-06-17 03:55:49 +0000
+++ bzrlib/builtins.py	2008-06-23 02:31:00 +0000
@@ -384,9 +384,10 @@
                 match_len = 0
                 for glob, paths in ignored.items():
                     match_len += len(paths)
-                self.outf.write("ignored %d file(s).\n" % match_len)
-            self.outf.write("If you wish to add some of these files,"
-                            " please add them by name.\n")
+                note("ignored %d file(s).\n" % match_len)
+
+            note("If you wish to add some of these files,"
+                 " please add them by name.\n")
 
 
 class cmd_mkdir(Command):
@@ -403,7 +404,7 @@
             os.mkdir(d)
             wt, dd = WorkingTree.open_containing(d)
             wt.add([dd])
-            self.outf.write('added %s\n' % d)
+            note('added %s\n' % d)
 
 
 class cmd_relpath(Command):
@@ -550,14 +551,14 @@
         if into_existing:
             # move into existing directory
             for pair in tree.move(rel_names[:-1], rel_names[-1], after=after):
-                self.outf.write("%s => %s\n" % pair)
+                note("%s => %s\n" % pair)
         else:
             if len(names_list) != 2:
                 raise errors.BzrCommandError('to mv multiple files the'
                                              ' destination must be a versioned'
                                              ' directory')
             tree.rename_one(rel_names[0], rel_names[1], after=after)
-            self.outf.write("%s => %s\n" % (rel_names[0], rel_names[1]))
+            note("%s => %s\n" % (rel_names[0], rel_names[1]))
 
 
 class cmd_pull(Command):
@@ -629,8 +630,7 @@
             else:
                 display_url = urlutils.unescape_for_display(stored_loc,
                         self.outf.encoding)
-                if not is_quiet():
-                    self.outf.write("Using saved location: %s\n" % display_url)
+                note("Using saved location: %s\n" % display_url)
                 location = stored_loc
 
         if mergeable is not None:
@@ -741,7 +741,7 @@
             else:
                 display_url = urlutils.unescape_for_display(stored_loc,
                         self.outf.encoding)
-                self.outf.write("Using saved location: %s\n" % display_url)
+                note("Using saved location: %s\n" % display_url)
                 location = stored_loc
 
         to_transport = transport.get_transport(location)
@@ -3822,7 +3822,7 @@
                 rev_id = b.get_rev_id(revno)
 
         if rev_id is None or _mod_revision.is_null(rev_id):
-            self.outf.write('No revisions to uncommit.\n')
+            note('No revisions to uncommit.\n')
             return 1
 
         lf = log_formatter('short',
@@ -3938,7 +3938,7 @@
                     host, port = port.split(':')
                 port = int(port)
             smart_server = server.SmartTCPServer(t, host=host, port=port)
-            print 'listening on port: ', smart_server.port
+            note('listening on port: %s' % smart_server.port)
             sys.stdout.flush()
         # for the duration of this server, no UI output is permitted.
         # note that this may cause problems with blackbox tests. This should
@@ -4441,7 +4441,7 @@
         try:
             if delete:
                 branch.tags.delete_tag(tag_name)
-                self.outf.write('Deleted tag %s.\n' % tag_name)
+                note('Deleted tag %s.\n' % tag_name)
             else:
                 if revision:
                     if len(revision) != 1:
@@ -4454,7 +4454,7 @@
                 if (not force) and branch.tags.has_tag(tag_name):
                     raise errors.TagAlreadyExists(tag_name)
                 branch.tags.set_tag(tag_name, revision_id)
-                self.outf.write('Created tag %s.\n' % tag_name)
+                note('Created tag %s.\n' % tag_name)
         finally:
             branch.unlock()
 

=== modified file 'bzrlib/tests/blackbox/__init__.py'
--- bzrlib/tests/blackbox/__init__.py	2008-06-05 16:27:16 +0000
+++ bzrlib/tests/blackbox/__init__.py	2008-06-21 20:55:07 +0000
@@ -81,6 +81,7 @@
                      'bzrlib.tests.blackbox.test_merge',
                      'bzrlib.tests.blackbox.test_merge_directive',
                      'bzrlib.tests.blackbox.test_missing',
+                     'bzrlib.tests.blackbox.test_mkdir',
                      'bzrlib.tests.blackbox.test_modified',
                      'bzrlib.tests.blackbox.test_mv',
                      'bzrlib.tests.blackbox.test_nick',

=== modified file 'bzrlib/tests/blackbox/test_add.py'
--- bzrlib/tests/blackbox/test_add.py	2007-08-02 17:01:23 +0000
+++ bzrlib/tests/blackbox/test_add.py	2008-06-21 20:55:07 +0000
@@ -207,3 +207,10 @@
         self.build_tree([u'\u1234A', u'\u1235A', u'\u1235AA', 'cc'])
         self.run_bzr(['add', u'\u1234?', u'\u1235*'])
         self.assertEquals(self.run_bzr('unknowns')[0], 'cc\n')
+
+    def test_quiet(self):
+        tree = self.make_branch_and_tree('.')
+        self.build_tree(['CVS'])
+        self.build_tree_contents([('.bzrignore', 'CVS\n')])
+        out, err = self.run_bzr('add --quiet')
+        self.assertEquals(out, '')

=== added file 'bzrlib/tests/blackbox/test_mkdir.py'
--- bzrlib/tests/blackbox/test_mkdir.py	1970-01-01 00:00:00 +0000
+++ bzrlib/tests/blackbox/test_mkdir.py	2008-06-21 20:55:07 +0000
@@ -0,0 +1,32 @@
+# Copyright (C) 2008 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
+
+"""Test for 'bzr mkdir'"""
+
+from bzrlib.tests import TestCaseWithTransport
+
+class TestMkdir(TestCaseWithTransport):
+
+    def test_mkdir(self):
+        tree = self.make_branch_and_tree('.')
+        out, err = self.run_bzr('mkdir newdir')
+        self.assertContainsRe(out, 'added')
+        self.assertContainsRe(out, 'newdir')
+
+    def test_quiet(self):
+        tree = self.make_branch_and_tree('.')
+        out, err = self.run_bzr('mkdir --quiet newdir')
+        self.assertEquals(out, '')

=== modified file 'bzrlib/tests/blackbox/test_mv.py'
--- bzrlib/tests/blackbox/test_mv.py	2008-03-05 13:09:32 +0000
+++ bzrlib/tests/blackbox/test_mv.py	2008-06-21 20:55:07 +0000
@@ -430,3 +430,14 @@
         self.assertNotInWorkingTree('c')
         self.failUnlessExists('d')
         self.assertInWorkingTree('d')
+
+    def test_quiet(self):
+        self.build_tree(['a', 'sub1/'])
+        tree = self.make_branch_and_tree('.')
+        tree.add(['a', 'sub1'])
+
+        out, err = self.run_bzr('move --quiet a sub1')
+        self.assertEquals(out, '')
+        out, err = self.run_bzr('move --quiet sub1/a sub1/b')
+        self.assertEquals(out, '')
+        

=== modified file 'bzrlib/tests/blackbox/test_push.py'
--- bzrlib/tests/blackbox/test_push.py	2008-03-09 18:08:36 +0000
+++ bzrlib/tests/blackbox/test_push.py	2008-06-21 20:55:07 +0000
@@ -266,6 +266,24 @@
             "bzr: ERROR: bzr push --revision takes one value.\n",
             'push -r0..2 ../to', working_dir='from')
 
+    def test_quiet(self):
+        tree = self.make_branch_and_tree('tree')
+        self.build_tree(['tree/a'])
+        tree.add('a')
+        tree.commit('commit a')
+        tree_target = tree.branch.bzrdir.sprout('target').open_workingtree()
+
+
+        os.chdir('tree')
+        # set remembered location
+        out, err = self.run_bzr('push --quiet ../target --remember')
+        self.assertEquals(out, '')
+        self.build_tree(['b'])
+        tree.add('b')
+        tree.commit('commit b')
+        out, err = self.run_bzr('push --quiet')
+        self.assertEquals(out, '')
+
 
 class RedirectingMemoryTransport(MemoryTransport):
 

=== modified file 'bzrlib/tests/blackbox/test_tags.py'
--- bzrlib/tests/blackbox/test_tags.py	2007-10-26 10:49:21 +0000
+++ bzrlib/tests/blackbox/test_tags.py	2008-06-21 20:55:07 +0000
@@ -181,3 +181,10 @@
         ## out, err = self.run_bzr('merge -d one two', encoding='utf-8')
         ## self.assertContainsRe(out,
         ##         'Conflicting tags:\n.*' + tagname.encode('utf-8'))
+
+    def test_quiet(self):
+        tree = self.make_branch_and_tree('.')
+        out, err = self.run_bzr('tag --quiet ssshhh')
+        self.assertEquals(out, '')
+        out, err = self.run_bzr('tag --quiet --delete ssshhh')
+        self.assertEqual(out, '')

=== modified file 'bzrlib/tests/blackbox/test_uncommit.py'
--- bzrlib/tests/blackbox/test_uncommit.py	2008-06-04 17:52:58 +0000
+++ bzrlib/tests/blackbox/test_uncommit.py	2008-06-21 20:55:07 +0000
@@ -247,3 +247,10 @@
         tree.commit(u'\u1234 message')
         out, err = self.run_bzr('uncommit --force tree', encoding='ascii')
         self.assertContainsRe(out, r'\? message')
+
+    def test_quiet(self):
+        tree = self.create_simple_tree()
+        os.chdir('tree')
+        out, err = self.run_bzr('uncommit --quiet -r2', retcode=1)
+        self.assertEquals(out, '')
+

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





More information about the bazaar mailing list