git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 14/19] upload-pack: add object filtering

From
JHJeff Hostetler <git@jeffhostetler.com>
Date
Jul 13, 2017, 17:34 UTC
Message-ID
<20170713173459.3559-15-git@jeffhostetler.com>
In-Reply-To
<20170713173459.3559-1-git@jeffhostetler.com>
From: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
---
 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
Previous: Jeff HostetlerNext: Jeff Hostetler
Message 12 of 20 in “WIP object filtering for partial clone”
  1. 00/19 WIP object filtering for partial cloneJeff Hostetler, Jul 13, 2017
  2. 01/19 dir: refactor add_excludes()Jeff Hostetler, Jul 13, 2017
  3. 03/19 list-objects: filter objects in traverse_commit_listJeff Hostetler, Jul 13, 2017
  4. 06/19 list-objects-filters: add use-sparse-checkout filterJeff Hostetler, Jul 13, 2017
  5. 07/19 object-filter: common declarations for object filteringJeff Hostetler, Jul 13, 2017
  6. 11/19 pack-objects: add object filtering supportJeff Hostetler, Jul 13, 2017
  7. 10/19 t6112: rev-list object filtering testJeff Hostetler, Jul 13, 2017
  8. 13/19 upload-pack: add filter-objects to protocol documentationJeff Hostetler, Jul 13, 2017
  9. 17/19 clone: add filter argumentsJeff Hostetler, Jul 13, 2017
  10. 18/19 index-pack: relax consistency checks for omitted objectsJeff Hostetler, Jul 13, 2017
  11. 12/19 pack-objects: add filtering help textJeff Hostetler, Jul 13, 2017
  12. 14/19 upload-pack: add object filteringJeff Hostetler, Jul 13, 2017
  13. 15/19 fetch-pack: add object filtering supportJeff Hostetler, Jul 13, 2017
  14. 16/19 connected: add filter_allow_omitted option to APIJeff Hostetler, Jul 13, 2017
  15. 19/19 fetch: add object filtering to fetchJeff Hostetler, Jul 13, 2017
  16. 08/19 rev-list: add object filtering supportJeff Hostetler, Jul 13, 2017
  17. 09/19 rev-list: add filtering help textJeff Hostetler, Jul 13, 2017
  18. 02/19 oidset2: create oidset subclass with object length and pathnameJeff Hostetler, Jul 13, 2017
  19. 05/19 list-objects-filters: add omit-large-blobs filterJeff Hostetler, Jul 13, 2017
  20. 04/19 list-objects-filters: add omit-all-blobs filterJeff Hostetler, Jul 13, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.