From 8a336f4b925d942ca3dad309c178cb1fdbb2e661 Mon Sep 17 00:00:00 2001 From: Philipp Wolfer Date: Thu, 4 Dec 2014 13:30:05 +0100 Subject: [PATCH 1/2] Fixed renaming paths starting with "[a-z]:" being interpreted as drive names on Windows. Fixes PICARD-663 --- picard/util/__init__.py | 7 +++++-- test/test_utils.py | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/picard/util/__init__.py b/picard/util/__init__.py index 56a80f2a3..294e11064 100644 --- a/picard/util/__init__.py +++ b/picard/util/__init__.py @@ -134,8 +134,11 @@ def replace_win32_incompat(string, repl=u"_"): """Replace win32 filename incompatible characters from ``string`` by ``repl``.""" # Don't replace : with _ for windows drive - drive, rest = ntpath.splitdrive(string) - return drive + _re_win32_incompat.sub(repl, rest) + if os.path.isabs(string): + drive, rest = ntpath.splitdrive(string) + return drive + _re_win32_incompat.sub(repl, rest) + else: + return _re_win32_incompat.sub(repl, string) _re_non_alphanum = re.compile(r'\W+', re.UNICODE) diff --git a/test/test_utils.py b/test/test_utils.py index 28a49d737..64121d299 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -19,6 +19,8 @@ class ReplaceWin32IncompatTest(unittest.TestCase): "c:\\test\\d_/2") self.assertEqual(util.replace_win32_incompat("A\"*:<>?|b"), "A_______b") + self.assertEqual(util.replace_win32_incompat("d:test"), + "d_test") def test_incorrect(self): self.assertNotEqual(util.replace_win32_incompat("c:\\test\\te\"st2"), From 3b49da91094045cd118387bbd61fe35f774eda7e Mon Sep 17 00:00:00 2001 From: Philipp Wolfer Date: Fri, 5 Dec 2014 17:25:12 +0100 Subject: [PATCH 2/2] Split the drive in replace_win32_incompat only on win32. Also updated the tests, since this is now platform dependent. --- picard/util/__init__.py | 2 +- test/test_utils.py | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/picard/util/__init__.py b/picard/util/__init__.py index 294e11064..3c3958f65 100644 --- a/picard/util/__init__.py +++ b/picard/util/__init__.py @@ -134,7 +134,7 @@ def replace_win32_incompat(string, repl=u"_"): """Replace win32 filename incompatible characters from ``string`` by ``repl``.""" # Don't replace : with _ for windows drive - if os.path.isabs(string): + if sys.platform == "win32" and os.path.isabs(string): drive, rest = ntpath.splitdrive(string) return drive + _re_win32_incompat.sub(repl, rest) else: diff --git a/test/test_utils.py b/test/test_utils.py index 64121d299..51801fe61 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import os.path +import sys import unittest from picard import util @@ -12,15 +13,25 @@ if '_' not in __builtin__.__dict__: class ReplaceWin32IncompatTest(unittest.TestCase): - def test_correct(self): + @unittest.skipUnless(sys.platform == "win32", "windows test") + def test_correct_absolute_win32(self): self.assertEqual(util.replace_win32_incompat("c:\\test\\te\"st/2"), "c:\\test\\te_st/2") self.assertEqual(util.replace_win32_incompat("c:\\test\\d:/2"), "c:\\test\\d_/2") + + @unittest.skipUnless(sys.platform != "win32", "non-windows test") + def test_correct_absolute_non_win32(self): + self.assertEqual(util.replace_win32_incompat("/test/te\"st/2"), + "/test/te_st/2") + self.assertEqual(util.replace_win32_incompat("/test/d:/2"), + "/test/d_/2") + + def test_correct_relative(self): self.assertEqual(util.replace_win32_incompat("A\"*:<>?|b"), "A_______b") - self.assertEqual(util.replace_win32_incompat("d:test"), - "d_test") + self.assertEqual(util.replace_win32_incompat("d:tes