git.fiddlerwoaroof.com
branch.lisp
8f6a8909
 (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)
c672c979
   (:method ((repository git-repository))
8f6a8909
     (get-local-branches (root repository))))
 
 (defgeneric branch (repository name)
c672c979
   (:method ((repository git-repository) name)
8f6a8909
     (second
      (find name (get-local-branches (root repository))
            :test 'equal
            :key 'car))))