Merge branch 'rs/tag-wo-the-repository'

Code clean-up.

* rs/tag-wo-the-repository:
  tag: stop using the_repository
  tag: support arbitrary repositories in parse_tag()
  tag: support arbitrary repositories in gpg_verify_tag()
  tag: use algo of repo parameter in parse_tag_buffer()
This commit is contained in:
Junio C Hamano 2026-01-08 16:40:11 +09:00
commit d28d2be5f2
10 changed files with 26 additions and 25 deletions

View File

@ -112,13 +112,13 @@ static int replace_name(struct commit_name *e,
if (!e->tag) { if (!e->tag) {
t = lookup_tag(the_repository, &e->oid); t = lookup_tag(the_repository, &e->oid);
if (!t || parse_tag(t)) if (!t || parse_tag(the_repository, t))
return 1; return 1;
e->tag = t; e->tag = t;
} }
t = lookup_tag(the_repository, oid); t = lookup_tag(the_repository, oid);
if (!t || parse_tag(t)) if (!t || parse_tag(the_repository, t))
return 0; return 0;
*tag = t; *tag = t;
@ -335,7 +335,7 @@ static void append_name(struct commit_name *n, struct strbuf *dst)
{ {
if (n->prio == 2 && !n->tag) { if (n->prio == 2 && !n->tag) {
n->tag = lookup_tag(the_repository, &n->oid); n->tag = lookup_tag(the_repository, &n->oid);
if (!n->tag || parse_tag(n->tag)) if (!n->tag || parse_tag(the_repository, n->tag))
die(_("annotated tag %s not available"), n->path); die(_("annotated tag %s not available"), n->path);
} }
if (n->tag && !n->name_checked) { if (n->tag && !n->name_checked) {

View File

@ -3293,7 +3293,7 @@ static void add_tag_chain(const struct object_id *oid)
tag = lookup_tag(the_repository, oid); tag = lookup_tag(the_repository, oid);
while (1) { while (1) {
if (!tag || parse_tag(tag) || !tag->tagged) if (!tag || parse_tag(the_repository, tag) || !tag->tagged)
die(_("unable to pack objects reachable from tag %s"), die(_("unable to pack objects reachable from tag %s"),
oid_to_hex(oid)); oid_to_hex(oid));

View File

@ -149,7 +149,7 @@ static int verify_tag(const char *name, const char *ref UNUSED,
if (format->format) if (format->format)
flags = GPG_VERIFY_OMIT_STATUS; flags = GPG_VERIFY_OMIT_STATUS;
if (gpg_verify_tag(oid, name, flags)) if (gpg_verify_tag(the_repository, oid, name, flags))
return -1; return -1;
if (format->format) if (format->format)

View File

@ -61,7 +61,7 @@ int cmd_verify_tag(int argc,
continue; continue;
} }
if (gpg_verify_tag(&oid, name, flags)) { if (gpg_verify_tag(repo, &oid, name, flags)) {
had_error = 1; had_error = 1;
continue; continue;
} }

2
fsck.c
View File

@ -474,7 +474,7 @@ static int fsck_walk_tag(struct tag *tag, void *data, struct fsck_options *optio
{ {
const char *name = fsck_get_object_name(options, &tag->object.oid); const char *name = fsck_get_object_name(options, &tag->object.oid);
if (parse_tag(tag)) if (parse_tag(the_repository, tag))
return -1; return -1;
if (name) if (name)
fsck_put_object_name(options, &tag->tagged->oid, "%s", name); fsck_put_object_name(options, &tag->tagged->oid, "%s", name);

View File

@ -449,7 +449,7 @@ static int show_ambiguous_object(const struct object_id *oid, void *data)
} else if (type == OBJ_TAG) { } else if (type == OBJ_TAG) {
struct tag *tag = lookup_tag(ds->repo, oid); struct tag *tag = lookup_tag(ds->repo, oid);
if (!parse_tag(tag) && tag->tag) { if (!parse_tag(ds->repo, tag) && tag->tag) {
/* /*
* TRANSLATORS: This is a line of ambiguous * TRANSLATORS: This is a line of ambiguous
* tag object output. E.g.: * tag object output. E.g.:

View File

@ -2866,7 +2866,7 @@ static int match_points_at(struct oid_array *points_at,
while (obj && obj->type == OBJ_TAG) { while (obj && obj->type == OBJ_TAG) {
struct tag *tag = (struct tag *)obj; struct tag *tag = (struct tag *)obj;
if (parse_tag(tag) < 0) { if (parse_tag(the_repository, tag) < 0) {
obj = NULL; obj = NULL;
break; break;
} }

27
tag.c
View File

@ -1,4 +1,3 @@
#define USE_THE_REPOSITORY_VARIABLE
#define DISABLE_SIGN_COMPARE_WARNINGS #define DISABLE_SIGN_COMPARE_WARNINGS
#include "git-compat-util.h" #include "git-compat-util.h"
@ -13,6 +12,7 @@
#include "gpg-interface.h" #include "gpg-interface.h"
#include "hex.h" #include "hex.h"
#include "packfile.h" #include "packfile.h"
#include "repository.h"
const char *tag_type = "tag"; const char *tag_type = "tag";
@ -44,28 +44,28 @@ static int run_gpg_verify(const char *buf, unsigned long size, unsigned flags)
return ret; return ret;
} }
int gpg_verify_tag(const struct object_id *oid, const char *name_to_report, int gpg_verify_tag(struct repository *r, const struct object_id *oid,
unsigned flags) const char *name_to_report, unsigned flags)
{ {
enum object_type type; enum object_type type;
char *buf; char *buf;
unsigned long size; unsigned long size;
int ret; int ret;
type = odb_read_object_info(the_repository->objects, oid, NULL); type = odb_read_object_info(r->objects, oid, NULL);
if (type != OBJ_TAG) if (type != OBJ_TAG)
return error("%s: cannot verify a non-tag object of type %s.", return error("%s: cannot verify a non-tag object of type %s.",
name_to_report ? name_to_report ?
name_to_report : name_to_report :
repo_find_unique_abbrev(the_repository, oid, DEFAULT_ABBREV), oid_to_hex(oid),
type_name(type)); type_name(type));
buf = odb_read_object(the_repository->objects, oid, &type, &size); buf = odb_read_object(r->objects, oid, &type, &size);
if (!buf) if (!buf)
return error("%s: unable to read file.", return error("%s: unable to read file.",
name_to_report ? name_to_report ?
name_to_report : name_to_report :
repo_find_unique_abbrev(the_repository, oid, DEFAULT_ABBREV)); oid_to_hex(oid));
ret = run_gpg_verify(buf, size, flags); ret = run_gpg_verify(buf, size, flags);
@ -148,9 +148,11 @@ int parse_tag_buffer(struct repository *r, struct tag *item, const void *data, u
FREE_AND_NULL(item->tag); FREE_AND_NULL(item->tag);
} }
if (size < the_hash_algo->hexsz + 24) if (size < r->hash_algo->hexsz + 24)
return -1; return -1;
if (memcmp("object ", bufptr, 7) || parse_oid_hex(bufptr + 7, &oid, &bufptr) || *bufptr++ != '\n') if (memcmp("object ", bufptr, 7) ||
parse_oid_hex_algop(bufptr + 7, &oid, &bufptr, r->hash_algo) ||
*bufptr++ != '\n')
return -1; return -1;
if (!starts_with(bufptr, "type ")) if (!starts_with(bufptr, "type "))
@ -201,7 +203,7 @@ int parse_tag_buffer(struct repository *r, struct tag *item, const void *data, u
return 0; return 0;
} }
int parse_tag(struct tag *item) int parse_tag(struct repository *r, struct tag *item)
{ {
enum object_type type; enum object_type type;
void *data; void *data;
@ -210,8 +212,7 @@ int parse_tag(struct tag *item)
if (item->object.parsed) if (item->object.parsed)
return 0; return 0;
data = odb_read_object(the_repository->objects, &item->object.oid, data = odb_read_object(r->objects, &item->object.oid, &type, &size);
&type, &size);
if (!data) if (!data)
return error("Could not read %s", return error("Could not read %s",
oid_to_hex(&item->object.oid)); oid_to_hex(&item->object.oid));
@ -220,7 +221,7 @@ int parse_tag(struct tag *item)
return error("Object %s not a tag", return error("Object %s not a tag",
oid_to_hex(&item->object.oid)); oid_to_hex(&item->object.oid));
} }
ret = parse_tag_buffer(the_repository, item, data, size); ret = parse_tag_buffer(r, item, data, size);
free(data); free(data);
return ret; return ret;
} }

4
tag.h
View File

@ -13,10 +13,10 @@ struct tag {
}; };
struct tag *lookup_tag(struct repository *r, const struct object_id *oid); struct tag *lookup_tag(struct repository *r, const struct object_id *oid);
int parse_tag_buffer(struct repository *r, struct tag *item, const void *data, unsigned long size); int parse_tag_buffer(struct repository *r, struct tag *item, const void *data, unsigned long size);
int parse_tag(struct tag *item); int parse_tag(struct repository *r, struct tag *item);
void release_tag_memory(struct tag *t); void release_tag_memory(struct tag *t);
struct object *deref_tag(struct repository *r, struct object *, const char *, int); struct object *deref_tag(struct repository *r, struct object *, const char *, int);
int gpg_verify_tag(const struct object_id *oid, int gpg_verify_tag(struct repository *r, const struct object_id *oid,
const char *name_to_report, unsigned flags); const char *name_to_report, unsigned flags);
struct object_id *get_tagged_oid(struct tag *tag); struct object_id *get_tagged_oid(struct tag *tag);

View File

@ -115,7 +115,7 @@ static int process_commit(struct walker *walker, struct commit *commit)
static int process_tag(struct walker *walker, struct tag *tag) static int process_tag(struct walker *walker, struct tag *tag)
{ {
if (parse_tag(tag)) if (parse_tag(the_repository, tag))
return -1; return -1;
return process(walker, tag->tagged); return process(walker, tag->tagged);
} }