From 397139ad0330cdc90c2105acb32622c5f893363e Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Fri, 23 Oct 2015 21:58:39 +0100 Subject: [PATCH] Add long_path=False option to abspath_expanduser_unicode. Signed-off-by: Daira Hopwood --- src/allmydata/test/test_util.py | 17 +++++++++++++++++ src/allmydata/util/encodingutil.py | 4 ++-- src/allmydata/util/fileutil.py | 5 +++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/allmydata/test/test_util.py b/src/allmydata/test/test_util.py index 4b7354e9..c91c8503 100644 --- a/src/allmydata/test/test_util.py +++ b/src/allmydata/test/test_util.py @@ -528,12 +528,14 @@ class FileUtil(ReallyEqualMixin, unittest.TestCase): saved_cwd = os.path.normpath(os.getcwdu()) abspath_cwd = fileutil.abspath_expanduser_unicode(u".") + abspath_cwd_notlong = fileutil.abspath_expanduser_unicode(u".", long_path=False) self.failUnless(isinstance(saved_cwd, unicode), saved_cwd) self.failUnless(isinstance(abspath_cwd, unicode), abspath_cwd) if sys.platform == "win32": self.failUnlessReallyEqual(abspath_cwd, fileutil.to_windows_long_path(saved_cwd)) else: self.failUnlessReallyEqual(abspath_cwd, saved_cwd) + self.failUnlessReallyEqual(abspath_cwd_notlong, saved_cwd) self.failUnlessReallyEqual(fileutil.to_windows_long_path(u"\\\\?\\foo"), u"\\\\?\\foo") self.failUnlessReallyEqual(fileutil.to_windows_long_path(u"\\\\.\\foo"), u"\\\\.\\foo") @@ -562,7 +564,19 @@ class FileUtil(ReallyEqualMixin, unittest.TestCase): self.failUnlessReallyEqual(baz[4], bar[4]) # same drive + baz_notlong = fileutil.abspath_expanduser_unicode(u"\\baz", long_path=False) + self.failIf(baz_notlong.startswith(u"\\\\?\\"), baz_notlong) + self.failUnlessReallyEqual(baz_notlong[1 :], u":\\baz") + + bar_notlong = fileutil.abspath_expanduser_unicode(u"\\bar", base=baz, long_path=False) + self.failIf(bar_notlong.startswith(u"\\\\?\\"), bar_notlong) + self.failUnlessReallyEqual(bar_notlong[1 :], u":\\bar") + # not u":\\baz\\bar", because \bar is absolute on the current drive. + + self.failUnlessReallyEqual(baz_notlong[0], bar_notlong[0]) # same drive + self.failIfIn(u"~", fileutil.abspath_expanduser_unicode(u"~")) + self.failIfIn(u"~", fileutil.abspath_expanduser_unicode(u"~", long_path=False)) cwds = ['cwd'] try: @@ -578,6 +592,9 @@ class FileUtil(ReallyEqualMixin, unittest.TestCase): for upath in (u'', u'fuu', u'f\xf9\xf9', u'/fuu', u'U:\\', u'~'): uabspath = fileutil.abspath_expanduser_unicode(upath) self.failUnless(isinstance(uabspath, unicode), uabspath) + + uabspath_notlong = fileutil.abspath_expanduser_unicode(upath, long_path=False) + self.failUnless(isinstance(uabspath_notlong, unicode), uabspath_notlong) finally: os.chdir(saved_cwd) diff --git a/src/allmydata/util/encodingutil.py b/src/allmydata/util/encodingutil.py index f97c4822..e18b854f 100644 --- a/src/allmydata/util/encodingutil.py +++ b/src/allmydata/util/encodingutil.py @@ -96,7 +96,7 @@ def argv_to_unicode(s): raise usage.UsageError("Argument %s cannot be decoded as %s." % (quote_output(s), io_encoding)) -def argv_to_abspath(s): +def argv_to_abspath(s, long_path=True): """ Convenience function to decode an argv element to an absolute path, with ~ expanded. If this fails, raise a UsageError. @@ -105,7 +105,7 @@ def argv_to_abspath(s): if decoded.startswith(u'-'): raise usage.UsageError("Path argument %s cannot start with '-'.\nUse %s if you intended to refer to a file." % (quote_output(s), quote_output(os.path.join('.', s)))) - return abspath_expanduser_unicode(decoded) + return abspath_expanduser_unicode(decoded, long_path=long_path) def unicode_to_argv(s, mangle=False): """ diff --git a/src/allmydata/util/fileutil.py b/src/allmydata/util/fileutil.py index 8194fcd4..6449ff1e 100644 --- a/src/allmydata/util/fileutil.py +++ b/src/allmydata/util/fileutil.py @@ -276,13 +276,14 @@ try: except ImportError: pass -def abspath_expanduser_unicode(path, base=None): +def abspath_expanduser_unicode(path, base=None, long_path=True): """ Return the absolute version of a path. If 'base' is given and 'path' is relative, the path will be expanded relative to 'base'. 'path' must be a Unicode string. 'base', if given, must be a Unicode string corresponding to an absolute path as returned by a previous call to abspath_expanduser_unicode. + On Windows, the result will be a long path unless long_path is given as False. """ if not isinstance(path, unicode): raise AssertionError("paths must be Unicode strings") @@ -313,7 +314,7 @@ def abspath_expanduser_unicode(path, base=None): # there is always at least one Unicode path component. path = os.path.normpath(path) - if sys.platform == "win32": + if sys.platform == "win32" and long_path: path = to_windows_long_path(path) return path -- 2.37.2