From: Jason Rumney Date: Fri, 11 Jul 2008 23:08:07 +0000 (+0000) Subject: (file-truename): Get truename of ancestors if file does X-Git-Tag: emacs-pretest-23.0.90~4233 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=85d181e19e303653d64b04b825f48ade6e0a268e;p=emacs.git (file-truename): Get truename of ancestors if file does not exist on Windows. --- diff --git a/lisp/files.el b/lisp/files.el index cb9720dc702..06d00446eb2 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -859,8 +859,19 @@ containing it, until no links are left at any level. (setq filename (funcall handler 'file-truename filename)) ;; If filename contains a wildcard, newname will be the old name. (unless (string-match "[[*?]" filename) - ;; If filename exists, use the long name - (setq filename (or (w32-long-file-name filename) filename)))) + ;; If filename exists, use the long name. If it doesn't exist, + ;; drill down until we find a directory that exists, and use + ;; the long name of that, with the extra non-existent path + ;; components concatenated. + (let ((longname (w32-long-file-name filename)) + missing rest) + (if longname + (setq filename longname) + ;; include the preceding directory separator in the missing + ;; part so subsequent recursion on the rest works. + (setq missing (concat "/" (file-name-nondirectory filename))) + (setq rest (substring filename 0 (* -1 (length missing)))) + (setq filename (concat (file-truename rest) missing)))))) (setq done t))) ;; If this file directly leads to a link, process that iteratively