Re: [PATCH v2 3/8] builtin/index-pack.c: write reverse indexes

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

 



On Wed, Jan 13, 2021 at 05:28:15PM -0500, Taylor Blau wrote:

>  OPTIONS
> @@ -33,7 +34,14 @@ OPTIONS
>  	file is constructed from the name of packed archive
>  	file by replacing .pack with .idx (and the program
>  	fails if the name of packed archive does not end
> -	with .pack).
> +	with .pack). Incompatible with `--rev-index`.

I wondered which option was incompatible, but couldn't see from the
context. It is "index-pack -o", which kind of makes sense. We can derive
"foo.rev" from "foo.idx", but normally "-o" does not do any deriving.

So I was all set to say "OK, we can live without it", but...

> @@ -1824,7 +1851,16 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
>  	if (from_stdin && hash_algo)
>  		die(_("--object-format cannot be used with --stdin"));
>  	if (!index_name && pack_name)
> -		index_name = derive_filename(pack_name, "idx", &index_name_buf);
> +		index_name = derive_filename(pack_name, ".pack", "idx", &index_name_buf);
> +
> +	opts.flags &= ~(WRITE_REV | WRITE_REV_VERIFY);
> +	if (rev_index) {
> +		opts.flags |= verify ? WRITE_REV_VERIFY : WRITE_REV;
> +		if (index_name)
> +			rev_index_name = derive_filename(index_name,
> +							 ".idx", "rev",
> +							 &rev_index_name_buf);
> +	}

...here we do end up deriving ".rev" from ".idx" anyway. So I guess we
probably could support "-o".  I also wonder what happens with "git
index-pack -o foo.idx" when pack.writeReverseIndex is set. It looks like
it would just work because of this block. But then shouldn't
"--rev-index" work, too? And indeed, there is a test for that at the end
of the patch! So is the documentation just wrong?

I admit to finding the use of opts.flags versus the rev_index option a
bit confusing. It seems like they are doing roughly the same thing, but
influenced by different sources. It seems like we should be able to have
a single local variable (then that goes on to set opts.flags for any
sub-functions we call). Or maybe two, if we need to distinguish config
versus command-line, but then they should have clear names
(rev_index_config and rev_index_cmdline or something).

As an aside, looking at derive_filename(), it seems a bit weird that one
argument has a dot in the suffix and the other does not. I guess you are
following the convention from write_special_file(), which omits it in
the newly-added suffix. But it is slightly awkward to omit it for the
old suffix in derive_filename(), because we want to strip_suffix() it
all at once.

Probably not that big a deal, but if anybody feels strongly, then
derive_filename() could do:

  if (!strip_suffix(pack_name, strip, &len) ||
      !len || pack_name[len] != '.')
	die("does not end in .%s", strip);

> @@ -1578,6 +1591,12 @@ static int git_index_pack_config(const char *k, const char *v, void *cb)
>  		}
>  		return 0;
>  	}
> +	if (!strcmp(k, "pack.writereverseindex")) {
> +		if (git_config_bool(k, v))
> +			opts->flags |= WRITE_REV;
> +		else
> +			opts->flags &= ~WRITE_REV;
> +	}
>  	return git_default_config(k, v, cb);
>  }

IMHO we'll eventually want to turn this feature on by default. In which
case we'll have to update every caller which is checking the config
manually. Should we hide this in a function that looks up the config,
and sets the default? Or alternatively, I guess, they could all use some
shared initializer for "flags".

> +	# Intentionally corrupt the reverse index.
> +	chmod u+w $rev &&
> +	printf "xxxx" | dd of=$rev bs=1 count=4 conv=notrunc &&
> +
> +	test_must_fail git index-pack --rev-index --verify \
> +		$packdir/pack-$pack.pack 2>err &&
> +	grep "validation error" err
> +'

This isn't that subtle of a corruption, because we are corrupting the
first 4 bytes, which is the magic signature. Maybe something further in
the actual data would be interesting instead of or in addition?

I dunno. There are a lot of edge cases around corruption (likewise, we
might care how the normal reading code-path perceives a signature
corruption like this). I'm not sure it's all that interesting to test
all of them.

> +test_expect_success 'index-pack infers reverse index name with -o' '
> +	git index-pack --rev-index -o other.idx $packdir/pack-$pack.pack &&
> +	test_path_is_file other.idx &&
> +	test_path_is_file other.rev
> +'

Hey, we _do_ support "--rev-index -o". Is it just the documentation that
is wrong?

-Peff



[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