Ensure the 'base' argument to abspath_expanduser_unicode takes effect on Windows...
authorDaira Hopwood <daira@jacaranda.org>
Tue, 21 Apr 2015 20:03:45 +0000 (21:03 +0100)
committerDaira Hopwood <daira@jacaranda.org>
Tue, 21 Apr 2015 20:04:20 +0000 (21:04 +0100)
Signed-off-by: Daira Hopwood <daira@jacaranda.org>
src/allmydata/test/test_util.py
src/allmydata/util/fileutil.py

index 4ba13a139a6ef3fc365711cd9aa618e7dfffb918..6c67fcc5fda1fdb1250523cd3f8e4891811d46c9 100644 (file)
@@ -487,7 +487,25 @@ class FileUtil(ReallyEqualMixin, unittest.TestCase):
 
         # adapted from <http://svn.python.org/view/python/branches/release26-maint/Lib/test/test_posixpath.py?view=markup&pathrev=78279#test_abspath>
 
-        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']
index 74132733169f306f8feb668f565d547f9b6f4df9..4dd501ce82a505eaf8cb16b4d14aa218dae655a9 100644 (file)
@@ -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 <http://bugs.python.org/issue1669539>.
         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