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

mhenoch at common-lisp.net mhenoch at common-lisp.net
Wed Nov 22 20:00:24 UTC 2006


Author: mhenoch
Date: Wed Nov 22 15:00:24 2006
New Revision: 67

Added:
   cl-darcs/trunk/diff.lisp
Modified:
   cl-darcs/trunk/cl-darcs.asd
Log:
Start hacking diff


Modified: cl-darcs/trunk/cl-darcs.asd
==============================================================================
--- cl-darcs/trunk/cl-darcs.asd	(original)
+++ cl-darcs/trunk/cl-darcs.asd	Wed Nov 22 15:00:24 2006
@@ -21,7 +21,9 @@
 	       ;; Files and directories
 	       :cl-fad
 	       ;; Regexps
-	       :cl-ppcre)
+	       :cl-ppcre
+	       ;; Diff
+	       :cl-difflib)
 
   :components
   ((:file "packages")

Added: cl-darcs/trunk/diff.lisp
==============================================================================
--- (empty file)
+++ cl-darcs/trunk/diff.lisp	Wed Nov 22 15:00:24 2006
@@ -0,0 +1,57 @@
+;;; Copyright (C) 2006 Magnus Henoch
+;;;
+;;; This program is free software; you can redistribute it and/or
+;;; modify it under the terms of the GNU General Public License as
+;;; published by the Free Software Foundation; either version 2 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with this program; if not, write to the Free Software
+;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+(in-package :darcs)
+
+(defun diff-file (original modified &key filename)
+  "Find changes between ORIGINAL and MODIFIED.
+Return a list of HUNK-PATCHes.  Use FILENAME as their filename."
+  (setf original (make-upath original))
+  (setf modified (make-upath modified))
+  (let* ((original-lines
+	  (with-open-stream (in (open-upath original :binary t))
+	    (loop for line = (read-binary-line in nil)
+	       while line collect line)))
+	 (modified-lines
+	  (with-open-stream (in (open-upath modified :binary t))
+	    (loop for line = (read-binary-line in nil)
+	       while line collect line)))
+
+	 ;; using equalp is safe (i.e. non-case-clobbering), as
+	 ;; we use bytes instead of characters
+	 (opcodes (difflib:get-opcodes
+		   (make-instance 'difflib:sequence-matcher
+				  :a original-lines
+				  :b modified-lines
+				  :test-function #'equalp)))
+
+	 patches)
+
+    (dolist (opcode opcodes)
+      (unless (eql (difflib:opcode-tag opcode) :equal)
+	 (push 
+	  (make-instance 'hunk-patch
+			 :filename filename
+			 :line-number (difflib:opcode-j1 opcode)
+			 :old (subseq original-lines
+					      (difflib:opcode-i1 opcode)
+					      (difflib:opcode-i2 opcode))
+			 :new (subseq modified-lines
+					      (difflib:opcode-j1 opcode)
+					      (difflib:opcode-j2 opcode)))
+	  patches)))
+
+    (nreverse patches)))



More information about the Cl-darcs-cvs mailing list