git-mirage

MirageOS backend for the Git protocol(s)
README

Support for on-disk and in-memory Git stores. Can read and write all
the Git objects: the usual blobs, trees, commits and tags but also
the pack files, pack indexes and the index file (where the staging area
lives).

All the objects share a consistent API, and convenience functions are
provided to manipulate the different objects. For instance, it is
possible to make a pack file position independent (as the Zlib
compression might change the relative offsets between the packed
objects), to generate pack indexes from pack files, or to expand
the filesystem of a given commit.

The library comes with a command-line tool called ogit as a Proof-of-concept
of the core library which shares a similar interface with git, but where all
operations are mapped to the API exposed ocaml-git (and hence using only OCaml
code).

The API documentation is available
online.

Build and Install Instructions

To build and install the project, simply run:

$ opam install git

What is supported

  • The loose object files can be read and written;

  • The pack files
    (collections of compressed loose objects using a binary-diff representation)
    and pack indexes
    (indexes of pack files) can be read and
    written). The binary diff hunks are exposed using a high-level
    position-independent representation so that they can be manipulated
    more easily. Pack file can be created and is compressed.

  • The index file
    (used as for managing the staging area)
    are fully supported. Which means that git diff and git status
    will work as expected on a repository created by the library.

  • Cloning and fetching
    (using various options) are fully supported for
    the Git protocol, the smart-HTTP protocol and git+ssh. A subset
    of the protocol capabilities are implemented (mainly thin-pack,
    ofs-delta, side-band-64k and allow-reachable-sha1-in-want).

  • Pushing is still experimental and needs more testing.

  • An abstraction for Git Store
    Is available. Various store implementations are available:

What is not supported

  • No server-side operations are currently supported.

  • No GC.

  • Updates, merge and rebase are not supported. Use
    irmin instead.

Performance

Performance is comparable to the Git tool.

Example

# #require "git.unix";;
# open Git_unix;;
# module Search = Git.Search.Make(FS);;

# let read filename =
    let open Lwt_result.Infix in
    Store.v (Fpath.v ".") >>= fun t ->
    Store.Ref.resolve Store.Reference.master >>= fun head ->
    let open Lwt.Infix in
    Search.find t head (`Commit (`Path filename)) >|= function
    | None -> Lwt.return (Error `Not_found)
    | Some hash -> Store.read t hash
val read : string list -> (Store.Value.t, Store.error) Lwt_result.t
    
# let pp =
    let ok ppf = function
      | Store.Value.Blob blob ->
        Fmt.string ppf (Store.Value.Blob.to_string blob)
      | _ -> Fmt.string ppf "#git-object" in
    Fmt.pp_result ~ok ~error:Store.pp_error
val pp : (Store.Value.t, Store.error) Fmt.t

# Lwt_main.run Lwt.Infix.(read [ "README.md" ] >|= pp Fmt.stdout)

ocaml-git -- Git format and protocol in pure OCaml

Support for on-disk and in-memory Git stores. Can read and write all
the Git objects: the usual blobs, trees, commits and tags but also
the pack files, pack indexes and the index file (where the staging area
lives).

[...]

License

MIT, see LICENSE.md file for its text.

Install
Published
12 Jul 2019
Sources
git-2.1.0.tbz
sha256=2a64446ac45b38e6830dc907d5321c0902310562dae3ba1bfb9ed70c0b3b9c7c
sha512=7ac19137197a0620f4a1398e325895a37bc1d52d9e32ed756488e01b55ae95f37f930c80d11bc29203b30ee6becf49b67826afd31c1389eb37e2c7f892b40864
Dependencies
mirage-stack-lwt
with-test & >= "1.3.0"
io-page-unix
with-test
tcpip
with-test & >= "3.3.0" & < "6.0.0"
io-page
with-test & >= "1.6.1"
tls
with-test
nocrypto
with-test & >= "0.5.4"
mirage-fs-unix
with-test & >= "1.3.0"
mtime
with-test & >= "1.0.0"
alcotest
with-test & >= "0.8.1"
git
= version
git-http
= version
mirage-conduit
>= "3.0.0"
conduit
< "2.3.0"
cohttp-mirage
>= "1.0.0"
ocaml
>= "4.03.0"
Reverse Dependencies
irmin-mirage
< "2.0.0"