[MERGE][Bug #116143] commit raises UnicodeError (traceback) if LANG is incorrect

Daniel Watkins D.M.Watkins at warwick.ac.uk
Tue Aug 21 13:34:49 BST 2007


On Thu, 2007-08-09 at 10:54 -0400, Aaron Bentley wrote:
> Is there any reason not to do this as a format string?  '""" + message + 
> """' is not as clear as '%s' to me.
Absolutely none.


-- 
Daniel Watkins (Odd_Bloke) <D.M.Watkins at warwick.ac.uk>
University of Warwick Christian Focus President
University of Warwick Computing Society WUGLUG Liaison Officer
-------------- next part --------------
# Bazaar merge directive format 2 (Bazaar 0.19)
# revision_id: d.m.watkins at warwick.ac.uk-20070821123242-\
#   2z9w63aqc3p0s089
# target_branch: file:///home/daniel/devel/bzr/bzr.dev/
# testament_sha1: 72b488ccdcd2045989c6d45268b54007d9e66d0b
# timestamp: 2007-08-21 14:33:02 +0200
# base_revision_id: pqm at pqm.ubuntu.com-20070821044713-ttnupbvhlsbwh1he
# 
# Begin patch
=== modified file 'NEWS'
--- NEWS	2007-08-21 03:40:50 +0000
+++ NEWS	2007-08-21 12:32:42 +0000
@@ -33,6 +33,10 @@
     * get_transport treats an empty possible_transports list the same as a non-
       empty one.  (Aaron Bentley)
 
+    * ``bzr commit`` now exits cleanly if a character unsupported by the
+      current encoding is used in the commit message.  (Daniel Watkins,
+      #116143)
+
   IMPROVEMENTS:
 
     * ``pull`` and ``merge`` are much faster at installing bundle format 4.
@@ -44,6 +48,9 @@
     * ``send`` now sends the directive as an attachment by default.
       (Aaron Bentley, Luk?? Lalinsk?, Alexander Belchenko)
 
+    * Parameters passed on the command line are checked to ensure they are
+      supported by the encoding in use. (Daniel Watkins)
+
   API BREAKS:
 
    * ``Branch.append_revision`` is removed altogether; please use 
@@ -222,6 +229,7 @@
     * Windows standalone installer show link to registration survey
       when installation finished. (Alexander Belchenko)
 
+>>>>>>> MERGE-SOURCE
   LIBRARY API BREAKS:
 
     * Deprecated dictionary ``bzrlib.option.SHORT_OPTIONS`` removed.

=== modified file 'bzrlib/commands.py'
--- bzrlib/commands.py	2007-08-15 04:33:34 +0000
+++ bzrlib/commands.py	2007-08-21 12:32:42 +0000
@@ -770,7 +770,11 @@
     import bzrlib.ui
     from bzrlib.ui.text import TextUIFactory
     bzrlib.ui.ui_factory = TextUIFactory()
-    argv = [a.decode(bzrlib.user_encoding) for a in argv[1:]]
+    try:
+        argv = [a.decode(bzrlib.user_encoding) for a in argv[1:]]
+    except UnicodeDecodeError:
+        raise errors.BzrError(("Parameter '%r' is unsupported by the current "
+                                                            "encoding." % a))
     ret = run_bzr_catch_errors(argv)
     trace.mutter("return code %d", ret)
     return ret

=== modified file 'bzrlib/errors.py'
--- bzrlib/errors.py	2007-08-21 02:46:21 +0000
+++ bzrlib/errors.py	2007-08-21 12:32:42 +0000
@@ -950,6 +950,12 @@
         BzrError.__init__(self, files=files, files_str=files_str)
 
 
+class BadCommitMessageEncoding(BzrError):
+
+    _fmt = 'The specified commit message contains characters unsupported by '\
+        'the current encoding.'
+
+
 class UpgradeReadonly(BzrError):
 
     _fmt = "Upgrade URL cannot work with readonly URLs."

=== modified file 'bzrlib/msgeditor.py'
--- bzrlib/msgeditor.py	2007-04-30 19:52:44 +0000
+++ bzrlib/msgeditor.py	2007-08-07 11:38:26 +0000
@@ -25,7 +25,7 @@
 
 import bzrlib
 import bzrlib.config as config
-from bzrlib.errors import BzrError
+from bzrlib.errors import BzrError, BadCommitMessageEncoding
 from bzrlib.trace import warning, mutter
 
 
@@ -113,24 +113,28 @@
         # codecs.open() ALWAYS opens file in binary mode but we need text mode
         # 'rU' mode useful when bzr.exe used on Cygwin (bialix 20070430)
         f = file(msgfilename, 'rU')
-        for line in codecs.getreader(bzrlib.user_encoding)(f):
-            stripped_line = line.strip()
-            # strip empty line before the log message starts
-            if not started:
+        try:
+            for line in codecs.getreader(bzrlib.user_encoding)(f):
+                stripped_line = line.strip()
+                # strip empty line before the log message starts
+                if not started:
+                    if stripped_line != "":
+                        started = True
+                    else:
+                        continue
+                # check for the ignore line only if there
+                # is additional information at the end
+                if hasinfo and stripped_line == ignoreline:
+                    break
+                nlines += 1
+                # keep track of the last line that had some content
                 if stripped_line != "":
-                    started = True
-                else:
-                    continue
-            # check for the ignore line only if there
-            # is additional information at the end
-            if hasinfo and stripped_line == ignoreline:
-                break
-            nlines += 1
-            # keep track of the last line that had some content
-            if stripped_line != "":
-                lastline = nlines
-            msg.append(line)
-        f.close()
+                    lastline = nlines
+                msg.append(line)
+        except UnicodeDecodeError:
+            raise BadCommitMessageEncoding()
+        finally:
+            f.close()
 
         if len(msg) == 0:
             return ""

=== modified file 'bzrlib/tests/blackbox/test_commit.py'
--- bzrlib/tests/blackbox/test_commit.py	2007-08-07 14:57:35 +0000
+++ bzrlib/tests/blackbox/test_commit.py	2007-08-21 12:32:42 +0000
@@ -224,6 +224,15 @@
         self.run_bzr('add foo.c')
         self.run_bzr('commit -m ""', retcode=3)
 
+    def test_unsupported_encoding_commit_message(self):
+        tree = self.make_branch_and_tree('.')
+        self.build_tree_contents([('foo.c', 'int main() {}')])
+        tree.add('foo.c')
+        out,err = self.run_bzr_subprocess('commit -m "\xff"', retcode=1,
+                                                    env_changes={'LANG': 'C'})
+        self.assertContainsRe(err, r'bzrlib.errors.BzrError: Parameter.*is '
+                                    'unsupported by the current encoding.')
+
     def test_other_branch_commit(self):
         # this branch is to ensure consistent behaviour, whether we're run
         # inside a branch, or not.

=== modified file 'bzrlib/tests/test_msgeditor.py'
--- bzrlib/tests/test_msgeditor.py	2007-05-01 09:09:18 +0000
+++ bzrlib/tests/test_msgeditor.py	2007-08-21 12:28:01 +0000
@@ -26,6 +26,11 @@
 from bzrlib.tests import TestCaseWithTransport, TestSkipped
 from bzrlib.trace import mutter
 
+from bzrlib import (
+    osutils,
+    errors
+    )
+
 
 class MsgEditorTest(TestCaseWithTransport):
 
@@ -80,7 +85,7 @@
         self.assertEqual(True, bzrlib.msgeditor._run_editor(''),
                          'Unable to run dummy fake editor')
 
-    def make_fake_editor(self):
+    def make_fake_editor(self, message='test message from fed\\n'):
         """Set up environment so that an editor will be a known script.
 
         Sets up BZR_EDITOR so that if an editor is spawned it will run a
@@ -89,6 +94,7 @@
         f = file('fed.py', 'wb')
         f.write('#!%s\n' % sys.executable)
         f.write("""\
+# coding=utf-8
 import sys
 if len(sys.argv) == 2:
     fn = sys.argv[1]
@@ -96,10 +102,10 @@
     s = f.read()
     f.close()
     f = file(fn, 'wb')
-    f.write('test message from fed\\n')
+    f.write('%s')
     f.write(s)
     f.close()
-""")
+""" % (message, ))
         f.close()
         if sys.platform == "win32":
             # [win32] make batch file and set BZR_EDITOR
@@ -210,3 +216,14 @@
         self.assertNotEqual(None, msgfilename)
         self.assertFalse(hasinfo)
         self.assertFileEqual('', msgfilename)
+
+    def test_unsupported_encoding_commit_message(self):
+        old_env = osutils.set_or_unset_env('LANG', 'C')
+        try:
+            self.make_fake_editor(message='\xff')
+
+            working_tree = self.make_uncommitted_tree()
+            self.assertRaises(errors.BadCommitMessageEncoding,
+                                    bzrlib.msgeditor.edit_commit_message, '')
+        finally:
+            osutils.set_or_unset_env('LANG', old_env)

# Begin bundle
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
tn/i7kinChIFCcAnIA==
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
Url : https://lists.ubuntu.com/archives/bazaar/attachments/20070821/180a5895/attachment-0001.pgp 


More information about the bazaar mailing list