commit f42509955901bbc81284b5141cf272a1f6c6ad4c (HEAD, refs/remotes/origin/master) Author: Eli Zaretskii Date: Sat Sep 7 10:14:31 2019 +0300 Revert "file-truename now uses realpath for local files" This reverts commit a59839d7556ef85058e09b005f0ff32e59b20ec3. This commit broke the MS-Windows build (because there's no realpath on MS-Windows). Even if I change the implementation to always signal an error on MS-Windows, the build fails. diff --git a/lisp/files.el b/lisp/files.el index d32c6acb82..ce4dd99bd5 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -1307,14 +1307,9 @@ 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. - (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))) + (if handler + (setq filename (funcall handler 'file-truename filename) + done t) (let ((dir (or (file-name-directory filename) default-directory)) target dirfile) ;; Get the truename of the directory. diff --git a/src/fileio.c b/src/fileio.c index adf2f3d970..968a55e595 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -20,7 +20,6 @@ along with GNU Emacs. If not, see . */ #include #include #include -#include #include "sysstdio.h" #include #include @@ -2694,46 +2693,6 @@ file_name_absolute_p (char const *filename) && (!filename[1] || IS_DIRECTORY_SEP (filename[1]) || user_homedir (&filename[1])))); } - -DEFUN ("fileio--truename", Ffileio__truename, Sfileio__truename, 1, 1, 0, - doc: /* Return the true name of FILENAME, without file name handlers. - -The returned string is an absolute file name that does not involve -\".\", \"..\", or symbolic links. Signal an error if FILENAME does -not exist or if its true name cannot be determined. */) - (Lisp_Object filename) -{ - CHECK_STRING (filename); - Lisp_Object absname = Fexpand_file_name (filename, Qnil); - Lisp_Object encoded_absname = ENCODE_FILE (absname); - ptrdiff_t encoded_len = SBYTES (encoded_absname); - char *encoded = SSDATA (encoded_absname); - bool append_slash = (1 < encoded_len - && IS_DIRECTORY_SEP (encoded[encoded_len - 1]) - && !IS_DIRECTORY_SEP (encoded[encoded_len - 2])); - char *truename = realpath (encoded, NULL); - if (!truename) - report_file_error ("Deriving truename", filename); - ptrdiff_t truename_len = strlen (truename); - if (truename_len == encoded_len - append_slash - && memcmp (truename, encoded, truename_len) == 0) - { - /* ABSNAME is already the true name. */ - xfree (truename); - return absname; - } - else - { - if (append_slash) - { - truename = xrealloc (truename, truename_len + 2); - strcpy (truename + truename_len, "/"); - } - Lisp_Object unibyte_truename = build_unibyte_string (truename); - xfree (truename); - return DECODE_FILE (unibyte_truename); - } -} DEFUN ("file-exists-p", Ffile_exists_p, Sfile_exists_p, 1, 1, 0, doc: /* Return t if file FILENAME exists (whether or not you can read it). @@ -6469,7 +6428,6 @@ This includes interactive calls to `delete-file' and defsubr (&Sadd_name_to_file); defsubr (&Smake_symbolic_link); defsubr (&Sfile_name_absolute_p); - defsubr (&Sfileio__truename); defsubr (&Sfile_exists_p); defsubr (&Sfile_executable_p); defsubr (&Sfile_readable_p); commit a59839d7556ef85058e09b005f0ff32e59b20ec3 Author: Paul Eggert Date: Fri Sep 6 14:30:33 2019 -0700 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. diff --git a/lisp/files.el b/lisp/files.el index ce4dd99bd5..d32c6acb82 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. diff --git a/src/fileio.c b/src/fileio.c index 968a55e595..adf2f3d970 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -20,6 +20,7 @@ along with GNU Emacs. If not, see . */ #include #include #include +#include #include "sysstdio.h" #include #include @@ -2693,6 +2694,46 @@ file_name_absolute_p (char const *filename) && (!filename[1] || IS_DIRECTORY_SEP (filename[1]) || user_homedir (&filename[1])))); } + +DEFUN ("fileio--truename", Ffileio__truename, Sfileio__truename, 1, 1, 0, + doc: /* Return the true name of FILENAME, without file name handlers. + +The returned string is an absolute file name that does not involve +\".\", \"..\", or symbolic links. Signal an error if FILENAME does +not exist or if its true name cannot be determined. */) + (Lisp_Object filename) +{ + CHECK_STRING (filename); + Lisp_Object absname = Fexpand_file_name (filename, Qnil); + Lisp_Object encoded_absname = ENCODE_FILE (absname); + ptrdiff_t encoded_len = SBYTES (encoded_absname); + char *encoded = SSDATA (encoded_absname); + bool append_slash = (1 < encoded_len + && IS_DIRECTORY_SEP (encoded[encoded_len - 1]) + && !IS_DIRECTORY_SEP (encoded[encoded_len - 2])); + char *truename = realpath (encoded, NULL); + if (!truename) + report_file_error ("Deriving truename", filename); + ptrdiff_t truename_len = strlen (truename); + if (truename_len == encoded_len - append_slash + && memcmp (truename, encoded, truename_len) == 0) + { + /* ABSNAME is already the true name. */ + xfree (truename); + return absname; + } + else + { + if (append_slash) + { + truename = xrealloc (truename, truename_len + 2); + strcpy (truename + truename_len, "/"); + } + Lisp_Object unibyte_truename = build_unibyte_string (truename); + xfree (truename); + return DECODE_FILE (unibyte_truename); + } +} DEFUN ("file-exists-p", Ffile_exists_p, Sfile_exists_p, 1, 1, 0, doc: /* Return t if file FILENAME exists (whether or not you can read it). @@ -6428,6 +6469,7 @@ This includes interactive calls to `delete-file' and defsubr (&Sadd_name_to_file); defsubr (&Smake_symbolic_link); defsubr (&Sfile_name_absolute_p); + defsubr (&Sfileio__truename); defsubr (&Sfile_exists_p); defsubr (&Sfile_executable_p); defsubr (&Sfile_readable_p); commit 5b117511aa1b5c451773891b505a7098a67f9532 Author: Mauro Aranda Date: Wed Aug 28 08:29:57 2019 -0300 Improve file name completion in file and directory widgets (Bug#7779) * lisp/wid-edit.el (widget 'file, widget 'directory): Respect the option read-file-name-completion-ignore-case. (widget 'directory): Filter the file names, to only perform directory name completion. diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el index fdc16299c8..9bc7a076ee 100644 --- a/lisp/wid-edit.el +++ b/lisp/wid-edit.el @@ -3083,7 +3083,9 @@ as the value." (define-widget 'file 'string "A file widget. It reads a file name from an editable text field." - :completions #'completion-file-name-table + :completions (completion-table-case-fold + #'completion-file-name-table + (not read-file-name-completion-ignore-case)) :prompt-value 'widget-file-prompt-value :format "%{%t%}: %v" ;; Doesn't work well with terminating newline. @@ -3118,6 +3120,11 @@ It reads a file name from an editable text field." (define-widget 'directory 'file "A directory widget. It reads a directory name from an editable text field." + :completions (apply-partially #'completion-table-with-predicate + (completion-table-case-fold + #'completion-file-name-table + (not read-file-name-completion-ignore-case)) + #'directory-name-p 'strict) :tag "Directory") (defvar widget-symbol-prompt-value-history nil