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

Re: [PATCH 00/14] WIP Partial clone part 3: clone, fetch, fetch-pack, upload-pack, and tests

From
Junio C Hamano <gitster@pobox.com>
Date
Nov 3, 2017, 15:12 UTC
Message-ID
<xmqqy3nno0py.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<20171102203129.59417-1-git@jeffhostetler.com>
Jeff Hostetler <git@jeffhostetler.com> writes:
> From: Jeff Hostetler <jeffhost@microsoft.com>
>
> This is part 3 of 3 for partial clone.
> It assumes that part 1 [1] and part 2 [2] are in place.

Thanks. As planned these replaced the partial clone with size filter thing from Jonathan. The resulting integration passed the tests locally so I pushed it out.

By the way, the enhancement in this series made to list-objects.c had a bit of interaction with the last round of Stefan's "describe blob" topic when both were merged to 'pu'. I think I resolved it correctly, but the merge resolution can use extra sets of eyes.

diff --cc list-objects.c index 5390a7440d,07a92f35fe..e05de01af1

--- a/list-objects.c
+++ b/list-objects.c
@@@ -220,32 -183,20 +220,22 @@@ static void add_pending_tree(struct rev
  	add_pending_object(revs, &tree->object, "");
  }
  
- static void do_traverse(struct rev_info *revs,
- 			show_commit_fn show_commit,
- 			show_object_fn show_object,
- 			void *show_data,
- 			filter_object_fn filter_fn,
- 			void *filter_data)
+ static void traverse_trees_and_blobs(struct rev_info *revs,
+ 				     struct strbuf *base,
+ 				     show_object_fn show_object,
 -				     void *data)
++				     void *show_data,
++				     filter_object_fn filter_fn,
++				     void *filter_data)
  {
  	int i;
- 	struct commit *commit;
- 	struct strbuf base;
  
- 	strbuf_init(&base, PATH_MAX);
- 	while ((commit = get_revision(revs)) != NULL) {
- 		/*
- 		 * an uninteresting boundary commit may not have its tree
- 		 * parsed yet, but we are not going to show them anyway
- 		 */
- 		if (commit->tree)
- 			add_pending_tree(revs, commit->tree);
- 		show_commit(commit, show_data);
- 	}
 -	assert(base->len == 0);
 -
++	assert(!base->len);
  	for (i = 0; i < revs->pending.nr; i++) {
  		struct object_array_entry *pending = revs->pending.objects + i;
  		struct object *obj = pending->item;
  		const char *name = pending->name;
  		const char *path = pending->path;
++
  		if (obj->flags & (UNINTERESTING | SEEN))
  			continue;
  		if (obj->type == OBJ_TAG) {
@@@ -257,47 -208,41 +247,76 @@@
  			path = "";
  		if (obj->type == OBJ_TREE) {
  			process_tree(revs, (struct tree *)obj, show_object,
- 				     &base, path, show_data,
 -				     base, path, data);
++				     base, path, show_data,
 +				     filter_fn, filter_data);
  			continue;
  		}
  		if (obj->type == OBJ_BLOB) {
  			process_blob(revs, (struct blob *)obj, show_object,
- 				     &base, path, show_data,
 -				     base, path, data);
++				     base, path, show_data,
 +				     filter_fn, filter_data);
  			continue;
  		}
  		die("unknown pending object %s (%s)",
  		    oid_to_hex(&obj->oid), name);
  	}
  	object_array_clear(&revs->pending);
- 	strbuf_release(&base);
+ }
+ 
 -void traverse_commit_list(struct rev_info *revs,
 -			  show_commit_fn show_commit,
 -			  show_object_fn show_object,
 -			  void *data)
++static void do_traverse(struct rev_info *revs,
++			show_commit_fn show_commit,
++			show_object_fn show_object,
++			void *show_data,
++			filter_object_fn filter_fn,
++			void *filter_data)
+ {
+ 	struct commit *commit;
+ 	struct strbuf csp; /* callee's scratch pad */
 -	strbuf_init(&csp, PATH_MAX);
+ 
++	strbuf_init(&csp, PATH_MAX);
+ 	while ((commit = get_revision(revs)) != NULL) {
+ 		/*
+ 		 * an uninteresting boundary commit may not have its tree
+ 		 * parsed yet, but we are not going to show them anyway
+ 		 */
+ 		if (commit->tree)
+ 			add_pending_tree(revs, commit->tree);
 -		show_commit(commit, data);
++		show_commit(commit, show_data);
+ 		if (revs->tree_blobs_in_commit_order)
 -			traverse_trees_and_blobs(revs, &csp, show_object, data);
++			traverse_trees_and_blobs(revs, &csp,
++						 show_object, show_data,
++						 filter_fn, filter_data);
+ 	}
 -	traverse_trees_and_blobs(revs, &csp, show_object, data);
 -
++	traverse_trees_and_blobs(revs, &csp,
++				 show_object, show_data,
++				 filter_fn, filter_data);
+ 	strbuf_release(&csp);
  }
 +
 +void traverse_commit_list(struct rev_info *revs,
 +			  show_commit_fn show_commit,
 +			  show_object_fn show_object,
 +			  void *show_data)
 +{
 +	do_traverse(revs, show_commit, show_object, show_data, NULL, NULL);
 +}
 +
 +void traverse_commit_list_filtered(
 +	struct list_objects_filter_options *filter_options,
 +	struct rev_info *revs,
 +	show_commit_fn show_commit,
 +	show_object_fn show_object,
 +	void *show_data,
 +	struct oidset *omitted)
 +{
 +	filter_object_fn filter_fn = NULL;
 +	filter_free_fn filter_free_fn = NULL;
 +	void *filter_data = NULL;
 +
 +	filter_data = list_objects_filter__init(omitted, filter_options,
 +						&filter_fn, &filter_free_fn);
 +	do_traverse(revs, show_commit, show_object, show_data,
 +		    filter_fn, filter_data);
 +	if (filter_data && filter_free_fn)
 +		filter_free_fn(filter_data);
 +}
Previous: Jeff Hostetler
Message 23 of 23 in “WIP Partial clone part 3: clone, fetch, fetch-pack, upload-pack, and tests”
  1. 00/14 WIP Partial clone part 3: clone, fetch, fetch-pack, upload-pack, and testsJeff Hostetler, Nov 2, 2017
  2. 02/14 clone, fetch-pack, index-pack, transport: partial cloneJeff Hostetler, Nov 2, 2017
  3. Jonathan TanNov 3, 2017
  4. Adam DinwoodieNov 8, 2017
  5. Jeff HostetlerNov 16, 2017
  6. 04/14 fetch: add object filtering for partial fetchJeff Hostetler, Nov 2, 2017
  7. Jonathan TanNov 3, 2017
  8. Jeff HostetlerNov 16, 2017
  9. 05/14 remote-curl: add object filtering for partial cloneJeff Hostetler, Nov 2, 2017
  10. 07/14 fetch-pack: test support excluding large blobsJeff Hostetler, Nov 2, 2017
  11. 08/14 fetch: add from_promisor and exclude-promisor-objects parametersJeff Hostetler, Nov 2, 2017
  12. 10/14 t5601: test for partial cloneJeff Hostetler, Nov 2, 2017
  13. 13/14 fetch-pack: restore save_commit_buffer after useJeff Hostetler, Nov 2, 2017
  14. 11/14 t5500: more tests for partial clone and fetchJeff Hostetler, Nov 2, 2017
  15. 14/14 index-pack: silently assume missing objects are promisorJeff Hostetler, Nov 2, 2017
  16. 12/14 unpack-trees: batch fetching of missing blobsJeff Hostetler, Nov 2, 2017
  17. 09/14 t5500: add fetch-pack tests for partial cloneJeff Hostetler, Nov 2, 2017
  18. 06/14 pack-objects: test support for blob filteringJeff Hostetler, Nov 2, 2017
  19. 03/14 fetch: refactor calculation of remote listJeff Hostetler, Nov 2, 2017
  20. 01/14 upload-pack: add object filtering for partial cloneJeff Hostetler, Nov 2, 2017
  21. Jonathan TanNov 2, 2017
  22. Jeff HostetlerNov 3, 2017
  23. Junio C HamanoNov 3, 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.