From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Alan Mackenzie Newsgroups: gmane.emacs.bugs Subject: bug#28691: [PATCH] Add file name handler support for 'make-process' (Bug#28691) Date: 18 Dec 2018 01:57:23 -0000 Organization: muc.de e.V. Message-ID: <20181218015723.4032.qmail@mail.muc.de> References: NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Trace: blaine.gmane.org 1545098169 31934 195.159.176.226 (18 Dec 2018 01:56:09 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Tue, 18 Dec 2018 01:56:09 +0000 (UTC) User-Agent: tin/2.4.2-20171224 ("Lochhead") (UNIX) (FreeBSD/11.2-RELEASE-p4 (amd64)) Cc: 28691@debbugs.gnu.org To: Philipp Stephani Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Tue Dec 18 02:56:05 2018 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gZ4c7-00089x-E5 for geb-bug-gnu-emacs@m.gmane.org; Tue, 18 Dec 2018 02:56:03 +0100 Original-Received: from localhost ([::1]:50969 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gZ4eE-0007yW-Av for geb-bug-gnu-emacs@m.gmane.org; Mon, 17 Dec 2018 20:58:14 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:44827) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gZ4e6-0007yQ-Rt for bug-gnu-emacs@gnu.org; Mon, 17 Dec 2018 20:58:08 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gZ4e2-0004gS-Mh for bug-gnu-emacs@gnu.org; Mon, 17 Dec 2018 20:58:06 -0500 Original-Received: from debbugs.gnu.org ([208.118.235.43]:48157) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gZ4e2-0004fp-Hr for bug-gnu-emacs@gnu.org; Mon, 17 Dec 2018 20:58:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1gZ4e2-0005EF-6t for bug-gnu-emacs@gnu.org; Mon, 17 Dec 2018 20:58:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Alan Mackenzie Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 18 Dec 2018 01:58:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 28691 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 28691-submit@debbugs.gnu.org id=B28691.154509824820057 (code B ref 28691); Tue, 18 Dec 2018 01:58:02 +0000 Original-Received: (at 28691) by debbugs.gnu.org; 18 Dec 2018 01:57:28 +0000 Original-Received: from localhost ([127.0.0.1]:52415 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gZ4dT-0005DR-EP for submit@debbugs.gnu.org; Mon, 17 Dec 2018 20:57:27 -0500 Original-Received: from colin.muc.de ([193.149.48.1]:12749 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1gZ4dQ-0005DH-KI for 28691@debbugs.gnu.org; Mon, 17 Dec 2018 20:57:25 -0500 Original-Received: (qmail 4034 invoked by uid 3782); 18 Dec 2018 01:57:23 -0000 In-Reply-To: X-Newsgroups: gnu.emacs.bug X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:153545 Archived-At: Hello, Philipp, I hope I'm not late to the party, here, but.... What is this patch about, and what is it for? In article you wrote= : > * src/process.c (Fmake_process): Add new keyword argument > ':file-handler'. > (syms_of_process) : Define new symbols. > * lisp/files.el (file-name-non-special): Add support for > 'make-process'. > * test/src/process-tests.el (make-process/file-handler/found) > (make-process/file-handler/not-found) > (make-process/file-handler/disable): New unit tests. > (process-tests--file-handler): New helper function. > * test/lisp/files-tests.el > (files-tests-file-name-non-special-make-process): New unit test. > * doc/lispref/files.texi (Magic File Names): Document that > 'make-process' can invoke file name handlers. > * doc/lispref/processes.texi (Asynchronous Processes): Document > ':file-handlers' argument to 'make-process'. > --- > doc/lispref/files.texi | 2 ++ > doc/lispref/processes.texi | 10 ++++++-- > etc/NEWS | 5 ++++ > lisp/files.el | 11 +++++++-- > src/process.c | 17 +++++++++++++ > test/lisp/files-tests.el | 10 ++++++++ > test/src/process-tests.el | 49 ++++++++++++++++++++++++++++++++++++++ > 7 files changed, 100 insertions(+), 4 deletions(-) > diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi > index b795864815..00e7fc1841 100644 > --- a/doc/lispref/files.texi > +++ b/doc/lispref/files.texi > @@ -3171,6 +3171,7 @@ Magic File Names > @code{make-directory}, > @code{make-directory-internal}, > @code{make-nearby-temp-file}, > +@code{make-process}, > @code{make-symbolic-link},@* > @code{process-file}, > @code{rename-file}, @code{set-file-acl}, @code{set-file-modes}, > @@ -3227,6 +3228,7 @@ Magic File Names > @code{make-auto-save-file-name}, > @code{make-direc@discretionary{}{}{}tory}, > @code{make-direc@discretionary{}{}{}tory-internal}, > +@code{make-process}, > @code{make-symbolic-link}, > @code{process-file}, > @code{rename-file}, @code{set-file-acl}, @code{set-file-modes}, > diff --git a/doc/lispref/processes.texi b/doc/lispref/processes.texi > index d88c7fbe62..92dc9df22e 100644 > --- a/doc/lispref/processes.texi > +++ b/doc/lispref/processes.texi > @@ -696,6 +696,12 @@ Asynchronous Processes > created with @code{make-pipe-process}, described below. If > @var{stderr} is @code{nil}, standard error is mixed with standard > output, and both are sent to @var{buffer} or @var{filter}. > + > +@item :file-handler @var{file-handler} > +If @var{file-handler} is non-@code{nil}, then look for a file name > +handler for the current buffer's @code{default-directory}, and invoke > +that file handler to make the process. If there is no such handler, > +proceed as if @var{file-handler} were @code{nil}. > @end table Are we talking about a "file name handler" or a "file handler", here? Any chance of consistency? What is one of these? In what way does it "handle" the file, or the file name? What is the domain of the search which takes place? How is such a handler recognised? How is this handler "invoked"? What arguments does it take? Apologies if these things are already explained in nearby text. I haven't read any of the context beyond what's in the patch. > The original argument list, modified with the actual connection > @@ -704,8 +710,8 @@ Asynchronous Processes > The current working directory of the subprocess is set to the current > buffer's value of @code{default-directory} if that is local (as > determined by `unhandled-file-name-directory'), or "~" otherwise. If > -you want to run a process in a remote directory use > -@code{start-file-process}. > +you want to run a process in a remote directory, pass > +@code{:file-handler t} to @code{make-process}. > @end defun >=20=20 > @defun make-pipe-process &rest args > diff --git a/etc/NEWS b/etc/NEWS > index c88f6ef5ca..2987937064 100644 > --- a/etc/NEWS > +++ b/etc/NEWS > @@ -1407,6 +1407,11 @@ un-obsoleting it. > +++ > ** New function 'group-name' returns a group name corresponding to GID= . >=20=20 > +** 'make-process' now takes a keyword argument ':file-handler'; if > +that is non-nil, it will look for a file name handler for the current > +buffer's 'default-directory' and invoke that file handler to make the > +process. That way 'make-process' can start remote processes. > + > ^L > * Changes in Emacs 27.1 on Non-Free Operating Systems >=20=20 > diff --git a/lisp/files.el b/lisp/files.el > index fb6cf0193a..448df62710 100644 > --- a/lisp/files.el > +++ b/lisp/files.el > @@ -7103,7 +7103,8 @@ file-name-non-special > (default-directory > (if (memq operation > '(insert-directory process-file start-file-process > - shell-command temporary-file-di= rectory)) > + make-process shell-command > + temporary-file-directory)) > (directory-file-name > (expand-file-name > (unhandled-file-name-directory default-directory))) > @@ -7151,7 +7152,13 @@ file-name-non-special > ;; These file-notify-* operations take a > ;; descriptor. > (file-notify-rm-watch) > - (file-notify-valid-p))) > + (file-notify-valid-p) > + ;; `make-process' uses keyword arguments and > + ;; doesn't mangle its filenames in any way. > + ;; It already strips /: from the binary > + ;; filename, so we don't have to do this > + ;; here. > + (make-process))) > ;; For all other operations, treat the first > ;; argument only as the file name. > '(nil 0)))) > diff --git a/src/process.c b/src/process.c > index 8e0b2349f9..5895f77446 100644 > --- a/src/process.c > +++ b/src/process.c > @@ -1661,6 +1661,11 @@ to the standard error of subprocess. Specifying= this implies > `:connection-type' is set to `pipe'. If STDERR is nil, standard error > is mixed with standard output and sent to BUFFER or FILTER. >=20=20 > +:file-handler FILE-HANDLER -- If FILE-HANDLER is non-nil, then look > +for a file name handler for the current buffer's `default-directory' > +and invoke that file handler to make the process. If there is no > +such handler, proceed as if FILE-HANDLER were nil. > + Ditto. > usage: (make-process &rest ARGS) */) > (ptrdiff_t nargs, Lisp_Object *args) > { > @@ -1674,6 +1679,15 @@ usage: (make-process &rest ARGS) */) > /* Save arguments for process-contact and clone-process. */ > contact =3D Flist (nargs, args); >=20=20 > + if (!NILP (Fplist_get (contact, QCfile_handler))) > + { > + Lisp_Object file_handler > + =3D Ffind_file_name_handler (BVAR (current_buffer, directory), > + Qmake_process); > + if (!NILP (file_handler)) > + return CALLN (Fapply, file_handler, Qmake_process, contact); > + } > + > buffer =3D Fplist_get (contact, QCbuffer); > if (!NILP (buffer)) > buffer =3D Fget_buffer_create (buffer); > @@ -8098,6 +8112,8 @@ init_process_emacs (int sockfd) > void > syms_of_process (void) > { > + DEFSYM (Qmake_process, "make-process"); > + > #ifdef subprocesses >=20=20 > DEFSYM (Qprocessp, "processp"); > @@ -8138,6 +8154,7 @@ syms_of_process (void) > DEFSYM (Qreal, "real"); > DEFSYM (Qnetwork, "network"); > DEFSYM (Qserial, "serial"); > + DEFSYM (QCfile_handler, ":file-handler"); > DEFSYM (QCbuffer, ":buffer"); > DEFSYM (QChost, ":host"); > DEFSYM (QCservice, ":service"); > diff --git a/test/lisp/files-tests.el b/test/lisp/files-tests.el > index 3b192ee872..9d827e865d 100644 > --- a/test/lisp/files-tests.el > +++ b/test/lisp/files-tests.el > @@ -1109,6 +1109,16 @@ files-tests-file-attributes-equal > (with-temp-buffer > (write-region nil nil nospecial nil :visit)))) >=20=20 > +(ert-deftest files-tests-file-name-non-special-make-process () > + "Check that the =E2=80=98:file-handler=E2=80=99 argument of =E2=80=98= make-process=E2=80=99 > +works as expected if the default directory is quoted." > + (let ((default-directory (file-name-quote invocation-directory)) > + (program (file-name-quote > + (expand-file-name invocation-name invocation-directo= ry)))) > + (should (processp (make-process :name "name" > + :command (list program "--version"= ) > + :file-handler t))))) > + > (ert-deftest files-tests--insert-directory-wildcard-in-dir-p () > (let ((alist (list (cons "/home/user/*/.txt" (cons "/home/user/" "*/= .txt")) > (cons "/home/user/.txt" nil) > diff --git a/test/src/process-tests.el b/test/src/process-tests.el > index 551b34ff37..2e4be53185 100644 > --- a/test/src/process-tests.el > +++ b/test/src/process-tests.el > @@ -215,5 +215,54 @@ process-tests--mixable > (string-to-list "stdout\n") > (string-to-list "stderr\n")))))) >=20=20 > +(ert-deftest make-process/file-handler/found () > + "Check that the =E2=80=98:file-handler=E2=80=99 argument of =E2=80=98= make-process=E2=80=99 > +works as expected if a file handler is found." > + (let ((file-handler-calls 0)) > + (cl-flet ((file-handler > + (&rest args) > + (should (equal default-directory "test-handler:/dir/")) > + (should (equal args '(make-process :name "name" > + :command ("/bin/true= ") > + :file-handler t))) > + (cl-incf file-handler-calls) > + 'fake-process)) > + (let ((file-name-handler-alist (list (cons (rx bos "test-handler= :") > + #'file-handler))) > + (default-directory "test-handler:/dir/")) > + (should (eq (make-process :name "name" > + :command '("/bin/true") > + :file-handler t) > + 'fake-process)) > + (should (=3D file-handler-calls 1)))))) > + > +(ert-deftest make-process/file-handler/not-found () > + "Check that the =E2=80=98:file-handler=E2=80=99 argument of =E2=80=98= make-process=E2=80=99 > +works as expected if no file handler is found." > + (let ((file-name-handler-alist ()) > + (default-directory invocation-directory) > + (program (expand-file-name invocation-name invocation-director= y))) > + (should (processp (make-process :name "name" > + :command (list program "--version"= ) > + :file-handler t))))) > + > +(ert-deftest make-process/file-handler/disable () > + "Check =E2=80=98make-process=E2=80=99 works as expected if it should= n=E2=80=99t use the > +file handler." > + (let ((file-name-handler-alist (list (cons (rx bos "test-handler:") > + #'process-tests--file-han= dler))) > + (default-directory "test-handler:/dir/") > + (program (expand-file-name invocation-name invocation-director= y))) > + (should (processp (make-process :name "name" > + :command (list program "--version"= )))))) > + > +(defun process-tests--file-handler (operation &rest _args) > + (cl-ecase operation > + (unhandled-file-name-directory "/") > + (make-process (ert-fail "file handler called unexpectedly")))) > + > +(put #'process-tests--file-handler 'operations > + '(unhandled-file-name-directory make-process)) > + > (provide 'process-tests) > ;; process-tests.el ends here. > --=20 > 2.20.0.405.gbc1bbc6f85-goog --=20 Alan Mackenzie (Nuremberg, Germany).