> On 09 Apr 2017, at 21:11, Lars Schneider <larsxschneider@xxxxxxxxx> wrote: > > Some `clean` / `smudge` filters might require a significant amount of > time to process a single blob. During this process the Git checkout > operation is blocked and Git needs to wait until the filter is done to > continue with the checkout. > > Teach the filter process protocol (introduced in edcc858) to accept the > status "delayed" as response to a filter request. Upon this response Git > continues with the checkout operation. After the checkout operation Git > calls "finish_delayed_checkout" which queries the filter for remaining > blobs. If the filter is still working on the completion, then the filter > is expected to block. If the filter has completed all remaining blobs > then an empty response is expected. > > Git has a multiple code paths that checkout a blob. Support delayed > checkouts only in `clone` (in unpack-trees.c) and `checkout` operations. > > Signed-off-by: Lars Schneider <larsxschneider@xxxxxxxxx> > --- > ... > diff --git a/convert.h b/convert.h > index 82871a11d5..da6c702090 100644 > --- a/convert.h > +++ b/convert.h > @@ -42,6 +42,11 @@ extern int convert_to_git(const char *path, const char *src, size_t len, > struct strbuf *dst, enum safe_crlf checksafe); > extern int convert_to_working_tree(const char *path, const char *src, > size_t len, struct strbuf *dst); > +extern int async_convert_to_working_tree(const char *path, const char *src, > + size_t len, struct strbuf *dst, > + void *dco); > I don't like the void pointer here. However, "cache.h" includes "convert.h" and therefore "convert.h" cannot include "cache.h". That's why "convert.h" doesn't know about "struct delayed_checkout". I just realized that I could move "struct delayed_checkout" and "enum ce_delay_state" definition from "cache.h" to "convert.h" to solve the problem nicely. Any objection to this approach? Thanks, Lars