Rev 5925: (vila) Require prompts to always be unicode (Jelmer Vernooij) in file:///home/pqm/archives/thelove/bzr/%2Btrunk/
Canonical.com Patch Queue Manager
pqm at pqm.ubuntu.com
Fri May 27 10:48:04 UTC 2011
At file:///home/pqm/archives/thelove/bzr/%2Btrunk/
------------------------------------------------------------
revno: 5925 [merge]
revision-id: pqm at pqm.ubuntu.com-20110527104800-fvcjlygvqloos6kl
parent: pqm at pqm.ubuntu.com-20110527090129-l9la6zh0v1jp4238
parent: v.ladeuil+lp at free.fr-20110527100253-4j9vm9tgqnpfcu8f
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Fri 2011-05-27 10:48:00 +0000
message:
(vila) Require prompts to always be unicode (Jelmer Vernooij)
modified:
bzrlib/builtins.py builtins.py-20050830033751-fc01482b9ca23183
bzrlib/config.py config.py-20051011043216-070c74f4e9e338e8
bzrlib/lockdir.py lockdir.py-20060220222025-98258adf27fbdda3
bzrlib/msgeditor.py msgeditor.py-20050901111708-ef6d8de98f5d8f2f
bzrlib/tests/per_uifactory/__init__.py __init__.py-20090923045301-o12zypjwsidxn2hy-1
bzrlib/tests/test_config.py testconfig.py-20051011041908-742d0c15d8d8c8eb
bzrlib/tests/test_script.py test_script.py-20090901081156-y90z4w2t62fv7e7b-1
bzrlib/tests/test_ui.py test_ui.py-20051130162854-458e667a7414af09
bzrlib/transport/gio_transport.py __init__.py-20100430125031-jb4f7q7mtyz55kz3-2
bzrlib/transport/http/__init__.py http_transport.py-20050711212304-506c5fd1059ace96
bzrlib/transport/http/_pycurl.py pycurlhttp.py-20060110060940-4e2a705911af77a6
bzrlib/transport/http/_urllib2_wrappers.py _urllib2_wrappers.py-20060913231729-ha9ugi48ktx481ao-1
bzrlib/transport/ssh.py ssh.py-20060824042150-0s9787kng6zv1nwq-1
bzrlib/ui/__init__.py ui.py-20050824083933-8cf663c763ba53a9
bzrlib/ui/text.py text.py-20051130153916-2e438cffc8afc478
doc/en/release-notes/bzr-2.4.txt bzr2.4.txt-20110114053217-k7ym9jfz243fddjm-1
=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py 2011-05-20 14:39:50 +0000
+++ b/bzrlib/builtins.py 2011-05-27 05:16:48 +0000
@@ -4954,7 +4954,7 @@
if not force:
if not ui.ui_factory.confirm_action(
- 'Uncommit these revisions',
+ u'Uncommit these revisions',
'bzrlib.builtins.uncommit',
{}):
self.outf.write('Canceled\n')
=== modified file 'bzrlib/config.py'
--- a/bzrlib/config.py 2011-05-20 14:46:02 +0000
+++ b/bzrlib/config.py 2011-05-27 10:02:53 +0000
@@ -1803,7 +1803,7 @@
if ask:
if prompt is None:
# Create a default prompt suitable for most cases
- prompt = scheme.upper() + ' %(host)s username'
+ prompt = u'%s' % (scheme.upper(),) + u' %(host)s username'
# Special handling for optional fields in the prompt
if port is not None:
prompt_host = '%s:%d' % (host, port)
@@ -1847,7 +1847,7 @@
if password is None:
if prompt is None:
# Create a default prompt suitable for most cases
- prompt = '%s' % scheme.upper() + ' %(user)s@%(host)s password'
+ prompt = u'%s' % scheme.upper() + u' %(user)s@%(host)s password'
# Special handling for optional fields in the prompt
if port is not None:
prompt_host = '%s:%d' % (host, port)
=== modified file 'bzrlib/lockdir.py'
--- a/bzrlib/lockdir.py 2011-03-31 09:01:27 +0000
+++ b/bzrlib/lockdir.py 2011-05-16 13:39:39 +0000
@@ -355,7 +355,7 @@
holder_info = self.peek()
except LockCorrupt, e:
# The lock info is corrupt.
- if bzrlib.ui.ui_factory.get_boolean("Break (corrupt %r)" % (self,)):
+ if bzrlib.ui.ui_factory.get_boolean(u"Break (corrupt %r)" % (self,)):
self.force_break_corrupt(e.file_data)
return
if holder_info is not None:
=== modified file 'bzrlib/msgeditor.py'
--- a/bzrlib/msgeditor.py 2011-05-24 09:52:04 +0000
+++ b/bzrlib/msgeditor.py 2011-05-27 05:16:48 +0000
@@ -151,7 +151,7 @@
edited_content = msg_transport.get_bytes(basename)
if edited_content == reference_content:
if not ui.ui_factory.confirm_action(
- "Commit message was not edited, use anyway",
+ u"Commit message was not edited, use anyway",
"bzrlib.msgeditor.unchanged",
{}):
# Returning "" makes cmd_commit raise 'empty commit message
=== modified file 'bzrlib/tests/per_uifactory/__init__.py'
--- a/bzrlib/tests/per_uifactory/__init__.py 2011-01-10 22:20:12 +0000
+++ b/bzrlib/tests/per_uifactory/__init__.py 2011-05-16 14:02:27 +0000
@@ -66,9 +66,8 @@
# confirm_action should be answered by every ui factory; even
# noninteractive ones should have a reasonable default
self._load_responses([True])
- result = self.factory.confirm_action(
- 'Break a lock?',
- 'bzr.lock.break.confirm',
+ result = self.factory.confirm_action(u'Break a lock?',
+ 'bzr.lock.break.confirm',
{})
# will be true either because we read it from the input or because
# that's the default
=== modified file 'bzrlib/tests/test_config.py'
--- a/bzrlib/tests/test_config.py 2011-05-25 14:17:27 +0000
+++ b/bzrlib/tests/test_config.py 2011-05-27 10:02:53 +0000
@@ -2735,11 +2735,11 @@
def test_username_defaults_prompts(self):
# HTTP prompts can't be tested here, see test_http.py
- self._check_default_username_prompt('FTP %(host)s username: ', 'ftp')
- self._check_default_username_prompt(
- 'FTP %(host)s:%(port)d username: ', 'ftp', port=10020)
- self._check_default_username_prompt(
- 'SSH %(host)s:%(port)d username: ', 'ssh', port=12345)
+ self._check_default_username_prompt(u'FTP %(host)s username: ', 'ftp')
+ self._check_default_username_prompt(
+ u'FTP %(host)s:%(port)d username: ', 'ftp', port=10020)
+ self._check_default_username_prompt(
+ u'SSH %(host)s:%(port)d username: ', 'ssh', port=12345)
def test_username_default_no_prompt(self):
conf = config.AuthenticationConfig()
@@ -2751,22 +2751,21 @@
def test_password_default_prompts(self):
# HTTP prompts can't be tested here, see test_http.py
self._check_default_password_prompt(
- 'FTP %(user)s@%(host)s password: ', 'ftp')
- self._check_default_password_prompt(
- 'FTP %(user)s@%(host)s:%(port)d password: ', 'ftp', port=10020)
- self._check_default_password_prompt(
- 'SSH %(user)s@%(host)s:%(port)d password: ', 'ssh', port=12345)
+ u'FTP %(user)s@%(host)s password: ', 'ftp')
+ self._check_default_password_prompt(
+ u'FTP %(user)s@%(host)s:%(port)d password: ', 'ftp', port=10020)
+ self._check_default_password_prompt(
+ u'SSH %(user)s@%(host)s:%(port)d password: ', 'ssh', port=12345)
# SMTP port handling is a bit special (it's handled if embedded in the
# host too)
# FIXME: should we: forbid that, extend it to other schemes, leave
# things as they are that's fine thank you ?
- self._check_default_password_prompt('SMTP %(user)s@%(host)s password: ',
- 'smtp')
- self._check_default_password_prompt('SMTP %(user)s@%(host)s password: ',
- 'smtp', host='bar.org:10025')
- self._check_default_password_prompt(
- 'SMTP %(user)s@%(host)s:%(port)d password: ',
- 'smtp', port=10025)
+ self._check_default_password_prompt(
+ u'SMTP %(user)s@%(host)s password: ', 'smtp')
+ self._check_default_password_prompt(
+ u'SMTP %(user)s@%(host)s password: ', 'smtp', host='bar.org:10025')
+ self._check_default_password_prompt(
+ u'SMTP %(user)s@%(host)s:%(port)d password: ', 'smtp', port=10025)
def test_ssh_password_emits_warning(self):
conf = config.AuthenticationConfig(_file=StringIO(
=== modified file 'bzrlib/tests/test_script.py'
--- a/bzrlib/tests/test_script.py 2011-05-13 12:51:05 +0000
+++ b/bzrlib/tests/test_script.py 2011-05-16 13:39:39 +0000
@@ -558,7 +558,7 @@
def run(self):
if ui.ui_factory.get_boolean(
- 'Really do it',
+ u'Really do it',
# 'bzrlib.tests.test_script.confirm',
# {}
):
=== modified file 'bzrlib/tests/test_ui.py'
--- a/bzrlib/tests/test_ui.py 2011-04-05 17:37:53 +0000
+++ b/bzrlib/tests/test_ui.py 2011-05-16 13:39:39 +0000
@@ -63,7 +63,7 @@
def test_text_factory_confirm(self):
# turns into reading a regular boolean
ui = self.make_test_ui_factory('n\n')
- self.assertEquals(ui.confirm_action('Should %(thing)s pass?',
+ self.assertEquals(ui.confirm_action(u'Should %(thing)s pass?',
'bzrlib.tests.test_ui.confirmation',
{'thing': 'this'},),
False)
@@ -119,12 +119,12 @@
stdout = tests.StringIOWrapper()
stderr = tests.StringIOWrapper()
factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
- self.assertEqual(True, factory.get_boolean(""))
- self.assertEqual(False, factory.get_boolean(""))
- self.assertEqual(True, factory.get_boolean(""))
- self.assertEqual(False, factory.get_boolean(""))
- self.assertEqual(True, factory.get_boolean(""))
- self.assertEqual(False, factory.get_boolean(""))
+ self.assertEqual(True, factory.get_boolean(u""))
+ self.assertEqual(False, factory.get_boolean(u""))
+ self.assertEqual(True, factory.get_boolean(u""))
+ self.assertEqual(False, factory.get_boolean(u""))
+ self.assertEqual(True, factory.get_boolean(u""))
+ self.assertEqual(False, factory.get_boolean(u""))
self.assertEqual("foo\n", factory.stdin.read())
# stdin should be empty
self.assertEqual('', factory.stdin.readline())
@@ -137,15 +137,15 @@
stdout = tests.StringIOWrapper()
stderr = tests.StringIOWrapper()
factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
- self.assertEqual(1, factory.get_integer(""))
- self.assertEqual(-2, factory.get_integer(""))
- self.assertEqual(42, factory.get_integer(""))
+ self.assertEqual(1, factory.get_integer(u""))
+ self.assertEqual(-2, factory.get_integer(u""))
+ self.assertEqual(42, factory.get_integer(u""))
def test_text_factory_prompt(self):
# see <https://launchpad.net/bugs/365891>
StringIO = tests.StringIOWrapper
factory = _mod_ui_text.TextUIFactory(StringIO(), StringIO(), StringIO())
- factory.prompt('foo %2e')
+ factory.prompt(u'foo %2e')
self.assertEqual('', factory.stdout.getvalue())
self.assertEqual('foo %2e', factory.stderr.getvalue())
@@ -166,7 +166,7 @@
self.apply_redirected(None, factory.stdout,
factory.stdout,
factory.get_boolean,
- "what do you want"))
+ u"what do you want"))
output = out.getvalue()
self.assertContainsRe(output,
"| foo *\r\r *\r*")
@@ -195,10 +195,10 @@
factory.stdout.encoding = "utf8"
# there is no output from the base factory
self.assertEqual("someuser",
- factory.get_username('Hello %(host)s', host='some'))
+ factory.get_username(u'Hello %(host)s', host='some'))
self.assertEquals("Hello some: ", factory.stderr.getvalue())
self.assertEquals('', factory.stdout.getvalue())
- self.assertEqual("", factory.get_username("Gebruiker"))
+ self.assertEqual("", factory.get_username(u"Gebruiker"))
# stdin should be empty
self.assertEqual('', factory.stdin.readline())
@@ -352,7 +352,7 @@
self.assertRaises(
NotImplementedError,
self.apply_redirected,
- None, stdout, stdout, factory.get_boolean, "foo")
+ None, stdout, stdout, factory.get_boolean, u"foo")
class TestUIFactoryTests(tests.TestCase):
@@ -371,12 +371,12 @@
def test_canned_input_get_input(self):
uif = _mod_ui.CannedInputUIFactory([True, 'mbp', 'password', 42])
- self.assertEqual(True, uif.get_boolean('Extra cheese?'))
- self.assertEqual('mbp', uif.get_username('Enter your user name'))
+ self.assertEqual(True, uif.get_boolean(u'Extra cheese?'))
+ self.assertEqual('mbp', uif.get_username(u'Enter your user name'))
self.assertEqual('password',
- uif.get_password('Password for %(host)s',
+ uif.get_password(u'Password for %(host)s',
host='example.com'))
- self.assertEqual(42, uif.get_integer('And all that jazz ?'))
+ self.assertEqual(42, uif.get_integer(u'And all that jazz ?'))
class TestBoolFromString(tests.TestCase):
=== modified file 'bzrlib/transport/gio_transport.py'
--- a/bzrlib/transport/gio_transport.py 2010-08-30 07:42:12 +0000
+++ b/bzrlib/transport/gio_transport.py 2011-05-27 10:02:53 +0000
@@ -176,7 +176,7 @@
user = None
if (flags & gio.ASK_PASSWORD_NEED_USERNAME and
flags & gio.ASK_PASSWORD_NEED_DOMAIN):
- prompt = scheme.upper() + ' %(host)s DOMAIN\username'
+ prompt = u'%s' % (scheme.upper(),) + u' %(host)s DOMAIN\\username'
user_and_domain = auth.get_user(scheme, host,
port=port, ask=True, prompt=prompt)
(domain, user) = user_and_domain.split('\\', 1)
@@ -191,7 +191,7 @@
#a DOMAIN and a username prompt should be the
#same so I will missuse the ui_factory get_username
#a little bit here.
- prompt = scheme.upper() + ' %(host)s DOMAIN'
+ prompt = u'%s' % (scheme.upper(),) + u' %(host)s DOMAIN'
domain = ui.ui_factory.get_username(prompt=prompt)
op.set_domain(domain)
=== modified file 'bzrlib/transport/http/__init__.py'
--- a/bzrlib/transport/http/__init__.py 2011-01-26 19:34:58 +0000
+++ b/bzrlib/transport/http/__init__.py 2011-05-27 07:39:41 +0000
@@ -74,7 +74,7 @@
password = urllib.unquote(password)
else:
password = ui.ui_factory.get_password(
- prompt='HTTP %(user)s@%(host)s password',
+ prompt=u'HTTP %(user)s@%(host)s password',
user=username, host=host)
password_manager.add_password(None, host, username, password)
url = urlparse.urlunsplit((scheme, netloc, path, query, fragment))
=== modified file 'bzrlib/transport/http/_pycurl.py'
--- a/bzrlib/transport/http/_pycurl.py 2010-11-06 10:55:58 +0000
+++ b/bzrlib/transport/http/_pycurl.py 2011-05-27 07:39:41 +0000
@@ -301,7 +301,9 @@
The URL and code are automatically included as appropriate.
:param info: Extra information to include in the message.
- :param body: File-like object from which the body of the page can be read.
+
+ :param body: File-like object from which the body of the page can be
+ read.
"""
code = curl.getinfo(pycurl.HTTP_CODE)
url = curl.getinfo(pycurl.EFFECTIVE_URL)
@@ -321,7 +323,7 @@
else:
msg = ': ' + info
raise errors.InvalidHttpResponse(
- url, 'Unable to handle http code %d%s: %s'
+ url, 'Unable to handle http code %d%s: %s'
% (code, msg, plaintext_body))
def _debug_cb(self, kind, text):
=== modified file 'bzrlib/transport/http/_urllib2_wrappers.py'
--- a/bzrlib/transport/http/_urllib2_wrappers.py 2011-05-12 07:53:55 +0000
+++ b/bzrlib/transport/http/_urllib2_wrappers.py 2011-05-27 07:39:41 +0000
@@ -1260,11 +1260,11 @@
user. The daughter classes should implements a public
build_password_prompt using this method.
"""
- prompt = '%s' % auth['protocol'].upper() + ' %(user)s@%(host)s'
+ prompt = u'%s' % auth['protocol'].upper() + u' %(user)s@%(host)s'
realm = auth['realm']
if realm is not None:
- prompt += ", Realm: '%s'" % realm
- prompt += ' password'
+ prompt += u", Realm: '%s'" % realm.decode('utf8')
+ prompt += u' password'
return prompt
def _build_username_prompt(self, auth):
@@ -1278,11 +1278,11 @@
user. The daughter classes should implements a public
build_username_prompt using this method.
"""
- prompt = '%s' % auth['protocol'].upper() + ' %(host)s'
+ prompt = u'%s' % auth['protocol'].upper() + u' %(host)s'
realm = auth['realm']
if realm is not None:
- prompt += ", Realm: '%s'" % realm
- prompt += ' username'
+ prompt += u", Realm: '%s'" % realm.decode('utf8')
+ prompt += u' username'
return prompt
def http_request(self, request):
@@ -1552,12 +1552,12 @@
def build_password_prompt(self, auth):
prompt = self._build_password_prompt(auth)
- prompt = 'Proxy ' + prompt
+ prompt = u'Proxy ' + prompt
return prompt
def build_username_prompt(self, auth):
prompt = self._build_username_prompt(auth)
- prompt = 'Proxy ' + prompt
+ prompt = u'Proxy ' + prompt
return prompt
def http_error_407(self, req, fp, code, msg, headers):
=== modified file 'bzrlib/transport/ssh.py'
--- a/bzrlib/transport/ssh.py 2011-01-11 20:20:13 +0000
+++ b/bzrlib/transport/ssh.py 2011-05-16 13:39:39 +0000
@@ -573,7 +573,8 @@
return True
except paramiko.PasswordRequiredException:
password = ui.ui_factory.get_password(
- prompt='SSH %(filename)s password', filename=filename)
+ prompt=u'SSH %(filename)s password',
+ filename=filename.decode(osutils._fs_enc))
try:
key = pkey_class.from_private_key_file(filename, password)
paramiko_transport.auth_publickey(username, key)
=== modified file 'bzrlib/ui/__init__.py'
--- a/bzrlib/ui/__init__.py 2011-05-19 09:32:38 +0000
+++ b/bzrlib/ui/__init__.py 2011-05-27 05:16:48 +0000
@@ -204,10 +204,10 @@
"""
return self.get_boolean(prompt % prompt_kwargs)
- def get_password(self, prompt='', **kwargs):
+ def get_password(self, prompt=u'', **kwargs):
"""Prompt the user for a password.
- :param prompt: The prompt to present the user
+ :param prompt: The prompt to present the user (must be unicode)
:param kwargs: Arguments which will be expanded into the prompt.
This lets front ends display different things if
they so choose.
@@ -483,7 +483,7 @@
def get_integer(self, prompt):
return self.responses.pop(0)
- def get_password(self, prompt='', **kwargs):
+ def get_password(self, prompt=u'', **kwargs):
return self.responses.pop(0)
def get_username(self, prompt, **kwargs):
=== modified file 'bzrlib/ui/text.py'
--- a/bzrlib/ui/text.py 2011-04-07 10:36:24 +0000
+++ b/bzrlib/ui/text.py 2011-05-16 13:39:39 +0000
@@ -114,7 +114,7 @@
password = password[:-1]
return password
- def get_password(self, prompt='', **kwargs):
+ def get_password(self, prompt=u'', **kwargs):
"""Prompt the user for a password.
:param prompt: The prompt to present the user
@@ -198,6 +198,8 @@
:param kwargs: Dictionary of arguments to insert into the prompt,
to allow UIs to reformat the prompt.
"""
+ if type(prompt) != unicode:
+ raise ValueError("prompt %r not a unicode string" % prompt)
if kwargs:
# See <https://launchpad.net/bugs/365891>
prompt = prompt % kwargs
=== modified file 'doc/en/release-notes/bzr-2.4.txt'
--- a/doc/en/release-notes/bzr-2.4.txt 2011-05-27 09:01:29 +0000
+++ b/doc/en/release-notes/bzr-2.4.txt 2011-05-27 10:48:00 +0000
@@ -35,6 +35,10 @@
* Reports the original error when an InvalidHttpResponse exception is
encountered to facilitate debug. (Vincent Ladeuil, #788530)
+* ``UIFactory.prompt``, ``UIFactory.get_username``,
+ ``UIFactory.get_password`` and ``UIFactory.get_boolean`` now require a
+ unicode prompt to be passed in. (Jelmer Vernooij, #592083)
+
Documentation
*************
More information about the bazaar-commits
mailing list