Browse Source

convert: add classification for conv_attrs struct

Create `enum conv_attrs_classification` to express the different ways
that attributes are handled for a blob during checkout.

This will be used in a later commit when deciding whether to add a file
to the parallel or delayed queue during checkout. For now, we can also
use it in get_stream_filter_ca() to simplify the function (as the
classifying logic is the same).

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Jeff Hostetler 4 years ago committed by Junio C Hamano
parent
commit
f59d15bb42
  1. 26
      convert.c
  2. 33
      convert.h

26
convert.c

@ -1954,13 +1954,7 @@ struct stream_filter *get_stream_filter_ca(const struct conv_attrs *ca, @@ -1954,13 +1954,7 @@ struct stream_filter *get_stream_filter_ca(const struct conv_attrs *ca,
{
struct stream_filter *filter = NULL;

if (ca->drv && (ca->drv->process || ca->drv->smudge || ca->drv->clean))
return NULL;

if (ca->working_tree_encoding)
return NULL;

if (ca->crlf_action == CRLF_AUTO || ca->crlf_action == CRLF_AUTO_CRLF)
if (classify_conv_attrs(ca) != CA_CLASS_STREAMABLE)
return NULL;

if (ca->ident)
@ -2016,3 +2010,21 @@ void clone_checkout_metadata(struct checkout_metadata *dst, @@ -2016,3 +2010,21 @@ void clone_checkout_metadata(struct checkout_metadata *dst,
if (blob)
oidcpy(&dst->blob, blob);
}

enum conv_attrs_classification classify_conv_attrs(const struct conv_attrs *ca)
{
if (ca->drv) {
if (ca->drv->process)
return CA_CLASS_INCORE_PROCESS;
if (ca->drv->smudge || ca->drv->clean)
return CA_CLASS_INCORE_FILTER;
}

if (ca->working_tree_encoding)
return CA_CLASS_INCORE;

if (ca->crlf_action == CRLF_AUTO || ca->crlf_action == CRLF_AUTO_CRLF)
return CA_CLASS_INCORE;

return CA_CLASS_STREAMABLE;
}

33
convert.h

@ -200,4 +200,37 @@ int stream_filter(struct stream_filter *, @@ -200,4 +200,37 @@ int stream_filter(struct stream_filter *,
const char *input, size_t *isize_p,
char *output, size_t *osize_p);

enum conv_attrs_classification {
/*
* The blob must be loaded into a buffer before it can be
* smudged. All smudging is done in-proc.
*/
CA_CLASS_INCORE,

/*
* The blob must be loaded into a buffer, but uses a
* single-file driver filter, such as rot13.
*/
CA_CLASS_INCORE_FILTER,

/*
* The blob must be loaded into a buffer, but uses a
* long-running driver process, such as LFS. This might or
* might not use delayed operations. (The important thing is
* that there is a single subordinate long-running process
* handling all associated blobs and in case of delayed
* operations, may hold per-blob state.)
*/
CA_CLASS_INCORE_PROCESS,

/*
* The blob can be streamed and smudged without needing to
* completely read it into a buffer.
*/
CA_CLASS_STREAMABLE,
};

enum conv_attrs_classification classify_conv_attrs(
const struct conv_attrs *ca);

#endif /* CONVERT_H */

Loading…
Cancel
Save