[PATCH 45/49] repack: move `finish_pack_objects_cmd()` out of the builtin

Taylor Blau
2025-09-28T22:10:24Z

In a similar spirit as the previous commit(s), now that the function
`finish_pack_objects_cmd()` has no explicit dependencies within the
repack builtin, let's extract it.

This prepares us to extract the remaining two functions within the
repack builtin that explicitly write packfiles, which are
`write_cruft_pack()` and `write_filtered_pack()`, which will be done in
the future commits.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
---
builtin/repack.c | 33 ---------------------------------
repack.c | 33 +++++++++++++++++++++++++++++++++
repack.h | 5 +++++
3 files changed, 38 insertions(+), 33 deletions(-)

diff --git a/builtin/repack.c b/builtin/repack.c
index 8db95305c8..836a006607 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -107,39 +107,6 @@ static int repack_config(const char *var, const char *value,
return git_default_config(var, value, ctx, cb);
}

-static int finish_pack_objects_cmd(const struct git_hash_algo *algop,
- struct write_pack_opts *opts,
- struct child_process *cmd,
- struct string_list *names)
-{
- FILE *out;
- int local = write_pack_opts_is_local(opts);
- struct strbuf line = STRBUF_INIT;
-
- out = xfdopen(cmd->out, "r");
- while (strbuf_getline_lf(&line, out) != EOF) {
- struct string_list_item *item;
-
- if (line.len != algop->hexsz)
- die(_("repack: Expecting full hex object ID lines only "
- "from pack-objects."));
- /*
- * Avoid putting packs written outside of the repository in the
- * list of names.
- */
- if (local) {
- item = string_list_append(names, line.buf);
- item->util = generated_pack_populate(line.buf,
- opts->packtmp);
- }
- }
- fclose(out);
-
- strbuf_release(&line);
-
- return finish_command(cmd);
-}
-
static int write_filtered_pack(struct write_pack_opts *opts,
struct existing_packs *existing,
struct string_list *names)
diff --git a/repack.c b/repack.c
index 7af297ae48..8a0e4789fa 100644
--- a/repack.c
+++ b/repack.c
@@ -83,6 +83,39 @@ int write_pack_opts_is_local(struct write_pack_opts *opts)
return skip_prefix(opts->destination, opts->packdir, &scratch);
}

+int finish_pack_objects_cmd(const struct git_hash_algo *algop,
+ struct write_pack_opts *opts,
+ struct child_process *cmd,
+ struct string_list *names)
+{
+ FILE *out;
+ int local = write_pack_opts_is_local(opts);
+ struct strbuf line = STRBUF_INIT;
+
+ out = xfdopen(cmd->out, "r");
+ while (strbuf_getline_lf(&line, out) != EOF) {
+ struct string_list_item *item;
+
+ if (line.len != algop->hexsz)
+ die(_("repack: Expecting full hex object ID lines only "
+ "from pack-objects."));
+ /*
+ * Avoid putting packs written outside of the repository in the
+ * list of names.
+ */
+ if (local) {
+ item = string_list_append(names, line.buf);
+ item->util = generated_pack_populate(line.buf,
+ opts->packtmp);
+ }
+ }
+ fclose(out);
+
+ strbuf_release(&line);
+
+ return finish_command(cmd);
+}
+
#define DELETE_PACK 1
#define RETAIN_PACK 2

diff --git a/repack.h b/repack.h
index 16f2de2ea9..9351293233 100644
--- a/repack.h
+++ b/repack.h
@@ -42,6 +42,11 @@ struct write_pack_opts {
const char *write_pack_opts_pack_prefix(struct write_pack_opts *opts);
int write_pack_opts_is_local(struct write_pack_opts *opts);

+int finish_pack_objects_cmd(const struct git_hash_algo *algop,
+ struct write_pack_opts *opts,
+ struct child_process *cmd,
+ struct string_list *names);
+
struct repository;
struct packed_git;

--
2.51.0.243.g16eca91f2c0