[Cl-darcs-cvs] r3 - cl-darcs/trunk

mhenoch at common-lisp.net mhenoch at common-lisp.net
Tue May 23 17:12:09 UTC 2006


Author: mhenoch
Date: Tue May 23 13:12:09 2006
New Revision: 3

Modified:
   cl-darcs/trunk/apply-patch.lisp
Log:
Handle the case of subsequent hunks changing the same line.


Modified: cl-darcs/trunk/apply-patch.lisp
==============================================================================
--- cl-darcs/trunk/apply-patch.lisp	(original)
+++ cl-darcs/trunk/apply-patch.lisp	Tue May 23 13:12:09 2006
@@ -27,10 +27,13 @@
 	   (,filename-gensym ,filename))
        (restart-case
 	   ;; Open the file to patch for reading.
-	   (with-open-file (,instreamvar ,filename-gensym
-					 :direction :input
-					 :if-does-not-exist :error
-					 :element-type '(unsigned-byte 8))
+	   (with-open-stream (,instreamvar
+			      (make-instance 'unreadable-stream
+					     :base-stream
+					     (open ,filename-gensym
+						   :direction :input
+						   :if-does-not-exist :error
+						   :element-type '(unsigned-byte 8))))
 	     ;; Open a temporary file for writing.
 	     (with-temp-file (,outstreamvar :element-type '(unsigned-byte 8))
 	       (progn , at body)
@@ -40,7 +43,7 @@
 
 	       (setf ,files-copied-gensym t)
 	       ;; Copy the temporary file over the original.
-	       (fad:copy-file (pathname ,outstreamvar) (pathname ,instreamvar) :overwrite t)))
+	       (fad:copy-file (pathname ,outstreamvar) ,filename :overwrite t)))
 
 	 ;; Until the temporary file is copied over the original, we can
 	 ;; retry as many times we want.
@@ -292,12 +295,14 @@
 		      ;; them to the temporary file.
 		      ))))
 	    
-	    ;; Now, let's add lines, increasing the line counter as we
-	    ;; go.
-	    (dolist (new (hunk-new-lines hunk))
-	      (maybe-terpri)
-	      (write-sequence new out)
-	      (incf line-number)))
+	    ;; Now, let's add lines.  The obvious way to do it would
+	    ;; be to print the lines to output, increasing the line
+	    ;; counter for every line.  However, in some circumstances
+	    ;; there are two subsequent hunks modifying the same line
+	    ;; (i.e. s/A/B/ and s/B/C/ are expected to have the same
+	    ;; result as s/A/C/), so we unread the lines instead.
+	    (dolist (new (reverse (hunk-new-lines hunk)))
+	      (unread-line in new)))
 
 	  ;; And output the lines after all hunks
 	  (loop for line = (read-binary-line in nil :eof)



More information about the Cl-darcs-cvs mailing list