Compare commits
No commits in common. "95cb457284aa037bbd24f56ffa0b008978f4309c" and "3dc33b875ae9ac5d1c308f310f6dac5318217644" have entirely different histories.
95cb457284
...
3dc33b875a
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,2 +0,0 @@
|
|||||||
/gitano.fasl
|
|
||||||
/main.fasl
|
|
17
gitano.asd
17
gitano.asd
@ -1,17 +0,0 @@
|
|||||||
(asdf:defsystem "gitano"
|
|
||||||
:version "0.0.1"
|
|
||||||
:author "Joseph Ferano"
|
|
||||||
:license "MIT"
|
|
||||||
:depends-on (
|
|
||||||
:hunchentoot
|
|
||||||
:easy-routes
|
|
||||||
:djula
|
|
||||||
:cl-git
|
|
||||||
)
|
|
||||||
:components ((:module "." ;; a src/ subdirectory
|
|
||||||
:components
|
|
||||||
(
|
|
||||||
(:file "main") ;; = src/myproject.lisp
|
|
||||||
)))
|
|
||||||
|
|
||||||
:description "A minimalist git forge intended for self-hosting")
|
|
81
main.lisp
81
main.lisp
@ -1,7 +1,3 @@
|
|||||||
(defpackage gitano
|
|
||||||
(:use :cl))
|
|
||||||
(in-package :gitano)
|
|
||||||
|
|
||||||
(ql:quickload '("hunchentoot" "caveman2" "spinneret"
|
(ql:quickload '("hunchentoot" "caveman2" "spinneret"
|
||||||
"djula" "easy-routes" "cl-git"))
|
"djula" "easy-routes" "cl-git"))
|
||||||
|
|
||||||
@ -12,29 +8,10 @@
|
|||||||
(hunchentoot:start *acceptor*)
|
(hunchentoot:start *acceptor*)
|
||||||
|
|
||||||
(easy-routes:defroute home ("/" :method :get) ()
|
(easy-routes:defroute home ("/" :method :get) ()
|
||||||
;; (format nil "<ul>~{<li><a href=\"/~a\">~:*~a</a></li>~}</ul>" (get-projects)))
|
(format nil "<ul>~{<li><a href=\"/~a\">~:*~a</a></li>~}</ul>" (get-projects)))
|
||||||
(render-home))
|
|
||||||
|
|
||||||
(easy-routes:defroute project ("/:project/" :method :get) ()
|
(easy-routes:defroute project ("/:project" :method :get) ()
|
||||||
;; (format nil "<ul>~{<li><a href=\"/~a\">~:*~a</a></li>~}</ul>" (get-master-logs project)))
|
(format nil "<ul>~{<li><a href=\"/~a\">~:*~a</a></li>~}</ul>" (get-master-logs project)))
|
||||||
(render-project project))
|
|
||||||
|
|
||||||
(easy-routes:defroute commit-diff ("/:project/:commithash" :method :get) ()
|
|
||||||
(format nil "<pre>~a</pre>" (get-diff project commithash)))
|
|
||||||
|
|
||||||
(djula:add-template-directory (asdf:system-relative-pathname "gitano" "www/"))
|
|
||||||
|
|
||||||
(defparameter +home.html+ (djula:compile-template* "home.html"))
|
|
||||||
(defparameter +project.html+ (djula:compile-template* "project.html"))
|
|
||||||
|
|
||||||
(defun render-home ()
|
|
||||||
(djula:render-template* +home.html+ nil :projects (get-projects-alist)))
|
|
||||||
|
|
||||||
(defun render-project (project)
|
|
||||||
(djula:render-template* +project.html+ nil
|
|
||||||
:project '((:name . "flan"))
|
|
||||||
:commits '(((:message . "Commit 1" ) (:hash . "12345678"))
|
|
||||||
((:message . "Commit 2" ) (:hash . "abcdefgh")))))
|
|
||||||
|
|
||||||
(defun get-projects ()
|
(defun get-projects ()
|
||||||
(loop for dir in (uiop:subdirectories "/home/joe/Development/")
|
(loop for dir in (uiop:subdirectories "/home/joe/Development/")
|
||||||
@ -42,14 +19,6 @@
|
|||||||
collect dir into dirs
|
collect dir into dirs
|
||||||
finally (return (mapcar (lambda (d) (first (last (pathname-directory d)))) dirs))))
|
finally (return (mapcar (lambda (d) (first (last (pathname-directory d)))) dirs))))
|
||||||
|
|
||||||
(defun get-projects-alist ()
|
|
||||||
(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) (list (cons :name (first (last (pathname-directory d))))))
|
|
||||||
dirs))))
|
|
||||||
|
|
||||||
(defun get-master-logs (proj-name)
|
(defun get-master-logs (proj-name)
|
||||||
(git:with-repository (repository (merge-pathnames "/home/joe/Development/" proj-name))
|
(git:with-repository (repository (merge-pathnames "/home/joe/Development/" proj-name))
|
||||||
(loop
|
(loop
|
||||||
@ -60,13 +29,11 @@
|
|||||||
:until (null revision)
|
:until (null revision)
|
||||||
:collect (git:message revision))))
|
:collect (git:message revision))))
|
||||||
|
|
||||||
(defun get-diff (proj-name commithash)
|
(defun get-diff (proj-name)
|
||||||
(git:with-repository (repository (merge-pathnames "/home/joe/Development/" proj-name))
|
(git:with-repository (repository (merge-pathnames "/home/joe/Development/" proj-name))
|
||||||
(format nil "~{~A~^~%~}"
|
(git:make-patch
|
||||||
(mapcar (lambda (patch) (getf patch :patch))
|
(git:diff (git:get-object 'git:commit "5e43870b11166f972a1de6cc387f3c4bc381894c" repository)
|
||||||
(git:make-patch
|
(git:get-object 'git:commit "7ed1d2216cf051da937bb6fb05e911a293321876" repository)))))
|
||||||
(git:diff (git:get-object 'git:commit "5e43870b11166f972a1de6cc387f3c4bc381894c" repository)
|
|
||||||
(git:get-object 'git:commit "7ed1d2216cf051da937bb6fb05e911a293321876" repository)))))))
|
|
||||||
|
|
||||||
(defparameter *repo* (git:open-repository
|
(defparameter *repo* (git:open-repository
|
||||||
(merge-pathnames #p"Development/odin-6502/" (user-homedir-pathname))))
|
(merge-pathnames #p"Development/odin-6502/" (user-homedir-pathname))))
|
||||||
@ -74,27 +41,27 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; (git:open-repository "/home/joe/Development/cubetimer/")
|
(git:open-repository "/home/joe/Development/cubetimer/")
|
||||||
;; (uiop:directory-exists-p (merge-pathnames "/home/joe/Development/tinyswords/" ".git"))
|
(uiop:directory-exists-p (merge-pathnames "/home/joe/Development/tinyswords/" ".git"))
|
||||||
|
|
||||||
;; (let* ((proj-path (merge-pathnames #p"Development/tinyswords/" (user-homedir-pathname)))
|
(let* ((proj-path (merge-pathnames #p"Development/tinyswords/" (user-homedir-pathname)))
|
||||||
;; (repo (git:open-repository proj-path)))
|
(repo (git:open-repository proj-path)))
|
||||||
;; (git:resolve (git:get-object 'git:reference "HEAD" repo)))
|
(git:resolve (git:get-object 'git:reference "HEAD" repo)))
|
||||||
|
|
||||||
;; (loop for item in (git:repository-status *repo*)
|
(loop for item in (git:repository-status *repo*)
|
||||||
;; do (when (not (equalp (cadr item) :ignored))
|
do (when (not (equalp (cadr item) :ignored))
|
||||||
;; (print item)))
|
(print item)))
|
||||||
|
|
||||||
;; (loop for item in (git:repository-status *repo*)
|
(loop for item in (git:repository-status *repo*)
|
||||||
;; do (when (not (equalp (cadr item) :ignored))
|
do (when (not (equalp (cadr item) :ignored))
|
||||||
;; (print item)))
|
(print item)))
|
||||||
|
|
||||||
;; (git:revision-walk (git:get-object 'git:reference "refs/heads/master"
|
(git:revision-walk (git:get-object 'git:reference "refs/heads/master"
|
||||||
;; (git:open-repository "/home/joe/Development/tinyswords/")))
|
(git:open-repository "/home/joe/Development/tinyswords/")))
|
||||||
|
|
||||||
;; (loop for entry in (git:entries (git:reflog (git:get-object 'git:reference "HEAD" *repo*)))
|
(loop for entry in (git:entries (git:reflog (git:get-object 'git:reference "HEAD" *repo*)))
|
||||||
;; do (print (getf (git:committer entry) :email)))
|
do (print (getf (git:committer entry) :email)))
|
||||||
|
|
||||||
|
|
||||||
;; (loop for tag in (git:with-repository (repo "/home/joe/Repositories/emacs/")
|
(loop for tag in (git:with-repository (repo "/home/joe/Repositories/emacs/")
|
||||||
;; (git:list-objects 'git:tag repo)))
|
(git:list-objects 'git:tag repo)))
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Gitano</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<ul>
|
|
||||||
{% for project in projects %}
|
|
||||||
<li><a href="{{project.name}}/">{{ project.name }}</a></li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
11
www/index.html
Normal file
11
www/index.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Hello!</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello local server!</h1>
|
||||||
|
<p>
|
||||||
|
We just served our own files.
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -1,8 +0,0 @@
|
|||||||
<title> {{ project.name }} </title>
|
|
||||||
<body>
|
|
||||||
<ul>
|
|
||||||
{% for commit in commits %}
|
|
||||||
<li><a href="{{project.name}}/{{commit.hash}}"> {{ commit.message }} </a></li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
</body>
|
|
Loading…
x
Reference in New Issue
Block a user