[Cl-darcs-cvs] r37 - cl-darcs/trunk
mhenoch at common-lisp.net
mhenoch at common-lisp.net
Fri Sep 1 00:21:43 UTC 2006
Author: mhenoch
Date: Thu Aug 31 20:21:43 2006
New Revision: 37
Added:
cl-darcs/trunk/write-patch.lisp
Log:
Add write-patch
Added: cl-darcs/trunk/write-patch.lisp
==============================================================================
--- (empty file)
+++ cl-darcs/trunk/write-patch.lisp Thu Aug 31 20:21:43 2006
@@ -0,0 +1,145 @@
+;;; 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 write-patch-to-repo (patch repo)
+ "Write the named patch PATCH to REPO, under correct filename."
+ (let ((filename
+ (upath-subdir repo '("_darcs" "patches")
+ (patchinfo-make-filename
+ (named-patch-patchinfo patch)))))
+ (with-open-file (out filename :direction :output :element-type '(unsigned-byte 8)
+ :if-exists :error)
+ (write-patch patch out))))
+
+(defgeneric write-patch (patch stream)
+ (:documentation "Write PATCH to STREAM, in darcs patch format.
+STREAM is assumed to have element type (unsigned-byte 8).
+The patch is terminated by a newline character."))
+
+(defun write-as-byte (char stream)
+ "Convert CHAR to a byte, and write it to STREAM."
+ (write-byte (char-code char) stream))
+
+(defun write-as-bytes (string stream)
+ "Convert STRING to bytes, and write it to STREAM."
+ (write-sequence (string-to-bytes string) stream))
+
+(defmethod write-patch ((patch composite-patch) stream)
+ (write-as-byte #\{ stream)
+ (dolist (part (patches patch))
+ (write-patch part stream))
+ (write-as-byte #\} stream)
+ (write-byte 10 stream))
+
+(defmethod write-patch ((patch hunk-patch) stream)
+ (write-as-bytes (concatenate
+ 'string
+ "hunk "
+ (patch-filename patch)
+ (format nil " ~A" (hunk-line-number patch)))
+ stream)
+ (write-byte 10 stream)
+ (dolist (line (hunk-old-lines patch))
+ (write-as-byte #\- stream)
+ (write-sequence line stream)
+ (write-byte 10 stream))
+ (dolist (line (hunk-new-lines patch))
+ (write-byte (char-code #\+) stream)
+ (write-sequence line stream)
+ (write-byte 10 stream)))
+
+(defun write-token-and-filename (token filename stream)
+ (write-as-bytes token stream)
+ (write-byte 32 stream)
+ (write-as-bytes filename stream)
+ (write-byte 10 stream))
+
+(defmethod write-patch ((patch add-file-patch) stream)
+ (write-token-and-filename "addfile" (patch-filename patch) stream))
+
+(defmethod write-patch ((patch rm-file-patch) stream)
+ (write-token-and-filename "rmfile" (patch-filename patch) stream))
+
+(defmethod write-patch ((patch add-dir-patch) stream)
+ (write-token-and-filename "adddir" (patch-directory patch) stream))
+
+(defmethod write-patch ((patch rm-dir-patch) stream)
+ (write-token-and-filename "rmdir" (patch-directory patch) stream))
+
+(defmethod write-patch ((patch binary-patch) stream)
+ (write-token-and-filename "binary" (patch-filename patch) stream)
+ (flet ((write-binary-data (bin)
+ ;; Print binary data in hex format, with 78 characters per
+ ;; line. Each lines starts with *. A newline is printed
+ ;; at the start, but not at the end.
+ (loop for i from 0 upto (length bin)
+ do (when (zerop (mod i 49))
+ (write-byte 10 stream)
+ (write-as-byte #\* stream))
+ (write-as-bytes (string-downcase
+ (format nil "~X" (aref bin i)))
+ stream))))
+ (write-as-bytes "oldhex" stream)
+ (write-binary-data (binary-oldhex patch))
+ (write-as-bytes "newhex" stream)
+ (write-binary-data (binary-newhex patch))
+ (write-byte 10 stream)))
+
+(defmethod write-patch ((patch token-replace-patch) stream)
+ (write-as-bytes (format nil "replace ~A [~A] ~A ~A"
+ (patch-filename patch)
+ (token-regexp patch)
+ (old-token patch)
+ (new-token patch))
+ stream)
+ (write-byte 10 stream))
+
+(defmethod write-patch ((patch named-patch) stream)
+ (write-as-bytes
+ (with-output-to-string (strout)
+ (write-patchinfo (named-patch-patchinfo patch) strout))
+ stream)
+ (when (named-patch-dependencies patch)
+ (write-as-byte #\< stream)
+ (write-byte 10 stream)
+ (dolist (d (named-patch-dependencies patch))
+ (write-as-bytes
+ (with-output-to-string (strout)
+ (write-patchinfo d strout))
+ stream)
+ (write-byte 10 stream))
+ (write-as-byte #\> stream)
+ (write-byte 32 stream))
+ (write-patch (named-patch-patch patch) stream))
+
+(defmethod write-patch ((patch change-pref-patch) stream)
+ (write-as-bytes "changepref " stream)
+ (write-as-bytes (change-pref-which patch) stream)
+ (write-byte 10 stream)
+ (write-sequence (change-pref-from patch) stream)
+ (write-byte 10 stream)
+ (write-sequence (change-pref-to patch) stream)
+ (write-byte 10 stream))
+
+(defmethod write-patch ((patch move-patch) stream)
+ (write-sequence (string-to-bytes "move ") stream)
+ (write-sequence (string-to-bytes (patch-move-from patch)) stream)
+ (write-byte 32 stream)
+ (write-sequence (string-to-bytes (patch-move-to patch)) stream)
+ (write-byte 10 stream))
+
More information about the Cl-darcs-cvs
mailing list