convert: add "status=delayed" to filter process protocol
authorLars Schneider <larsxschneider@gmail.com>
Fri, 30 Jun 2017 20:41:28 +0000 (22:41 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 30 Jun 2017 20:50:41 +0000 (13:50 -0700)
commit2841e8f81cb2820024804b9341577be1d0ce1240
tree21a9a9a8528b07bbd516ff1384156a20ea5f8464
parent1514c8edd62d96006cd1de31e906ed5798dd4681
convert: add "status=delayed" to filter process protocol

Some `clean` / `smudge` filters may require a significant amount of
time to process a single blob (e.g. the Git LFS smudge filter might
perform network requests). 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 edcc8581 ("convert: add
filter.<driver>.process option", 2016-10-16), 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
for now. The optimization is most effective in these code paths as all
files of the tree are processed.

Signed-off-by: Lars Schneider <larsxschneider@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/gitattributes.txt
builtin/checkout.c
cache.h
convert.c
convert.h
entry.c
t/t0021-conversion.sh
t/t0021/rot13-filter.pl
unpack-trees.c