Rev 5634: (gz) Don't cast paths to str in workingtree move error conditions (Martin in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Wed Jan 26 20:51:35 UTC 2011


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

------------------------------------------------------------
revno: 5634 [merge]
revision-id: pqm at pqm.ubuntu.com-20110126205132-pei0r2ge0pzxlzzr
parent: pqm at pqm.ubuntu.com-20110125174508-jmx7uxbgbc7kuwbg
parent: gzlist at googlemail.com-20110126200750-9q207kowt6wxdi9j
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Wed 2011-01-26 20:51:32 +0000
message:
  (gz) Don't cast paths to str in workingtree move error conditions (Martin
   [gz])
modified:
  bzrlib/errors.py               errors.py-20050309040759-20512168c4e14fbd
  bzrlib/tests/blackbox/test_mv.py test_mv.py-20060705114902-33tkxz0o9cdshemo-1
  bzrlib/tests/per_workingtree/test_move.py test_move.py-20070225171927-mohn2vqj5fx7edc6-1
  bzrlib/tests/per_workingtree/test_rename_one.py test_rename_one.py-20070226161242-2d8ibdedl700jgio-1
  bzrlib/workingtree.py          workingtree.py-20050511021032-29b6ec0a681e02e3
  doc/en/release-notes/bzr-2.4.txt bzr2.4.txt-20110114053217-k7ym9jfz243fddjm-1
=== modified file 'bzrlib/errors.py'
--- a/bzrlib/errors.py	2011-01-20 23:53:41 +0000
+++ b/bzrlib/errors.py	2011-01-26 20:02:52 +0000
@@ -1960,15 +1960,16 @@
 
 class BzrMoveFailedError(BzrError):
 
-    _fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
+    _fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
+        "%(_has_extra)s%(extra)s")
 
     def __init__(self, from_path='', to_path='', extra=None):
         from bzrlib.osutils import splitpath
         BzrError.__init__(self)
         if extra:
-            self.extra = ': ' + str(extra)
+            self.extra, self._has_extra = extra, ': '
         else:
-            self.extra = ''
+            self.extra = self._has_extra = ''
 
         has_from = len(from_path) > 0
         has_to = len(to_path) > 0
@@ -1995,11 +1996,13 @@
 
 class BzrRenameFailedError(BzrMoveFailedError):
 
-    _fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
+    _fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
+        "%(_has_extra)s%(extra)s")
 
     def __init__(self, from_path, to_path, extra=None):
         BzrMoveFailedError.__init__(self, from_path, to_path, extra)
 
+
 class BzrRemoveChangedFilesError(BzrError):
     """Used when user is trying to remove changed files."""
 

=== modified file 'bzrlib/tests/blackbox/test_mv.py'
--- a/bzrlib/tests/blackbox/test_mv.py	2010-02-17 17:11:16 +0000
+++ b/bzrlib/tests/blackbox/test_mv.py	2011-01-26 16:27:31 +0000
@@ -28,6 +28,7 @@
     CaseInsensitiveFilesystemFeature,
     SymlinkFeature,
     TestCaseWithTransport,
+    UnicodeFilename,
     )
 
 
@@ -504,3 +505,11 @@
         # If this fails, the tree is trying to acquire a branch lock, which it
         # shouldn't.
         self.run_bzr(['mv', 'tree/path', 'tree/path2'])
+
+    def test_mv_unversioned_non_ascii(self):
+        """Clear error on mv of an unversioned non-ascii file, see lp:707954"""
+        self.requireFeature(UnicodeFilename)
+        tree = self.make_branch_and_tree(".")
+        self.build_tree([u"\xA7"])
+        out, err = self.run_bzr_error(["Could not rename", "not versioned"],
+            ["mv", u"\xA7", "b"])

=== modified file 'bzrlib/tests/per_workingtree/test_move.py'
--- a/bzrlib/tests/per_workingtree/test_move.py	2010-07-15 13:33:30 +0000
+++ b/bzrlib/tests/per_workingtree/test_move.py	2011-01-26 16:31:43 +0000
@@ -21,6 +21,7 @@
 from bzrlib import (
     errors,
     osutils,
+    tests,
     )
 
 from bzrlib.workingtree_4 import DirStateWorkingTreeFormat
@@ -543,3 +544,25 @@
         self.assertTreeLayout([('', root_id), ('a', 'a-id'), ('c', 'c-id'),
                                ('a/b', 'b-id')], tree.basis_tree())
         tree._validate()
+
+    def test_move_to_unversioned_non_ascii_dir(self):
+        """Check error when moving to unversioned non-ascii directory"""
+        self.requireFeature(tests.UnicodeFilename)
+        tree = self.make_branch_and_tree(".")
+        self.build_tree(["a", u"\xA7/"])
+        tree.add(["a"])
+        e = self.assertRaises(errors.BzrMoveFailedError,
+            tree.move, ["a"], u"\xA7")
+        self.assertIsInstance(e.extra, errors.NotVersionedError)
+        self.assertEqual(e.extra.path, u"\xA7")
+
+    def test_move_unversioned_non_ascii(self):
+        """Check error when moving an unversioned non-ascii file"""
+        self.requireFeature(tests.UnicodeFilename)
+        tree = self.make_branch_and_tree(".")
+        self.build_tree([u"\xA7", "dir/"])
+        tree.add("dir")
+        e = self.assertRaises(errors.BzrMoveFailedError,
+            tree.move, [u"\xA7"], "dir")
+        self.assertIsInstance(e.extra, errors.NotVersionedError)
+        self.assertEqual(e.extra.path, u"\xA7")

=== modified file 'bzrlib/tests/per_workingtree/test_rename_one.py'
--- a/bzrlib/tests/per_workingtree/test_rename_one.py	2009-07-23 00:24:30 +0000
+++ b/bzrlib/tests/per_workingtree/test_rename_one.py	2011-01-26 16:31:43 +0000
@@ -336,3 +336,46 @@
         tree.add(['a'])
         self.assertRaises((errors.InvalidNormalization, UnicodeEncodeError),
             tree.rename_one, 'a', u'ba\u030arry')
+
+    def test_rename_unversioned_non_ascii(self):
+        """Check error when renaming an unversioned non-ascii file"""
+        self.requireFeature(tests.UnicodeFilename)
+        tree = self.make_branch_and_tree(".")
+        self.build_tree([u"\xA7"])
+        e = self.assertRaises(errors.BzrRenameFailedError,
+            tree.rename_one, u"\xA7", "b")
+        self.assertIsInstance(e.extra, errors.NotVersionedError)
+        self.assertEqual(e.extra.path, u"\xA7")
+
+    def test_rename_into_unversioned_non_ascii_dir(self):
+        """Check error when renaming into unversioned non-ascii directory"""
+        self.requireFeature(tests.UnicodeFilename)
+        tree = self.make_branch_and_tree(".")
+        self.build_tree(["a", u"\xA7/"])
+        tree.add(["a"])
+        e = self.assertRaises(errors.BzrMoveFailedError,
+            tree.rename_one, "a", u"\xA7/a")
+        self.assertIsInstance(e.extra, errors.NotVersionedError)
+        self.assertEqual(e.extra.path, u"\xA7")
+
+    def test_rename_over_already_versioned_non_ascii(self):
+        """Check error renaming over an already versioned non-ascii file"""
+        self.requireFeature(tests.UnicodeFilename)
+        tree = self.make_branch_and_tree(".")
+        self.build_tree(["a", u"\xA7"])
+        tree.add(["a", u"\xA7"])
+        e = self.assertRaises(errors.BzrMoveFailedError,
+            tree.rename_one, "a", u"\xA7")
+        self.assertIsInstance(e.extra, errors.AlreadyVersionedError)
+        self.assertEqual(e.extra.path, u"\xA7")
+
+    def test_rename_after_non_existant_non_ascii(self):
+        """Check error renaming after move with missing non-ascii file"""
+        self.requireFeature(tests.UnicodeFilename)
+        tree = self.make_branch_and_tree(".")
+        self.build_tree(["a"])
+        tree.add(["a"])
+        e = self.assertRaises(errors.BzrMoveFailedError,
+            tree.rename_one, "a", u"\xA7", after=True)
+        self.assertIsInstance(e.extra, errors.NoSuchFile)
+        self.assertEqual(e.extra.path, u"\xA7")

=== modified file 'bzrlib/workingtree.py'
--- a/bzrlib/workingtree.py	2011-01-25 16:48:24 +0000
+++ b/bzrlib/workingtree.py	2011-01-26 20:02:52 +0000
@@ -1384,7 +1384,7 @@
         to_dir_id = inv.path2id(to_dir)
         if to_dir_id is None:
             raise errors.BzrMoveFailedError('',to_dir,
-                errors.NotVersionedError(path=str(to_dir)))
+                errors.NotVersionedError(path=to_dir))
 
         to_dir_ie = inv[to_dir_id]
         if to_dir_ie.kind != 'directory':
@@ -1397,7 +1397,7 @@
             from_id = inv.path2id(from_rel)
             if from_id is None:
                 raise errors.BzrMoveFailedError(from_rel,to_dir,
-                    errors.NotVersionedError(path=str(from_rel)))
+                    errors.NotVersionedError(path=from_rel))
 
             from_entry = inv[from_id]
             from_parent_id = from_entry.parent_id
@@ -1445,17 +1445,17 @@
             # check the inventory for source and destination
             if from_id is None:
                 raise errors.BzrMoveFailedError(from_rel,to_rel,
-                    errors.NotVersionedError(path=str(from_rel)))
+                    errors.NotVersionedError(path=from_rel))
             if to_id is not None:
                 raise errors.BzrMoveFailedError(from_rel,to_rel,
-                    errors.AlreadyVersionedError(path=str(to_rel)))
+                    errors.AlreadyVersionedError(path=to_rel))
 
             # try to determine the mode for rename (only change inv or change
             # inv and file system)
             if after:
                 if not self.has_filename(to_rel):
                     raise errors.BzrMoveFailedError(from_id,to_rel,
-                        errors.NoSuchFile(path=str(to_rel),
+                        errors.NoSuchFile(path=to_rel,
                         extra="New file has not been created yet"))
                 only_change_inv = True
             elif not self.has_filename(from_rel) and self.has_filename(to_rel):
@@ -1563,7 +1563,7 @@
             from_id = basis_tree.path2id(from_rel)
             if from_id is None:
                 raise errors.BzrRenameFailedError(from_rel,to_rel,
-                    errors.NotVersionedError(path=str(from_rel)))
+                    errors.NotVersionedError(path=from_rel))
             # put entry back in the inventory so we can rename it
             from_entry = basis_tree.inventory[from_id].copy()
             inv.add(from_entry)
@@ -1587,7 +1587,7 @@
         # versioned
         if to_dir_id is None:
             raise errors.BzrMoveFailedError(from_rel,to_rel,
-                errors.NotVersionedError(path=str(to_dir)))
+                errors.NotVersionedError(path=to_dir))
 
         # all checks done. now we can continue with our actual work
         mutter('rename_one:\n'

=== modified file 'doc/en/release-notes/bzr-2.4.txt'
--- a/doc/en/release-notes/bzr-2.4.txt	2011-01-25 13:59:32 +0000
+++ b/doc/en/release-notes/bzr-2.4.txt	2011-01-26 20:07:50 +0000
@@ -54,6 +54,10 @@
 * ``bzr pull`` will now exit with exit code 1 if there were tag conflicts.
   (Jelmer Vernooij, #213185)
 
+* ``bzr mv`` user errors no longer throw UnicodeEncodeError with non-ascii
+  paths, however they may still print junk if not on a UTF-8 terminal.
+  (Martin [gz], #707954)
+
 * ``bzr serve`` no longer crashes when a server_started hook is installed and
   IPv6 support is available on the system. (Jelmer Vernooij, #293697)
 




More information about the bazaar-commits mailing list