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