pack-write: pass hash_algo to `write_idx_file()`

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>

Karthik Nayak committed Jan 19, 2025 at 12:19 UTC 7653e9af9b9ddfc465df50203c78f5c8569d8c79
6 files changed +27 -16
builtin/fast-import.c
+2 -2
@@ -798,8 +798,8 @@ static const char *create_index(void)
798 if (c != last)
799 die("internal consistency error creating the index");
800
801 - tmpfile = write_idx_file(NULL, idx, object_count, &pack_idx_opts,
802 - pack_data->hash);
801 + tmpfile = write_idx_file(the_hash_algo, NULL, idx, object_count,
802 + &pack_idx_opts, pack_data->hash);
803 free(idx);
804 return tmpfile;
805 }
builtin/index-pack.c
+2 -1
@@ -2093,7 +2093,8 @@ int cmd_index_pack(int argc,
2093 ALLOC_ARRAY(idx_objects, nr_objects);
2094 for (i = 0; i < nr_objects; i++)
2095 idx_objects[i] = &objects[i].idx;
2096 - curr_index = write_idx_file(index_name, idx_objects, nr_objects, &opts, pack_hash);
2096 + curr_index = write_idx_file(the_hash_algo, index_name, idx_objects,
2097 + nr_objects, &opts, pack_hash);
2098 if (rev_index)
2099 curr_rev_index = write_rev_file(rev_index_name, idx_objects,
2100 nr_objects, pack_hash,
builtin/pack-objects.c
+4 -3
@@ -1368,9 +1368,10 @@ static void write_pack_file(void)
1368 if (cruft)
1369 pack_idx_opts.flags |= WRITE_MTIMES;
1370
1371 - stage_tmp_packfiles(&tmpname, pack_tmp_name,
1372 - written_list, nr_written,
1373 - &to_pack, &pack_idx_opts, hash,
1371 + stage_tmp_packfiles(the_hash_algo, &tmpname,
1372 + pack_tmp_name, written_list,
1373 + nr_written, &to_pack,
1374 + &pack_idx_opts, hash,
1375 &idx_tmp_name);
1376
1377 if (write_bitmap_index) {
bulk-checkin.c
+3 -2
@@ -44,8 +44,9 @@ static void finish_tmp_packfile(struct strbuf *basename,
44 {
45 char *idx_tmp_name = NULL;
46
47 - stage_tmp_packfiles(basename, pack_tmp_name, written_list, nr_written,
48 - NULL, pack_idx_opts, hash, &idx_tmp_name);
47 + stage_tmp_packfiles(the_hash_algo, basename, pack_tmp_name,
48 + written_list, nr_written, NULL, pack_idx_opts, hash,
49 + &idx_tmp_name);
50 rename_tmp_packfile_idx(basename, &idx_tmp_name);
51
52 free(idx_tmp_name);
pack-write.c
+8 -6
@@ -56,7 +56,8 @@ static int need_large_offset(off_t offset, const struct pack_idx_option *opts)
56 * The *sha1 contains the pack content SHA1 hash.
57 * The objects array passed in will be sorted by SHA1 on exit.
58 */
59 -const char *write_idx_file(const char *index_name, struct pack_idx_entry **objects,
59 +const char *write_idx_file(const struct git_hash_algo *hash_algo,
60 + const char *index_name, struct pack_idx_entry **objects,
61 int nr_objects, const struct pack_idx_option *opts,
62 const unsigned char *sha1)
63 {
@@ -130,7 +131,7 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec
131 struct pack_idx_entry *obj = *list++;
132 if (index_version < 2)
133 hashwrite_be32(f, obj->offset);
133 - hashwrite(f, obj->oid.hash, the_hash_algo->rawsz);
134 + hashwrite(f, obj->oid.hash, hash_algo->rawsz);
135 if ((opts->flags & WRITE_IDX_STRICT) &&
136 (i && oideq(&list[-2]->oid, &obj->oid)))
137 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
173 }
174 }
175
175 - hashwrite(f, sha1, the_hash_algo->rawsz);
176 + hashwrite(f, sha1, hash_algo->rawsz);
177 finalize_hashfile(f, NULL, FSYNC_COMPONENT_PACK_METADATA,
178 CSUM_HASH_IN_STREAM | CSUM_CLOSE |
179 ((opts->flags & WRITE_IDX_VERIFY) ? 0 : CSUM_FSYNC));
@@ -546,7 +547,8 @@ void rename_tmp_packfile_idx(struct strbuf *name_buffer,
547 rename_tmp_packfile(name_buffer, *idx_tmp_name, "idx");
548 }
549
549 -void stage_tmp_packfiles(struct strbuf *name_buffer,
550 +void stage_tmp_packfiles(const struct git_hash_algo *hash_algo,
551 + struct strbuf *name_buffer,
552 const char *pack_tmp_name,
553 struct pack_idx_entry **written_list,
554 uint32_t nr_written,
@@ -561,8 +563,8 @@ void stage_tmp_packfiles(struct strbuf *name_buffer,
563 if (adjust_shared_perm(pack_tmp_name))
564 die_errno("unable to make temporary pack file readable");
565
564 - *idx_tmp_name = (char *)write_idx_file(NULL, written_list, nr_written,
565 - pack_idx_opts, hash);
566 + *idx_tmp_name = (char *)write_idx_file(hash_algo, NULL, written_list,
567 + nr_written, pack_idx_opts, hash);
568 if (adjust_shared_perm(*idx_tmp_name))
569 die_errno("unable to make temporary index file readable");
570
pack.h
+8 -2
@@ -86,7 +86,12 @@ struct progress;
86 /* Note, the data argument could be NULL if object type is blob */
87 typedef int (*verify_fn)(const struct object_id *, enum object_type, unsigned long, void*, int*);
88
89 -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);
89 +const char *write_idx_file(const struct git_hash_algo *hash_algo,
90 + const char *index_name,
91 + struct pack_idx_entry **objects,
92 + int nr_objects,
93 + const struct pack_idx_option *,
94 + const unsigned char *sha1);
95 int check_pack_crc(struct packed_git *p, struct pack_window **w_curs, off_t offset, off_t len, unsigned int nr);
96 int verify_pack_index(struct packed_git *);
97 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 *);
124 struct packing_data;
125
126 struct hashfile *create_tmp_packfile(char **pack_tmp_name);
122 -void stage_tmp_packfiles(struct strbuf *name_buffer,
127 +void stage_tmp_packfiles(const struct git_hash_algo *hash_algo,
128 + struct strbuf *name_buffer,
129 const char *pack_tmp_name,
130 struct pack_idx_entry **written_list,
131 uint32_t nr_written,