@@ -1256,6 +1256,35 @@ int fsck_objects_error_function(struct fsck_options *o,
return 1;
}
+int fsck_refs_error_function(struct fsck_options *options UNUSED,
+ const struct object_id *oid,
+ enum object_type object_type UNUSED,
+ const char *ref_checkee,
+ const char *sub_ref_checkee,
+ enum fsck_msg_type msg_type,
+ enum fsck_msg_id msg_id UNUSED,
+ const char *message)
+{
+ struct strbuf sb = STRBUF_INIT;
+ int ret = 0;
+
+ if (sub_ref_checkee)
+ strbuf_addf(&sb, "%s.%s", ref_checkee, sub_ref_checkee);
+ else
+ strbuf_addstr(&sb, ref_checkee);
+
+ if (oid)
+ strbuf_addf(&sb, " -> (%s)", oid_to_hex(oid));
+
+ if (msg_type == FSCK_WARN)
+ warning("%s: %s", sb.buf, message);
+ else
+ ret = error("%s: %s", sb.buf, message);
+
+ strbuf_release(&sb);
+ return ret;
+}
+
static int fsck_blobs(struct oidset *blobs_found, struct oidset *blobs_done,
enum fsck_msg_id msg_missing, enum fsck_msg_id msg_type,
struct fsck_options *options, const char *blob_type)
@@ -136,6 +136,14 @@ int fsck_objects_error_cb_print_missing_gitmodules(struct fsck_options *o,
enum fsck_msg_type msg_type,
enum fsck_msg_id msg_id,
const char *message);
+int fsck_refs_error_function(struct fsck_options *options,
+ const struct object_id *oid,
+ enum object_type object_type,
+ const char *ref_checkee,
+ const char *sub_ref_checkee,
+ enum fsck_msg_type msg_type,
+ enum fsck_msg_id msg_id,
+ const char *message);
struct fsck_options {
fsck_walk_func walk;
@@ -174,6 +182,13 @@ struct fsck_options {
.gitattributes_done = OIDSET_INIT, \
.error_func = fsck_objects_error_cb_print_missing_gitmodules, \
}
+#define FSCK_REFS_OPTIONS_DEFAULT { \
+ .error_func = fsck_refs_error_function, \
+}
+#define FSCK_REFS_OPTIONS_STRICT { \
+ .strict = 1, \
+ .error_func = fsck_refs_error_function, \
+}
/* descend in all linked child objects
* the return value is:
Create refs-specific "error_func" callback "fsck_refs_error_function" which could provide the following report messages. 1. "ref_checkee": "fsck error name": "user message". 2. "ref_checkee.sub_ref_checkee": "fsck error name": "user message". 3. "ref_checkee -> (oid hex)": "fsck error name": "user message". 4. "ref_checkee.sub_ref_checkee -> (oid hex)": "fsck error name": "user message". "fsck_refs_error_function" uses the "ref_checkee" and "sub_ref_checkee" parameters to indicate the information of the checked refs. For loose ref and reflog, it only uses the "ref_checkee" parameter. For packed refs and reftable refs, when checking the consistency of the file itself, it still only uses "ref_checkee" parameter. However, when checking the consistency of the ref or reflog contained in the file, it will use "sub_ref_checkee" parameter to indicate that we are not checking the file but the incorporated ref or reflog. "fsck_refs_error_function" will use the "oid" parameter if the caller passes the oid, it will use "oid_to_hex" to get the corresponding hex value to report to the caller. Last, add "FSCK_REFS_OPTIONS_DEFAULT" and "FSCK_REFS_OPTIONS_STRICT" macros to create refs options easily. Mentored-by: Patrick Steinhardt <ps@pks.im> Mentored-by: Karthik Nayak <karthik.188@gmail.com> Signed-off-by: shejialuo <shejialuo@gmail.com> --- fsck.c | 29 +++++++++++++++++++++++++++++ fsck.h | 15 +++++++++++++++ 2 files changed, 44 insertions(+)