9dca83b1 |
(in-package :fwoar.cl-git.commit)
|
4cc1ee49 |
|
9dca83b1 |
(defclass git-commit (fwoar.cl-git:git-object)
|
489818ad |
((%metadata :initarg :metadata :reader metadata)
|
4cc1ee49 |
(%data :initarg :data :reader data)))
|
b7739814 |
(defun git-commit (hash metadata data)
(fw.lu:new 'git-commit hash metadata data))
(defun clamp-string (s len)
(subseq s 0 (min len (length s))))
|
744c84b5 |
(defmethod print-object ((o git-commit) s)
(if *print-readably*
(format s "#.(git-commit ~<~s~_~s~_~s~:>)"
|
9dca83b1 |
(list (fwoar.cl-git:hash o)
|
744c84b5 |
(metadata o)
(data o)))
(print-unreadable-object (o s :type t :identity t)
|
9dca83b1 |
(format s "~a" (format nil "~7,1,1,'x@a" (clamp-string (fwoar.cl-git:hash o) 7))))))
|
4cc1ee49 |
(defun parse-commit (commit)
(destructuring-bind (metadata message)
|
9dca83b1 |
(fwoar.cl-git.utils:partition-subseq
#(#\newline #\newline)
commit
#+(or)(babel:octets-to-string commit :encoding :latin1))
|
4cc1ee49 |
(values message
|
9dca83b1 |
(map 'vector
(serapeum:op (fwoar.string-utils:partition #\space _))
|
4cc1ee49 |
(fwoar.string-utils:split #\newline metadata)))))
|
744c84b5 |
(defun make-commit (data hash)
|
4cc1ee49 |
(multiple-value-bind (message metadata)
(parse-commit data)
|
744c84b5 |
(git-commit hash metadata message)))
|
9dca83b1 |
(defmethod -extract-object-of-type
((type (eql :commit)) s repository &key hash)
(make-commit (babel:octets-to-string s :encoding fwoar.cl-git:*git-encoding*)
|
744c84b5 |
hash))
|
4cc1ee49 |
|
9dca83b1 |
(defcomponents git-commit (object _)
((eql :tree) (fwoar.cl-git:ensure-ref
(cadr
(fw.lu:v-assoc :tree (metadata object)
:test 'string-equal))))
|
4cc1ee49 |
|
9dca83b1 |
((eql :author) (second
(fw.lu:v-assoc :author (metadata object)
:test 'string-equal)))
((eql :committer) (second
(fw.lu:v-assoc :committer (metadata object)
:test 'string-equal)))
((eql :parents) (data-lens.transducers:into
'()
(data-lens:•
(data-lens.transducers:filtering
(data-lens:on (data-lens:== "parent" :test 'equal)
#'car))
(data-lens.transducers:mapping #'cadr))
(metadata object)))
((eql :message) (data object)))
|