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

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


Gah, left a conflict marker in.  This should be a clean bundle.

-- 
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-20070821125537-\
#   kmoystprykftt5th
# target_branch: file:///home/daniel/devel/bzr/bzr.dev/
# testament_sha1: 7fca9766edfb6d2be26fc168b84ccd4d68f5149b
# timestamp: 2007-08-21 14:55:46 +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:55:37 +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 

=== 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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
-------------- 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/3a935cf0/attachment.pgp 


More information about the bazaar mailing list