From: Daira Hopwood Date: Tue, 21 Apr 2015 20:03:45 +0000 (+0100) Subject: Ensure the 'base' argument to abspath_expanduser_unicode takes effect on Windows... X-Git-Tag: allmydata-tahoe-1.10.1a1~36 X-Git-Url: https://git.rkrishnan.org/%5B/%5D%20/uri/%22file:/using.html?a=commitdiff_plain;h=eb34e0d62574e77ccc49cfd79eea19b89fa5032a;p=tahoe-lafs%2Ftahoe-lafs.git Ensure the 'base' argument to abspath_expanduser_unicode takes effect on Windows. fixes #2398 Signed-off-by: Daira Hopwood --- diff --git a/src/allmydata/test/test_util.py b/src/allmydata/test/test_util.py index 4ba13a13..6c67fcc5 100644 --- a/src/allmydata/test/test_util.py +++ b/src/allmydata/test/test_util.py @@ -487,7 +487,25 @@ class FileUtil(ReallyEqualMixin, unittest.TestCase): # adapted from - self.failUnlessIn(u"foo", fileutil.abspath_expanduser_unicode(u"foo")) + foo = fileutil.abspath_expanduser_unicode(u"foo") + self.failUnless(foo.endswith(u"\\foo"), foo) + + foobar = fileutil.abspath_expanduser_unicode(u"bar", base=foo) + self.failUnless(foobar.endswith(u"\\foo\\bar"), foobar) + + if sys.platform == "win32": + # This is checking that a drive letter is added for a path without one. + baz = fileutil.abspath_expanduser_unicode(u"\\baz") + self.failUnless(baz.startswith(u"\\\\?\\"), baz) + self.failUnlessReallyEqual(baz[5 :], u":\\baz") + + bar = fileutil.abspath_expanduser_unicode(u"\\bar", base=baz) + self.failUnless(bar.startswith(u"\\\\?\\"), bar) + self.failUnlessReallyEqual(bar[5 :], u":\\bar") + # not u":\\baz\\bar", because \bar is absolute on the current drive. + + self.failUnlessReallyEqual(baz[4], bar[4]) # same drive + self.failIfIn(u"~", fileutil.abspath_expanduser_unicode(u"~")) cwds = ['cwd'] diff --git a/src/allmydata/util/fileutil.py b/src/allmydata/util/fileutil.py index 74132733..4dd501ce 100644 --- a/src/allmydata/util/fileutil.py +++ b/src/allmydata/util/fileutil.py @@ -318,10 +318,14 @@ def abspath_expanduser_unicode(path, base=None): path = expanduser(path) if _getfullpathname: - # On Windows, os.path.isabs will return True for paths without a drive letter, + # On Windows, os.path.isabs will incorrectly return True + # for paths without a drive letter (that are not UNC paths), # e.g. "\\". See . try: - path = _getfullpathname(path or u".") + if base is None: + path = _getfullpathname(path or u".") + else: + path = _getfullpathname(os.path.join(base, path)) except OSError: pass