From: Patrick Steinhardt Date: Fri, 02 Oct 2026 10:08:12 GMT Subject: [PATCH 01/13] commit-graph: require resolved packfile paths for `stdin_packs` Message-ID: <20261002-pks-odb-move-alternates-v1-1-8a63507b88c4@pks.im> In-Reply-To: <20261002-pks-odb-move-alternates-v1-0-8a63507b88c4@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. Refactor the logic to instead require the caller to pass in resolved packfiles to untangle that dependency. 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.379.gc618271300.dirty