irmin-pack
reload after a GC (#2200, @metanivek)irmin-pack
irmin-pack
irmin-pack
Irmin_pack_unix.Stats.Latest_gc which is now the parameter of GC's finished callback (#2089, @Ngoguey42)Gc.oldest_live_commit which returns the key of the commit on which the latest gc was called on. (#2110, @icristescu)split to create a new suffix chunk. Subsequent writes will append to this chunk until split is called again. (#2118, @icristescu)create_one_commit_store to create a new store from the existing one, containing only one commit. (#2125, @icristescu)irmin-pack
examples/gc.ml for a demonstration of how it works with the new split function. (#2126, @metanivek)irmin-pack
irmin
test_set_and_get* functions to retrieve commit associated with an update to the store (#2074, @patricoferris)irmin-graphql
test_set_and_get function as a new mutation (#2074, @patricoferris)contents_hash function to get a value's hash (#2099, @patricoferris)irmin-pack
Gc.cancel to abort a running GC (#2101, @art-w)Irmin_pack_unix.Stats.Latest_gc which is now the parameter of GC's finished callback (#2089, @Ngoguey42)irmin-tezos-utils
irmin-tezos-utils containing a graphical tool for manual pack files analysis. (#1939, @clecat)irmin-pack
irmin_pack_mem no longer exposes disk specifics functions (#2081, @icristescu)Pack_key and Pack_value from irmin-pack to irmin-pack.unix (#2084, @metanivek)open_rw and after a failed GC (#2095, @art-w)irmin-pack
irmin-tezos CLI to work with gced stores. (#1919, @icristescu)irmin
Storage module for creating custom storage layers (#2047, @metanivek)irmin-pack
Gc.is_allowed (#2076, @icristescu)weight parameter in the LRU implementation to bound memory usage (#2050, @samoht)irmin
Irmin_unix.set_listen_dir_hook (#2071, @zshipko)irmin-pack
irmin
Tree.seq to Tree's public API (#1923, @metanivek)irmin-fs
irmin-fs.unix (#1948, @metanivek)irmin-git
irmin-git.unix (#1948, @metanivek)irmin-graphql
irmin-graphql.unix (#1948, @metanivek)irmin-http
irmin-http.unix (#1948, @metanivek)irmin-cli
irmin command-line tool (#1951, @metanivek)irmin-pack
Indexing_strategy.minimal. The primary API is Store.Gc.run, Store.Gc.wait, and Store.Gc.is_finished. See examples/gc.ml for a demonstration of usage.irmin
Tree.node_fn type with more general Tree.folder type to represent the different ways to use Tree.fold (#1918, @metanivek)irmin-unix
irmin-unix package. Unix backends are now subpackages of their relevant backend (see irmin-fs.unix and irmin-git.unix). The CLI tool is in irmin-cli. For common unix utilities, see irmin.unix. (#1953, @metanivek)irmin-graphql
graphql.0.14.0 (#1843, @patricoferris, @zshipko)irmin
irmin-tezos CLI and ./tezos-node storage to work with v2 inodes (#1903, @icristescu, @Ngoguey42)irmin-pack
irmin
Metrics module to describe metric gathering in irmin. (#1817, @maiste)Repo.config to access config used to create repo (#1886, @zshipko)irmin-unix
--plugin flag to load Dynlink plugins that can register new contents, hash and store types (#1808, @zshipko)irmin-pack
use_fsync, dict_auto_flush_threshold andsuffix_auto_flush_threshold in store configuration. (#1865, @Ngoguey42)no_migrate in store configuration. (#1893, @zshipko)irmin-pack
Irmin_pack.Pack_store.Indexing_strategy to Irmin_pack.Indexing_strategy and the rest of Pack_store to Irmin_pack_unix (#1833, @Ngoguey42)Snapshot.Import.close requires a repo as additional argument (#1872, @icristescu)irmin-pack.x.x < 3.3.0 versions. A migration done by the readwrite instance is necessary to open older stores with irmin-pack.3.3.0. It is not forwards compatible. (#1865)Store.sync to Store.reload (#1900, @Ngoguey42).Pack_error exception that centralizes many error cases alongside RO_not_allowed and Unix.Unix_error (#1899, @Ngoguey42)irmin-pack
irmin
irmin-pack
forbid_empty_dir_persistence in store configuration. (#1789, @ngoguey42)Store.Snapshot to expose the inodes for tezos snapshots (#1757, @icristescu).irmin
Tree.fold ~uniq:`True by a factor of 2. (#1770, @CraigFe)clear from all content addresssable stores. (#1794, @icristescu)irmin-pack
ppx_irmin. (#1782, @hhugo)irmin-unix
push, pull, fetch and clone (#1776, @zshipko)Mimic.ctx. A side-effect of this update is that the remote function now returns an Lwt promise. (#1778, @zshipko)libirmin
libirmin package providing a C interface to the irmin API (#1713, @zshipko)irmin-bench
irmin
Irmin.Tree objects to use the comparison defined on hashes. The previous implementation was unstable. (#1519, @CraigFe)irmin-pack
irmin-unix
irmin
Read_only.S and Read_only.Maker module types (#1343, @samoht)close and batch functions (#1345, @samoht)close function (#1345, @samoht)Store.Tree.singleton for building trees with a single contents binding. (#1567, @CraigFe)with_handler and head to Store.Backend.Node and Store.Backend.Node_portableto work with recursive node structures from irmin core. (#1712, #1746 @Ngoguey42). Forward port of #1692 and #1670.proof, to_proof and of_proof to Store.Backend.Node_portable (#1716, @Ngoguey42). Forward port from #1583.hash_exn to Store.Backend.Node.Val and Store.Backend.Node_portable (#TODO, @Ngoguey42) Forward ported from #1741.Store.Tree.kinded_hash function. (#1767, @Ngoguey) Forward ported from #1625.Contents.String_v2, Node.Generic_key.Make_v2 and Commit.Generic_key.Make_v2 for backward compatibility with older stores. (#1715, @icristescu)irmin-bench
Many improvements to the actions trace replay:
irmin-mem
Irmin_mem.Content_addressable (#1369, @samoht)irmin-pack
stat-store command to irmin-fsck to output stats on the tree under a specified commit (#1391, @icristescu, @Ngoguey42, @CraigFe).Stats (#1570, @Ngoguey42).irmin-unix
irmin CLI to raise an exception when an invalid/non-existent config file is specified (#1413, @zshipko)--commit flag to CLI to load a store from a specific commit hash (#1721, @zshipko)irmin-tezos
tezos-context.encoding library. That'll simplify building benchmarks and custom tools (#1579, @samoht)irmin
Irmin.Sync is now a namespace: use Irmin.Sync.Make(S) instead of Irmin.Sync(S) (#1338, @samoht)Irmin.Private is now Irmin.Backend (#1530, @CraigFe)Store.master is now Store.main. The existing Store.master function is deprecated and will be removed in a future release. (#1564, @CraigFe)Store.Private is now Store.Backend (#1530, @CraigFe)Store.Private.Sync is now Store.Backend.Remote (#1338, @samoht)Irmin.Branch.S.master is now Irmin.Branch.S.main (#1564, @CraigFe)Irmin.Private.{Commit,Node} are now Irmin.{Node,Commit}. (#1471, @CraigFe)Move signatures for backend stores into their own modules. All the X_STORE sigs have moved to X.S:
APPEND_ONLY_STORE is now Append_only.SCONTENT_ADDRESSABLE_STORE is now Content_addressable.SATOMIC_WRITE_STORE is now Irmin.Atomic_write.S And all the X_STORE_MAKER have moved to X.Maker:APPEND_ONLY_STORE_MAKER is now Append_only.MakerCONTENT_ADDRESSABLE_STORE_MAKER is now Content_addressable.MakerATOMIC_WRITE_STORE_MAKER is now Atomic_write.Maker This gives some space to move convenient functors closer to where they belong:Content_addressable is now Content_addressable.MakeContent_adddressable.Check_closed and Atomic_write.Check_closed (#1342, @samoht)Irmin.Make into Irmin.Maker ; stage its result to return Make functor once provided with a content-addressable and an atomic-writes stores (#1369, @samoht)Irmin.Make_ext into Irmin.Maker_ext ; stage its result to return Make functor once provided with a content-addressable and an atomic-writes stores, as well as node and commit makers (#1369, @samoht)lwt.5.3.0 to use Lwt.Syntax in the codebase (#1401, @samoht)Info implementations are not part of store: use S.Info.v instead of Irmin.Info.v (#1400, @samoht)Commit.V1 to Commit.V1.Make. This functor now takes separate hash and key implementations as arguments. (#1431 #1634, @CraigFe @icristescu)Schema module to hold all the types that users can define in an Irmin store. Use this as a parameter to every Maker functor. This is a large change which touches all the backends. (#1470, @samoht, @CraigFe)Irmin.Backend.Conf.Schema for grouping configuration keys. Now Irmin.Backend.Conf.key takes an additional ~spec parameter. (#1492, @zshipko)Tree.empty and Node.empty now both take a unit argument. (#1566 #1629, @CraigFe)key type to path and Key module to Path when it is in a path context in Tree and Store. (#1569, @maiste)Node.default metadata default values into a Node.Metadata.default to give room for other metadata values (#1611, @samoht)Add support for non-content-addressed ("generic key") backend stores. This allows Irmin to work with backends in which not all values are addressed by their hash. In particular, this includes:
Store.{Commit,Contents,Tree}.of_key.Irmin.{Node,Commit}.Generic_key modules.Node.Portable and Commit.Portable.Irmin.Indexable.S. (#1510 #1647, @CraigFe)Tree functions are more frequent than before. (#1724, @Ngoguey42, @CraigFe)Pruned_hash tag to the error case of several Store.Tree functions (#1744 @Ngoguey42). Forward ported from #1583.irmin-containers
Irmin_containers.Store_maker; this is now equivalent to Irmin.Content_addressable.S (#1369, @samoht)Irmin_containers.CAS_maker to Irmin_containers.Content_addressable (#1369, @samoht)irmin-fs
Irmin_fs.Make into Irmin_fs.Maker (#1369, @samoht)Irmin_fs.Make_ext into Irmin_fs.Maker_ext (#1369, @samoht)irmin-git
All of the configuration keys have moved into their own namespace:
Irmin_git.root is now Irmin_git.Conf.rootIrmin_git.head is now Irmin_git.Conf.headIrmin_git.bare is now Irmin_git.Conf.bareIrmin_git.level is now Irmin_git.Conf.levelIrmin_git.buffers is now Irmin_git.Conf.buffersIrmin_git.dot_git is now Irmin_git.Conf.dot_git (#1347, @samoht)Irmin_git.Make into Irmin_git.Maker (#1369, @samoht)git.3.7.0 in the codebase (#1632, @dinosaure)irmin-graphql:
master to main in the GraphQL API. (#1564, @CraigFe)Updated to be compatible with generic keys.
Key type is now called Path to match the new name in irminkey fields and parameters have been renamed to path (#1618, @zshipko)irmin-mirage
Irmin_mirage_git.Make into Irmin_mirage_git.Maker (#1369, @samoht)irmin-pack
Irmin_pack.Maker module type now no longer takes a Conf argument. (#1641, @CraigFe)Conf.S requires a new parameter contents_length_header that (optionally) further specifies the encoding format used for commits in order to improve performance. (#1644, @CraigFe)irmin-pack.2.x versions, but not forwards compatible. (#1649 #1655, @CraigFe @Ngoguey42)irmin-unix
Irmin_unix.Resolver.load_config and make command line options take precedence over config options. (#1464, #1543, #1607 @zshipko)Irmin_unix.Resolver.destruct has been removed (and partially replaced by Resolver.spec). (#1603, @CraigFe)irmin CLI to support empty path in list subcommand. (#1575, @maiste)branches for listing available branches and log which is similar to git log (#1609, #1727, @zshipko)irmin watch to take parameters to specify a command that should be executed when there are new changes (#1608, @zshipko)irmin-pack
irmin-pack.layered library. Support for the layered store will be restored on a future release of irmin-pack. (#1651, @CraigFe)clear operation in irmin-pack. This operation is incompatible with performance optimisations made in this release. (#1655, @CraigFe)irmin-layers
irmin
irmin
Store.Private.Node.Val.hash_exn (#1741, @Ngoguey42)irmin
Tree.seq and Tree.list to produce pruned children (#1720, @Ngoguey42)irmin
irmin-pack
Repo.close (#1707, @zshipko)irmin
Tree.produce_proof and Tree.verify_proof to produce and verify proofs from complex computations. produce_proof and verify_proof takes a callback over tree and instead of a static list of operations -- this now means that the full Tree API can now be used in proofs, including sub-tree operations, folds and paginated lists (#1625, #1663, #1683, @samoht, @Ngoguey42)Tree.produce_stream and Tree.verify_stream to produce and verify stream proofs (#1684, #1692, #1691, @samoht, @Ngoguey42, @icristescu)irmin-pack
irmin-unix
tezos store type for irmin command-line (#1678, @zshipko)irmin
Tree.Proof.of_keys. Use Tree.produce_proof instead (#1625, @samoht)Tree.empty now takes a unit argument. (#1566, @CraigFe)Tree.length now takes a tree as argument (#1676, @samoht)Tree.Proof.t now uses a more precise datatype to encode value invariants (#1688, @samoht)irmin-pack
irmin-git
git.3.7.0 in the codebase (#1637, @dinosaure)irmin
irmin-pack
irmin
irmin-pack
irmin
Tree operations now raise a Dangling_hash exception when called with a path that contains dangling hashes in the underlying store, rather than interpreting such paths as ending with empty nodes (#1477, @CraigFe)Tree.export where nodes could be exported before some of their contents, resulting in indirect hashes in irmin-pack (#1508, @Ngoguey42)irmin
Node.seq and Node.of_seq are added to avoid allocating intermediate lists when it is not necessary (#1508, @samoht)cache parameter to Tree.hash, Tree.Contents.hash, Tree.list, Node.list, Node.seq and Node.find to control the storing of lazily loaded data (#1526, @Ngoguey42)Node.clear to clear internal caches (#1526, @Ngoguey42)tree argument to Tree.fold to manipulate the subtrees (#1527, @icristescu, @Ngoguey42)Store.Tree.pruned for building purely in-memory tree objects with known hashes. (#1537, @CraigFe)order argument to specify the order of traversal in Tree.fold (#1548, @icristescu, @CraigFe)irmin
Node.v is renamed to Node.of_list (#1508, @samoht)Tree.export in order to minimise the memory footprint. (#1508, @Ngoguey42)~force:`And_clear case parameter from Tree.fold, ~force:`True ~cache:false is the new equivalent. (#1526, @Ngoguey42) `Tree.fold ~force:`True and `Tree.fold ~force:`False don't cache the lazily loaded data any more. Pass ~cache:true to enable it again. (#1526, @Ngoguey42)Irmin.Tree.clear (#1515, @samoht)irmin-git
irmin-git to git.3.5.0. (#1495, @dinosaure)irmin-pack
integrity-check-index command in irmin-fsck. (#1480, #1487 @icristescu, @samoht)irmin-pack
reconstruct_index is now traverse_pack_file, it allows for both index reconstruction and index checking (#1478, @Ngoguey42)irmin-pack
irmin
Store.Tree.length. (#1316, @Ngoguey42)irmin-layers
irmin-pack
irmin-pack
Irmin_pack.Version.{V1,V2} modules for convenience. (#1457, @CraigFe)irmin-pack.mem package (#1436, @icristescu, @craigfe)irmin-graphql
last_modified field to GraphQL interface (#1393, @kluvin)irmin-layers
copy_in_upper from the repo configuration. The default is now to copy. (#1322, @Ngoguey42)freeze. It is now possible to specify two distinct commit closures for the copy to lower and the copy to next upper. (#1322, @Ngoguey42)Irmin_layered_pack.Make and Irmin_layers.MakeintoIrmin_layered_pack.MakerandIrmin_layers.Maker` (#1369, @samoht)Irmin_layered_pack.Make_ext and and Irmin_layers.Make_extinto intoIrmin_layered_pack.Maker_extandIrmin_layers.Maker_ext` (#1369, @samoht)Irmin_layered_pack.Config into Irmin_layered_pack.Conf (#1370, @samoht)irmin-pack
inode that doesn't point to the root of a directory. (#1292, @Ngoguey42)entries to a value larger than stable_hash. (#1292, @Ngoguey42)stat-pack command in irmin-fsck. (#1311, @icristescu)Version module type into Version.S and io_version into version. The Pack.File and Atomic_write functors now take Version as their first parameter (#1352, @samoht)Irmin_pack.Make into Irmin_pack.V1 (#1369, @samoht)Irmin_pack.Config into Irmin_pack.Conf (#1370, @samoht)Irmin_pack.Pack into Irmin_pack.Content_addressable and Irmin_pack.Pack.File into Irmin_pack.Content_addressable.Maker (#1377, @samoht)Irmin_pack.Store.Atomic_write into its own module (#1378, @samoht)Checks.Reconstruct_index.run now takes an optional index_log_size parameter for customising the interval between merges during reconstruction. (#1459, @CraigFe)This release contains 2.6.0 plus the changes described in 2.5.4.
** Note: this release is based on 2.5.3, and does not contain 2.5.4. Use 2.6.1 for access to those changes. **
irmin
Tree.of_concrete now prunes empty subdirectories, and raises Invalid_argument if the input contains duplicate bindings. (#1385, @CraigFe)irmin-chunk
irmin-git
irmin-git with git.3.4.0. (#1392, @dinosaure)irmin-pack
Index.try_merge. This function was supposed to hint index to schedule merges after every commit. However, Index.try_merge is buggy and stacks merges which causes the node to block and wait for any existing merge to complete. We will revisit that feature in future once we fix Index.try_merge (#1409, @CraigFe)irmin
Tree.update_tree and Tree.add_tree for large directories (#1315, @Ngoguey42)irmin-pack
irmin
Store.tree_t to return false-negatives. (#1371, @CraigFe)irmin
Store.Tree.is_empty. (#1373, @CraigFe)irmin
Tree.update_tree and Tree.add_tree functions now interpret adding an empty subtree as a remove operation, rather than adding an empty directory. (#1335, @craigfe)irmin-pack
Store.sync when using the V1 format (#1360, @samoht)irmin-git
irmin
Store.Tree.remove is now much faster when operating on large directories. The commits following removals are also much faster. (#1289, @Ngoguey42)Store.Tree.{of_hash, shallow} to take kinded hashes, allowing the creation of unforced contents values. (#1285, @CraigFe)Tree.destruct to return lazy contents values, which may be forced with Tree.Contents.force. (#1285, @CraigFe)irmin-bench
irmin-pack
inode where the remove function could cause hashing instabilities. No user-facing change since this function is not being used yet. (#1247, @Ngoguey42, @icristescu)irmin
Tree.add_tree t k v complexity does not depend on v size. (#1267, @samoht @Ngoguey42 and @CraigFe)irmin
Perms module containing helper types for using phantom-typed capabilities as used by the store backends. (#1262, @CraigFe)Exported_for_stores module containing miscellaneous helper types for building backends. (#1262, @CraigFe)Tree.update and Tree.update_tree for efficient read-and-set on trees. (#1274, @CraigFe)irmin-pack:
integrity-check-inodes command to irmin-fsck for checking the integrity of inodes. (#1253, @icristescu, @Ngoguey42)irmin-bench
irmin-mem package is now included with the irmin package under the library name irmin.mem. It keeps the same top-level module name of Irmin_mem. (#1276, @CraigFe)Irmin_mem no longer provides the layered in-memory store Make_layered. This can be constructed manually via Irmin_layers.Make. (#1276, @CraigFe)irmin-git
irmin to the last version of ocaml-git (#1065) It fixes an issue on serialization/deserialization of big tree object (see #1001)irmin-pack*
irmin*
last_modified (#948, @pascutto)last_modified. The case of a created key is now considered a modification by the function. (#1167, @clecat)Tree.fold ~force:(False f) where results where partially skipped (#1174, @Ngoguey42, @samoht and @CraigFe )Tree.kind. Empty path on a tree used to return a None instead of a `Node. (#1218, @Ngoguey42)ppx_irmin
irmin-unix
XDG_CONFIG_HOME. (#1168, @zshipko)irmin-layers (new):
irmin-layers that includes common signatures for layered stores. It contains a stub Make_layers functor (#882, @icristescu)irmin-bench (new):
irmin
Tree.Contents module exposing operations over lazy tree contents. (#1022 #1241, @CraigFe @samoht)Type.Unboxed.{encode_bin,decode_bin,size_of} to work with unboxed values (#1030, @samoht)headers option in Type.{encode_bin,decode_bin,size_of}. Use Type.Unboxed.<fn> instead (#1030, @samoht)Type.v now takes an extra mandatory unit argument (#1030, @samoht)Type.pp_dump, which provides a way to pretty-print values with a syntax almost identical to native OCaml syntax, so that they can easily be copy-pasted into an OCaml REPL for inspection. (#1046, @liautaud)Generic functions in Irmin.Type are now more efficient when a partial closure is constructed to the type representation (#1030 #1093, @samoht @CraigFe). To make this even more explicit, these functions are now staged and Type.{unstage,stage} can manipulate these. The goal is to encourage users to write this kind of (efficent) pattern:
let encode_bin = Type.(unstage (encode_bin ty))
let _ = <begin loop> ... encode_bin foo ... <end loop>clear function for stores (#1071, @icristescu, @CraigFe)iter_commits and iter_nodes functions to traverse the commits and nodes graphs (#1077, @icristescu)Repo.iter to traverse object graphs (#1128, @samoht)irmin-pack:
index_throttle option to Irmin_pack.config, which exposes the memory throttle feature of Index in Irmin-Pack. (#1049, @icristescu)Pack.clear and Dict.clear (#1047, @icristescu, @CraigFe, @samoht)migrate function for upgrading stores with old formats (#1070, @icristescu, @CraigFe)flush function for a repo (#1092, @icristescu)reconstruct_index to reconstruct an index from a pack file. (#1097, @icristescu)reconstruct-index command to irmin-fsck for reconstructing an index from the command line (#1189, @zshipko)integrity-check command to irmin-fsck for checking the integrity of an irmin-pack store (#1196, @zshipko)ppx_irmin:
'a t generates a representation of type 'a Type.t -> 'a t Type.t (#1085, @CraigFe)--lib command-line option which has the same behaviour as the lib run-time argument (i.e. --lib Foo will cause ppx_irmin to derive type representations using combinators in the Foo module). (#1086, @CraigFe)[typ: <core-type>] for deriving type representations inline. (#1087, @CraigFe)irmin
Tree.tree type to Tree.t. (#1022, @CraigFe)Tree.pp_stats with the type representation Tree.stats_t. (#TODO, @CraigFe)Float.nan, Float.infinity and Float.neg_infinity are now encoded as "nan", "inf" and "-inf" respectively. (#979, @liautaud)Type.{v,like,map} no longer take a ~cli argument, and now take separate ~pp and ~of_string arguments instead. (#1103, @CraigFe)Irmin.Type combinators are now supplied by the repr package. The API of Irmin.Type is not changed. (#1106, @CraigFe)Irmin.Type uses staging for equal, short_hash and compare to speed-up generic operations (#1130, #1131, #1132, @samoht)Tree.fold more expressive and ensure it uses a bounded memory (#1169, @samoht)list and Tree.list to take optional offset and length arguments to help with pagination. Also return direct pointers to the subtrees to speed up subsequent accesses (#1241, @samoht, @zshipko, @CraigFe, @Ngoguey42 and @icristescu)irmin-pack:
sync has to be called by the read-only instance to synchronise with the files on disk. (#1008, @icristescu)sync to flush for the operation that flushes to disk all buffers of a read-write instance. (#1008, @icristescu)Repo.iter to speed-up copies between layers (#1149, #1150 @samoht)heads parameter to check-self-contained command in Checks (#1224, @zshipko)ppx_irmin:
[@generic ...] attribute has been renamed to [@repr ...]. (#1082, @CraigFe)irmin:
Irmin.Type.empty to represent an uninhabited type. (#961, @CraigFe)Store.Tree.concrete_t. (#1003, @CraigFe)irmin-containers (new):
irmin-containers, which provides a set of simple mergeable datastructures implemented using Irmin. (#1014, @ani003)ppx_irmin
@nobuiltin attribute, which can be used when shadowing primitive types such as unit. See README_PPX for details. (#993, @CraigFe)lib argument, which can be used to supply primitive type representations from modules other than Irmin.Type. (#994, @CraigFe)irmin:
Add sanity checks when creating Irmin.Type records, variants and enums (#956 and #966, @liautaud):
Irmin.Type.{sealr,sealv,enum} will now raise Invalid_argument if two components have the same name;Irmin.Type.{field,case0,case1} will now raise Invalid_argument if the component name is not a valid UTF-8 string.Changed the JSON encoding of options and unit to avoid ambiguous cases (#967, @liautaud):
() is now encoded as {};None is now encoded as null;Some x is now encoded as {"some": x};None are still omitted;Some x are still unboxed into x.pair int string prints as int * string. (#997, @CraigFe)Irmin.S.tree is now abstract. The previous form can be coerced to/from the abstract representation with the new functions Irmin.S.Tree.{v,destruct} respectively. (#990, @CraigFe)irmin-mem
KV now expose their unit metadata type. (#995, @CraigFe)irmin-graphql
get_{contents,tree} fields having incorrect ordering (#989, @CraigFe)ppx_irmin (new):
ppx_irmin, which provides a PPX deriving plugin for generating Irmin generics.irmin-unix:
--hash parameter to the command-line interface, allowing the hash function to be specified. For BLAKE2b and BLAKE2s, the bit-length may be specified with a trailing slash, as in --hash=blake2b/16. The hash function may also be specified in the configuration file. (#898, @craigfe)irmin:
Irmin.Hash.Make_BLAKE2B and Irmin.Hash.Make_BLAKE2S functors for customizing the bit-length of these hash functions. (#898, @craigfe)iter function over a closure graph (#912, @ioana)Type.pp_ty for pretty-printing Irmin generics. (#926, @craigfe)Merge.with_conflict for modifying the conflict error message of a merge function. (#926, @craigfe)irmin-pack:
integrity_check can now try to repair corrupted values. (#947, @pascutto)irmin-graphql:
irmin-pack (new):
irmin-pack, which uses a space-optimised on-disk format.irmin-graphql (new):
irmin-graphql, which provides a GraphQL server implementation that can be used with both the MirageOS and Unix backends. Additionally, a graphql command has been added to the command-line interface for starting irmin-graphql servers. (#558, @andreas, @zshipko)irmin-graphql with Irmin_graphql.Server.Make_ext and the Irmin_graphql.Server.PRESENTER interface. (#643, @andreas)irmin-test (new):
irmin-test, which allows for packages to access the Irmin test-suite. This package can now be used for new packages that implement custom backends to test their implementations against the same tests that the core backends are tested against. (#508, @zshipko)irmin-unix:
Cli module to expose some methods to simplify building command-line interfaces using Irmin. (#517, @zshipko)$HOME/.irmin/config.yml which may be overridden by either $PWD/.irmin.yml or by passing --config <PATH>. See irmin help irmin.yml for details. (#513, @zshipko)irmin-git:
irmin-http:
/trees/merge route for server-side merge operations. (#714, @samoht)irmin:
Json_value and Json content types. (#516 #694, @zshipko)Irmin.Type generic hash functions. (#712, @samoht)V1 submodules in Commit, Contents and Hash to provide compatibility with 1.x serialisation formats. (#644 #666, @samoht)Store.last_modified function, which provides a list of commits where the given key was modified last. (#617, @pascutto)Content_addressable.unsafe_add function allowing the key of the new value to be specified explicitly (for performance reasons). (#783, @samoht)save_contents function for saving contents to the database. (#689, @samoht)Private.Lock now exposes a stats function returning the number of held locks. (#704, @samoht)irmin-unix:
irmin read to irmin get and irmin write to irmin set. (#501, @zshipko)irmin-git:
ocaml-git >= 2.0. (#545, @samoht)irmin-http:
CLIENT to HTTP_CLIENT and simplify the signatures necessary to construct HTTP clients and servers. (#701, @samoht)irmin-mirage
irmin-mirage into irmin-{mirage,mirage-git,mirage-graphql} to allow for more granular dependency selection. Any instances of Irmin_mirage.Git should be replaced with Irmin_mirage_git. (#686, @zshipko)irmin:
Irmin.Contents.S0 with Irmin.Type.S.Type.pre_digest -> Type.pre_hash and Type.hash -> Type.short_hash. (#720, @samoht)Irmin.Type to use incremental hash functions (functions of type 'a -> (string -> unit) -> unit) for performance reasons. (#751, @samoht)Irmin.Type.like constructor and add a new Irmin.Type.map with the previous behaviour.Irmin.Type combinators. (#550 #538 #652 #653 #655 #656 #688, @samoht)Store.set to return a result type and create a new Store.set_exn with the previous exception-raising behaviour. (#572, @samoht)Rename store module types to be more descriptive:
Irmin.AO with Irmin.CONTENT_ADDRESSABLE_STORE;Irmin.AO_MAKER with Irmin.CONTENT_ADDRESSABLE_STORE_MAKER;Irmin.RW with Irmin.ATOMIC_WRITE_STORE;Irmin.RW_MAKER with Irmin.ATOMIC_WRITE_STORE_MAKER. (#601, @samoht)export_tree to save_tree (#689, @samoht) and add an option to conditionally clear the tree cache (#702 #725, @samoht).Irmin_{fs,mem,unix}.KV to BLAKE2b rather than SHA1 for security reasons. (#811, @craigfe)Irmin.remote_uri to Store.remote, for stores that support remote operations. (#552, @samoht)batch function has been added to the backend definition to allow for better control over how groups of operations are processed. (#609, @samoht)close function has been added to allow backends to close any held resources (e.g. file descriptors for the FS backend). (#845, @samoht)Private.Node.Make parameters to use a simpler notion of 'path' in terms of a list of steps. (#645, @samoht)Node.update to Node.add. (#713, @samoht)irmin-unix:
revert command. (#496, @zshipko)irmin-git:
Node.add to preserve sharing. (#802, @samoht)irmin-http:
irmin:
S.History.is_empty would return true for a store with exactly one commit. (#865, @pascutto)irmin:
pp and of_string functions from Irmin.Contents.S in favour of Irmin.Type.to_string and Irmin.Type.of_string.Bytes content type. (#708, @samoht)Cstruct dependency and content type. If possible, switch to Irmin.Contents.String or else use Irmin.Type.map to wrap the Cstruct type. (#544, @samoht)Contents.hash, Tree.hash and Commit.hash (#512, @samoht)Tree.hash and Tree.of_hash now work on leaf nodes. To do this, Tree.hash has to return a more complex type (#512, @samoht)-safe-string is enabled by default (#477, @djs55)irmin-chunk
Add a new package: irmin-chunk, which was initially in a separate repository created by @mounirnasrallah and @samoht and ported to the new Irmin API by @g2p (#464)
irmin-unix
Re-add the irmin binary, the example application which used to be installed by irmin-unixbefore we switched to usejbuilder` (#466, @samoht -- reported by @ouenzzo and @dudelson)
irmin
That releases saw a nice series of patches to improve the performance of Irmin.Tree contributed by the Tezos team:
Irmin.Tree operations: on trivial benchmarks with a lot of values, this patch introduces a 10-times speed-up (#457, @OCamlPro-Henry)Irmin.Type primitives (#458, @OCamlPro-Henry)Hash.digest to also take a type representation (#458, @OCamlPro-Henry)Irmin.Type.{encode,decode}_cstruct (#458, @OCamlPro-Henry)Irmin.Contents.RAW (#458, @OCamlPro-Henry){Type,Merge}.int which might cause some issue on 32 bits platforms. Intead use the more explicit (and portable) {Type,Merge}.int32 or {Type,Merge}.int64 (#469, @samoht)This release changes the build system to use jbuilder. By doing so, it introduces two new packages: irmin-mem and irmin-fs -- containing Irmin_mem and Irmin_fs respectively. That release also fixes a bunch of regressions introduced in the big 1.0 rewrite.
all
jbuilder (#444, @samoht)irmin
Irmin.Contents.Cstruct: pretty-print the raw contents, not the hexdump (#442, @samoht)Irmin.Hash.X.of_string should not raise an exception on invalid hash (#443, @samoht)irmin-mem
Irmin_mem module.irmin-fs
Irmin_fs module.irmin-git
irmin
S.Tree.find_tree to return a tree option instead of tree. This is a breaking API change but it let distinguish between the empty and non-existent cases (#431, @samoht)url#branch syntax (#432, @samoht)Irmin.Merge.idempotent for values with idempotent operations (#433, @samoht)S.repo type as an alias to the S.Repo.t (#436, @samoht)S.Tree.diff intoduced in the 1.0 release: nested differences where reported with the wrong path (#438, @samoht)irmin-unix
irmin-git
irmin
irmin-unix
irmin
irmin-unix
Major API changes:
Type).S.Tree). Transactions now only ensure snapshot isolation instead of full serialisability.KV functors which just take one parameter: the contents.irmin.0.*), so that backends have to implement the minimum set of functions to be Irmin-compatible, and users can have many convenient high-level functions when using the Irmin API. The backends implement AO and RW, the frontend provides S.The package is also now split into 5 opam packages: irmin, irmin-git, irmin-http, irmin-unixandirmin-miragewith similarly namedocamlfind` libraries.
More detailled changes:
Fmt everywhere (#397, @samoht)create functions into v (#397, @samoht)irmin
Task into Info to denote commit info (#397, @samoht)Task.uid (#397, @samoht)Task.messages into Info.message, take a string instead of a list of strings as parameter and remove Task.add (#397, @samoht)Info.f to only takes unit as argument. Previously it was taken an 'a which was used by the update functions. The update functions now take a full Info.f function as parameter, which should be less confusing (#397, @samoht)mirage-tc by a new internal module Type using type-based combinators. This makes defining new mergeable data-types much easier, especially records and variants (#397, @samoht)Merge.unit, Merge.bool, Merge.char, Merge.int, Merge.int32, Merge.int64, Merge.float (#397, @samoht)Merge.option, Merge.pair, Merge.tripleandMerge.alist` (#397, @samoht)Merge.MSet into Merge.MultiSet (#397, @samoht)Merge.set into Merge.Set (#397, @samoht)Merge.OP into Merge.Infix and rename operators to avoid name-clashing with other monads (#397, @samoht)path argument from the merge functions (#397, @samoht)Path submodule in Contents.S (#397, @samoht)Diff module (#397, @samoht)'a parameter (#397, @samoht)S.read by S.find (#397, @samoht)S.read_exn by S.get (#397, @samoht)S.kind to check the kind of store entries (files, directories) (#397, @samoht)View functor, replaced by first-class support for immutable trees S.Tree (#397, @samoht)S.find_tree to find immutable subtrees (#397, @samoht)S.find_all to find contents and metadat (#397, @samoht)S.mem to only check for contents, not subtree (#397, @samoht)S.mem_tree to check for subtrees (similar behavior to S.mem in irmin.0.*) (#397, @samoht)S.with_tree for atomic update of subtrees. This operation replaces with_hrw_view, but a weaker consistency guarantee: instead of providing full seriasilabilty, S.with_tree provides snapshot isolation, which is consistent enough for most of the users. (#397, @samoht)S.update into S.set and ensure that the operation is atomic by using a combination of test-and-set and optimistic concurrency control. (#397, @samoht)S.remove to ensure the operation is atomtic.S.status to mimick git status. (#397, @samoht)_id suffixes. (#397, @samoht)S.merge_with_commit and S.merge_with_branch (#397, @samoht)S.Head.fast_forward (#401, @samoht)S.Commit, S.Branch (#401, @samoht)KV_MAKER to ease the creation of store with string lists as paths and strings as branches (#405, @samoht)RO.read by RO.find (#397, @samoht)RO.read_exn (#397, @samoht)RO.iter, replaced by RW.list (#397, @samoht)RW.update by RW.set (#397, @samoht)RW.compare_and_set into RW.test_and_set (#397, @samoht)RW.watch, RW.watch_key and RW.unwatch functions to set-up low-level notifications (#397, @samoht)irmin-git
git.0.10.0 (#397, @samoht)LOCK modules (#397, @samoht)S.Internals into S.Git (#397, @samoht)S.Internals.commit_of_id into S.Git.git_commit (#397, @samoht)S.Git.of_repo to convert an Irmin repo into a Git repo (#397, @samoht)S.Git.to_repo to convert a Git repo into an Irmin repo (#397, @samoht)S.Git_mem.clear and S.Git_mem.clear_all for in-memory Git backends (#397, @samoht)Memory into Mem.Make (#405, @samoht)FS into FS.Make (#405, @samoht)CONTEXT and fold it into IO (#405, @samoht)Mem.KV and FS.KV to ease creatin of store with default implementations for branches and paths (#405, @samoht)Mem.Ref and FS.Ref access tags, remotes and other Git references (#407, @samoht).git path (#409, @samoht)irmin-mirage
Task module into Info to reflect the core API changesInfo.f to accept an optional author argument and a format string as a message parameter (#261, #406 @samoht)Irmin_git into Git (#405, @samoht)irmin-http
ocaml-webmachine (#397, @samoht)KV to ease creatin of store with default implementations for branches and paths (#405, @samoht)irmin-unix
Irmin_unix.task into Irmin_unix.info (#397, @samoht)LOCK (#397, @samoht)Irmin_unix.info to take an optional author argument and accept a format string as message parameter (#261, #406 @samoht)Irmin_fs into FS (#405, @samoht)Irmin_git into Git (#405, @samoht)Irmin_http into Http (#405, @samoht)Lwt_unix.fork in the tests anymore (#383, @samoht)Make_with_metadata to customize the type of the nodes metadata (#364, @samoht)Irmin_fs (#345, @samoht)Store.iter to defer opening the file only when needed. This was causing a file-descriptor early exhaustion on Windows (#345, @samoht)ocaml-git 1.8.0Irmin.Private.Contents.Store and Irmin.Private.Commit.Store to make it easier to build new and efficient Irmin backends. (#346, @samoht)--address argument of the CLI now supports a URI launchd://<name> where <name> corresponds to the section in the property list file (#321, by @djs55)/watch-rec in the REST API (#326, by @samoht)Irmin_mem backend to work when equal keys might be not structurally equal (Pervasives.(=) is evil)Hash.SHA1.equal to always return true when the underlying bigarrays are equals. Before that, this was only the case when the whole Cstruct.t where identical: ie. same bigarray but also same offset in the Cstruct.t value, which is obviously not always the case. Apply the same fix to Hash.SHA1.compare and Hash.SHA1.hash.BC.tag is now BC.name and BC.branch is now BC.head_ref. The various "Tag" modules are now called "Ref" ("Branch" would be confusing here since they only store references to commits, not the branch contents). Note: The remote HTTP protocol still uses "tag".Irmin_http_server.listen. Instead, return the Cohttp configuration for the server and let the user perform the listen. The resulting API is simpler (removes timeout and uri parameters), more flexible, and easier to use from Mirage.Irmin.task from API of internal stores (commit, node, etc). Tasks are now passed explicitly to operations that need them, so it is now explicit which operations create commits. For example, the API now makes it clear that lcas doesn't change anything, while lca requires a task because it may create commits. Apart from simplifying the code, this change also makes it possible to create the internal stores once, not once per commit message. Note: this does not affect the main BC API, so most users will see no difference.Irmin.Basic. This was a functor that took a functor for making stores and returned a functor for making stores with strings for branch names and SHA1 for the hash. It's easier to write the application out in full than to explain to people what it does. This change also makes it possible for back-ends to provide extra operations in a type-safe way. In particular, Irmin_git.Internals has moved inside the store type and the runtime check that it is only used with the correct store type is now enforced at compile time instead.AO.config. It was only used by the removed Git.Internals hack.AO.create to AO_MAKER.Remove dummy functions that are no longer needed with the new API:
View.task is gone (it never did anything).View.create is gone (it ignored both its arguments and called View.empty).Ir_node.Graph.Store.create (unused, but previously required by AO).Ir_commit.History.Store.create (same).Ir_bc.Make and Ir_bc.MAKER features.Ir_bc.STORE_EXT and Ir_s.STORE. Ir_s was the only consumer of the Ir_bc.STORE_EXT interface, and all it did was repack the values to match its own interface. Now, Ir_bc exports the final public API directly, which simplifies the code.ir_s.mli and removed ir_s.ml. Before, all module types were duplicated in the .ml and .mli files.BC stores now contain a Repo module. A Repo.t represents a repository as a whole, rather than any particular branch. Operations which do not look at the current branch have been moved to this module. They are: branches, remove_branch, heads, watch_branches, import, export, and task_of_head. When updating old code, you can use BC.repo t to get a Repo.t from a branch. Note that heads previously ensured that the current branch's head was included in the returned set (which made a difference for anonymous branches). This feature has been removed. In the future, the plan is to use OCaml's GC to track which anonymous branches are still being used and return all of them.BC store are now created by the back-ends, not by Ir_bc. This allows back-ends to use their own APIs for this. In particular, back-ends can now share resources (such as a database connection) between stores. Internal stores no longer need to deal with config values at all.Sync.create now takes a Repo.t, not a config, allowing Repo.config to be removed and allowing sharing of the back-end's internal state with the sync code. For example, the Git back-end no longer needs to create a new Git store object for sync.type head to type commit_id. head was confusing because it applied to all commits, not just branch heads. Putting id in the name makes it clear that this is just data and (for example) holding an ID will not prevent the corresponding commit from being GC'd (once we have GC). of_head is now of_commit_id, task_of_head is now task_of_commit_id, Internals.commit_of_head is now Internals.commit_of_id and BC.Head is now BC.Hash.config argument to all the backend's config functions. This allow the backends to composed more easily. (initial patch by @nasrallahmounir, integration by @samoht)Irmin.LINK and Irmin.LINK_MAKER. Add Irmin_mem.Link and Irmin_fs.Link which implement Irmin.LINK_MAKER in these backends (initial patch by @nasrallahmounir, integration by @samoht)Cstruct.t): Irmin.RAW and raw store maker: Irmin.AO_MAKER_RAW (initial patch by @nasrallahmounir, integration by @samoht)Irmin.Hash.digest_size (initial patch by @nasrallahmounir, integration by @samoht)/view to the REST API (#292, by @samoht)Irmin.Private.merge_node (#292 by @samoht)Irmin_git.Irmin_value_store functor. This provides the Irmin Contents/Node/Commit APIs on top of a Git-type store. This is useful for backends that want to store data using the Git object format, to be able to sync with Git, but without using Git's filesystem layout and locking. (#268 by @talex5)Content-type field set by the client: by default, we still use JSON (or use application/json) but using application/octet-stream will avoid having to hex-encode large binary blobs to make them JSON-compatible. This feature is still experimental (especially when using Git on the server) (#255)ocaml-git.1.7.1 (which works with lwt.2.5.0)Store.config for all the stores (AO, RW, etc.)Irmin_git.Internals to be able to get back the Git commit objects from an head value (#245, #241)Irmin.Private.remove_nodeRemove the special __root__ filename in Irmin stores and in views (#233)
View.update_path when the view contains a value at its root. Now the updated path contains a the value stored at the root of the view.NoneInvalid_argument and Failure exceptions that were raised by the server.Irmin.update_tag for HTTP clientsMirage_irmin.KV_RO to surface an Irmin store as a read-only key/value store implementing `V1_LWT.KV_RO (#107)Irmin.SYNCocaml-git.1.6.0-, _, '.' and /) (#186)Irmin.clone. (#221)X-IrminVersion header - the server might decide to enfore the version check or not. The server always reply with its version in the JSON reply, using a version field. The client might use that information to bail out nicely instead of failing because of some random unmarshalling errors due to API changes (#167)git fsck and git gc complain a lot (with good reasons) and do some fency things with git index. The regression has been introduced while trying to fix #190 (the fix is in #229)Irmin.Private.Watch.listen_dir and Irmin.Private.Watch.set_listen_dir_hook synchronous.alcotest >= 0.4. This removes the dependency towards OUnit and nocrypto for the tests.Irmin.export for the HTTP backend (#196, patch from Alex Zatelepin)Irmin.export (#196, patch from Alex Zatelepin)Task.empty (the empty task) and Task.none (the empty task constructor)Completely rewrite the notification mechanism. All the watch functions now take a callback as argument and return a de-allocation function. The callbacks receive a heads values (the last and current ones) and diff values. (#187)
Irmin.watch_head to watch for the changes of the current branch's headIrmin.watch_tags to watch for the changes of all the tags in the storeIrmin.watch_key to watch for the changes of the values associated to a given key (this is not recursive anymore).View.watch_path to watch for the changes in a subtree. The function return views and the user can use View.diff to compute differences between views if needed.View.remove to clean-up empty directories (#190)View.make_head (#188)Irmin.empty (#161)Irmin.Snapshot. Nobody was using it and it can be easily replaced by Irmin.head, Irmin.watch_head and Irmin.update_head.Irmin.iter to include the values and move it into the Irmin.RO signature.Irmin.fast_forward_head (#172)Irmin.compare_and_set_head (#171)Irmin.update and Irmin.merge are atomic.Irmin.clone of an empty branchIrmin.RW.compare_and_test that the backends now have to implement to guarantee atomicity of Irmin's high-level operations.Irmin.Private.Lock to provide per-handler, per-key locking. This can be used by backend to implement simple locking policies.Lwt.t to the return type of Irmin.tag and Irmin.tag_exn_exn function raise Invalid_argument (#144)Irmin.switch and Irmin.detachIrmin.history to get the branch history as a DAG of heads (#140).Irmin.Merge.promise combinatorsIrmin.watch_tags to monitor tag creation and desctructions.Irmin.pushIrmin.with_hrw_view to easily use transactions.Irmin.t to denote the store capabilities read-only, read-write or branch-consistent.~old argument of a merge function can now be optional to signify that there is no common ancestor.Irmin.with_rw_view to create a temporary, in-memory and mutable view of the store. This can be used to perform atomic operations in the store (ie. non-persistent transactions).unit -> 'a result Lwt.t argument for ~old (instead of 'a). Evalutating the function will compute the least-common ancestors. Merge functions which ignore the old argument don't have to pay the cost of computing the lcas anymore.S.lca to get the least common ancestorsS.of_head for the HTTP client (regression introduced in 0.9.0)Views introduced in 0.9.0. (thx @buzzheavyyear for the report)Irmin.update Irmin.remove, Irmin.remove_rec) even if the contents' store have not changed.None).('key, 'value) Irmint.t instead of 'value Irmin.t.merge functions now take the current filename being merged as an additional argument.Contents should expose a Path sub-module. Keys of the resulting Irmin store will be of type Path.t.irmin init --help. (#103)Origin into Task and use it pervasively through the API.git/HEAD (#76)remove_rec to remove directories (#74, #85)core_kernel (#22, #81)cryptokit and sha1and usenocrypto` instead--full on the command-lineor or ?full=1 on the web interface)dot when dumping a graph on the command-line. dot does not like big graphs, but that's still useful to have the .dot file to analyze it.open Irmin_unix at the top of your file and use less functor in your code (again, check the examples)IrminMemory.Make to return an hanlder to a shared datastore instead of creating a fresh one. Add IrminMemory.Fresh to return a fresh in-memory datastore maker.refs/heads/ anymore)IrminTree to IrminNode to reflect the fact that we can support arbitrary immutable graphs (it's better if they are DAGs but that's not mandatory)IrminBlob to IrminContents to reflect the fact that we also support structured contents (as JSON objects)irmin watch works now for all backends.irmin fetch command: we can now choose the backend to import the data inslow tests execution timeIRMIN to configure its default backendLwt_bytes and Lwt_unix instead of the custom-made IrminChannelbin_prot instead of a custom binary protocolValue is now Blob, Revision is now Commit and Tag becomes Reference (rational: consistency with Git names)core_kernel instead of building a custom Identiable.Sdolog instead of a custom log librarymstruct (mutable buffers on top of cstruct) which is now released independentlyezjsonm and alcotest libraries