[Cl-darcs-cvs] r51 - cl-darcs/trunk
mhenoch at common-lisp.net
mhenoch at common-lisp.net
Fri Oct 6 19:55:15 UTC 2006
Author: mhenoch
Date: Fri Oct 6 15:55:15 2006
New Revision: 51
Added:
cl-darcs/trunk/pristine.lisp
Modified:
cl-darcs/trunk/get.lisp
cl-darcs/trunk/pull.lisp
Log:
Add functions for keeping a pristine. Use it when getting and pulling.
Modified: cl-darcs/trunk/get.lisp
==============================================================================
--- cl-darcs/trunk/get.lisp (original)
+++ cl-darcs/trunk/get.lisp Fri Oct 6 15:55:15 2006
@@ -64,6 +64,8 @@
;; What happens when adding patches one by one?
(append-inventory outname patchinfo)
(format t ".")))
+ (format t "~&Creating pristine")
+ (create-pristine-from-tree outname)
(format t "~&All done"))))
(defun select-some-patches (patchinfo-list)
Added: cl-darcs/trunk/pristine.lisp
==============================================================================
--- (empty file)
+++ cl-darcs/trunk/pristine.lisp Fri Oct 6 15:55:15 2006
@@ -0,0 +1,28 @@
+;;; 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 create-pristine-from-tree (repodir)
+ "Copy the checked-out tree at REPODIR to get a pristine tree."
+ (let* ((darcs-dir (upath-subdir repodir '("_darcs")))
+ (pristine-dir (upath-subdir darcs-dir '("pristine"))))
+ (make-dir pristine-dir)
+ (copy-directory repodir pristine-dir :excluding (list darcs-dir))))
+
+(defun apply-patch-to-pristine (patch repodir)
+ "Apply PATCH to the pristine tree in REPODIR."
+ (apply-patch patch (upath-subdir repodir '("_darcs" "pristine"))))
Modified: cl-darcs/trunk/pull.lisp
==============================================================================
--- cl-darcs/trunk/pull.lisp (original)
+++ cl-darcs/trunk/pull.lisp Fri Oct 6 15:55:15 2006
@@ -49,11 +49,32 @@
(make-instance 'composite-patch
:patches our-patches)))))
(format t "~&Applying patches")
- (dolist (p merged-patches)
- (apply-patch p ourrepo)
- ;; If this is not a named patch, our assumptions are
- ;; challenged.
- (append-inventory ourrepo (named-patch-patchinfo p))
- (write-patch-to-repo p ourrepo)
- (format t ".")))))
- (format t "~&All done"))
+ (let ((applying-to-source t)
+ (source-and-pristine-differ nil))
+ (dolist (p merged-patches)
+ ;; First, copy the modified patch to the repository.
+ (write-patch-to-repo p ourrepo)
+ ;; Then, apply it to the pristine copy. This couldn't
+ ;; possibly fail.
+ (apply-patch-to-pristine p ourrepo)
+ ;; Note the patch in the inventory.
+ (append-inventory ourrepo (named-patch-patchinfo p))
+ ;; And finally apply the patch to the real source. This
+ ;; could fail if the source has been modified. Deal with
+ ;; that in a crude way. XXX: it is wasteful to apply
+ ;; patches twice.
+ (when applying-to-source
+ (restart-case
+ (apply-patch p ourrepo)
+ (skip-this ()
+ :report "Don't apply this patch to the source tree (it was applied to the pristine tree)"
+ (setf source-and-pristine-differ t))
+ (skip-all ()
+ :report "Stop trying to apply patches to the source tree (they will be applied to the pristine tree)"
+ (setf source-and-pristine-differ t)
+ (setf applying-to-source nil))))
+ (format t "."))
+ (when source-and-pristine-differ
+ (format t "~&~<Some patches could not be applied to the source tree.~
+You should manually merge changes from the pristine tree in _darcs/pristine/.~:@>")))))
+ (format t "~&All done")))
More information about the Cl-darcs-cvs
mailing list