X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=impl.lisp;h=0b37c8badc9b655f1f7c45777dc6f7b433cb1000;hp=c2d7cabb84a3a36750374cf33aefa5d24ae36ae8;hb=1b7f506ec98bd5b885203a3250c52603b943cee9;hpb=753fe2d6bbe8e8c8a6fa6154e829c6586b0c2ff3 diff --git a/impl.lisp b/impl.lisp index c2d7cab..0b37c8b 100644 --- a/impl.lisp +++ b/impl.lisp @@ -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)))))