4cc1ee49 |
(in-package :fwoar.cl-git)
(defun root-of (repo)
(typecase repo
(repository (root repo))
((or pathname string) (namestring
(truename repo)))))
|
ee4281cb |
(defun packed-ref (repo id)
|
744c84b5 |
(multiple-value-bind (pack offset sha) (find-object-in-pack-files repo id)
|
ee4281cb |
(when pack
(make-instance 'packed-ref
|
744c84b5 |
:hash sha
|
ee4281cb |
:repo repo
:offset offset
:pack pack))))
|
15785ea0 |
(defgeneric ref (repo id)
(:documentation "Given a REPOsitory and a ref ID return the ref-id object.")
(:method ((repo git-repository) (id string))
|
744c84b5 |
(or (alexandria:when-let ((object-file (loose-object repo id)))
(make-instance 'loose-ref
:repo repo
:hash (concatenate 'string
(subseq id 0 2)
(pathname-name object-file))
:file object-file))
(packed-ref repo id))))
|
216c17e7 |
|
489818ad |
(defvar *ref-intern-table*
(make-hash-table :test 'equal #+sbcl :weakness #+sbcl :key-and-value))
|
216c17e7 |
(defun ensure-ref (thing &optional (repo *git-repository*))
(typecase thing
(git-ref thing)
|
489818ad |
(t (alexandria:when-let ((maybe-result (ref repo thing)))
(alexandria:ensure-gethash (component :hash maybe-result)
*ref-intern-table*
maybe-result)))))
|
216c17e7 |
(defun ensure-repository (thing)
|
c672c979 |
(repository thing))
|