From: Mark Wooding Date: Tue, 31 May 2011 12:13:17 +0000 (+0100) Subject: Merge branch 'master' of metalzone.distorted.org.uk:~mdw/public-git/lisp X-Git-Url: https://git.distorted.org.uk/~mdw/lisp/commitdiff_plain/39bf02db3dc4419a6451f2c68996c48187a20d1f?hp=-c Merge branch 'master' of metalzone.distorted.org.uk:~mdw/public-git/lisp * 'master' of metalzone.distorted.org.uk:~mdw/public-git/lisp: safely.lisp: More CLisp fixing. safely.lisp: Hacking for CLisp support. --- 39bf02db3dc4419a6451f2c68996c48187a20d1f diff --combined safely.lisp index 4830a99,9e723ed..84a06c4 --- a/safely.lisp +++ b/safely.lisp @@@ -33,13 -33,7 +33,13 @@@ #+(or cmu sbcl) (eval-when (:compile-toplevel :execute) (import #+cmu '(ext:unix-namestring unix:unix-link) - #+sbcl '(sb-int:unix-namestring))) + #+sbcl '(sb-ext:native-namestring))) +#+cmu +(progn + (declaim (inline unix-namestring)) + (defun native-namestring (pathname &key as-file) + (declare (ignore as-file)) + (unix-namestring pathname nil))) (defstruct (safely (:predicate safelyp)) "Stores information about how to commit or undo safe writes." @@@ -110,6 -104,11 +110,11 @@@ (safely-trail safe)) stream)) + (declaim (inline rename)) + (defun rename (old new) + #-clisp (rename-file old new) + #+clisp (posix:copy-file old new :method :rename)) + (defun delete-file-without-moaning (file) "Delete the FILE, ignoring errors." (handler-case (delete-file file) @@@ -118,7 -117,7 +123,7 @@@ (defun rename-file-without-moaning (old new) "Rename OLD to NEW, ignoring errors, and without doing any stupid name mangling." - (handler-case (rename-file old new) + (handler-case (rename old new) (file-error () nil))) (defun safely-unwind (trail) @@@ -159,13 -158,21 +164,23 @@@ ;; Use link(2) where available. (generate-fresh-file-name file tag (lambda (name) - (let ((from (unix-namestring file t)) - (to (unix-namestring name nil))) + (let ((from (native-namestring file + :as-file t)) + (to (native-namestring name + :as-file t))) (and from to (unix-link from to))))) + #+clisp + (generate-fresh-file-name file tag + (lambda (name) + (posix:copy-file (namestring file) + (namestring name) + :method :hardlink + :if-exists nil))) + + + #-(or cmu sbcl) ;; Otherwise just copy the file contents and hope for the best. (with-open-file (input file :element-type :default) @@@ -215,7 -222,7 +230,7 @@@ (push `(:rmtmp ,old) cleanup) (push `(:revert ,old ,file) revert)) (push `(:rmtmp ,file) revert)) - (rename-file new file))) + (rename new file))) (:delete (destructuring-bind (tag file) job (declare (ignore tag)) (let ((old (safe-copy file "delete")))