safely.lisp: CLisp's POSIX:COPY-FILE :METHOD :RENAME is a disaster.
authorMark Wooding <mdw@distorted.org.uk>
Thu, 9 Jun 2011 14:06:25 +0000 (15:06 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Thu, 9 Jun 2011 14:06:25 +0000 (15:06 +0100)
It seems to do two separate pathname merges.  Use RENAME-FILE instead:
it may be mad, but at least it's mad in a well-understood way.  We still
need :IF-EXISTS :OVERWRITE because CLisp makes life unnecessarily
difficult.

safely.lisp

index 69fceed..9809f07 100644 (file)
 
 (declaim (inline rename))
 (defun rename (old new)
-  #-clisp (rename-file old
-                      (make-pathname :directory '(:relative)
-                                     :defaults new))
-  #+clisp (posix:copy-file old new :method :rename))
+  (let ((target (make-pathname :directory '(:relative)
+                              :defaults new)))
+    #-clisp (rename-file old target)
+    #+clisp (rename-file old target :if-exists :overwrite)))
 
 (defun delete-file-without-moaning (file)
   "Delete the FILE, ignoring errors."