From: Patrick Steinhardt Date: Thu, 08 Oct 2026 08:35:51 GMT Subject: [PATCH v2 01/13] commit-graph: require resolved packfile paths for `stdin_packs` Message-ID: <20261008-pks-odb-move-alternates-v2-1-b47e8189baa5@pks.im> In-Reply-To: <20261008-pks-odb-move-alternates-v2-0-b47e8189baa5@pks.im> Users can ask git-commit-graph(1) to write a commit graph specifically for a set of packfiles via the "--stdin-packs" option. Those users are expected to pass in relative paths, and those eventually get resolved in `fill_oids_from_packs()`. This ties the logic in "commit-graph.c" to the specific object database source, as the subsystem now needs to assume where a specific packfile is located relative to the source itself. Refactor the logic to instead require the caller to pass in resolved packfiles to untangle that dependency. This also makes the next change easier to implement, where we'll get rid of passing the source to the commit-graph subsystem. Signed-off-by: Patrick Steinhardt --- builtin/commit-graph.c | 17 ++++++++++++++--- commit-graph.c | 15 +++++---------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/builtin/commit-graph.c b/builtin/commit-graph.c index d62005edc0..b5784ad3c7 100644 --- a/builtin/commit-graph.c +++ b/builtin/commit-graph.c @@ -8,6 +8,7 @@ #include "parse-options.h" #include "commit-graph.h" #include "odb.h" +#include "odb/source.h" #include "progress.h" #include "replace-object.h" #include "strbuf.h" @@ -302,9 +303,19 @@ static int graph_write(int argc, const char **argv, const char *prefix, } if (opts.stdin_packs) { - while (strbuf_getline(&buf, stdin) != EOF) - string_list_append_nodup(&pack_indexes, - strbuf_detach(&buf, NULL)); + struct strbuf packname = STRBUF_INIT; + size_t dirlen; + + strbuf_addf(&packname, "%s/pack/", source->path); + dirlen = packname.len; + + while (strbuf_getline(&buf, stdin) != EOF) { + strbuf_setlen(&packname, dirlen); + strbuf_addbuf(&packname, &buf); + string_list_append(&pack_indexes, packname.buf); + } + + strbuf_release(&packname); } else if (opts.stdin_commits) { oidset_init(&commits, 0); if (opts.progress) diff --git a/commit-graph.c b/commit-graph.c index 983c11ce85..73814c1622 100644 --- a/commit-graph.c +++ b/commit-graph.c @@ -1936,12 +1936,8 @@ static int fill_oids_from_packs(struct write_commit_graph_context *ctx, { uint32_t i; struct strbuf progress_title = STRBUF_INIT; - struct strbuf packname = STRBUF_INIT; - int dirlen; int ret = 0; - strbuf_addf(&packname, "%s/pack/", ctx->odb_source->path); - dirlen = packname.len; if (ctx->report_progress) { strbuf_addf(&progress_title, Q_("Finding commits for commit graph in %"PRIuMAX" pack", @@ -1954,15 +1950,15 @@ static int fill_oids_from_packs(struct write_commit_graph_context *ctx, } for (i = 0; i < pack_indexes->nr; i++) { struct packed_git *p; - strbuf_setlen(&packname, dirlen); - strbuf_addstr(&packname, pack_indexes->items[i].string); - p = add_packed_git(ctx->r, packname.buf, packname.len, 1); + + p = add_packed_git(ctx->r, pack_indexes->items[i].string, + strlen(pack_indexes->items[i].string), 1); if (!p) { - ret = error(_("error adding pack %s"), packname.buf); + ret = error(_("error adding pack %s"), pack_indexes->items[i].string); goto cleanup; } if (open_pack_index(p)) { - ret = error(_("error opening index for %s"), packname.buf); + ret = error(_("error opening index for %s"), pack_indexes->items[i].string); close_pack(p); free(p); goto cleanup; @@ -1976,7 +1972,6 @@ static int fill_oids_from_packs(struct write_commit_graph_context *ctx, cleanup: stop_progress(&ctx->progress); strbuf_release(&progress_title); - strbuf_release(&packname); return ret; } -- 2.56.0.406.ga2d225a756.dirty