PuercoPop / cl-git

A Common Lisp implementation of parsers for the git object file formats

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

CL-GIT: the pure lisp interface to Git objects

Introduction

Git libraries for Common Lisp common in a couple forms. Some attempt to wrap the libgit2 git library (e.g. https://github.com/russell/cl-git). Others wrap the git binary in a subprocess (e.g. http://shinmera.github.io/legit/). Such libraries work well in cases where you control the environment but not all lisp programs run in such circumstances. This library, on the contrary, attempts to implement parsers for git’s file formats as well as a thin “porcelain” interface for manipulating git objects.

Installation

% git clone https://github.com/fiddlerwoaroof/fwoar.lisputils.git "$HOME/quicklisp/local-projects/fwoar-lisputils"
% git clone https://github.com/fiddlerwoaroof/cl-git.git "$HOME/quicklisp/local-projects/cl-git"
% sbcl --load "$HOME/quicklisp/setup.lisp"
CL-USER> (ql:quickload :cl-git)

Example usage

Get the commit id of the master branch for a specific repository:

(git:in-repository "~/quicklisp/local-projects/cl-git")
(git:git (branch "master")) ;; the argument to branch defaults to "master"
#<LOOSE-REF 4d4ea31 of ~/git_repos/cl-git/>

Show the commit message

(git:in-repository "~/quicklisp/local-projects/cl-git")
(git:git (branch "master") ;; the argument to branch defaults to "master"
         (component :message))
doc: Complete installation instruction

Show the messages of the commit’s parent

(git:in-repository "~/quicklisp/local-projects/cl-git")
(git:git (branch "master") ;; the argument to branch defaults to "master"
         (commit-parents))
(("7df80f061ae5bf6177a1c0888d085281be2801e1"))

Show the files in a commit

(git:in-repository "~/quicklisp/local-projects/cl-git")
(list* #("name" "mode" "hash")
       (git:git (branch "master")
                (component :tree :entries)
                (map (juxt (component :name)
                           (component :mode)
                           (component :hash)))))
namemodehash
.gitignore1006448a9fe9f77149f74fed5c05388be8e5ffd4a31678
.projectile100644e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
LICENSE1006440306819e780fa57dc3bf6b99a0a059670b605ae0
README.org100644a52be677adeda194bcdfdd12740f00535b6b0997
branch.lisp100644e06b66967fa4fa005ccf00dcbc7d839b22259593
cl-git.asd1006449db42f61f21e11529b9bc1c52ee118c03d663c04
extract.lisp100644cf8e6e10786a26ffcd6a3e0fdb97abdf1c9f0345
git.lisp100644c516dfc248544509c3ae58e3a8c2ab81c225aa9c
graph.lisp10064431576396aff0fff28f69e0ef84571c0dc8cc43ec
model.lisp100644fb265bb344fee602dc175d1d5eac6bdc2d013a10
package.lisp100644d2818bb88b8ec5235a8ae91309f31ba58d941d42
porcelain.lisp1006440673dcbe10b945d561a9c3c485fe28aab12b257c
undelta.lisp100644ae0a070133d1a14d6e940a0f790f40b37e885b22
util.lisp10064487c2b9b2dfaa1fbf66b3fe88d3a925593886b159

Partially Implemented:

Delta refs

Git uses a delta calculation routine to compress some of the blobs in a pack file. This delta stores a reference to a base object and a sequence of commands for transforming the base object into the new object. My plan to support this is to first just extract the commands from the pack file and store them as a delta object. When this works adequately, I’ll write an interpreter to do the actual merge.

About

A Common Lisp implementation of parsers for the git object file formats

License:MIT License


Languages

Language:Common Lisp 100.0%