Rev 4397: (vila) Display prompt on stderr (not stdout) in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Tue Jun 2 15:46:10 BST 2009


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

------------------------------------------------------------
revno: 4397
revision-id: pqm at pqm.ubuntu.com-20090602144606-fbbsgi540zlly0pv
parent: pqm at pqm.ubuntu.com-20090602023451-adrz7xhxr6qimtni
parent: v.ladeuil+lp at free.fr-20090602135227-1dfkhq2pvfgyah6b
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Tue 2009-06-02 15:46:06 +0100
message:
  (vila) Display prompt on stderr (not stdout)
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/plugins/launchpad/test_register.py test_register.py-20060315182712-40f5dda945c829a8
  bzrlib/tests/test_config.py    testconfig.py-20051011041908-742d0c15d8d8c8eb
  bzrlib/tests/test_http.py      testhttp.py-20051018020158-b2eef6e867c514d9
  bzrlib/tests/test_ui.py        test_ui.py-20051130162854-458e667a7414af09
  bzrlib/ui/__init__.py          ui.py-20050824083933-8cf663c763ba53a9
    ------------------------------------------------------------
    revno: 4396.1.1
    revision-id: v.ladeuil+lp at free.fr-20090602135227-1dfkhq2pvfgyah6b
    parent: pqm at pqm.ubuntu.com-20090602023451-adrz7xhxr6qimtni
    parent: v.ladeuil+lp at free.fr-20090602134827-k1r08407pnf7rrb8
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: integration
    timestamp: Tue 2009-06-02 15:52:27 +0200
    message:
      Display prompt on stderr (not stdout)
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/plugins/launchpad/test_register.py test_register.py-20060315182712-40f5dda945c829a8
      bzrlib/tests/test_config.py    testconfig.py-20051011041908-742d0c15d8d8c8eb
      bzrlib/tests/test_http.py      testhttp.py-20051018020158-b2eef6e867c514d9
      bzrlib/tests/test_ui.py        test_ui.py-20051130162854-458e667a7414af09
      bzrlib/ui/__init__.py          ui.py-20050824083933-8cf663c763ba53a9
    ------------------------------------------------------------
    revno: 4368.3.4
    revision-id: v.ladeuil+lp at free.fr-20090602134827-k1r08407pnf7rrb8
    parent: v.ladeuil+lp at free.fr-20090602092349-adzoel9jbwqq45qd
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: 376582-auth-prompt
    timestamp: Tue 2009-06-02 15:48:27 +0200
    message:
      Fix plugin test too :-/
      
      * bzrlib/plugins/launchpad/test_register.py:
      (TestGatherUserCredentials.test_gather_user_credentials_prompts):prompt
      is now displayed on stderr.
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/plugins/launchpad/test_register.py test_register.py-20060315182712-40f5dda945c829a8
    ------------------------------------------------------------
    revno: 4368.3.3
    revision-id: v.ladeuil+lp at free.fr-20090602092349-adzoel9jbwqq45qd
    parent: v.ladeuil+lp at free.fr-20090602092120-xs1ikguqckiu820o
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: 376582-auth-prompt
    timestamp: Tue 2009-06-02 11:23:49 +0200
    message:
      Fixed as per Ian's review.
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
    ------------------------------------------------------------
    revno: 4368.3.2
    revision-id: v.ladeuil+lp at free.fr-20090602092120-xs1ikguqckiu820o
    parent: v.ladeuil+lp at free.fr-20090515101451-bffnsywhvaskrz1h
    parent: pqm at pqm.ubuntu.com-20090602023451-adrz7xhxr6qimtni
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: 376582-auth-prompt
    timestamp: Tue 2009-06-02 11:21:20 +0200
    message:
      Merge bzr.dev
    added:
      bzrlib/send.py                 send.py-20090521192735-j7cdb33ykmtmzx4w-1
      bzrlib/tests/per_repository_reference/test_fetch.py test_fetch.py-20090511214909-25pkgmoam913lrji-1
      bzrlib/tests/per_repository_reference/test_initialize.py test_initialize.py-20090527083941-4rz2urcthjet5e2i-1
      bzrlib/tests/per_repository_reference/test_unlock.py test_unlock.py-20090526160031-14lvypj5pbrndnyz-1
    renamed:
      bzrlib/tests/workingtree_implementations/test_get_file_with_stat.py => bzrlib/tests/tree_implementations/test_get_file_with_stat.py test_get_file_with_s-20080922035909-lhdovrr36jpxmu0v-1
    modified:
      Makefile                       Makefile-20050805140406-d96e3498bb61c5bb
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzr                            bzr.py-20050313053754-5485f144c7006fa6
      bzrlib/__init__.py             __init__.py-20050309040759-33e65acf91bbcd5d
      bzrlib/_rio_pyx.pyx            _rio_pyx.pyx-20090514104636-8203jcqvfny56yrd-1
      bzrlib/branch.py               branch.py-20050309040759-e4baf4e0d046576e
      bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
      bzrlib/diff.py                 diff.py-20050309040759-26944fbbf2ebbf36
      bzrlib/foreign.py              foreign.py-20081112170002-olsxmandkk8qyfuq-1
      bzrlib/groupcompress.py        groupcompress.py-20080705181503-ccbxd6xuy1bdnrpu-8
      bzrlib/inventory.py            inventory.py-20050309040759-6648b84ca2005b37
      bzrlib/knit.py                 knit.py-20051212171256-f056ac8f0fbe1bd9
      bzrlib/log.py                  log.py-20050505065812-c40ce11702fe5fb1
      bzrlib/mutabletree.py          mutabletree.py-20060906023413-4wlkalbdpsxi2r4y-2
      bzrlib/osutils.py              osutils.py-20050309040759-eeaff12fbf77ac86
      bzrlib/remote.py               remote.py-20060720103555-yeeg2x51vn0rbtdp-1
      bzrlib/repofmt/groupcompress_repo.py repofmt.py-20080715094215-wp1qfvoo7093c8qr-1
      bzrlib/repofmt/pack_repo.py    pack_repo.py-20070813041115-gjv5ma7ktfqwsjgn-1
      bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
      bzrlib/revisiontree.py         revisiontree.py-20060724012533-bg8xyryhxd0o0i0h-1
      bzrlib/smart/repository.py     repository.py-20061128022038-vr5wy5bubyb8xttk-1
      bzrlib/smart/server.py         server.py-20061110062051-chzu10y32vx8gvur-1
      bzrlib/tests/blackbox/test_add.py test_add.py-20060518072250-857e4f86f54a30b2
      bzrlib/tests/blackbox/test_dpush.py test_dpush.py-20090108125928-st1td6le59g0vyv2-1
      bzrlib/tests/blackbox/test_log.py test_log.py-20060112090212-78f6ea560c868e24
      bzrlib/tests/blackbox/test_send.py test_bundle.py-20060616222707-c21c8b7ea5ef57b1
      bzrlib/tests/blackbox/test_serve.py test_serve.py-20060913064329-8t2pvmsikl4s3xhl-1
      bzrlib/tests/branch_implementations/test_branch.py testbranch.py-20050711070244-121d632bc37d7253
      bzrlib/tests/branch_implementations/test_push.py test_push.py-20070130153159-fhfap8uoifevg30j-1
      bzrlib/tests/per_repository/test_fetch.py test_fetch.py-20070814052151-5cxha9slx4c93uog-1
      bzrlib/tests/per_repository/test_fileid_involved.py test_file_involved.py-20051215205901-728a172d1014daaa
      bzrlib/tests/per_repository/test_write_group.py test_write_group.py-20070716105516-89n34xtogq5frn0m-1
      bzrlib/tests/per_repository_reference/__init__.py __init__.py-20080220025549-nnm2s80it1lvcwnc-2
      bzrlib/tests/per_repository_reference/test_default_stacking.py test_default_stackin-20090311055345-9ajahgm58oq3wh6h-1
      bzrlib/tests/test_foreign.py   test_foreign.py-20081125004048-ywb901edgp9lluxo-1
      bzrlib/tests/test_graph.py     test_graph_walker.py-20070525030405-enq4r60hhi9xrujc-1
      bzrlib/tests/test_groupcompress.py test_groupcompress.p-20080705181503-ccbxd6xuy1bdnrpu-13
      bzrlib/tests/test_http.py      testhttp.py-20051018020158-b2eef6e867c514d9
      bzrlib/tests/test_osutils.py   test_osutils.py-20051201224856-e48ee24c12182989
      bzrlib/tests/test_pack_repository.py test_pack_repository-20080801043947-eaw0e6h2gu75kwmy-1
      bzrlib/tests/test_repository.py test_repository.py-20060131075918-65c555b881612f4d
      bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
      bzrlib/tests/tree_implementations/__init__.py __init__.py-20060717075546-420s7b0bj9hzeowi-2
      bzrlib/tests/workingtree_implementations/__init__.py __init__.py-20060203003124-b2aa5aca21a8bfad
      bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
      bzrlib/transport/__init__.py   transport.py-20050711165921-4978aa7ce1285ad5
      bzrlib/tree.py                 tree.py-20050309040759-9d5f2496be663e77
      bzrlib/workingtree.py          workingtree.py-20050511021032-29b6ec0a681e02e3
      bzrlib/workingtree_4.py        workingtree_4.py-20070208044105-5fgpc5j3ljlh5q6c-1
      doc/en/user-guide/svn_plugin.txt svn_plugin.txt-20080509065016-cjc90f46407vi9a0-2
      bzrlib/tests/tree_implementations/test_get_file_with_stat.py test_get_file_with_s-20080922035909-lhdovrr36jpxmu0v-1
    ------------------------------------------------------------
    revno: 4368.3.1
    revision-id: v.ladeuil+lp at free.fr-20090515101451-bffnsywhvaskrz1h
    parent: pqm at pqm.ubuntu.com-20090515012140-stwx16f974x0zogp
    committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
    branch nick: 376582-auth-prompt
    timestamp: Fri 2009-05-15 12:14:51 +0200
    message:
      Use stderr for UI prompt to address bug #376582.
      
      * bzrlib/ui/__init__.py:
      (CLIUIFactory.prompt): Display prompt on stderr.
      
      * bzrlib/tests/test_ui.py: (UITests.test_text_factory_ascii_password,
      UITests.test_text_factory_utf8_password,
      UITests.assert_get_bool_acceptance_of_user_input,
      UITests.test_text_factory_prompt,
      UITests.test_silent_ui_getusername,
      UITests.test_text_ui_getusername,
      UITests.test_text_ui_getusername_utf8):prompt is now displayed on
      stderr.
      
      * bzrlib/tests/test_http.py:
      (TestAuth.test_prompt_for_username,
      TestAuth.test_prompt_for_password): prompt is now displayed on
      stderr.
      
      * bzrlib/tests/test_config.py:
      (TestAuthenticationConfig._check_default_password_prompt,
      TestAuthenticationConfig._check_default_username_prompt): prompt
      is now displayed on stderr.
    modified:
      NEWS                           NEWS-20050323055033-4e00b5db738777ff
      bzrlib/tests/test_config.py    testconfig.py-20051011041908-742d0c15d8d8c8eb
      bzrlib/tests/test_http.py      testhttp.py-20051018020158-b2eef6e867c514d9
      bzrlib/tests/test_ui.py        test_ui.py-20051130162854-458e667a7414af09
      bzrlib/ui/__init__.py          ui.py-20050824083933-8cf663c763ba53a9
=== modified file 'NEWS'
--- a/NEWS	2009-06-02 01:37:30 +0000
+++ b/NEWS	2009-06-02 13:48:27 +0000
@@ -12,6 +12,11 @@
 Compatibility Breaks
 ********************
 
+* Display prompt on stderr (instead of stdout) when querying users so
+  that the output of commands can be safely redirected.
+  (Vincent Ladeuil, #376582)
+
+
 New Features
 ************
 

=== modified file 'bzrlib/plugins/launchpad/test_register.py'
--- a/bzrlib/plugins/launchpad/test_register.py	2009-03-23 14:59:43 +0000
+++ b/bzrlib/plugins/launchpad/test_register.py	2009-06-02 13:48:27 +0000
@@ -335,12 +335,14 @@
         g_conf = config.GlobalConfig()
         g_conf.set_user_option('email', 'Test User <test at user.com>')
         stdout = tests.StringIOWrapper()
+        stderr = tests.StringIOWrapper()
         ui.ui_factory = tests.TestUIFactory(stdin='userpass\n',
-                                            stdout=stdout)
+                                            stdout=stdout, stderr=stderr)
         self.assertIs(None, service.registrant_password)
         service.gather_user_credentials()
         self.assertEqual('test at user.com', service.registrant_email)
         self.assertEqual('userpass', service.registrant_password)
-        self.assertContainsRe(stdout.getvalue(),
+        self.assertEquals('', stdout.getvalue())
+        self.assertContainsRe(stderr.getvalue(),
                              'launchpad.net password for test at user\\.com')
 

=== modified file 'bzrlib/tests/test_config.py'
--- a/bzrlib/tests/test_config.py	2009-04-27 16:10:10 +0000
+++ b/bzrlib/tests/test_config.py	2009-05-15 10:14:51 +0000
@@ -1461,7 +1461,8 @@
     """Test AuthenticationConfig behaviour"""
 
     def _check_default_password_prompt(self, expected_prompt_format, scheme,
-                              host=None, port=None, realm=None, path=None):
+                                       host=None, port=None, realm=None,
+                                       path=None):
         if host is None:
             host = 'bar.org'
         user, password = 'jim', 'precious'
@@ -1470,17 +1471,20 @@
             'user': user, 'realm': realm}
 
         stdout = tests.StringIOWrapper()
+        stderr = tests.StringIOWrapper()
         ui.ui_factory = tests.TestUIFactory(stdin=password + '\n',
-                                            stdout=stdout)
+                                            stdout=stdout, stderr=stderr)
         # We use an empty conf so that the user is always prompted
         conf = config.AuthenticationConfig()
         self.assertEquals(password,
                           conf.get_password(scheme, host, user, port=port,
                                             realm=realm, path=path))
-        self.assertEquals(stdout.getvalue(), expected_prompt)
+        self.assertEquals(expected_prompt, stderr.getvalue())
+        self.assertEquals('', stdout.getvalue())
 
     def _check_default_username_prompt(self, expected_prompt_format, scheme,
-                              host=None, port=None, realm=None, path=None):
+                                       host=None, port=None, realm=None,
+                                       path=None):
         if host is None:
             host = 'bar.org'
         username = 'jim'
@@ -1488,13 +1492,15 @@
             'scheme': scheme, 'host': host, 'port': port,
             'realm': realm}
         stdout = tests.StringIOWrapper()
+        stderr = tests.StringIOWrapper()
         ui.ui_factory = tests.TestUIFactory(stdin=username+ '\n',
-                                            stdout=stdout)
+                                            stdout=stdout, stderr=stderr)
         # We use an empty conf so that the user is always prompted
         conf = config.AuthenticationConfig()
         self.assertEquals(username, conf.get_user(scheme, host, port=port,
                           realm=realm, path=path, ask=True))
-        self.assertEquals(stdout.getvalue(), expected_prompt)
+        self.assertEquals(expected_prompt, stderr.getvalue())
+        self.assertEquals('', stdout.getvalue())
 
     def test_username_defaults_prompts(self):
         # HTTP prompts can't be tested here, see test_http.py

=== modified file 'bzrlib/tests/test_http.py'
--- a/bzrlib/tests/test_http.py	2009-05-27 13:59:47 +0000
+++ b/bzrlib/tests/test_http.py	2009-06-02 09:21:20 +0000
@@ -1569,15 +1569,18 @@
         self.server.add_user('joe', 'foo')
         t = self.get_user_transport(None, None)
         stdout = tests.StringIOWrapper()
-        ui.ui_factory = tests.TestUIFactory(stdin='joe\nfoo\n', stdout=stdout)
+        stderr = tests.StringIOWrapper()
+        ui.ui_factory = tests.TestUIFactory(stdin='joe\nfoo\n',
+                                            stdout=stdout, stderr=stderr)
         self.assertEqual('contents of a\n',t.get('a').read())
         # stdin should be empty
         self.assertEqual('', ui.ui_factory.stdin.readline())
-        stdout.seek(0)
+        stderr.seek(0)
         expected_prompt = self._expected_username_prompt(t._unqualified_scheme)
-        self.assertEquals(expected_prompt, stdout.read(len(expected_prompt)))
+        self.assertEquals(expected_prompt, stderr.read(len(expected_prompt)))
+        self.assertEquals('', stdout.getvalue())
         self._check_password_prompt(t._unqualified_scheme, 'joe',
-                                    stdout.readline())
+                                    stderr.readline())
 
     def test_prompt_for_password(self):
         if self._testing_pycurl():
@@ -1588,12 +1591,15 @@
         self.server.add_user('joe', 'foo')
         t = self.get_user_transport('joe', None)
         stdout = tests.StringIOWrapper()
-        ui.ui_factory = tests.TestUIFactory(stdin='foo\n', stdout=stdout)
-        self.assertEqual('contents of a\n',t.get('a').read())
+        stderr = tests.StringIOWrapper()
+        ui.ui_factory = tests.TestUIFactory(stdin='foo\n',
+                                            stdout=stdout, stderr=stderr)
+        self.assertEqual('contents of a\n', t.get('a').read())
         # stdin should be empty
         self.assertEqual('', ui.ui_factory.stdin.readline())
         self._check_password_prompt(t._unqualified_scheme, 'joe',
-                                    stdout.getvalue())
+                                    stderr.getvalue())
+        self.assertEquals('', stdout.getvalue())
         # And we shouldn't prompt again for a different request
         # against the same transport.
         self.assertEqual('contents of b\n',t.get('b').read())

=== modified file 'bzrlib/tests/test_ui.py'
--- a/bzrlib/tests/test_ui.py	2009-04-24 13:30:48 +0000
+++ b/bzrlib/tests/test_ui.py	2009-05-15 10:14:51 +0000
@@ -67,15 +67,17 @@
         self.assertEqual('', stdout.getvalue())
 
     def test_text_factory_ascii_password(self):
-        ui = TestUIFactory(stdin='secret\n', stdout=StringIOWrapper())
+        ui = TestUIFactory(stdin='secret\n', stdout=StringIOWrapper(),
+                           stderr=StringIOWrapper())
         pb = ui.nested_progress_bar()
         try:
             self.assertEqual('secret',
                              self.apply_redirected(ui.stdin, ui.stdout,
-                                                   ui.stdout,
+                                                   ui.stderr,
                                                    ui.get_password))
             # ': ' is appended to prompt
-            self.assertEqual(': ', ui.stdout.getvalue())
+            self.assertEqual(': ', ui.stderr.getvalue())
+            self.assertEqual('', ui.stdout.readline())
             # stdin should be empty
             self.assertEqual('', ui.stdin.readline())
         finally:
@@ -88,21 +90,22 @@
         it to utf8 to test that we transport the password correctly.
         """
         ui = TestUIFactory(stdin=u'baz\u1234'.encode('utf8'),
-                           stdout=StringIOWrapper())
-        ui.stdin.encoding = 'utf8'
-        ui.stdout.encoding = ui.stdin.encoding
+                           stdout=StringIOWrapper(),
+                           stderr=StringIOWrapper())
+        ui.stderr.encoding = ui.stdout.encoding = ui.stdin.encoding = 'utf8'
         pb = ui.nested_progress_bar()
         try:
-            password = self.apply_redirected(ui.stdin, ui.stdout, ui.stdout,
+            password = self.apply_redirected(ui.stdin, ui.stdout, ui.stderr,
                                              ui.get_password,
                                              u'Hello \u1234 %(user)s',
                                              user=u'some\u1234')
             # We use StringIO objects, we need to decode them
             self.assertEqual(u'baz\u1234', password.decode('utf8'))
             self.assertEqual(u'Hello \u1234 some\u1234: ',
-                             ui.stdout.getvalue().decode('utf8'))
-            # stdin should be empty
+                             ui.stderr.getvalue().decode('utf8'))
+            # stdin and stdout should be empty
             self.assertEqual('', ui.stdin.readline())
+            self.assertEqual('', ui.stdout.readline())
         finally:
             pb.finished()
 
@@ -193,6 +196,7 @@
                                  "yes\nn\nnot an answer\n"
                                  "no\nfoo\n")
         factory.stdout = StringIO()
+        factory.stderr = StringIO()
         # there is no output from the base factory
         self.assertEqual(True, factory.get_boolean(""))
         self.assertEqual(True, factory.get_boolean(""))
@@ -223,8 +227,10 @@
 
     def test_text_factory_prompt(self):
         # see <https://launchpad.net/bugs/365891>
-        factory = TextUIFactory(None, StringIO(), StringIO())
+        factory = TextUIFactory(None, StringIO(), StringIO(), StringIO())
         factory.prompt('foo %2e')
+        self.assertEqual('', factory.stdout.getvalue())
+        self.assertEqual('foo %2e', factory.stderr.getvalue())
 
     def test_text_factory_prompts_and_clears(self):
         # a get_boolean call should clear the pb before prompting
@@ -263,37 +269,41 @@
         factory = SilentUIFactory()
         factory.stdin = StringIO("someuser\n\n")
         factory.stdout = StringIO()
-        self.assertEquals(None, 
+        factory.stderr = StringIO()
+        self.assertEquals(None,
             factory.get_username(u'Hello\u1234 %(host)s', host=u'some\u1234'))
         self.assertEquals("", factory.stdout.getvalue())
+        self.assertEquals("", factory.stderr.getvalue())
         self.assertEquals("someuser\n\n", factory.stdin.getvalue())
 
     def test_text_ui_getusername(self):
         factory = TextUIFactory(None, None, None)
         factory.stdin = StringIO("someuser\n\n")
         factory.stdout = StringIO()
+        factory.stderr = StringIO()
         factory.stdout.encoding = "utf8"
         # there is no output from the base factory
-        self.assertEqual("someuser", 
-            factory.get_username('Hello %(host)s', host='some'))
-        self.assertEquals("Hello some: ", factory.stdout.getvalue())
+        self.assertEqual("someuser",
+                         factory.get_username('Hello %(host)s', host='some'))
+        self.assertEquals("Hello some: ", factory.stderr.getvalue())
+        self.assertEquals('', factory.stdout.getvalue())
         self.assertEqual("", factory.get_username("Gebruiker"))
         # stdin should be empty
         self.assertEqual('', factory.stdin.readline())
 
     def test_text_ui_getusername_utf8(self):
         ui = TestUIFactory(stdin=u'someuser\u1234'.encode('utf8'),
-                           stdout=StringIOWrapper())
-        ui.stdin.encoding = "utf8"
-        ui.stdout.encoding = ui.stdin.encoding
+                           stdout=StringIOWrapper(), stderr=StringIOWrapper())
+        ui.stderr.encoding = ui.stdout.encoding = ui.stdin.encoding = "utf8"
         pb = ui.nested_progress_bar()
         try:
             # there is no output from the base factory
-            username = self.apply_redirected(ui.stdin, ui.stdout, ui.stdout,
+            username = self.apply_redirected(ui.stdin, ui.stdout, ui.stderr,
                 ui.get_username, u'Hello\u1234 %(host)s', host=u'some\u1234')
             self.assertEquals(u"someuser\u1234", username.decode('utf8'))
-            self.assertEquals(u"Hello\u1234 some\u1234: ", 
-                ui.stdout.getvalue().decode("utf8"))
+            self.assertEquals(u"Hello\u1234 some\u1234: ",
+                              ui.stderr.getvalue().decode("utf8"))
+            self.assertEquals('', ui.stdout.getvalue())
         finally:
             pb.finished()
 

=== modified file 'bzrlib/ui/__init__.py'
--- a/bzrlib/ui/__init__.py	2009-04-24 15:49:33 +0000
+++ b/bzrlib/ui/__init__.py	2009-05-15 10:14:51 +0000
@@ -227,7 +227,7 @@
             prompt = prompt % kwargs
         prompt = prompt.encode(osutils.get_terminal_encoding(), 'replace')
         self.clear_term()
-        self.stdout.write(prompt)
+        self.stderr.write(prompt)
 
     def note(self, msg):
         """Write an already-formatted message."""




More information about the bazaar-commits mailing list