From: Jeff Hostetler <[email protected]>

Signed-off-by: Jeff Hostetler <[email protected]>
---
 upload-pack.c | 39 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

diff --git a/upload-pack.c b/upload-pack.c
index ffb028d..c709054 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -17,6 +17,7 @@
 #include "parse-options.h"
 #include "argv-array.h"
 #include "prio-queue.h"
+#include "object-filter.h"
 
 static const char * const upload_pack_usage[] = {
        N_("git upload-pack [<options>] <dir>"),
@@ -63,6 +64,9 @@ static int advertise_refs;
 static int stateless_rpc;
 static const char *pack_objects_hook;
 
+static int capability_filter_objects_requested;
+static struct object_filter_options filter_options;
+
 static void reset_timeout(void)
 {
        alarm(timeout);
@@ -131,6 +135,30 @@ static void create_pack_file(void)
        if (use_include_tag)
                argv_array_push(&pack_objects.args, "--include-tag");
 
+       if (filter_options.omit_all_blobs)
+               argv_array_push(&pack_objects.args,
+                               ("--" CL_ARG_FILTER_OMIT_ALL_BLOBS));
+       else if (filter_options.omit_large_blobs) {
+               if (filter_options.large_byte_limit_string)
+                       argv_array_pushf(&pack_objects.args, "--%s=%s",
+                                        CL_ARG_FILTER_OMIT_LARGE_BLOBS,
+                                        
filter_options.large_byte_limit_string);
+               else
+                       argv_array_pushf(&pack_objects.args, "--%s=%ld",
+                                        CL_ARG_FILTER_OMIT_LARGE_BLOBS,
+                                        filter_options.large_byte_limit);
+       }
+       else if (filter_options.use_sparse) {
+               if (!oidcmp(&filter_options.sparse_oid, &null_oid))
+                       argv_array_pushf(&pack_objects.args, "--%s=%s",
+                                        CL_ARG_FILTER_USE_SPARSE,
+                                        
oid_to_hex(&filter_options.sparse_oid));
+               else
+                       argv_array_pushf(&pack_objects.args, "--%s=%s",
+                                        CL_ARG_FILTER_USE_SPARSE,
+                                        filter_options.sparse_value);
+       }
+
        pack_objects.in = -1;
        pack_objects.out = -1;
        pack_objects.err = -1;
@@ -793,6 +821,12 @@ static void receive_needs(void)
                        deepen_rev_list = 1;
                        continue;
                }
+               if (object_filter_hand_parse_protocol(&filter_options, line, 0, 
0)) {
+                       if (!capability_filter_objects_requested)
+                               die("git upload-pack: object filtering requires 
'%s' capability",
+                                   PROTOCOL_CAPABILITY_FILTER_OBJECTS);
+                       continue;
+               }
                if (!skip_prefix(line, "want ", &arg) ||
                    get_sha1_hex(arg, sha1_buf))
                        die("git upload-pack: protocol error, "
@@ -820,6 +854,8 @@ static void receive_needs(void)
                        no_progress = 1;
                if (parse_feature_request(features, "include-tag"))
                        use_include_tag = 1;
+               if (parse_feature_request(features, 
PROTOCOL_CAPABILITY_FILTER_OBJECTS))
+                       capability_filter_objects_requested = 1;
 
                o = parse_object(sha1_buf);
                if (!o) {
@@ -928,7 +964,8 @@ static int send_ref(const char *refname, const struct 
object_id *oid,
 {
        static const char *capabilities = "multi_ack thin-pack side-band"
                " side-band-64k ofs-delta shallow deepen-since deepen-not"
-               " deepen-relative no-progress include-tag multi_ack_detailed";
+               " deepen-relative no-progress include-tag multi_ack_detailed"
+               " " PROTOCOL_CAPABILITY_FILTER_OBJECTS;
        const char *refname_nons = strip_namespace(refname);
        struct object_id peeled;
 
-- 
2.9.3

Reply via email to