]> git.ipfire.org Git - thirdparty/git.git/commitdiff
convert: add classification for conv_attrs struct
authorJeff Hostetler <jeffhost@microsoft.com>
Wed, 16 Dec 2020 14:50:33 +0000 (11:50 -0300)
committerJunio C Hamano <gitster@pobox.com>
Thu, 18 Mar 2021 20:56:40 +0000 (13:56 -0700)
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>
convert.c
convert.h

index 9af6aafc5ada5e2c41a8a8b55a7dc5c059124532..b9d25d9a472ca105ebfeaa1fb701b10347b711ef 100644 (file)
--- a/convert.c
+++ b/convert.c
@@ -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,
        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;
+}
index 484b50965d5fdebf64eb0f5b1b11a5e15c626352..43e567a59b063d1a13e51cdde8a8e8d157d7bda8 100644 (file)
--- a/convert.h
+++ b/convert.h
@@ -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 */