git.fiddlerwoaroof.com
commit.lisp
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)))