chiark
/
gitweb
/
~mdw
/
lisp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' of metalzone.distorted.org.uk:~mdw/public-git/lisp
[lisp]
/
safely.lisp
diff --git
a/safely.lisp
b/safely.lisp
index 4830a99b5e04356327808a52e6d3176bd1b35c7d..84a06c4a6cd65649c745410327c9e388d24c761f 100644
(file)
--- a/
safely.lisp
+++ b/
safely.lisp
@@
-110,6
+110,11
@@
(defun safely-open-output-stream (safe file &rest open-args)
(safely-trail safe))
stream))
(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)
(defun delete-file-without-moaning (file)
"Delete the FILE, ignoring errors."
(handler-case (delete-file file)
@@
-118,7
+123,7
@@
(defun delete-file-without-moaning (file)
(defun rename-file-without-moaning (old new)
"Rename OLD to NEW, ignoring errors, and without doing any stupid name
mangling."
(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)
(file-error () nil)))
(defun safely-unwind (trail)
@@
-166,6
+171,16
@@
(defun safe-copy (file tag)
(and from to
(unix-link from to)))))
(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)
#-(or cmu sbcl)
;; Otherwise just copy the file contents and hope for the best.
(with-open-file (input file :element-type :default)
@@
-215,7
+230,7
@@
(defun safely-commit (safe)
(push `(:rmtmp ,old) cleanup)
(push `(:revert ,old ,file) revert))
(push `(:rmtmp ,file) revert))
(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")))
(:delete (destructuring-bind (tag file) job
(declare (ignore tag))
(let ((old (safe-copy file "delete")))