]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pack-write: pass hash_algo to `write_idx_file()`
authorKarthik Nayak <karthik.188@gmail.com>
Sun, 19 Jan 2025 11:19:28 +0000 (12:19 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 21 Jan 2025 20:36:34 +0000 (12:36 -0800)
The `write_idx_file()` function uses the global `the_hash_algo` variable
to access the repository's hash_algo. To avoid global variable usage,
pass a hash_algo from the layers above.

Since `stage_tmp_packfiles()` also resides in 'pack-write.c' and calls
`write_idx_file()`, update it to accept a `struct git_hash_algo` as a
parameter and pass it through to the callee.

Altough the layers above could have access to the hash_algo internally,
simply pass in `the_hash_algo`. This avoids any compatibility issues and
bubbles up global variable usage to upper layers which can be eventually
resolved.

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
builtin/pack-objects.c
bulk-checkin.c
pack-write.c
pack.h

index 6baf2b1b71e2443a7987a41e0cd246076682bf58..c4bc52f93c011f34bd7f98c8e9d74a33cf9783bd 100644 (file)
@@ -798,8 +798,8 @@ static const char *create_index(void)
        if (c != last)
                die("internal consistency error creating the index");
 
-       tmpfile = write_idx_file(NULL, idx, object_count, &pack_idx_opts,
-                                pack_data->hash);
+       tmpfile = write_idx_file(the_hash_algo, NULL, idx, object_count,
+                                &pack_idx_opts, pack_data->hash);
        free(idx);
        return tmpfile;
 }
index cb9de5ca2c50670dd1224177d32a2ad811469930..a531d75d902a3e78e011e05a636bfe9c0694a238 100644 (file)
@@ -2093,7 +2093,8 @@ int cmd_index_pack(int argc,
        ALLOC_ARRAY(idx_objects, nr_objects);
        for (i = 0; i < nr_objects; i++)
                idx_objects[i] = &objects[i].idx;
-       curr_index = write_idx_file(index_name, idx_objects, nr_objects, &opts, pack_hash);
+       curr_index = write_idx_file(the_hash_algo, index_name, idx_objects,
+                                   nr_objects, &opts, pack_hash);
        if (rev_index)
                curr_rev_index = write_rev_file(rev_index_name, idx_objects,
                                                nr_objects, pack_hash,
index 6188e8205952492cb72f92bb2c80c1201c2f7acf..a6828002c255d875268672c869b5f2bd052f7f3f 100644 (file)
@@ -1368,9 +1368,10 @@ static void write_pack_file(void)
                        if (cruft)
                                pack_idx_opts.flags |= WRITE_MTIMES;
 
-                       stage_tmp_packfiles(&tmpname, pack_tmp_name,
-                                           written_list, nr_written,
-                                           &to_pack, &pack_idx_opts, hash,
+                       stage_tmp_packfiles(the_hash_algo, &tmpname,
+                                           pack_tmp_name, written_list,
+                                           nr_written, &to_pack,
+                                           &pack_idx_opts, hash,
                                            &idx_tmp_name);
 
                        if (write_bitmap_index) {
index e6595f8dc7d34b3e590fef2c088de26fb1e02832..e5c365613d564b12222873d9148adcceefc6aea4 100644 (file)
@@ -44,8 +44,9 @@ static void finish_tmp_packfile(struct strbuf *basename,
 {
        char *idx_tmp_name = NULL;
 
-       stage_tmp_packfiles(basename, pack_tmp_name, written_list, nr_written,
-                           NULL, pack_idx_opts, hash, &idx_tmp_name);
+       stage_tmp_packfiles(the_hash_algo, basename, pack_tmp_name,
+                           written_list, nr_written, NULL, pack_idx_opts, hash,
+                           &idx_tmp_name);
        rename_tmp_packfile_idx(basename, &idx_tmp_name);
 
        free(idx_tmp_name);
index 0cd75d2e55419362a61cf981fc11117ea7a1d88a..f344e78a9ec20cea9812a5eaffc72ae0b7e7424d 100644 (file)
@@ -56,7 +56,8 @@ static int need_large_offset(off_t offset, const struct pack_idx_option *opts)
  * The *sha1 contains the pack content SHA1 hash.
  * The objects array passed in will be sorted by SHA1 on exit.
  */
-const char *write_idx_file(const char *index_name, struct pack_idx_entry **objects,
+const char *write_idx_file(const struct git_hash_algo *hash_algo,
+                          const char *index_name, struct pack_idx_entry **objects,
                           int nr_objects, const struct pack_idx_option *opts,
                           const unsigned char *sha1)
 {
@@ -130,7 +131,7 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec
                struct pack_idx_entry *obj = *list++;
                if (index_version < 2)
                        hashwrite_be32(f, obj->offset);
-               hashwrite(f, obj->oid.hash, the_hash_algo->rawsz);
+               hashwrite(f, obj->oid.hash, hash_algo->rawsz);
                if ((opts->flags & WRITE_IDX_STRICT) &&
                    (i && oideq(&list[-2]->oid, &obj->oid)))
                        die("The same object %s appears twice in the pack",
@@ -172,7 +173,7 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec
                }
        }
 
-       hashwrite(f, sha1, the_hash_algo->rawsz);
+       hashwrite(f, sha1, hash_algo->rawsz);
        finalize_hashfile(f, NULL, FSYNC_COMPONENT_PACK_METADATA,
                          CSUM_HASH_IN_STREAM | CSUM_CLOSE |
                          ((opts->flags & WRITE_IDX_VERIFY) ? 0 : CSUM_FSYNC));
@@ -546,7 +547,8 @@ void rename_tmp_packfile_idx(struct strbuf *name_buffer,
        rename_tmp_packfile(name_buffer, *idx_tmp_name, "idx");
 }
 
-void stage_tmp_packfiles(struct strbuf *name_buffer,
+void stage_tmp_packfiles(const struct git_hash_algo *hash_algo,
+                        struct strbuf *name_buffer,
                         const char *pack_tmp_name,
                         struct pack_idx_entry **written_list,
                         uint32_t nr_written,
@@ -561,8 +563,8 @@ void stage_tmp_packfiles(struct strbuf *name_buffer,
        if (adjust_shared_perm(pack_tmp_name))
                die_errno("unable to make temporary pack file readable");
 
-       *idx_tmp_name = (char *)write_idx_file(NULL, written_list, nr_written,
-                                              pack_idx_opts, hash);
+       *idx_tmp_name = (char *)write_idx_file(hash_algo, NULL, written_list,
+                                              nr_written, pack_idx_opts, hash);
        if (adjust_shared_perm(*idx_tmp_name))
                die_errno("unable to make temporary index file readable");
 
diff --git a/pack.h b/pack.h
index 46d85e5bec787c90af69700fd4b328b1ebf1d606..c650fdbe2dcde8055ad0efe55646338cd0f81df5 100644 (file)
--- a/pack.h
+++ b/pack.h
@@ -86,7 +86,12 @@ struct progress;
 /* Note, the data argument could be NULL if object type is blob */
 typedef int (*verify_fn)(const struct object_id *, enum object_type, unsigned long, void*, int*);
 
-const char *write_idx_file(const char *index_name, struct pack_idx_entry **objects, int nr_objects, const struct pack_idx_option *, const unsigned char *sha1);
+const char *write_idx_file(const struct git_hash_algo *hash_algo,
+                          const char *index_name,
+                          struct pack_idx_entry **objects,
+                          int nr_objects,
+                          const struct pack_idx_option *,
+                          const unsigned char *sha1);
 int check_pack_crc(struct packed_git *p, struct pack_window **w_curs, off_t offset, off_t len, unsigned int nr);
 int verify_pack_index(struct packed_git *);
 int verify_pack(struct repository *, struct packed_git *, verify_fn fn, struct progress *, uint32_t);
@@ -119,7 +124,8 @@ int read_pack_header(int fd, struct pack_header *);
 struct packing_data;
 
 struct hashfile *create_tmp_packfile(char **pack_tmp_name);
-void stage_tmp_packfiles(struct strbuf *name_buffer,
+void stage_tmp_packfiles(const struct git_hash_algo *hash_algo,
+                        struct strbuf *name_buffer,
                         const char *pack_tmp_name,
                         struct pack_idx_entry **written_list,
                         uint32_t nr_written,