;; cvs -z3 log -N -d">2003-12-03" >../ChangeLog (defun load-logs (stream &aux (entry nil) (logs nil)) (loop for line = (read-line stream nil :eof) until (eq line :eof) do (cond (#+cmu(ppcre:scan "^=+$" line) #+clisp(regexp:match "==*" line) (when (and entry #+cmu(null (ppcre:scan "selected revisions: 0" entry)) #+clisp(null (regexp:match "selected revisions: 0" entry))) (push entry logs)) (setq entry nil)) (t (setq entry (if entry (concatenate 'string entry line '(#\Newline)) (concatenate 'string line '(#\Newline)))))) finally (return logs))) (defun parse-logs (logs) (flet ((get-path (log) #+cmu (aref (second (multiple-value-list (ppcre:scan-to-strings "Working file: (.+)" log))) 0) #+clisp (let ((m (second (multiple-value-list (regexp:match "Working file: \\(.*\\).head:" log))))) (subseq log (regexp:match-start m) (regexp:match-end m)))) (get-changes (log) #+cmu (cdr (ppcre:split "----+" log)) #+clisp (cdr (regexp:regexp-split "-----*" log)))) (loop for l in logs collect (cons (get-path l) (get-changes l))))) #+cmu (defun parse (date) (port:chdir "src") (format t "Getting cvs log ....~%") (let ((s (with-output-to-string (s) (run-program "cvs" `("-z3" "log" "-N" "-d" ,date) :output s)))) (port:chdir "..") (format t "Parsing cvs log ....~%") (with-input-from-string (stream s) (parse-logs (load-logs stream))))) #+clisp (defun parse (date) (ext:cd "src") (format t "Getting cvs log ....~%") (let ((stream (run-program "cvs" :arguments `("-z3" "log" "-N" "-d" ,date) :output :stream))) (ext:cd "..") (format t "Parsing cvs log ....~%") (parse-logs (load-logs stream)))) (defun cvslog-to-html (date) (let ((lst (parse date))) (with-output-to-string (s) (write-line "" s) (format s "~%CMU Common Lisp - cvs log - ~A~%~%" date) (write-line "" s) (format s "

CMU Common Lisp - cvs log - ~A

~%" date) (write-line "" s) (write-line "" s) (write-line "" s)))) (defun cvslog (&optional (date ">2003-12-03")) (with-open-file (s "cvslog.html" :direction :output :if-exists :supersede) (write-line (cvslog-to-html date) s)) t)