diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2019-09-06 14:30:33 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2019-09-06 14:31:38 -0700 |
commit | a59839d7556ef85058e09b005f0ff32e59b20ec3 (patch) | |
tree | 7e4eb3909246dde8efdcaecd77cfd41e75b93593 /lisp/files.el | |
parent | 5b117511aa1b5c451773891b505a7098a67f9532 (diff) | |
download | emacs-a59839d7556ef85058e09b005f0ff32e59b20ec3.tar.gz |
file-truename now uses realpath for local files
This uses fewer syscalls on GNU/Linux and other GNUish platforms.
* lisp/files.el (file-truename): Try fileio--truename
if there are no handlers.
* src/fileio.c: Include stdlib.h, for realpath.
(Ffileio__truename): New function.
Diffstat (limited to 'lisp/files.el')
-rw-r--r-- | lisp/files.el | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/lisp/files.el b/lisp/files.el index ce4dd99bd53..d32c6acb82c 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -1307,9 +1307,14 @@ containing it, until no links are left at any level. (let ((handler (find-file-name-handler filename 'file-truename))) ;; For file name that has a special handler, call handler. ;; This is so that ange-ftp can save time by doing a no-op. - (if handler - (setq filename (funcall handler 'file-truename filename) - done t) + (or + (if handler + (setq filename (funcall handler 'file-truename filename) + done t) + (condition-case nil + (setq filename (fileio--truename filename) + done t) + (file-missing nil))) (let ((dir (or (file-name-directory filename) default-directory)) target dirfile) ;; Get the truename of the directory. |