Re: [PATCH v4 4/6] rev-list: handle missing tree objects properly

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> Previously, we assumed only blob objects could be missing. This patch
> makes rev-list handle missing trees like missing blobs. A missing tree
> will cause an error if --missing indicates an error should be caused,
> and the hash is printed even if the tree is missing.

The last sentence is difficult to understand - probably better to say
that all --missing= arguments and --exclude-promisor-objects work for
missing trees like they currently do for blobs (and do not fixate on
just --missing=error). And also demonstrate this in tests, like in
t6612.

> In list-objects.c we no longer print a message to stderr if a tree
> object is missing (quiet_on_missing is always true). I couldn't find
> any place where this would matter, or where the caller of
> traverse_commit_list would need to be fixed to show the error. However,
> in the future it would be trivial to make the caller show the message if
> we needed to.
> 
> This is not tested very thoroughly, since we cannot create promisor
> objects in tests without using an actual partial clone. t0410 has a
> promise_and_delete utility function, but the is_promisor_object function
> does not return 1 for objects deleted in this way. More tests will will
> come in a patch that implements a filter that can be used with git
> clone.

These two paragraphs are no longer applicable, I think.

> @@ -373,6 +375,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
>  	init_revisions(&revs, prefix);
>  	revs.abbrev = DEFAULT_ABBREV;
>  	revs.commit_format = CMIT_FMT_UNSPECIFIED;
> +	revs.do_not_die_on_missing_tree = 1;

Is this correct? I would have expected this to be set only if --missing
was set.

> -	process_tree_contents(ctx, tree, base);
> +	/*
> +	 * NEEDSWORK: we should not have to process this tree's contents if the
> +	 * filter wants to exclude all its contents AND the filter doesn't need
> +	 * to collect the omitted OIDs. We should add a LOFR_SKIP_TREE bit which
> +	 * allows skipping all children.
> +	 */
> +	if (parsed)
> +		process_tree_contents(ctx, tree, base);

I agree with Jeff Hostetler in [1] that a LOFR_SKIP_TREE bit is
desirable, but I don't think that this patch is the right place to
introduce this NEEDSWORK. For me, this patch is about skipping iterating
over the contents of a tree because the tree does not exist; this
NEEDSWORK is about skipping iterating over the contents of a tree
because we don't want its contents, and it is quite confusing to
conflate the two.

[1] https://public-inbox.org/git/d751d56b-84bb-a03d-5f2a-7dbaf8d947cc@xxxxxxxxxxxxxxxxx/

> @@ -124,6 +124,7 @@ struct rev_info {
>  			first_parent_only:1,
>  			line_level_traverse:1,
>  			tree_blobs_in_commit_order:1,
> +			do_not_die_on_missing_tree:1,

I know that the other flags don't have documentation, but I think it's
worth documenting this one because it is rather complicated. I have
provided a sample one in my earlier review - feel free to use that or
come up with your own.

> diff --git a/t/t0410-partial-clone.sh b/t/t0410-partial-clone.sh
> index 4984ca583..74e3c5767 100755
> --- a/t/t0410-partial-clone.sh
> +++ b/t/t0410-partial-clone.sh
> @@ -186,6 +186,72 @@ test_expect_success 'rev-list stops traversal at missing and promised commit' '
>  	! grep $FOO out
>  '
>  
> +test_expect_success 'show missing tree objects with --missing=print' '
> +	rm -rf repo &&
> +	test_create_repo repo &&
> +	test_commit -C repo foo &&
> +	test_commit -C repo bar &&
> +	test_commit -C repo baz &&
> +
> +	TREE=$(git -C repo rev-parse bar^{tree}) &&
> +
> +	promise_and_delete $TREE &&
> +
> +	git -C repo config core.repositoryformatversion 1 &&
> +	git -C repo config extensions.partialclone "arbitrary string" &&
> +	git -C repo rev-list --quiet --missing=print --objects HEAD >missing_objs 2>rev_list_err &&
> +	echo "?$TREE" >expected &&
> +	test_cmp expected missing_objs &&
> +
> +	# do not complain when a missing tree cannot be parsed
> +	! grep -q "Could not read " rev_list_err
> +'

I think that the --exclude-promisor-tests can go in t0410 as you have
done, but the --missing tests (except for --missing=allow-promisor)
should go in t6112. (And like the existing --missing tests, they should
be done without setting extensions.partialclone.)

As for --missing=allow-promisor, I don't see them being tested anywhere
:-( so feel free to make a suggestion. I would put them in t6112 for
easy comparison with the other --missing tests.



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux