]> git.ipfire.org Git - thirdparty/git.git/commitdiff
object-file-convert: stop depending on `the_repository`
authorPatrick Steinhardt <ps@pks.im>
Mon, 10 Mar 2025 07:13:27 +0000 (08:13 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 10 Mar 2025 20:16:19 +0000 (13:16 -0700)
There are multiple sites in "object-file-convert.c" where we use the
global `the_repository` variable, either explicitly or implicitly by
using `the_hash_algo`. All of these callsites are transitively called
from `convert_object_file()`, which indeed has no repo as input.

Refactor the function so that it receives a repository as a parameter
and pass it through to all internal functions to get rid of the
dependency. Remove the `USE_THE_REPOSITORY_VARIABLE` define.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/tag.c
commit.c
object-file-convert.c
object-file-convert.h
object-file.c

index d3e0943b734759ae559a21889a7ff6bb40f65c92..7c173535cb320f517afe11e54d689cd52d064e7c 100644 (file)
@@ -172,7 +172,7 @@ static int do_sign(struct strbuf *buffer, struct object_id **compat_oid,
        if (compat) {
                const struct git_hash_algo *algo = the_repository->hash_algo;
 
-               if (convert_object_file(&compat_buf, algo, compat,
+               if (convert_object_file(the_repository ,&compat_buf, algo, compat,
                                        buffer->buf, buffer->len, OBJ_TAG, 1))
                        goto out;
                if (sign_buffer(&compat_buf, &compat_sig, keyid))
index 6efdb03997d9a0fd18e082f8500f4a8ca752ec6d..48aeefaad31709fdddeea988df315a4edf308abd 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -1380,7 +1380,7 @@ static int convert_commit_extra_headers(const struct commit_extra_header *orig,
                struct commit_extra_header *new;
                CALLOC_ARRAY(new, 1);
                if (!strcmp(orig->key, "mergetag")) {
-                       if (convert_object_file(&out, algo, compat,
+                       if (convert_object_file(the_repository, &out, algo, compat,
                                                orig->value, orig->len,
                                                OBJ_TAG, 1)) {
                                free(new);
index eba71955cf7b8821b9e6d0129c7542cf10c652a8..7ab875afe6cb3ac8fb505a6c25016528fdb29461 100644 (file)
@@ -1,4 +1,3 @@
-#define USE_THE_REPOSITORY_VARIABLE
 #define DISABLE_SIGN_COMPARE_WARNINGS
 
 #include "git-compat-util.h"
@@ -63,7 +62,8 @@ static int decode_tree_entry_raw(struct object_id *oid, const char **path,
        return 0;
 }
 
-static int convert_tree_object(struct strbuf *out,
+static int convert_tree_object(struct repository *repo,
+                              struct strbuf *out,
                               const struct git_hash_algo *from,
                               const struct git_hash_algo *to,
                               const char *buffer, size_t size)
@@ -78,7 +78,7 @@ static int convert_tree_object(struct strbuf *out,
                if (decode_tree_entry_raw(&entry_oid, &path, &pathlen, from, p,
                                          end - p))
                        return error(_("failed to decode tree entry"));
-               if (repo_oid_to_algop(the_repository, &entry_oid, to, &mapped_oid))
+               if (repo_oid_to_algop(repo, &entry_oid, to, &mapped_oid))
                        return error(_("failed to map tree entry for %s"), oid_to_hex(&entry_oid));
                strbuf_add(out, p, path - p);
                strbuf_add(out, path, pathlen);
@@ -88,7 +88,8 @@ static int convert_tree_object(struct strbuf *out,
        return 0;
 }
 
-static int convert_tag_object(struct strbuf *out,
+static int convert_tag_object(struct repository *repo,
+                             struct strbuf *out,
                              const struct git_hash_algo *from,
                              const struct git_hash_algo *to,
                              const char *buffer, size_t size)
@@ -105,7 +106,7 @@ static int convert_tag_object(struct strbuf *out,
                return error("bogus tag object");
        if (parse_oid_hex_algop(buffer + 7, &oid, &p, from) < 0)
                return error("bad tag object ID");
-       if (repo_oid_to_algop(the_repository, &oid, to, &mapped_oid))
+       if (repo_oid_to_algop(repo, &oid, to, &mapped_oid))
                return error("unable to map tree %s in tag object",
                             oid_to_hex(&oid));
        size -= ((p + 1) - buffer);
@@ -139,7 +140,8 @@ static int convert_tag_object(struct strbuf *out,
        return 0;
 }
 
-static int convert_commit_object(struct strbuf *out,
+static int convert_commit_object(struct repository *repo,
+                                struct strbuf *out,
                                 const struct git_hash_algo *from,
                                 const struct git_hash_algo *to,
                                 const char *buffer, size_t size)
@@ -165,7 +167,7 @@ static int convert_commit_object(struct strbuf *out,
                            (p != eol))
                                return error(_("bad %s in commit"), "tree");
 
-                       if (repo_oid_to_algop(the_repository, &oid, to, &mapped_oid))
+                       if (repo_oid_to_algop(repo, &oid, to, &mapped_oid))
                                return error(_("unable to map %s %s in commit object"),
                                             "tree", oid_to_hex(&oid));
                        strbuf_addf(out, "tree %s\n", oid_to_hex(&mapped_oid));
@@ -177,7 +179,7 @@ static int convert_commit_object(struct strbuf *out,
                            (p != eol))
                                return error(_("bad %s in commit"), "parent");
 
-                       if (repo_oid_to_algop(the_repository, &oid, to, &mapped_oid))
+                       if (repo_oid_to_algop(repo, &oid, to, &mapped_oid))
                                return error(_("unable to map %s %s in commit object"),
                                             "parent", oid_to_hex(&oid));
 
@@ -202,7 +204,7 @@ static int convert_commit_object(struct strbuf *out,
                        }
 
                        /* Compute the new tag object */
-                       if (convert_tag_object(&new_tag, from, to, tag.buf, tag.len)) {
+                       if (convert_tag_object(repo, &new_tag, from, to, tag.buf, tag.len)) {
                                strbuf_release(&tag);
                                strbuf_release(&new_tag);
                                return -1;
@@ -241,7 +243,8 @@ static int convert_commit_object(struct strbuf *out,
        return 0;
 }
 
-int convert_object_file(struct strbuf *outbuf,
+int convert_object_file(struct repository *repo,
+                       struct strbuf *outbuf,
                        const struct git_hash_algo *from,
                        const struct git_hash_algo *to,
                        const void *buf, size_t len,
@@ -256,13 +259,13 @@ int convert_object_file(struct strbuf *outbuf,
 
        switch (type) {
        case OBJ_COMMIT:
-               ret = convert_commit_object(outbuf, from, to, buf, len);
+               ret = convert_commit_object(repo, outbuf, from, to, buf, len);
                break;
        case OBJ_TREE:
-               ret = convert_tree_object(outbuf, from, to, buf, len);
+               ret = convert_tree_object(repo, outbuf, from, to, buf, len);
                break;
        case OBJ_TAG:
-               ret = convert_tag_object(outbuf, from, to, buf, len);
+               ret = convert_tag_object(repo, outbuf, from, to, buf, len);
                break;
        default:
                /* Not implemented yet, so fail. */
index a4f802aa8eeae4d48e22607c52806cf3fbb2e56f..9b3cc5e533dda52b70b9bc660a68d423df910b1f 100644 (file)
@@ -14,7 +14,8 @@ int repo_oid_to_algop(struct repository *repo, const struct object_id *src,
  * Convert an object file from one hash algorithm to another algorithm.
  * Return -1 on failure, 0 on success.
  */
-int convert_object_file(struct strbuf *outbuf,
+int convert_object_file(struct repository *repo,
+                       struct strbuf *outbuf,
                        const struct git_hash_algo *from,
                        const struct git_hash_algo *to,
                        const void *buf, size_t len,
index b3e0276b2a45e1e1298ee640513e969188c55930..b0e237a2acccc961aca80c95ef3171dfafd505f3 100644 (file)
@@ -1793,7 +1793,7 @@ static int oid_object_info_convert(struct repository *r,
                if (type == -1)
                        return -1;
                if (type != OBJ_BLOB) {
-                       ret = convert_object_file(&outbuf,
+                       ret = convert_object_file(the_repository, &outbuf,
                                                  the_hash_algo, input_algo,
                                                  content, size, type, !do_die);
                        free(content);
@@ -2510,7 +2510,7 @@ int write_object_file_flags(const void *buf, unsigned long len,
                        hash_object_file(compat, buf, len, type, &compat_oid);
                else {
                        struct strbuf converted = STRBUF_INIT;
-                       convert_object_file(&converted, algo, compat,
+                       convert_object_file(the_repository, &converted, algo, compat,
                                            buf, len, type, 0);
                        hash_object_file(compat, converted.buf, converted.len,
                                         type, &compat_oid);
@@ -2550,7 +2550,8 @@ int write_object_file_literally(const void *buf, unsigned long len,
                                         &compat_oid);
                else if (compat_type != -1) {
                        struct strbuf converted = STRBUF_INIT;
-                       convert_object_file(&converted, algo, compat,
+                       convert_object_file(the_repository,
+                                           &converted, algo, compat,
                                            buf, len, compat_type, 0);
                        hash_object_file(compat, converted.buf, converted.len,
                                         compat_type, &compat_oid);