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

mhenoch at common-lisp.net mhenoch at common-lisp.net
Tue Jan 8 18:09:18 UTC 2008


Author: mhenoch
Date: Tue Jan  8 13:09:17 2008
New Revision: 157

Modified:
   cl-darcs/trunk/cmdline.lisp
Log:
Hack "add" command for error messages conforming to darcs' test suite, etc


Modified: cl-darcs/trunk/cmdline.lisp
==============================================================================
--- cl-darcs/trunk/cmdline.lisp	(original)
+++ cl-darcs/trunk/cmdline.lisp	Tue Jan  8 13:09:17 2008
@@ -1,4 +1,4 @@
-;;; Copyright (C) 2007 Magnus Henoch
+;;; Copyright (C) 2007, 2008 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
@@ -27,6 +27,9 @@
     "Turn a command symbol into a function symbol."
     (intern (format nil "CMD-~A" command) :darcs)))
 
+(define-condition invalid-arguments (simple-error)
+  ())
+
 (defun handle-command-line (argv)
   "Handle a command line, emulating the real darcs client.
 ARGV is a list of strings.  This function is to be called in some
@@ -41,10 +44,24 @@
 	      (format *error-output* "Invalid command '~A'!~%" (car argv)))
 	  (usage)
 	  1)
-	(handler-case 
-	    (apply function (cdr argv))
+	(handler-case
+	    (let ((retval (apply function (cdr argv))))
+	      (fresh-line)
+	      (if (numberp retval)
+		  retval
+		  (progn
+		    (warn "~A didn't give a proper exit code." command)
+		    0)))
+	  ;; Catch wrong number of arguments
 	  (program-error ()
 	    (command-usage command)
+	    1)
+	  (invalid-arguments (c)
+	    (with-accessors ((ctrl simple-condition-format-control)
+			     (args simple-condition-format-arguments)) c
+	      (when ctrl
+		(apply #'format *error-output* ctrl args)))
+	    (command-usage command)
 	    1)))))
 
 (defun usage ()
@@ -60,7 +77,7 @@
 
 (defun command-usage (command)
   "Print longer documentation for COMMAND."
-  (format *error-output* "~A~%" (documentation (command-function command) 'function)))
+  (format *error-output* "~&~A~%" (documentation (command-function command) 'function)))
 
 (defmacro define-darcs-command (name arglist docstring &body body)
   (let ((function (command-function name)))
@@ -79,10 +96,47 @@
   "Add files and directories for later recording.
 
 Usage: darcs add FILE ..."
-  (let ((repo (find-repo)))
+  (let ((repo (find-repo))
+	already-there)
     (dolist (file files-and-dirs)
-      (add-file repo file)
-      (format t "~&Added ~A" file))))
+      (handler-case
+	  (progn
+	    (add-file repo file)
+	    ;; (format t "~&Added ~A" file)
+	    )
+	(already-in-repository (c)
+	  ;; Save the files and directories that are already in the
+	  ;; repository for pretty error printing.
+	  (push (slot-value c 'file) already-there))))
+    (when already-there
+      (setf already-there (nreverse already-there))
+      (let* ((with-path (mapcar (lambda (f) (merge-pathnames f repo)) already-there))
+	     (nfiles 0)
+	     (ndirs 0))
+	(dolist (f with-path)
+	  (let ((truename (fad:file-exists-p f)))
+	    (assert truename)
+	    (if (fad:directory-pathname-p f)
+		(incf ndirs)
+		(incf nfiles))))
+	(assert (= (+ nfiles ndirs) (length already-there)))
+	;; We want the message to look just like darcs', in order to
+	;; pass its test suite (in particular tests/add.pl).
+	(format *error-output*
+		"~&The following ~A already in the repository"
+		(cond
+		  ((zerop nfiles)
+		   (if (= ndirs 1)
+		       "directory is"
+		       "directories are"))
+		  ((zerop ndirs)
+		   (if (= nfiles 1)
+		       "file is"
+		       "files are"))
+		  (t
+		   "files and directories are")))
+	(format *error-output* ":~%~{ ~A~}" already-there))))
+  0)
 
 (define-darcs-command whatsnew ()
   "See what has been changed in the working directory.
@@ -98,12 +152,20 @@
   (multiple-value-bind (operands options errors)
       (getopt:getopt args
 		     '(("repodir" :required)))
-    (declare (ignore operands))
+    (unless (null operands)
+      (error 'invalid-arguments
+	     :format-control "Invalid arguments: ~@{ ~A~}"
+	     :format-arguments operands))
     (if errors
-	(progn
-	  (format *error-output* "Invalid arguments: ~{ ~A ~}~%" errors)
-	  1)
+	(error 'invalid-arguments 
+	       :format-control "Invalid arguments: ~@{ ~A~}"
+	       :format-arguments errors)
 	(let ((repodir (or (cdr (assoc "repodir" options :test #'string=))
 			   *default-pathname-defaults*)))
-	  (format t "Creating repo in ~S...~%" repodir)
-	  (create-repo (truename repodir))))))
+	  (format t "Creating repo in ~A...~%" repodir)
+	  (create-repo repodir)
+	  0))))
+
+(define-darcs-command record (&rest args)
+    "Save changes in the working copy to the repository as a patch."
+  )



More information about the Cl-darcs-cvs mailing list