]> git.ipfire.org Git - thirdparty/git.git/commitdiff
repack-promisor: extract function to finalize repacking
authorPatrick Steinhardt <ps@pks.im>
Mon, 5 Jan 2026 13:16:43 +0000 (14:16 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 14 Jan 2026 14:29:24 +0000 (06:29 -0800)
We're about to add a second caller that wants to finalize repacking of
promisor objects. Split out the function which does this to prepare for
that.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
repack-promisor.c

index ee6e0669f656028a4f59389d0ba0b8ff637526c3..125038d92e25659743a4ea61d4798500af165e3f 100644 (file)
@@ -34,39 +34,17 @@ static int write_oid(const struct object_id *oid,
        return 0;
 }
 
-void repack_promisor_objects(struct repository *repo,
-                            const struct pack_objects_args *args,
-                            struct string_list *names, const char *packtmp)
+static void finish_repacking_promisor_objects(struct repository *repo,
+                                             struct child_process *cmd,
+                                             struct string_list *names,
+                                             const char *packtmp)
 {
-       struct write_oid_context ctx;
-       struct child_process cmd = CHILD_PROCESS_INIT;
-       FILE *out;
        struct strbuf line = STRBUF_INIT;
+       FILE *out;
 
-       prepare_pack_objects(&cmd, args, packtmp);
-       cmd.in = -1;
-
-       /*
-        * NEEDSWORK: Giving pack-objects only the OIDs without any ordering
-        * hints may result in suboptimal deltas in the resulting pack. See if
-        * the OIDs can be sent with fake paths such that pack-objects can use a
-        * {type -> existing pack order} ordering when computing deltas instead
-        * of a {type -> size} ordering, which may produce better deltas.
-        */
-       ctx.cmd = &cmd;
-       ctx.algop = repo->hash_algo;
-       for_each_packed_object(repo, write_oid, &ctx,
-                              FOR_EACH_OBJECT_PROMISOR_ONLY);
-
-       if (cmd.in == -1) {
-               /* No packed objects; cmd was never started */
-               child_process_clear(&cmd);
-               return;
-       }
-
-       close(cmd.in);
+       close(cmd->in);
 
-       out = xfdopen(cmd.out, "r");
+       out = xfdopen(cmd->out, "r");
        while (strbuf_getline_lf(&line, out) != EOF) {
                struct string_list_item *item;
                char *promisor_name;
@@ -96,7 +74,38 @@ void repack_promisor_objects(struct repository *repo,
        }
 
        fclose(out);
-       if (finish_command(&cmd))
+       if (finish_command(cmd))
                die(_("could not finish pack-objects to repack promisor objects"));
        strbuf_release(&line);
 }
+
+void repack_promisor_objects(struct repository *repo,
+                            const struct pack_objects_args *args,
+                            struct string_list *names, const char *packtmp)
+{
+       struct write_oid_context ctx;
+       struct child_process cmd = CHILD_PROCESS_INIT;
+
+       prepare_pack_objects(&cmd, args, packtmp);
+       cmd.in = -1;
+
+       /*
+        * NEEDSWORK: Giving pack-objects only the OIDs without any ordering
+        * hints may result in suboptimal deltas in the resulting pack. See if
+        * the OIDs can be sent with fake paths such that pack-objects can use a
+        * {type -> existing pack order} ordering when computing deltas instead
+        * of a {type -> size} ordering, which may produce better deltas.
+        */
+       ctx.cmd = &cmd;
+       ctx.algop = repo->hash_algo;
+       for_each_packed_object(repo, write_oid, &ctx,
+                              FOR_EACH_OBJECT_PROMISOR_ONLY);
+
+       if (cmd.in == -1) {
+               /* No packed objects; cmd was never started */
+               child_process_clear(&cmd);
+               return;
+       }
+
+       finish_repacking_promisor_objects(repo, &cmd, names, packtmp);
+}