From mboxrd@z Thu Jan 1 00:00:00 1970
Path: news.gmane.org!.POSTED!not-for-mail
From: Philipp Stephani
Newsgroups: gmane.emacs.bugs
Subject: bug#28691: [PATCH] Add file name handler support for 'make-process'
(Bug#28691)
Date: Mon, 17 Dec 2018 21:47:46 +0100
Message-ID: <20181217204746.53492-1-phst@google.com>
References: <8336qwdixp.fsf@gnu.org>
NNTP-Posting-Host: blaine.gmane.org
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Trace: blaine.gmane.org 1545079632 7848 195.159.176.226 (17 Dec 2018 20:47:12 GMT)
X-Complaints-To: usenet@blaine.gmane.org
NNTP-Posting-Date: Mon, 17 Dec 2018 20:47:12 +0000 (UTC)
Cc: Philipp Stephani , 28691@debbugs.gnu.org
To: eliz@gnu.org
Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Dec 17 21:47:07 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 1gYzn9-0001wt-AL
for geb-bug-gnu-emacs@m.gmane.org; Mon, 17 Dec 2018 21:47:07 +0100
Original-Received: from localhost ([::1]:49481 helo=lists.gnu.org)
by lists.gnu.org with esmtp (Exim 4.71)
(envelope-from )
id 1gYzpF-0005Uq-U8
for geb-bug-gnu-emacs@m.gmane.org; Mon, 17 Dec 2018 15:49:17 -0500
Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:51248)
by lists.gnu.org with esmtp (Exim 4.71)
(envelope-from ) id 1gYzp4-0005T0-18
for bug-gnu-emacs@gnu.org; Mon, 17 Dec 2018 15:49:07 -0500
Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
(envelope-from ) id 1gYzp0-0004SP-Qt
for bug-gnu-emacs@gnu.org; Mon, 17 Dec 2018 15:49:06 -0500
Original-Received: from debbugs.gnu.org ([208.118.235.43]:48028)
by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16)
(Exim 4.71) (envelope-from )
id 1gYzp0-0004RY-Ky
for bug-gnu-emacs@gnu.org; Mon, 17 Dec 2018 15:49:02 -0500
Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2)
(envelope-from ) id 1gYzp0-00025D-F0
for bug-gnu-emacs@gnu.org; Mon, 17 Dec 2018 15:49:02 -0500
X-Loop: help-debbugs@gnu.org
Resent-From: Philipp Stephani
Original-Sender: "Debbugs-submit"
Resent-CC: bug-gnu-emacs@gnu.org
Resent-Date: Mon, 17 Dec 2018 20:49: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.15450796877935
(code B ref 28691); Mon, 17 Dec 2018 20:49:02 +0000
Original-Received: (at 28691) by debbugs.gnu.org; 17 Dec 2018 20:48:07 +0000
Original-Received: from localhost ([127.0.0.1]:52286 helo=debbugs.gnu.org)
by debbugs.gnu.org with esmtp (Exim 4.84_2)
(envelope-from )
id 1gYzo6-00023u-Os
for submit@debbugs.gnu.org; Mon, 17 Dec 2018 15:48:07 -0500
Original-Received: from mail-wr1-f52.google.com ([209.85.221.52]:32994)
by debbugs.gnu.org with esmtp (Exim 4.84_2)
(envelope-from ) id 1gYzo4-00023N-9v
for 28691@debbugs.gnu.org; Mon, 17 Dec 2018 15:48:04 -0500
Original-Received: by mail-wr1-f52.google.com with SMTP id c14so13730379wrr.0
for <28691@debbugs.gnu.org>; Mon, 17 Dec 2018 12:48:04 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
h=from:to:cc:subject:date:message-id:in-reply-to:references
:mime-version:content-transfer-encoding;
bh=JFZUvF2JLjHtJFnmAFsCJo85MyPw3sbhTxVJmiZLhK4=;
b=lciMII/eW/LwktxhM7RzDkkjzoI3SBfnbJRWuYw4B6UiGtEBhzkJeJ1x0q5p+BaGmm
AlfPyMzM+qT+6bW38EnKl67CGz+PGpPZ0dBGNpMr5MgDWmDgMFkOnfiGnHOwsiuo9RMD
AvizdZu/fwEzHoZKVFKkEtmU+NQ5JubyFtbop32mPwwrTQBLIxeNa40kzJcTLNCmNH61
8Fe1vbehQp3kWoogaApQ6R0BdPDEwZi/UjGfVlbmO4OT+vHDBK63N9AuQqiSOZmh2kvo
Ej6gfR2jTjwjsrqAuNyWSdWD9QSbe3BgXmT+/K9U/06BtdbeqvdMmaXxneq6hHQWD6ui
dhRA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=1e100.net; s=20161025;
h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to
:references:mime-version:content-transfer-encoding;
bh=JFZUvF2JLjHtJFnmAFsCJo85MyPw3sbhTxVJmiZLhK4=;
b=MW0anDpsFyKDuQz7LhE9IqJ/LmIW3ywM3Ivl8rfJWiQQ3cSu+O0pbkANTNqomA5a5J
2fkSmRkAW15GGQwjAYsB2C2+04U9sQdc0aWaX630jEmGCYNo0AoMZgGagCI6aRcnPA9S
wgxPYwD9G5jKLZjzjom/JrP+QQPMqkMDaIt7Yf/EE4fSaZxR+sC698mBBgCF1L/41qz0
NxB9CPC/OVuXdYlVOik+ygZCnOMD3YCaUR7Pa+KHY/QCnmE0Ac+J/zzE7iXjTPUeRVdH
erT4Bjms0MakSaD7dP6XEN9PapFTMsev2zoPh3Fp6MY03MgThl0A5TcBgRJ5Kt+t/ZVF
rVMw==
X-Gm-Message-State: AA+aEWYlyaIzr9cz2Yttmc9fmhrCPSutHmj6ocYt+kVD7ZIkpg5wN0bf
3qG826EdI/RWXEsjcHhuS8s=
X-Google-Smtp-Source: AFSGD/UTnzSL+mXQPM1GJHKPc25dC6GeeFLOqaN7DXvKlzuh6+1eFHlfhIH2BKnfO+Mc9zN7E4gQoQ==
X-Received: by 2002:adf:f350:: with SMTP id e16mr11476438wrp.125.1545079678260;
Mon, 17 Dec 2018 12:47:58 -0800 (PST)
Original-Received: from phst-glaptop.cm.cablesurf.de
([2001:4c50:25a:f300:2a16:adff:fe49:52c8])
by smtp.gmail.com with ESMTPSA id y8sm314717wmg.13.2018.12.17.12.47.56
(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
Mon, 17 Dec 2018 12:47:57 -0800 (PST)
X-Google-Original-From: Philipp Stephani
X-Mailer: git-send-email 2.20.0.405.gbc1bbc6f85-goog
In-Reply-To: <8336qwdixp.fsf@gnu.org>
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:153536
Archived-At:
* 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
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
@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.
+** '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.
+
* Changes in Emacs 27.1 on Non-Free Operating Systems
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-directory))
+ 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.
+: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.
+
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 = Flist (nargs, args);
+ if (!NILP (Fplist_get (contact, QCfile_handler)))
+ {
+ Lisp_Object file_handler
+ = Ffind_file_name_handler (BVAR (current_buffer, directory),
+ Qmake_process);
+ if (!NILP (file_handler))
+ return CALLN (Fapply, file_handler, Qmake_process, contact);
+ }
+
buffer = Fplist_get (contact, QCbuffer);
if (!NILP (buffer))
buffer = 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
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))))
+(ert-deftest files-tests-file-name-non-special-make-process ()
+ "Check that the ‘:file-handler’ argument of ‘make-process’
+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-directory))))
+ (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"))))))
+(ert-deftest make-process/file-handler/found ()
+ "Check that the ‘:file-handler’ argument of ‘make-process’
+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 (= file-handler-calls 1))))))
+
+(ert-deftest make-process/file-handler/not-found ()
+ "Check that the ‘:file-handler’ argument of ‘make-process’
+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-directory)))
+ (should (processp (make-process :name "name"
+ :command (list program "--version")
+ :file-handler t)))))
+
+(ert-deftest make-process/file-handler/disable ()
+ "Check ‘make-process’ works as expected if it shouldn’t use the
+file handler."
+ (let ((file-name-handler-alist (list (cons (rx bos "test-handler:")
+ #'process-tests--file-handler)))
+ (default-directory "test-handler:/dir/")
+ (program (expand-file-name invocation-name invocation-directory)))
+ (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.
--
2.20.0.405.gbc1bbc6f85-goog