fsck: provide a function to fsck buffer without object struct

The fsck code has been slowly moving away from requiring an object
struct in commits like 103fb6d43b (fsck: accept an oid instead of a
"struct tag" for fsck_tag(), 2019-10-18), c5b4269b57 (fsck: accept an
oid instead of a "struct commit" for fsck_commit(), 2019-10-18), etc.

However, the only external interface that fsck.c provides is
fsck_object(), which requires an object struct, then promptly discards
everything except its oid and type. Let's factor out the post-discard
part of that function as fsck_buffer(), leaving fsck_object() as a thin
wrapper around it. That will provide more flexibility for callers which
may not have a struct.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2023-01-18 15:43:53 -05:00 committed by Junio C Hamano
parent 34959d80db
commit 35ff327e2d
2 changed files with 25 additions and 10 deletions

27
fsck.c
View File

@ -1237,19 +1237,26 @@ int fsck_object(struct object *obj, void *data, unsigned long size,
if (!obj) if (!obj)
return report(options, NULL, OBJ_NONE, FSCK_MSG_BAD_OBJECT_SHA1, "no valid object to fsck"); return report(options, NULL, OBJ_NONE, FSCK_MSG_BAD_OBJECT_SHA1, "no valid object to fsck");
if (obj->type == OBJ_BLOB) return fsck_buffer(&obj->oid, obj->type, data, size, options);
return fsck_blob(&obj->oid, data, size, options); }
if (obj->type == OBJ_TREE)
return fsck_tree(&obj->oid, data, size, options);
if (obj->type == OBJ_COMMIT)
return fsck_commit(&obj->oid, data, size, options);
if (obj->type == OBJ_TAG)
return fsck_tag(&obj->oid, data, size, options);
return report(options, &obj->oid, obj->type, int fsck_buffer(const struct object_id *oid, enum object_type type,
void *data, unsigned long size,
struct fsck_options *options)
{
if (type == OBJ_BLOB)
return fsck_blob(oid, data, size, options);
if (type == OBJ_TREE)
return fsck_tree(oid, data, size, options);
if (type == OBJ_COMMIT)
return fsck_commit(oid, data, size, options);
if (type == OBJ_TAG)
return fsck_tag(oid, data, size, options);
return report(options, oid, type,
FSCK_MSG_UNKNOWN_TYPE, FSCK_MSG_UNKNOWN_TYPE,
"unknown type '%d' (internal fsck error)", "unknown type '%d' (internal fsck error)",
obj->type); type);
} }
int fsck_error_function(struct fsck_options *o, int fsck_error_function(struct fsck_options *o,

8
fsck.h
View File

@ -183,6 +183,14 @@ int fsck_walk(struct object *obj, void *data, struct fsck_options *options);
int fsck_object(struct object *obj, void *data, unsigned long size, int fsck_object(struct object *obj, void *data, unsigned long size,
struct fsck_options *options); struct fsck_options *options);
/*
* Same as fsck_object(), but for when the caller doesn't have an object
* struct.
*/
int fsck_buffer(const struct object_id *oid, enum object_type,
void *data, unsigned long size,
struct fsck_options *options);
/* /*
* fsck a tag, and pass info about it back to the caller. This is * fsck a tag, and pass info about it back to the caller. This is
* exposed fsck_object() internals for git-mktag(1). * exposed fsck_object() internals for git-mktag(1).