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