[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [MirageOS-devel] Irmin API newbie questions



Hi,

I've made a new release of Irmin (0.9.4) with better concurrency properties, 
that I've tried to explain what these properties are on the wiki:

https://github.com/mirage/irmin/wiki/concurrency

That release also fixes the performance issues you found with the computation 
of lcas. I'm working on fixing the other issues you found[1], and I'd 
especially like to improve the watch / notification API based on your very 
useful comments.

I've also started a roadmap page to get a sense of what needs to be done for 
1.0:

https://github.com/mirage/irmin/wiki/Roadmap

And a list of the current and past (summer) projects related to Irmin (not 
really part of the 1.0 process, but can lead to interesting features for the 
next releases):

https://github.com/mirage/irmin/wiki/Projects

Best,
Thomas

[1] https://github.com/mirage/irmin/issues?q=is%3Aopen+is%3Aissue+label%3Abug




> On 9 Feb 2015, at 12:03, Thomas Leonard <talex5@xxxxxxxxx> wrote:
> 
> I'm trying to understand the Irmin API. The current documentation is
> good, but I'm still having trouble with some of the concepts. I'm
> looking at these sources:
> 
>  https://mirage.github.io/irmin/
>  https://github.com/mirage/irmin/wiki/Using-the-Irmin-API
> 
> 
> (BTW, I think it might be useful to add the equivalent git command
> next to functions in the documentation, since most people will
> understand that already)
> 
> 
> Anyway, my questions:
> 
> 
> The BASIC docs are missing
> (https://mirage.github.io/irmin/Irmin.BASIC.html), but the code shows:
> 
>  type ('a, 'b) basic = (module BASIC with type key = 'a and type value = 'b)
> 
> It seems that using Irmin.Contents.String gets me "key = string list",
> but "step" remains abstract. How do I use cons, decons, etc?
> 
> 
> If I have a RW store, I can watch a key:
> 
>  val watch : t -> key -> value option Lwt_stream.t
> 
> Presumably, I also need to take care to stop watching it when I'm
> done, otherwise the stream will grow without limit, right? I guess
> there should be an unwatch, or maybe this should be a React signal or
> something.
> 
> 
> I got a bit confused when I reached the BC page:
> 
>  https://mirage.github.io/irmin/Irmin.BC.html
> 
> It uses 'tag' to mean a pointer to a commit that is updates on each
> operation (i.e. what Git would call a 'branch'). I realise that tags
> and branches are the same thing internally, but 'branch' seems to
> capture better what Irmin is using them for ("The tag value is updated
> every time the store is updated, so every handle connected or which
> will be connected to the same tag will see the changes."). [ BTW,
> what's a "handle"? ]
> 
> 
> val update_tag : t -> tag -> unit Lwt.t
> update_tag t tag updates t's current branch with the contents of the
> branch named tag.
> 
> What does "update" mean here? Is this "git reset --hard tag"? A merge?
> A "--ff-only" merge?
> 
> 
> My mental model of Git is that the store is a DAG and I can append to
> any branch. e.g. we have:
> 
>   git commit-tree <tree> [(-p <parent>)...] < changelog
> 
> If I'm understanding the Irmin API correctly, each "store"
> (repository? branch?) has a current "tag" (branch) and I need to set
> the tag I want to work on, e.g.
> 
>  val switch : Store.t -> tag -> unit Lwt.t
> 
> If I want to work on another branch without changing the current
> branch for other users, I should "clone" the store:
> 
>  val clone_force : ('a -> Irmin.task) -> t -> tag -> ('a -> t) Lwt.t
> 
> But, this is not a "git clone", it's like "git branch tag" - a new
> branch I can work on without affecting the repository's default
> branch. It seems strange that Irmin has a mutable "current branch" at
> all - this seems like a UI concept that's only needed for command-line
> use (to save typing).
> 
> 
> A "head" is defined as "a given store revision" (i.e. what Git would
> call a commit). It wasn't clear to me at first whether a head was a
> commit or an anonymous branch. e.g.
> 
> val rename_tag : t -> tag -> [ `Duplicated_tag | `Ok ] Lwt.t
> Change the current tag name. Fail if a tag with the same name already
> exists. The head is unchanged.
> 
> "The head is unchanged" suggests that heads might change in other
> cases. Looking at the code, I see a "type head = Commit.key" in one
> place, so I guess they're (usually?) commits. Does "head" here mean
> "the default branch"?
> 
> 
> Finally, how do I get history? e.g. if I want to show users the recent
> changes to a document. I see a "slice" type, but it's not clear what I
> can do with it.
> 
> 
> Thanks!
> 
> 
> -- 
> Dr Thomas Leonard        http://0install.net/
> GPG: 9242 9807 C985 3C07 44A6  8B9A AE07 8280 59A5 3CC1
> GPG: DA98 25AE CAD0 8975 7CDA  BD8E 0713 3F96 CA74 D8BA
> 
> _______________________________________________
> MirageOS-devel mailing list
> MirageOS-devel@xxxxxxxxxxxxxxxxxxxx
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/mirageos-devel


_______________________________________________
MirageOS-devel mailing list
MirageOS-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/mirageos-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.