4cc1ee49 | (in-package :fwoar.cl-git) (defclass git-tree (git-object) ((%entries :initarg :entries :reader entries))) (defun git-tree (entries) (fw.lu:new 'git-tree entries)) (defclass tree-entry () |
216c17e7 | ((%repo :initarg :repo :reader repository) (%mode :initarg :mode :reader te-mode) |
4cc1ee49 | (%name :initarg :name :reader te-name) (%hash :initarg :hash :reader te-hash))) |
216c17e7 | (defun tree-entry (repo name mode hash) (fw.lu:new 'tree-entry repo name mode hash)) |
4cc1ee49 | (defmethod print-object ((o tree-entry) s) (if *print-readably* (format s "#.(~s ~s ~s ~s)" 'tree-entry (te-name o) (te-mode o) (te-hash o)) (print-unreadable-object (o s :type t :identity t) (format s "(~a: ~a)" (te-name o) (subseq (te-hash o) 0 7))))) (defun parse-tree-entry (data) (values-list (partition 0 data :with-offset 20))) |
216c17e7 | (defun format-tree-entry (repo entry) |
4cc1ee49 | (destructuring-bind (info sha) (partition 0 entry) |
216c17e7 | (destructuring-bind (mode name) (partition #\space (babel:octets-to-string info :encoding *git-encoding*)) (tree-entry repo name mode (elt (->sha-string sha) 0))))) |
4cc1ee49 | |
216c17e7 | (defun tree-entries (repo data &optional accum) |
4cc1ee49 | (if (<= (length data) 0) (nreverse accum) (multiple-value-bind (next rest) (parse-tree-entry data) |
41ea4583 | (tree-entries repo rest |
216c17e7 | (list* (format-tree-entry repo next) |
4cc1ee49 | accum))))) (defmethod -extract-object-of-type ((type (eql :tree)) s repository &key) |
216c17e7 | (git-tree (tree-entries repository s))) |
4cc1ee49 | (defmethod component ((component (eql :entries)) (object git-tree)) (entries object)) (defmethod component ((component string) (object git-tree)) |
216c17e7 | (car (remove component (entries object) :test-not #'equal :key 'te-name))) |
4cc1ee49 | (defmethod component ((component pathname) (object git-tree)) (remove-if-not (lambda (it) (pathname-match-p it component)) (entries object) :key 'te-name)) (defmethod component ((component (eql :name)) (object tree-entry)) (te-name object)) (defmethod component ((component (eql :mode)) (object tree-entry)) (te-mode object)) (defmethod component ((component (eql :hash)) (object tree-entry)) (te-hash object)) |
216c17e7 | (defmethod component ((component (eql :ref)) (object tree-entry)) (ref (repository object) (te-hash object))) |