odb: rename read_object_with_reference()

Rename `read_object_with_reference()` to `odb_read_object_peeled()` to
match other functions related to the object database and our modern
coding guidelines. Furthermore though, the old name didn't really
describe very well what this function actually does, which is to walk
down any commit and tag objects until an object of the required type has
been found. This is generally referred to as "peeling", so the new name
should be way more descriptive.

No compatibility wrapper is introduced as the function is not used a lot
throughout our codebase.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt
2025-07-01 14:22:29 +02:00
committed by Junio C Hamano
parent 08218b8cd4
commit 841a03b404
8 changed files with 37 additions and 45 deletions

View File

@@ -4301,11 +4301,11 @@ Now, for the meat:
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
case 0: case 0:
buf = read_object_with_reference(sha1, argv[1], &size, NULL); buf = odb_read_object_peeled(r->objects, sha1, argv[1], &size, NULL);
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
This is how you read a blob (actually, not only a blob, but any type of This is how you read a blob (actually, not only a blob, but any type of
object). To know how the function `read_object_with_reference()` actually object). To know how the function `odb_read_object_peeled()` actually
works, find the source code for it (something like `git grep works, find the source code for it (something like `git grep
read_object_with | grep ":[a-z]"` in the Git repository), and read read_object_with | grep ":[a-z]"` in the Git repository), and read
the source. the source.

View File

@@ -246,8 +246,8 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name)
* fall-back to the usual case. * fall-back to the usual case.
*/ */
} }
buf = read_object_with_reference(the_repository, &oid, buf = odb_read_object_peeled(the_repository->objects, &oid,
exp_type_id, &size, NULL); exp_type_id, &size, NULL);
if (use_mailmap) { if (use_mailmap) {
size_t s = size; size_t s = size;

View File

@@ -2535,10 +2535,9 @@ static void note_change_n(const char *p, struct branch *b, unsigned char *old_fa
oidcpy(&commit_oid, &commit_oe->idx.oid); oidcpy(&commit_oid, &commit_oe->idx.oid);
} else if (!repo_get_oid(the_repository, p, &commit_oid)) { } else if (!repo_get_oid(the_repository, p, &commit_oid)) {
unsigned long size; unsigned long size;
char *buf = read_object_with_reference(the_repository, char *buf = odb_read_object_peeled(the_repository->objects,
&commit_oid, &commit_oid, OBJ_COMMIT, &size,
OBJ_COMMIT, &size, &commit_oid);
&commit_oid);
if (!buf || size < the_hash_algo->hexsz + 6) if (!buf || size < the_hash_algo->hexsz + 6)
die("Not a valid commit: %s", p); die("Not a valid commit: %s", p);
free(buf); free(buf);
@@ -2604,9 +2603,8 @@ static void parse_from_existing(struct branch *b)
unsigned long size; unsigned long size;
char *buf; char *buf;
buf = read_object_with_reference(the_repository, buf = odb_read_object_peeled(the_repository->objects, &b->oid,
&b->oid, OBJ_COMMIT, &size, OBJ_COMMIT, &size, &b->oid);
&b->oid);
parse_from_commit(b, buf, size); parse_from_commit(b, buf, size);
free(buf); free(buf);
} }
@@ -2699,10 +2697,9 @@ static struct hash_list *parse_merge(unsigned int *count)
oidcpy(&n->oid, &oe->idx.oid); oidcpy(&n->oid, &oe->idx.oid);
} else if (!repo_get_oid(the_repository, from, &n->oid)) { } else if (!repo_get_oid(the_repository, from, &n->oid)) {
unsigned long size; unsigned long size;
char *buf = read_object_with_reference(the_repository, char *buf = odb_read_object_peeled(the_repository->objects,
&n->oid, &n->oid, OBJ_COMMIT,
OBJ_COMMIT, &size, &n->oid);
&size, &n->oid);
if (!buf || size < the_hash_algo->hexsz + 6) if (!buf || size < the_hash_algo->hexsz + 6)
die("Not a valid commit: %s", from); die("Not a valid commit: %s", from);
free(buf); free(buf);

View File

@@ -522,9 +522,7 @@ static int grep_submodule(struct grep_opt *opt,
obj_read_lock(); obj_read_lock();
object_type = odb_read_object_info(subrepo->objects, oid, NULL); object_type = odb_read_object_info(subrepo->objects, oid, NULL);
obj_read_unlock(); obj_read_unlock();
data = read_object_with_reference(subrepo, data = odb_read_object_peeled(subrepo->objects, oid, OBJ_TREE, &size, NULL);
oid, OBJ_TREE,
&size, NULL);
if (!data) if (!data)
die(_("unable to read tree (%s)"), oid_to_hex(oid)); die(_("unable to read tree (%s)"), oid_to_hex(oid));
@@ -705,9 +703,8 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec,
struct strbuf base; struct strbuf base;
int hit, len; int hit, len;
data = read_object_with_reference(opt->repo, data = odb_read_object_peeled(opt->repo->objects, &obj->oid,
&obj->oid, OBJ_TREE, OBJ_TREE, &size, NULL);
&size, NULL);
if (!data) if (!data)
die(_("unable to read tree (%s)"), oid_to_hex(&obj->oid)); die(_("unable to read tree (%s)"), oid_to_hex(&obj->oid));

View File

@@ -2055,8 +2055,8 @@ static void add_preferred_base(struct object_id *oid)
if (window <= num_preferred_base++) if (window <= num_preferred_base++)
return; return;
data = read_object_with_reference(the_repository, oid, data = odb_read_object_peeled(the_repository->objects, oid,
OBJ_TREE, &size, &tree_oid); OBJ_TREE, &size, &tree_oid);
if (!data) if (!data)
return; return;

17
odb.c
View File

@@ -905,11 +905,11 @@ void *odb_read_object(struct object_database *odb,
return data; return data;
} }
void *read_object_with_reference(struct repository *r, void *odb_read_object_peeled(struct object_database *odb,
const struct object_id *oid, const struct object_id *oid,
enum object_type required_type, enum object_type required_type,
unsigned long *size, unsigned long *size,
struct object_id *actual_oid_return) struct object_id *actual_oid_return)
{ {
enum object_type type; enum object_type type;
void *buffer; void *buffer;
@@ -921,7 +921,7 @@ void *read_object_with_reference(struct repository *r,
int ref_length = -1; int ref_length = -1;
const char *ref_type = NULL; const char *ref_type = NULL;
buffer = odb_read_object(r->objects, &actual_oid, &type, &isize); buffer = odb_read_object(odb, &actual_oid, &type, &isize);
if (!buffer) if (!buffer)
return NULL; return NULL;
if (type == required_type) { if (type == required_type) {
@@ -941,9 +941,10 @@ void *read_object_with_reference(struct repository *r,
} }
ref_length = strlen(ref_type); ref_length = strlen(ref_type);
if (ref_length + r->hash_algo->hexsz > isize || if (ref_length + odb->repo->hash_algo->hexsz > isize ||
memcmp(buffer, ref_type, ref_length) || memcmp(buffer, ref_type, ref_length) ||
get_oid_hex_algop((char *) buffer + ref_length, &actual_oid, r->hash_algo)) { get_oid_hex_algop((char *) buffer + ref_length, &actual_oid,
odb->repo->hash_algo)) {
free(buffer); free(buffer);
return NULL; return NULL;
} }

15
odb.h
View File

@@ -274,6 +274,12 @@ void *odb_read_object(struct object_database *odb,
enum object_type *type, enum object_type *type,
unsigned long *size); unsigned long *size);
void *odb_read_object_peeled(struct object_database *odb,
const struct object_id *oid,
enum object_type required_type,
unsigned long *size,
struct object_id *oid_ret);
/* /*
* Add an object file to the in-memory object store, without writing it * Add an object file to the in-memory object store, without writing it
* to disk. * to disk.
@@ -382,7 +388,7 @@ void odb_assert_oid_type(struct object_database *odb,
/* /*
* Enabling the object read lock allows multiple threads to safely call the * Enabling the object read lock allows multiple threads to safely call the
* following functions in parallel: odb_read_object(), * following functions in parallel: odb_read_object(),
* read_object_with_reference(), odb_read_object_info() and odb(). * odb_read_object_peeled(), odb_read_object_info() and odb().
* *
* obj_read_lock() and obj_read_unlock() may also be used to protect other * obj_read_lock() and obj_read_unlock() may also be used to protect other
* section which cannot execute in parallel with object reading. Since the used * section which cannot execute in parallel with object reading. Since the used
@@ -431,13 +437,6 @@ enum for_each_object_flags {
FOR_EACH_OBJECT_SKIP_ON_DISK_KEPT_PACKS = (1<<4), FOR_EACH_OBJECT_SKIP_ON_DISK_KEPT_PACKS = (1<<4),
}; };
void *read_object_with_reference(struct repository *r,
const struct object_id *oid,
enum object_type required_type,
unsigned long *size,
struct object_id *oid_ret);
/* Compatibility wrappers, to be removed once Git 2.51 has been released. */ /* Compatibility wrappers, to be removed once Git 2.51 has been released. */
#include "repository.h" #include "repository.h"

View File

@@ -90,7 +90,7 @@ void *fill_tree_descriptor(struct repository *r,
void *buf = NULL; void *buf = NULL;
if (oid) { if (oid) {
buf = read_object_with_reference(r, oid, OBJ_TREE, &size, NULL); buf = odb_read_object_peeled(r->objects, oid, OBJ_TREE, &size, NULL);
if (!buf) if (!buf)
die(_("unable to read tree (%s)"), oid_to_hex(oid)); die(_("unable to read tree (%s)"), oid_to_hex(oid));
} }
@@ -611,7 +611,7 @@ int get_tree_entry(struct repository *r,
unsigned long size; unsigned long size;
struct object_id root; struct object_id root;
tree = read_object_with_reference(r, tree_oid, OBJ_TREE, &size, &root); tree = odb_read_object_peeled(r->objects, tree_oid, OBJ_TREE, &size, &root);
if (!tree) if (!tree)
return -1; return -1;
@@ -681,10 +681,8 @@ enum get_oid_result get_tree_entry_follow_symlinks(struct repository *r,
void *tree; void *tree;
struct object_id root; struct object_id root;
unsigned long size; unsigned long size;
tree = read_object_with_reference(r, tree = odb_read_object_peeled(r->objects, &current_tree_oid,
&current_tree_oid, OBJ_TREE, &size, &root);
OBJ_TREE, &size,
&root);
if (!tree) if (!tree)
goto done; goto done;