static int connectivity_only;
static int check_strict;
static int keep_cache_objects;
-static struct fsck_options fsck_walk_options = FSCK_OPTIONS_DEFAULT;
-static struct fsck_options fsck_obj_options = FSCK_OPTIONS_DEFAULT;
+static struct fsck_options fsck_walk_options;
+static struct fsck_options fsck_obj_options;
static int errors_found;
static int write_lost_and_found;
static int verbose;
struct object_info *oi UNUSED,
void *data UNUSED)
{
- struct fsck_options options = FSCK_OPTIONS_DEFAULT;
+ struct fsck_options options;
struct object *obj = lookup_object(the_repository, oid);
if (!obj || !(obj->flags & HAS_OBJ))
object_as_type(obj, type, 0);
}
+ fsck_options_init(&options, FSCK_OPTIONS_DEFAULT);
options.walk = mark_used;
fsck_walk(obj, NULL, &options);
if (obj->type == OBJ_TREE)
argc = parse_options(argc, argv, prefix, fsck_opts, fsck_usage, 0);
+ fsck_options_init(&fsck_walk_options, FSCK_OPTIONS_DEFAULT);
fsck_walk_options.walk = mark_object;
+
+ fsck_options_init(&fsck_obj_options, FSCK_OPTIONS_DEFAULT);
fsck_obj_options.walk = mark_used;
fsck_obj_options.error_func = fsck_objects_error_func;
if (check_strict)
static int from_stdin;
static int strict;
static int do_fsck_object;
-static struct fsck_options fsck_options = FSCK_OPTIONS_MISSING_GITMODULES;
+static struct fsck_options fsck_options;
static int verbose;
static const char *progress_title;
static int show_resolving_progress;
show_usage_if_asked(argc, argv, index_pack_usage);
disable_replace_refs();
+
+ fsck_options_init(&fsck_options, FSCK_OPTIONS_MISSING_GITMODULES);
fsck_options.walk = mark_link;
reset_pack_idx_option(&opts);
};
static int option_strict = 1;
-static struct fsck_options fsck_options = FSCK_OPTIONS_STRICT;
+static struct fsck_options fsck_options;
static int mktag_fsck_error_func(struct fsck_options *o UNUSED,
void *fsck_report UNUSED,
if (strbuf_read(&buf, 0, 0) < 0)
die_errno(_("could not read from stdin"));
+ fsck_options_init(&fsck_options, FSCK_OPTIONS_STRICT);
fsck_options.error_func = mktag_fsck_error_func;
fsck_set_msg_type_from_ids(&fsck_options, FSCK_MSG_EXTRA_HEADER_ENTRY,
FSCK_WARN);
static int cmd_refs_verify(int argc, const char **argv, const char *prefix,
struct repository *repo UNUSED)
{
- struct fsck_options fsck_refs_options = FSCK_REFS_OPTIONS_DEFAULT;
+ struct fsck_options fsck_refs_options;
struct worktree **worktrees;
const char * const verify_usage[] = {
REFS_VERIFY_USAGE,
};
int ret = 0;
+ fsck_options_init(&fsck_refs_options, FSCK_OPTIONS_REFS);
+
argc = parse_options(argc, argv, prefix, options, verify_usage, 0);
if (argc)
usage(_("'git refs verify' takes no arguments"));
static off_t consumed_bytes;
static off_t max_input_size;
static struct git_hash_ctx ctx;
-static struct fsck_options fsck_options = FSCK_OPTIONS_STRICT;
+static struct fsck_options fsck_options;
static struct progress *progress;
/*
show_usage_if_asked(argc, argv, unpack_usage);
+ fsck_options_init(&fsck_options, FSCK_OPTIONS_STRICT);
+
for (i = 1 ; i < argc; i++) {
const char *arg = argv[i];
struct shallow_info *si,
struct string_list *pack_lockfiles)
{
- struct fsck_options fsck_options = FSCK_OPTIONS_MISSING_GITMODULES;
+ struct fsck_options fsck_options = { 0 };
struct repository *r = the_repository;
struct ref *ref = copy_ref_list(orig_ref);
struct object_id oid;
alternate_shallow_file = setup_temporary_shallow(si->shallow);
} else
alternate_shallow_file = NULL;
+
+ fsck_options_init(&fsck_options, FSCK_OPTIONS_MISSING_GITMODULES);
if (get_pack(args, fd, pack_lockfiles, NULL, sought, nr_sought,
&fsck_options.gitmodules_found))
die(_("git fetch-pack: fetch failed."));
struct string_list *pack_lockfiles)
{
struct repository *r = the_repository;
- struct fsck_options fsck_options = FSCK_OPTIONS_MISSING_GITMODULES;
+ struct fsck_options fsck_options;
struct ref *ref = copy_ref_list(orig_ref);
enum fetch_state state = FETCH_CHECK_LOCAL;
struct oidset common = OIDSET_INIT;
struct strvec index_pack_args = STRVEC_INIT;
const char *promisor_remote_config;
+ fsck_options_init(&fsck_options, FSCK_OPTIONS_MISSING_GITMODULES);
+
if (server_feature_v2("promisor-remote", &promisor_remote_config))
promisor_remote_reply(promisor_remote_config, NULL);
!oidset_equal(&options->gitattributes_found, &options->gitattributes_done);
}
+void fsck_options_init(struct fsck_options *options,
+ enum fsck_options_type type)
+{
+ static const struct fsck_options defaults[] = {
+ [FSCK_OPTIONS_DEFAULT] = {
+ .skip_oids = OIDSET_INIT,
+ .gitmodules_found = OIDSET_INIT,
+ .gitmodules_done = OIDSET_INIT,
+ .gitattributes_found = OIDSET_INIT,
+ .gitattributes_done = OIDSET_INIT,
+ .error_func = fsck_objects_error_function
+ },
+ [FSCK_OPTIONS_STRICT] = {
+ .strict = 1,
+ .gitmodules_found = OIDSET_INIT,
+ .gitmodules_done = OIDSET_INIT,
+ .gitattributes_found = OIDSET_INIT,
+ .gitattributes_done = OIDSET_INIT,
+ .error_func = fsck_objects_error_function,
+ },
+ [FSCK_OPTIONS_MISSING_GITMODULES] = {
+ .strict = 1,
+ .gitmodules_found = OIDSET_INIT,
+ .gitmodules_done = OIDSET_INIT,
+ .gitattributes_found = OIDSET_INIT,
+ .gitattributes_done = OIDSET_INIT,
+ .error_func = fsck_objects_error_cb_print_missing_gitmodules,
+ },
+ [FSCK_OPTIONS_REFS] = {
+ .error_func = fsck_refs_error_function,
+ },
+ };
+
+ switch (type) {
+ case FSCK_OPTIONS_DEFAULT:
+ case FSCK_OPTIONS_STRICT:
+ case FSCK_OPTIONS_MISSING_GITMODULES:
+ case FSCK_OPTIONS_REFS:
+ memcpy(options, &defaults[type], sizeof(*options));
+ break;
+ default:
+ BUG("unknown fsck options type %d", type);
+ }
+}
+
void fsck_options_clear(struct fsck_options *options)
{
free(options->msg_type);
kh_oid_map_t *object_names;
};
-#define FSCK_OPTIONS_DEFAULT { \
- .skip_oids = OIDSET_INIT, \
- .gitmodules_found = OIDSET_INIT, \
- .gitmodules_done = OIDSET_INIT, \
- .gitattributes_found = OIDSET_INIT, \
- .gitattributes_done = OIDSET_INIT, \
- .error_func = fsck_objects_error_function \
-}
-#define FSCK_OPTIONS_STRICT { \
- .strict = 1, \
- .gitmodules_found = OIDSET_INIT, \
- .gitmodules_done = OIDSET_INIT, \
- .gitattributes_found = OIDSET_INIT, \
- .gitattributes_done = OIDSET_INIT, \
- .error_func = fsck_objects_error_function, \
-}
-#define FSCK_OPTIONS_MISSING_GITMODULES { \
- .strict = 1, \
- .gitmodules_found = OIDSET_INIT, \
- .gitmodules_done = OIDSET_INIT, \
- .gitattributes_found = OIDSET_INIT, \
- .gitattributes_done = OIDSET_INIT, \
- .error_func = fsck_objects_error_cb_print_missing_gitmodules, \
-}
-#define FSCK_REFS_OPTIONS_DEFAULT { \
- .error_func = fsck_refs_error_function, \
-}
-
/* descend in all linked child objects
* the return value is:
* -1 error in processing the object
*/
bool fsck_has_queued_checks(struct fsck_options *options);
+enum fsck_options_type {
+ FSCK_OPTIONS_DEFAULT,
+ FSCK_OPTIONS_STRICT,
+ FSCK_OPTIONS_MISSING_GITMODULES,
+ FSCK_OPTIONS_REFS,
+};
+
+void fsck_options_init(struct fsck_options *options,
+ enum fsck_options_type type);
+
/*
* Clear the fsck_options struct, freeing any allocated memory.
*/
}
}
if (flags & INDEX_FORMAT_CHECK) {
- struct fsck_options opts = FSCK_OPTIONS_DEFAULT;
+ struct fsck_options opts;
+ fsck_options_init(&opts, FSCK_OPTIONS_DEFAULT);
opts.strict = 1;
opts.error_func = hash_format_check_report;
if (fsck_buffer(null_oid(istate->repo->hash_algo), type, buf, size, &opts))