]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix regression in expand-file-name with drive-relative HOME
authorEli Zaretskii <eliz@gnu.org>
Wed, 12 Dec 2018 16:27:05 +0000 (18:27 +0200)
committerEli Zaretskii <eliz@gnu.org>
Wed, 12 Dec 2018 16:27:05 +0000 (18:27 +0200)
* src/fileio.c (get_homedir) [DOS_NT]: Expand drive-relative
$HOME to begin with "X:/".

* test/src/fileio-tests.el (fileio-tests--relative-HOME): Add
testing of drive-relative value of $HOME on MS-Windows and
MS-DOS.

src/fileio.c
test/src/fileio-tests.el

index d9795715f9e440813accff5ead8379bee8a7fb44..687f6ec7452d679e71e5ede6c6703bef48d49ef2 100644 (file)
@@ -1692,6 +1692,34 @@ get_homedir (void)
       if (!home)
        return "";
     }
+#ifdef DOS_NT
+  /* If home is a drive-relative directory, expand it.  */
+  if (IS_DRIVE (*home)
+      && IS_DEVICE_SEP (home[1])
+      && !IS_DIRECTORY_SEP (home[2]))
+    {
+# ifdef WINDOWSNT
+      static char hdir[MAX_UTF8_PATH];
+# else
+      static char hdir[MAXPATHLEN];
+# endif
+      if (!getdefdir (c_toupper (*home) - 'A' + 1, hdir))
+       {
+         hdir[0] = c_toupper (*home);
+         hdir[1] = ':';
+         hdir[2] = '/';
+         hdir[3] = '\0';
+       }
+      if (home[2])
+       {
+         size_t homelen = strlen (hdir);
+         if (!IS_DIRECTORY_SEP (hdir[homelen - 1]))
+           strcat (hdir, "/");
+         strcat (hdir, home + 2);
+       }
+      home = hdir;
+    }
+#endif
   if (IS_ABSOLUTE_FILE_NAME (home))
     return home;
   if (!emacs_wd)
index b7b78bbda0910c9572833c699b09ef46535eea32..a74bcea41f2c416ed317431db94313a6801d1c49 100644 (file)
@@ -102,4 +102,8 @@ Also check that an encoding error can appear in a symlink."
     (setenv "HOME" "a/b/c")
     (should (equal (expand-file-name "~/foo")
                    (expand-file-name "a/b/c/foo")))
+    (when (memq system-type '(ms-dos windows-nt))
+      ;; Test expansion of drive-relative file names.
+      (setenv "HOME" "x:foo")
+      (should (equal (expand-file-name "~/bar") "x:/foo/bar")))
     (setenv "HOME" old-home)))