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

mhenoch at common-lisp.net mhenoch at common-lisp.net
Thu Sep 6 05:26:42 UTC 2007


Author: mhenoch
Date: Thu Sep  6 01:26:40 2007
New Revision: 139

Added:
   cl-darcs/trunk/cmdline.lisp
Modified:
   cl-darcs/trunk/packages.lisp
Log:
Start hacking command line interface

Added: cl-darcs/trunk/cmdline.lisp
==============================================================================
--- (empty file)
+++ cl-darcs/trunk/cmdline.lisp	Thu Sep  6 01:26:40 2007
@@ -0,0 +1,90 @@
+;;; Copyright (C) 2007 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)
+
+(defvar *darcs-commands* ()
+  "List of commands that can be executed from the command line.
+Each element is a symbol that names the command.  The corresponding
+function is named cmd-SYMBOL, and is called with all command line
+arguments but the first one.  It should return an integer exit code.")
+
+(eval-when (:compile-toplevel :load-toplevel)
+  (defun command-function (command)
+    "Turn a command symbol into a function symbol."
+    (intern (format nil "CMD-~A" command) :darcs)))
+
+(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
+platform-dependent manner, while being portable itself.  An integer
+exit code is returned."
+  (let* ((command (find (car argv) *darcs-commands* :test #'string-equal))
+	 (function (when command (command-function command))))
+    (if (null command)
+	(progn
+	  (if (null argv)
+	      (format *error-output* "No command given!~n")
+	      (format *error-output* "Invalid command '~A'!~n" command))
+	  (usage)
+	  1)
+	(handler-case 
+	    (apply function (cdr argv))
+	  (program-error ()
+	    (command-usage command)
+	    1)))))
+
+(defun usage ()
+  "Print usage information about commands to *ERROR-OUTPUT*."
+  (format *error-output* "Usage: darcs COMMAND ...~n~nCommands:~n")
+  (dolist (cmd *darcs-commands*)
+    (let ((function (command-function cmd)))
+      (format *error-output* "  ~A~15,2T~A~N" 
+	      (split-sequence:split-sequence 
+	       #\Newline (documentation function 'function)
+	       :count 1)))))
+
+(defun command-usage (command)
+  "Print longer documentation for COMMAND."
+  (format *error-output* "~A~N" (documentation (command-function command) 'function)))
+
+(defmacro define-darcs-command (name arglist docstring &body body)
+  (let ((function (command-function name)))
+    `(progn
+       (pushnew ',name *darcs-commands*)
+       (defun ,function ,arglist ,docstring , at body))))
+
+(defun find-repo ()
+  "Find repository in current directory.
+Signal an error if there is none."
+  (unless (fad:directory-exists-p (upath-subdir *default-pathname-defaults* '("_darcs")))
+    (error "Not in a darcs repo."))
+  *default-pathname-defaults*)
+
+(define-darcs-command add (&rest files-and-dirs)
+  "Add files and directories for later recording.
+
+Usage: darcs add FILE ..."
+  (let ((repo (find-repo)))
+    (dolist (file files-and-dirs)
+      (add-file repo file)
+      (format t "~&Added ~A" file))))
+
+(define-darcs-command whatsnew ()
+  "See what has been changed in the working directory.
+
+Usage: darcs whatsnew"
+  (diff-repo-display (find-repo)))

Modified: cl-darcs/trunk/packages.lisp
==============================================================================
--- cl-darcs/trunk/packages.lisp	(original)
+++ cl-darcs/trunk/packages.lisp	Thu Sep  6 01:26:40 2007
@@ -8,4 +8,5 @@
    #:get-repo #:pull #:diff-repo #:diff-repo-display 
    #:record-changes #:create-repo
    #:revert-changes #:send-to-file
-   #:add-file))
+   #:add-file
+   #:handle-command-line))



More information about the Cl-darcs-cvs mailing list