commit 2e5c192d6d90ad6cec970421bda48ceeeec1d31a
parent 48b1a06bdba2debb4f1c7a0b5c6d32b77f3f9905
Author: Tomas Hlavaty <tom@logand.com>
Date: Wed, 28 Aug 2013 23:26:50 +0200
rw.os:run-program refactored
Diffstat:
M | os.lisp | | | 74 | +++++++++++++++++++++++--------------------------------------------------- |
1 file changed, 23 insertions(+), 51 deletions(-)
diff --git a/os.lisp b/os.lisp
@@ -33,52 +33,18 @@
(let ((reason (or (cdr (assoc code error-plist)) "")))
(error (format nil "~a error ~d: ~a ~s" cmd code reason args)))))
-(defun run-command (cmd args &optional error-plist)
- #-(or cmu sbcl clisp openmcl ecl)
- (error "TODO port RW.OS:RUN-COMMAND")
- (let ((p
- #+cmu(ext:run-program cmd args)
- #+sbcl(sb-ext:run-program cmd args :search t)
- #+clisp(ext:run-program cmd :arguments args)
- #+openmcl(ccl:run-program cmd args)
- #+ecl (nth-value 2 (ext:run-program cmd args
- :input nil
- :output nil
- :error nil))))
- (when p
- (unwind-protect
- (let ((code #+cmu(ext:process-exit-code p)
- #+sbcl(sb-ext:process-exit-code p)
- #+clisp 0
- #+openmcl(multiple-value-bind (a b)
- (ccl:external-process-status p)
- (declare (ignore a))
- b)
- #+ecl(ext::external-process-%code p)))
- (if (eq 0 code)
- t
- (throw-error cmd args code error-plist)))
- #+cmu(ext:process-close p)
- #+sbcl(sb-ext:process-close p)
- #+openmcl(flet ((finish (x) (when x (close x))))
- (finish (ccl:external-process-output-stream p))
- (finish (ccl:external-process-input-stream p))
- (finish (ccl:external-process-error-stream p)))
- ;; TODO ecl?
- ))))
-
-(defun call-with-program-output (cmd args error-plist fn)
+(defun call-with-program-output (output cmd args error-plist fn)
#-(or cmu sbcl clisp openmcl ecl)
(error "TODO port RW.OS::CALL-WITH-PROGRAM-OUTPUT")
(let ((p
- #+cmu(ext:run-program cmd args :output :stream)
- #+sbcl(sb-ext:run-program cmd args :output :stream :search t)
- #+clisp(ext:run-program cmd :arguments args :output :stream)
- #+openmcl(ccl:run-program cmd args :output :stream)
- #+ecl (nth-value 2 (ext:run-program cmd args
- :input nil
- :output :stream
- :error nil))))
+ #+cmu(ext:run-program cmd args :output output)
+ #+sbcl(sb-ext:run-program cmd args :output output :search t)
+ #+clisp(ext:run-program cmd :arguments args :output output)
+ #+openmcl(ccl:run-program cmd args :output output)
+ #+ecl(nth-value 2 (ext:run-program cmd args
+ :input nil
+ :output output
+ :error nil))))
(when p
(unwind-protect
(let ((code #+cmu(ext:process-exit-code p)
@@ -90,12 +56,14 @@
b)
#+ecl(ext::external-process-%code p)))
(if (eq 0 code)
- (funcall fn
- #+cmu(ext:process-output p)
- #+sbcl(sb-ext:process-output p)
- #+clisp p
- #+openmcl(ccl:external-process-output-stream p)
- #+ecl(ext:external-process-output p))
+ (if (eq :stream output)
+ (funcall fn
+ #+cmu(ext:process-output p)
+ #+sbcl(sb-ext:process-output p)
+ #+clisp p
+ #+openmcl(ccl:external-process-output-stream p)
+ #+ecl(ext:external-process-output p))
+ t)
(throw-error cmd args code error-plist)))
#+cmu(ext:process-close p)
#+sbcl(sb-ext:process-close p)
@@ -103,11 +71,15 @@
(finish (ccl:external-process-output-stream p))
(finish (ccl:external-process-input-stream p))
(finish (ccl:external-process-error-stream p)))
- ;; TODO ecl?
+ ;; TODO ecl process clean up?
))))
+(defun run-command (cmd args &optional error-plist)
+ (call-with-program-output nil cmd args error-plist nil))
+
(defmacro with-program-output ((var cmd args &optional error-plist) &body body)
- `(call-with-program-output ,cmd ,args ,error-plist (lambda (,var) ,@body)))
+ `(call-with-program-output :stream ,cmd ,args ,error-plist
+ (lambda (,var) ,@body)))
(defun sha1sum (file)
(let ((name (format nil "~a" file)))