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,