Skip to content

Commit

Permalink
Fix rev index (#599)
Browse files Browse the repository at this point in the history
`git index-pack` fails when the `-o` argument is used and the requested
IDX file does not have the standard `.idx` suffix. The reverse index
code assumes the `.idx` suffix when it generates the `.rev` pathname.

Silently disable the reverse index when the suffix is different.

Added a test to confirm the breakage and then updated it to confirm the
fix.

This is being patched into vfs-2.41.0.5 directly, but the fixes should
be backported to upstream Git and to vfs-2.42.0.
  • Loading branch information
jeffhostetler authored and dscho committed Aug 28, 2023
2 parents c68e5fb + a8bc787 commit d117b01
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 0 deletions.
4 changes: 4 additions & 0 deletions builtin/index-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -1741,6 +1741,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
unsigned foreign_nr = 1; /* zero is a "good" value, assume bad */
int report_end_of_input = 0;
int hash_algo = 0;
int dash_o = 0;

/*
* index-pack never needs to fetch missing objects except when
Expand Down Expand Up @@ -1833,6 +1834,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
if (index_name || (i+1) >= argc)
usage(index_pack_usage);
index_name = argv[++i];
dash_o = 1;
} else if (starts_with(arg, "--index-version=")) {
char *c;
opts.version = strtoul(arg + 16, &c, 10);
Expand Down Expand Up @@ -1875,6 +1877,8 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
index_name = derive_filename(pack_name, "pack", "idx", &index_name_buf);

opts.flags &= ~(WRITE_REV | WRITE_REV_VERIFY);
if (rev_index && dash_o && !ends_with(index_name, ".idx"))
rev_index = 0;
if (rev_index) {
opts.flags |= verify ? WRITE_REV_VERIFY : WRITE_REV;
if (index_name)
Expand Down
24 changes: 24 additions & 0 deletions t/t5300-pack-object.sh
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,30 @@ test_expect_success 'build pack index for an existing pack' '
:
'

# The `--rev-index` option of `git index-pack` is now the default, so
# a `foo.rev` REV file will be created when a `foo.idx` IDX file is
# created. Normally, these pathnames are based upon the `foo.pack`
# PACK file pathname.
#
# However, the `-o` option lets you set the pathname of the IDX file
# indepdent of the PACK file.
#
# Verify what happens if these suffixes are changed.
#
test_expect_success 'complain about index name' '
# Normal case { .pack, .idx, .rev }
cat test-1-${packname_1}.pack >test-complain-0.pack &&
git index-pack -o test-complain-0.idx --rev-index test-complain-0.pack &&
test -f test-complain-0.idx &&
test -f test-complain-0.rev &&
# Non .idx suffix -- implicitly omits the .rev
cat test-1-${packname_1}.pack >test-complain-1.pack &&
git index-pack -o test-complain-1.idx-suffix --rev-index test-complain-1.pack &&
test -f test-complain-1.idx-suffix &&
! test -f test-complain-1.rev
'

test_expect_success 'unpacking with --strict' '
for j in a b c d e f g
Expand Down

0 comments on commit d117b01

Please sign in to comment.