package git-kv
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=531a165a2b107dc38947769ffd548df47a9d6ced1608da15ff5a90a5c720a7a8
sha512=772210a21f5f6453d08902817126203ed79e2c3c56e152dfc671f07919976e171c98b8919a283657e1bd4861dca69cba12074d97a54fdf2a2c8ec5785d45cfad
Description
Published: 24 May 2024
README
Git-kv, a simple Key-Value store synchronized with a Git repository
This library is a simple implementation of a Git repository that can be read and/or modified. It offers two ways to create such a local repository:
The local repository can be created in a serialized state
The local repository can be created from a remote repository
The first method has the advantage of not requiring an internet connection. The serialized state can be created with the mgit
tool:
$ mgit https://github.com/mirage/mirage <<EOF
> save db.pack
> quit
$ ls db.pack
db.pack
The disadvantage is that the serialized state may be out of sync with the state of the remote repository. In this case, the user has access to the pull
function, which allows the internet state of the local repository to be re-synchronised with the remote repository.
let contents_of_file filename =
let ic = open_in filename in
let ln = in_channel_length ic in
let rs = Bytes.create ln in
really_input ic rs 0 ln ;
Bytes.unsafe_to_string rs
let _ =
Git_kv.of_octets ctx
~remote:"git@github.com:mirage/mirage.git"
(contents_of_file "db.pack") >>= fun t ->
Git_kv.pull t >>= fun diff ->
...
The second method initiates a connection to the remote repository in order to download its state and reproduce a synchronised internal state. The type of connections supported are described in the given ctx
. We recommend the tutorial about Mimic to understand its use.
let _ =
Git_kv.connect ctx "git@github.com:mirage/mirage.git" >>= fun t ->
...
The user can manipulate the repository as an RW repository. Any change to the repository requires a new commit. These changes will be sent to the remote repository. The user can fold any changes into one commit if he/she wants.
module Store = Git_kv.Make (Pclock)
let new_file t =
Store.set t Mirage_kv.Key.(empty / "foo") "foo" >>= fun () ->
(* XXX(dinosaure): a commit was created and sended to the
remote repository. *)
...
let new_files t =
Store.change_and_push t @@ fun t ->
Store.set t Mirage_kv.Key.(empty / "foo" "foo") >>= fun () ->
Store.set t Mirage_kv.Key.(empty / "bar" "bar")
(* XXX(dinosaure): multiple files are added into the local repository
but they are committed only at the end of the given function
to [change_and_push]. That's say, only one commit was made and sended to the
remote Git repository. *)
Dependencies (9)
- ptime
-
mirage-clock
>= "2.0.0"
-
fmt
>= "0.8.7"
-
carton-lwt
>= "0.7.0"
-
carton
>= "0.7.0"
-
mirage-kv
>= "6.0.0"
-
git
>= "3.10.0"
-
dune
>= "2.9.0"
-
ocaml
>= "4.08.0"
Dev Dependencies (4)
-
git-unix
>= "3.10.0" & with-test
-
mirage-clock-unix
with-test
-
conf-git
with-test
-
hxd
with-test
Used by (1)
Conflicts
None