(in-package :fwoar.cl-git)
(defun get-local-unpacked-branches (root)
(mapcar (data-lens:juxt #'pathname-name
(alexandria:compose #'serapeum:trim-whitespace
#'alexandria:read-file-into-string))
(uiop:directory*
(merge-pathnames ".git/refs/heads/*"
root))))
(defun get-local-packed-branches (root)
(let* ((packed-ref-file-name (merge-pathnames ".git/packed-refs"
root)))
(when (probe-file packed-ref-file-name)
(with-open-file (s packed-ref-file-name)
(loop for line = (read-line s nil)
for parts = (partition #\space line)
for branch-name = (second parts)
while line
unless (alexandria:starts-with-subseq "#" line)
when (alexandria:starts-with-subseq "refs/heads" branch-name)
collect (list (subseq branch-name
(1+ (position #\/ branch-name
:from-end t)))
(first parts)))))))
(defun get-local-branches (root)
(append (get-local-unpacked-branches root)
(get-local-packed-branches root)))
(defgeneric branches (repository)
|