all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#1321: process-lines
       [not found] <jkiqqwioj6.fsf@fencepost.gnu.org>
@ 2015-03-14 22:36 ` Peder O. Klingenberg
  2015-03-14 23:45   ` Daniel Colascione
  2015-03-15 20:43   ` Stefan Monnier
  0 siblings, 2 replies; 5+ messages in thread
From: Peder O. Klingenberg @ 2015-03-14 22:36 UTC (permalink / raw)
  To: 1321

[-- Attachment #1: Type: text/plain, Size: 212 bytes --]

Just adding an optional argument to process-lines is difficult without breaking the API, due to its use of &rest.  I suggest something along the lines of the following patch:

...Peder...
-- 
Sløv uten dop

[-- Attachment #2: 0001-Extend-process-lines-to-allow-exit-status-handling.patch --]
[-- Type: application/octet-stream, Size: 3312 bytes --]

From 36387738fa6dc45db5a0ea4bbcc7ad982ba95da3 Mon Sep 17 00:00:00 2001
From: "Peder O. Klingenberg" <peder@klingenberg.no>
Date: Sat, 14 Mar 2015 23:00:16 +0100
Subject: [PATCH] Extend process-lines to allow exit status handling

* subr.el (process-lines-handling-status): Extension of the old
process-lines, with more flexible handling of the exit status.
(process-lines): Old API implemented using the new function.
(process-lines-ignore-status): Another use of the new function -
return the output lines regardless of the exit status.

Fixes: Bug#1321
---
 lisp/ChangeLog |  8 ++++++++
 lisp/subr.el   | 24 ++++++++++++++++++++----
 2 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index d393190..a93a306 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,11 @@
+2015-03-14  Peder O. Klingenberg  <peder@klingenberg.no>
+
+	* subr.el (process-lines-handling-status): Extension of the old
+	process-lines, with more flexible handling of the exit status.
+	(process-lines): Old API implemented using the new function.
+	(process-lines-ignore-status): Another use of the new function -
+	return the output lines regardless of the exit status.
+
 2015-03-13  Kevin Ryde  <user42_kevin@yahoo.com.au>
 
 	info-look fixes for Texinfo 5
diff --git a/lisp/subr.el b/lisp/subr.el
index deadca6..45b23dc 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -1901,13 +1901,19 @@ and the file name is displayed in the echo area."
 \f
 ;;;; Process stuff.
 
-(defun process-lines (program &rest args)
+(defun process-lines-handling-status (program status-handler &rest args)
   "Execute PROGRAM with ARGS, returning its output as a list of lines.
-Signal an error if the program returns with a non-zero exit status."
+If STATUS-HANDLER is non-NIL, it must be a function with one
+argument, which will be called with the exit status of the
+program before the output is collected.  If STATUS-HANDLER is
+NIL, an error is signalled if the program returns with a non-zero
+exit status."
   (with-temp-buffer
     (let ((status (apply 'call-process program nil (current-buffer) nil args)))
-      (unless (eq status 0)
-	(error "%s exited with status %s" program status))
+      (if status-handler
+	  (apply #'status-handler program args status)
+	(unless (eq status 0)
+	  (error "%s exited with status %s" program status)))
       (goto-char (point-min))
       (let (lines)
 	(while (not (eobp))
@@ -1918,6 +1924,16 @@ Signal an error if the program returns with a non-zero exit status."
 	  (forward-line 1))
 	(nreverse lines)))))
 
+(defun process-lines (program &rest args)
+  "Execute PROGRAM with ARGS, returning its output as a list of lines.
+Signal an error if the program returns with a non-zero exit status."
+  (apply #'process-lines-handling-status program nil args))
+
+(defun process-lines-ignore-status (program &rest args)
+  "Execute PROGRAM with ARGS, returning its output as a list of lines.
+The exit status of the program is ignored."
+  (apply #'process-lines-handling-status program #'identity args))
+
 (defun process-live-p (process)
   "Returns non-nil if PROCESS is alive.
 A process is considered alive if its status is `run', `open',
-- 
1.9.5 (Apple Git-50.3)


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* bug#1321: process-lines
  2015-03-14 22:36 ` bug#1321: process-lines Peder O. Klingenberg
@ 2015-03-14 23:45   ` Daniel Colascione
  2015-03-15  8:37     ` Peder O. Klingenberg
  2015-03-15 20:43   ` Stefan Monnier
  1 sibling, 1 reply; 5+ messages in thread
From: Daniel Colascione @ 2015-03-14 23:45 UTC (permalink / raw)
  To: Peder O. Klingenberg, 1321

[-- Attachment #1: Type: text/plain, Size: 344 bytes --]

On 03/14/2015 03:36 PM, Peder O. Klingenberg wrote:
> Just adding an optional argument to process-lines is difficult
> without
breaking the API, due to its use of &rest. I suggest something along the
lines of the following patch:

What about defining a `process-lines-2' that takes keyword arguments and
accepts a list for PROGRAM?



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#1321: process-lines
  2015-03-14 23:45   ` Daniel Colascione
@ 2015-03-15  8:37     ` Peder O. Klingenberg
  2020-09-19 22:20       ` Lars Ingebrigtsen
  0 siblings, 1 reply; 5+ messages in thread
From: Peder O. Klingenberg @ 2015-03-15  8:37 UTC (permalink / raw)
  To: Daniel Colascione; +Cc: 1321

[-- Attachment #1: Type: text/plain, Size: 676 bytes --]

On 15 Mar, 2015, at 0:45, Daniel Colascione <dancol@dancol.org> wrote:
> 
> What about defining a `process-lines-2' that takes keyword arguments and
> accepts a list for PROGRAM?

That’s another possibility, of course.  But in my opinion, the &rest is usually a more convenient API for the callers, saving them the trouble of consing up a new list.  Also, I find functions with -N suffixes to be less descriptive names than they should be.

In my haste to send a patch last night, I managed to send the wrong version, one that didn’t work as advertised.  Sorry.  Please ignore my previous patch and consider this one instead:


...Peder...
-- 
Sløv uten dop

[-- Attachment #2: 0001-Extend-process-lines-to-allow-exit-status-handling-v2.patch --]
[-- Type: application/octet-stream, Size: 3299 bytes --]

From a64514df4fcd00413580d16e6418223ae0eb6ae6 Mon Sep 17 00:00:00 2001
From: "Peder O. Klingenberg" <peder@klingenberg.no>
Date: Sat, 14 Mar 2015 23:00:16 +0100
Subject: [PATCH] Extend process-lines to allow exit status handling

* subr.el (process-lines-handling-status): Extension of the old
process-lines, with more flexible handling of the exit status.
(process-lines): Old API implemented using the new function.
(process-lines-ignore-status): Another use of the new function -
return the output lines regardless of the exit status.

Fixes: Bug#1321
---
 lisp/ChangeLog |  8 ++++++++
 lisp/subr.el   | 24 ++++++++++++++++++++----
 2 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index d393190..a93a306 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,11 @@
+2015-03-14  Peder O. Klingenberg  <peder@klingenberg.no>
+
+	* subr.el (process-lines-handling-status): Extension of the old
+	process-lines, with more flexible handling of the exit status.
+	(process-lines): Old API implemented using the new function.
+	(process-lines-ignore-status): Another use of the new function -
+	return the output lines regardless of the exit status.
+
 2015-03-13  Kevin Ryde  <user42_kevin@yahoo.com.au>
 
 	info-look fixes for Texinfo 5
diff --git a/lisp/subr.el b/lisp/subr.el
index deadca6..ec471f0 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -1901,13 +1901,19 @@ and the file name is displayed in the echo area."
 \f
 ;;;; Process stuff.
 
-(defun process-lines (program &rest args)
+(defun process-lines-handling-status (program status-handler &rest args)
   "Execute PROGRAM with ARGS, returning its output as a list of lines.
-Signal an error if the program returns with a non-zero exit status."
+If STATUS-HANDLER is non-NIL, it must be a function with one
+argument, which will be called with the exit status of the
+program before the output is collected.  If STATUS-HANDLER is
+NIL, an error is signalled if the program returns with a non-zero
+exit status."
   (with-temp-buffer
     (let ((status (apply 'call-process program nil (current-buffer) nil args)))
-      (unless (eq status 0)
-	(error "%s exited with status %s" program status))
+      (if status-handler
+	  (funcall status-handler status)
+	(unless (eq status 0)
+	  (error "%s exited with status %s" program status)))
       (goto-char (point-min))
       (let (lines)
 	(while (not (eobp))
@@ -1918,6 +1924,16 @@ Signal an error if the program returns with a non-zero exit status."
 	  (forward-line 1))
 	(nreverse lines)))))
 
+(defun process-lines (program &rest args)
+  "Execute PROGRAM with ARGS, returning its output as a list of lines.
+Signal an error if the program returns with a non-zero exit status."
+  (apply #'process-lines-handling-status program nil args))
+
+(defun process-lines-ignore-status (program &rest args)
+  "Execute PROGRAM with ARGS, returning its output as a list of lines.
+The exit status of the program is ignored."
+  (apply #'process-lines-handling-status program #'identity args))
+
 (defun process-live-p (process)
   "Returns non-nil if PROCESS is alive.
 A process is considered alive if its status is `run', `open',
-- 
1.9.5 (Apple Git-50.3)


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* bug#1321: process-lines
  2015-03-14 22:36 ` bug#1321: process-lines Peder O. Klingenberg
  2015-03-14 23:45   ` Daniel Colascione
@ 2015-03-15 20:43   ` Stefan Monnier
  1 sibling, 0 replies; 5+ messages in thread
From: Stefan Monnier @ 2015-03-15 20:43 UTC (permalink / raw)
  To: Peder O. Klingenberg; +Cc: 1321

> Just adding an optional argument to process-lines is difficult without
> breaking the API, due to its use of &rest.  I suggest something along the
> lines of the following patch:

FWIW, I don't really like process-lines at all.  It's used rather
rarely, so most uses would be just as happy with something like

    (with-temp-buffer
      (call-process <prog> nil t nil <args>)
      (get-buffer-lines))


-- Stefan





^ permalink raw reply	[flat|nested] 5+ messages in thread

* bug#1321: process-lines
  2015-03-15  8:37     ` Peder O. Klingenberg
@ 2020-09-19 22:20       ` Lars Ingebrigtsen
  0 siblings, 0 replies; 5+ messages in thread
From: Lars Ingebrigtsen @ 2020-09-19 22:20 UTC (permalink / raw)
  To: Peder O. Klingenberg; +Cc: 1321, Stefan Monnier

"Peder O. Klingenberg" <peder@klingenberg.no> writes:

> That’s another possibility, of course.  But in my opinion, the &rest
> is usually a more convenient API for the callers, saving them the
> trouble of consing up a new list.

Yup, makes sense to me.

Stefan raises the excellent objection that `process-lines' is pretty
trivial, and that it's not much used.  The former is definitely true,
but I wonder whether the reason it's not used much is because of the
very awkward interface.  Peder's patch fixes this by introducing a
-ignore-status version of the function (which is how it should have been
all along), so perhaps this version will get more usage.

So I've applied Peder's patch to Emacs 28.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-09-19 22:20 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <jkiqqwioj6.fsf@fencepost.gnu.org>
2015-03-14 22:36 ` bug#1321: process-lines Peder O. Klingenberg
2015-03-14 23:45   ` Daniel Colascione
2015-03-15  8:37     ` Peder O. Klingenberg
2020-09-19 22:20       ` Lars Ingebrigtsen
2015-03-15 20:43   ` Stefan Monnier

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.