]> git.ipfire.org Git - thirdparty/git.git/commitdiff
packfile: add repository to struct `packed_git`
authorKarthik Nayak <karthik.188@gmail.com>
Tue, 3 Dec 2024 14:43:55 +0000 (15:43 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 3 Dec 2024 23:21:53 +0000 (08:21 +0900)
The struct `packed_git` holds information regarding a packed object
file. Let's add the repository variable to this object, to represent the
repository that this packfile belongs to. This helps remove dependency
on the global `the_repository` object in `packfile.c` by simply using
repository information now readily available in the struct.

We do need to consider that a packfile could be part of the alternates
of a repository, but considering that we only have one repository struct
and also that we currently anyways use 'the_repository', we should be
OK with this change.

We also modify `alloc_packed_git` to ensure that the repository is added
to newly created `packed_git` structs. This requires modifying the
function and all its callee to pass the repository object down the
levels.

Helped-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fast-import.c
builtin/index-pack.c
commit-graph.c
connected.c
http.c
midx-write.c
midx.c
object-store-ll.h
packfile.c
packfile.h

index 76d5c20f141f42da988dddae0e549144d1379031..da7e2d613b7e7707af9bf6f6666376afe23165b6 100644 (file)
@@ -765,6 +765,7 @@ static void start_packfile(void)
 
        p->pack_fd = pack_fd;
        p->do_not_close = 1;
+       p->repo = the_repository;
        pack_file = hashfd(pack_fd, p->pack_name);
 
        pack_data = p;
@@ -888,7 +889,7 @@ static void end_packfile(void)
                idx_name = keep_pack(create_index());
 
                /* Register the packfile with core git's machinery. */
-               new_p = add_packed_git(idx_name, strlen(idx_name), 1);
+               new_p = add_packed_git(pack_data->repo, idx_name, strlen(idx_name), 1);
                if (!new_p)
                        die("core git rejected index %s", idx_name);
                all_packs[pack_id] = new_p;
index 9d23b41b3a23067d4f16a3a84deec7af2bc82d86..be2f99625ea3c7086f63342c49395a0c2720499b 100644 (file)
@@ -1552,7 +1552,8 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
 
        if (do_fsck_object) {
                struct packed_git *p;
-               p = add_packed_git(final_index_name, strlen(final_index_name), 0);
+               p = add_packed_git(the_repository, final_index_name,
+                                  strlen(final_index_name), 0);
                if (p)
                        install_packed_git(the_repository, p);
        }
@@ -1650,7 +1651,8 @@ static void read_v2_anomalous_offsets(struct packed_git *p,
 
 static void read_idx_option(struct pack_idx_option *opts, const char *pack_name)
 {
-       struct packed_git *p = add_packed_git(pack_name, strlen(pack_name), 1);
+       struct packed_git *p = add_packed_git(the_repository, pack_name,
+                                             strlen(pack_name), 1);
 
        if (!p)
                die(_("Cannot open existing pack file '%s'"), pack_name);
index 5bd89c0acdd03df1328d75707136cfd2937582a5..83dd69bfebc163015b847ae58e835627991b881b 100644 (file)
@@ -1914,7 +1914,7 @@ static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
                struct packed_git *p;
                strbuf_setlen(&packname, dirlen);
                strbuf_addstr(&packname, pack_indexes->items[i].string);
-               p = add_packed_git(packname.buf, packname.len, 1);
+               p = add_packed_git(ctx->r, packname.buf, packname.len, 1);
                if (!p) {
                        ret = error(_("error adding pack %s"), packname.buf);
                        goto cleanup;
index a9e2e139956f0c0daccb917200448d7d67a7dd6f..3099da84f3397fb8564ea14527be7c84f2f04585 100644 (file)
@@ -54,7 +54,8 @@ int check_connected(oid_iterate_fn fn, void *cb_data,
                strbuf_add(&idx_file, transport->pack_lockfiles.items[0].string,
                           base_len);
                strbuf_addstr(&idx_file, ".idx");
-               new_pack = add_packed_git(idx_file.buf, idx_file.len, 1);
+               new_pack = add_packed_git(the_repository, idx_file.buf,
+                                         idx_file.len, 1);
                strbuf_release(&idx_file);
        }
 
diff --git a/http.c b/http.c
index 58242b9d2dd595e9e0a5cb2d9bc6f38927546328..6744e184092cf645ba863cec4b1675090bd1473e 100644 (file)
--- a/http.c
+++ b/http.c
@@ -2439,7 +2439,7 @@ static int fetch_and_setup_pack_index(struct packed_git **packs_head,
        if (!tmp_idx)
                return -1;
 
-       new_pack = parse_pack_index(sha1, tmp_idx);
+       new_pack = parse_pack_index(the_repository, sha1, tmp_idx);
        if (!new_pack) {
                unlink(tmp_idx);
                free(tmp_idx);
index b3a5f6c51669349dc26edf94b5c25b8fea033322..c57726ef9475df693890d61627ce91409c1def7c 100644 (file)
@@ -154,7 +154,7 @@ static void add_pack_to_midx(const char *full_path, size_t full_path_len,
                        return;
 
                ALLOC_GROW(ctx->info, ctx->nr + 1, ctx->alloc);
-               p = add_packed_git(full_path, full_path_len, 0);
+               p = add_packed_git(the_repository, full_path, full_path_len, 0);
                if (!p) {
                        warning(_("failed to add packfile '%s'"),
                                full_path);
diff --git a/midx.c b/midx.c
index e82d4f2e65496b3e26c6e21c42e274406111aa3b..8edb75f51dc97973fd7deec41f72f59a756709e9 100644 (file)
--- a/midx.c
+++ b/midx.c
@@ -464,7 +464,7 @@ int prepare_midx_pack(struct repository *r, struct multi_pack_index *m,
                                        strhash(key.buf), key.buf,
                                        struct packed_git, packmap_ent);
        if (!p) {
-               p = add_packed_git(pack_name.buf, pack_name.len, m->local);
+               p = add_packed_git(r, pack_name.buf, pack_name.len, m->local);
                if (p) {
                        install_packed_git(r, p);
                        list_add_tail(&p->mru, &r->objects->packed_git_mru);
index 53b8e693b1b74f0e4156df7dce9f07460a65a9a8..d46cd0e654501225e6235b4d6940aa727147ce9f 100644 (file)
@@ -10,6 +10,7 @@
 struct oidmap;
 struct oidtree;
 struct strbuf;
+struct repository;
 
 struct object_directory {
        struct object_directory *next;
@@ -135,6 +136,10 @@ struct packed_git {
         */
        const uint32_t *mtimes_map;
        size_t mtimes_size;
+
+       /* repo denotes the repository this packfile belongs to */
+       struct repository *repo;
+
        /* something like ".git/objects/pack/xxxxx.pack" */
        char pack_name[FLEX_ARRAY]; /* more */
 };
index 9560f0a33c6f26d0d14dfe81320f5a760cc585df..6058eddf3588950ba242414b1b73d97c864d77e7 100644 (file)
@@ -217,11 +217,12 @@ uint32_t get_pack_fanout(struct packed_git *p, uint32_t value)
        return ntohl(level1_ofs[value]);
 }
 
-static struct packed_git *alloc_packed_git(int extra)
+static struct packed_git *alloc_packed_git(struct repository *r, int extra)
 {
        struct packed_git *p = xmalloc(st_add(sizeof(*p), extra));
        memset(p, 0, sizeof(*p));
        p->pack_fd = -1;
+       p->repo = r;
        return p;
 }
 
@@ -233,11 +234,12 @@ static char *pack_path_from_idx(const char *idx_path)
        return xstrfmt("%.*s.pack", (int)len, idx_path);
 }
 
-struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path)
+struct packed_git *parse_pack_index(struct repository *r, unsigned char *sha1,
+                                   const char *idx_path)
 {
        char *path = pack_path_from_idx(idx_path);
        size_t alloc = st_add(strlen(path), 1);
-       struct packed_git *p = alloc_packed_git(alloc);
+       struct packed_git *p = alloc_packed_git(r, alloc);
 
        memcpy(p->pack_name, path, alloc); /* includes NUL */
        free(path);
@@ -703,7 +705,8 @@ void unuse_pack(struct pack_window **w_cursor)
        }
 }
 
-struct packed_git *add_packed_git(const char *path, size_t path_len, int local)
+struct packed_git *add_packed_git(struct repository *r, const char *path,
+                                 size_t path_len, int local)
 {
        struct stat st;
        size_t alloc;
@@ -721,7 +724,7 @@ struct packed_git *add_packed_git(const char *path, size_t path_len, int local)
         * the use xsnprintf double-checks that)
         */
        alloc = st_add3(path_len, strlen(".promisor"), 1);
-       p = alloc_packed_git(alloc);
+       p = alloc_packed_git(r, alloc);
        memcpy(p->pack_name, path, path_len);
 
        xsnprintf(p->pack_name + path_len, alloc - path_len, ".keep");
@@ -877,7 +880,7 @@ static void prepare_pack(const char *full_name, size_t full_name_len,
 
                /* Don't reopen a pack we already have. */
                if (!hashmap_get(&data->r->objects->pack_map, &hent, pack_name)) {
-                       p = add_packed_git(full_name, full_name_len, data->local);
+                       p = add_packed_git(data->r, full_name, full_name_len, data->local);
                        if (p)
                                install_packed_git(data->r, p);
                }
index 08f88a7ff521e9f66b1be44f279a76d1ee5331ec..aee69d1a0b63445ccabda91cba4fe3967ed98673 100644 (file)
@@ -46,7 +46,8 @@ const char *pack_basename(struct packed_git *p);
  * and does not add the resulting packed_git struct to the internal list of
  * packs. You probably want add_packed_git() instead.
  */
-struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path);
+struct packed_git *parse_pack_index(struct repository *r, unsigned char *sha1,
+                                   const char *idx_path);
 
 typedef void each_file_in_pack_dir_fn(const char *full_path, size_t full_path_len,
                                      const char *file_name, void *data);
@@ -113,7 +114,8 @@ void close_pack(struct packed_git *);
 void close_object_store(struct raw_object_store *o);
 void unuse_pack(struct pack_window **);
 void clear_delta_base_cache(void);
-struct packed_git *add_packed_git(const char *path, size_t path_len, int local);
+struct packed_git *add_packed_git(struct repository *r, const char *path,
+                                 size_t path_len, int local);
 
 /*
  * Unlink the .pack and associated extension files.