X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=impl.lisp;h=0b37c8badc9b655f1f7c45777dc6f7b433cb1000;hp=c6aa65df7de8fd5b9ab7d5004e9dacae418450fb;hb=26d4fb77a1630200f6101d7adc0b2914c825090a;hpb=6f333885c716800cf85c2986a3b835efe0e54e70 diff --git a/impl.lisp b/impl.lisp index c6aa65d..0b37c8b 100644 --- a/impl.lisp +++ b/impl.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Sep 2003 ;;;; -;;;; $Id: io.lisp 7795 2003-09-10 05:44:47Z kevin $ +;;;; $Id$ ;;;; ;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -105,20 +105,33 @@ #+sbcl sb-ext:*posix-argv* ) -(defun shell-command-output (cmd &key directory whole) - #+allegro (excl.osi:command-output cmd :directory directory :whole whole) - #+sbcl - (let* ((out (make-array '(0) :element-type 'base-char :fill-pointer 0 - :adjustable t)) - (err (make-array '(0) :element-type 'base-char :fill-pointer 0 - :adjustable t)) - (status - (sb-impl::process-exit-code - (with-output-to-string (out-stream out) - (with-output-to-string (err-stream err) - (sb-ext:run-program - "/bin/sh" - (list "-c" cmd) - :input nil :output out-stream :error err-stream)))))) - (values out err status)) - ) +(defun copy-file (from to &key link overwrite preserve-symbolic-links + (preserve-time t) remove-destination force verbose) + #+allegro (sys:copy-file from to :link link :overwrite overwrite + :preserve-symbolic-links preserve-symbolic-links + :preserve-time preserve-time + :remove-destination remove-destination + :force force :verbose verbose) + #-allegro + (cond + ((and (typep from 'stream) (typep to 'stream)) + (copy-binary-stream from to)) + ((not (probe-file from)) + (error "File ~A does not exist." from)) + ((eq link :hard) + (run-shell-command "ln -f ~A ~A" (namestring from) (namestring to))) + (link + (multiple-value-bind (stdout stderr status) + (command-output "ln -f ~A ~A" (namestring from) (namestring to)) + (declare (ignore stdout stderr)) + ;; try symbolic if command failed + (unless (zerop status) + (run-shell-command "ln -sf ~A ~A" (namestring from) (namestring to))))) + (t + (when (and (or force remove-destination) (probe-file to)) + (delete-file to)) + (let* ((options (if preserve-time + "-p" + "")) + (cmd (format nil "cp ~A ~A ~A" options (namestring from) (namestring to)))) + (run-shell-command cmd)))))