gitano/main.lisp

72 lines
2.8 KiB
Common Lisp

(defpackage gitano
(:use :cl))
(in-package :gitano)
(ql:quickload '("hunchentoot" "caveman2" "spinneret"
"djula" "easy-routes" "cl-git"))
(defvar *acceptor* (make-instance 'easy-routes:easy-routes-acceptor
:port 1337
:document-root #p"www/"))
(hunchentoot:start *acceptor*)
(easy-routes:defroute home ("/" :method :get) ()
(format nil "<ul>~{<li><a href=\"/~a\">~:*~a</a></li>~}</ul>" (get-projects)))
(easy-routes:defroute project ("/:project" :method :get) ()
(format nil "<ul>~{<li><a href=\"/~a\">~:*~a</a></li>~}</ul>" (get-master-logs project)))
(defun get-projects ()
(loop for dir in (uiop:subdirectories "/home/joe/Development/")
when (uiop:directory-exists-p (merge-pathnames dir ".git"))
collect dir into dirs
finally (return (mapcar (lambda (d) (first (last (pathname-directory d)))) dirs))))
(defun get-master-logs (proj-name)
(git:with-repository (repository (merge-pathnames "/home/joe/Development/" proj-name))
(loop
:with walker = (git:revision-walk
(git:get-object 'git:reference "refs/heads/master"
repository))
:for revision = (git:next-revision walker)
:until (null revision)
:collect (git:message revision))))
(defun get-diff (proj-name)
(git:with-repository (repository (merge-pathnames "/home/joe/Development/" proj-name))
(git:make-patch
(git:diff (git:get-object 'git:commit "5e43870b11166f972a1de6cc387f3c4bc381894c" repository)
(git:get-object 'git:commit "7ed1d2216cf051da937bb6fb05e911a293321876" repository)))))
(defparameter *repo* (git:open-repository
(merge-pathnames #p"Development/odin-6502/" (user-homedir-pathname))))
;; (git:open-repository "/home/joe/Development/cubetimer/")
;; (uiop:directory-exists-p (merge-pathnames "/home/joe/Development/tinyswords/" ".git"))
;; (let* ((proj-path (merge-pathnames #p"Development/tinyswords/" (user-homedir-pathname)))
;; (repo (git:open-repository proj-path)))
;; (git:resolve (git:get-object 'git:reference "HEAD" repo)))
;; (loop for item in (git:repository-status *repo*)
;; do (when (not (equalp (cadr item) :ignored))
;; (print item)))
;; (loop for item in (git:repository-status *repo*)
;; do (when (not (equalp (cadr item) :ignored))
;; (print item)))
;; (git:revision-walk (git:get-object 'git:reference "refs/heads/master"
;; (git:open-repository "/home/joe/Development/tinyswords/")))
;; (loop for entry in (git:entries (git:reflog (git:get-object 'git:reference "HEAD" *repo*)))
;; do (print (getf (git:committer entry) :email)))
;; (loop for tag in (git:with-repository (repo "/home/joe/Repositories/emacs/")
;; (git:list-objects 'git:tag repo)))