summaryrefslogtreecommitdiff
path: root/lisp/files.el
diff options
context:
space:
mode:
authorJason Rumney <jasonr@gnu.org>2008-07-11 23:08:07 +0000
committerJason Rumney <jasonr@gnu.org>2008-07-11 23:08:07 +0000
commit85d181e19e303653d64b04b825f48ade6e0a268e (patch)
treec711967578a6068703d313b1a1807468c37ed287 /lisp/files.el
parent0c8b58e9f7f4c197fc79df247e98fc163b6339c1 (diff)
downloademacs-85d181e19e303653d64b04b825f48ade6e0a268e.tar.gz
(file-truename): Get truename of ancestors if file does
not exist on Windows.
Diffstat (limited to 'lisp/files.el')
-rw-r--r--lisp/files.el15
1 files changed, 13 insertions, 2 deletions
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