]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/repack.c: keep track of what pack-objects wrote
authorTaylor Blau <me@ttaylorr.com>
Mon, 16 Nov 2020 18:41:17 +0000 (13:41 -0500)
committerJunio C Hamano <gitster@pobox.com>
Mon, 16 Nov 2020 23:57:44 +0000 (15:57 -0800)
In the subsequent commit, it will become useful to keep track of which
metadata files were written by pack-objects. We already do this to an
extent with the 'exts' array, which only is used in the context of
existing packs.

Co-authored-by: Jeff King <peff@peff.net>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/repack.c

index 03e2c2c44b107cf3174df3d423cbdbca17ee0b7f..bb839180da767ab23b181328760f115c0e34d236 100644 (file)
@@ -212,6 +212,27 @@ static struct {
        {".promisor", 1},
 };
 
+static unsigned populate_pack_exts(char *name)
+{
+       struct stat statbuf;
+       struct strbuf path = STRBUF_INIT;
+       unsigned ret = 0;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(exts); i++) {
+               strbuf_reset(&path);
+               strbuf_addf(&path, "%s-%s%s", packtmp, name, exts[i].name);
+
+               if (stat(path.buf, &statbuf))
+                       continue;
+
+               ret |= (1 << i);
+       }
+
+       strbuf_release(&path);
+       return ret;
+}
+
 static void repack_promisor_objects(const struct pack_objects_args *args,
                                    struct string_list *names)
 {
@@ -240,11 +261,12 @@ static void repack_promisor_objects(const struct pack_objects_args *args,
 
        out = xfdopen(cmd.out, "r");
        while (strbuf_getline_lf(&line, out) != EOF) {
+               struct string_list_item *item;
                char *promisor_name;
                int fd;
                if (line.len != the_hash_algo->hexsz)
                        die(_("repack: Expecting full hex object ID lines only from pack-objects."));
-               string_list_append(names, line.buf);
+               item = string_list_append(names, line.buf);
 
                /*
                 * pack-objects creates the .pack and .idx files, but not the
@@ -263,6 +285,9 @@ static void repack_promisor_objects(const struct pack_objects_args *args,
                if (fd < 0)
                        die_errno(_("unable to create '%s'"), promisor_name);
                close(fd);
+
+               item->util = (void *)(uintptr_t)populate_pack_exts(item->string);
+
                free(promisor_name);
        }
        fclose(out);
@@ -430,6 +455,10 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
        if (!names.nr && !po_args.quiet)
                printf_ln(_("Nothing new to pack."));
 
+       for_each_string_list_item(item, &names) {
+               item->util = (void *)(uintptr_t)populate_pack_exts(item->string);
+       }
+
        close_object_store(the_repository->objects);
 
        /*