More meaningful error message for OPEN :IF-EXISTS :NEW-VERSION
authorPaul Khuong <pvk@pvk.ca>
Thu, 14 Nov 2013 20:15:38 +0000 (15:15 -0500)
committerPaul Khuong <pvk@pvk.ca>
Thu, 14 Nov 2013 22:32:18 +0000 (17:32 -0500)
We don't try to simulate versioned filesystems on top of standard
UNIX operations, because that would be lossy.  Now explained more
explicitly.

Based on a patch by Philip Munksgaard, fixes lp#455381.

NEWS
src/code/fd-stream.lisp
tests/filesys.pure.lisp

diff --git a/NEWS b/NEWS
index c9f52c7..bda318e 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -21,6 +21,9 @@ changes relative to sbcl-1.1.13:
     than a single word.
   * bug fix: contribs couldn't be built on Windows with MinGW.
   * bug fix: Better pathname handling on Windows. (lp#922117)
+  * bug fix: OPEN reports a more meaningful error when an existing file is
+    opened for output with :if-exists :new-version.  Thanks to Philip
+    Munksgaard. (lp#455381)
 
 changes in sbcl-1.1.13 relative to sbcl-1.1.12:
   * optimization: better distribution of SXHASH over small conses of related
index cae969d..acf84b0 100644 (file)
         (ensure-one-of if-does-not-exist
                        '(:error :create nil)
                        :if-does-not-exist)
-        (cond ((eq if-does-not-exist :create)
+        (cond ((and if-exists-given
+                    truename
+                    (eq if-exists :new-version))
+               (open-error "OPEN :IF-EXISTS :NEW-VERSION is not supported ~
+                            when a new version must be created."))
+              ((eq if-does-not-exist :create)
                (setf mask (logior mask sb!unix:o_creat)))
               ((not (member if-exists '(:error nil))))
               ;; Both if-does-not-exist and if-exists now imply
index 0dc72a7..00382ab 100644 (file)
     (assert (not
              (do-open t nil nil :io)))
     (assert (raises-error? (do-open t :error :error :io)))))
+
+(with-test (:name :open-new-version)
+  (multiple-value-bind (value error)
+      (ignore-errors (open #.(or *compile-file-truename* *load-truename*)
+                           :direction :output
+                           :if-exists :new-version))
+    (assert (not value))
+    (assert error)
+    (assert (equal (simple-condition-format-control error)
+                   "OPEN :IF-EXISTS :NEW-VERSION is not supported ~
+                            when a new version must be created."))))