builtin/index-pack.c: allow stripping arbitrary extensions

To derive the filename for a .idx file, 'git index-pack' uses
derive_filename() to strip the '.pack' suffix and add the new suffix.

Prepare for stripping off suffixes other than '.pack' by making the
suffix to strip a parameter of derive_filename(). In order to make this
consistent with the "suffix" parameter which does not begin with a ".",
an additional check in derive_filename.

Suggested-by: Jeff King <peff@peff.net>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Taylor Blau 2021-01-25 18:37:22 -05:00 committed by Junio C Hamano
parent 8ef50d9958
commit 84d544943c

View File

@ -1436,15 +1436,15 @@ static void fix_unresolved_deltas(struct hashfile *f)
free(sorted_by_pos); free(sorted_by_pos);
} }
static const char *derive_filename(const char *pack_name, const char *suffix, static const char *derive_filename(const char *pack_name, const char *strip,
struct strbuf *buf) const char *suffix, struct strbuf *buf)
{ {
size_t len; size_t len;
if (!strip_suffix(pack_name, ".pack", &len)) if (!strip_suffix(pack_name, strip, &len) || !len ||
die(_("packfile name '%s' does not end with '.pack'"), pack_name[len - 1] != '.')
pack_name); die(_("packfile name '%s' does not end with '.%s'"),
pack_name, strip);
strbuf_add(buf, pack_name, len); strbuf_add(buf, pack_name, len);
strbuf_addch(buf, '.');
strbuf_addstr(buf, suffix); strbuf_addstr(buf, suffix);
return buf->buf; return buf->buf;
} }
@ -1459,7 +1459,7 @@ static void write_special_file(const char *suffix, const char *msg,
int msg_len = strlen(msg); int msg_len = strlen(msg);
if (pack_name) if (pack_name)
filename = derive_filename(pack_name, suffix, &name_buf); filename = derive_filename(pack_name, "pack", suffix, &name_buf);
else else
filename = odb_pack_name(&name_buf, hash, suffix); filename = odb_pack_name(&name_buf, hash, suffix);
@ -1824,7 +1824,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
if (from_stdin && hash_algo) if (from_stdin && hash_algo)
die(_("--object-format cannot be used with --stdin")); die(_("--object-format cannot be used with --stdin"));
if (!index_name && pack_name) 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);
if (verify) { if (verify) {
if (!index_name) if (!index_name)