diff options
Diffstat (limited to 'builtin/fsck.c')
| -rw-r--r-- | builtin/fsck.c | 52 | 
1 files changed, 43 insertions, 9 deletions
diff --git a/builtin/fsck.c b/builtin/fsck.c index b42b6fe21f..27b9e78094 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -593,18 +593,44 @@ static void get_default_heads(void)  	}  } +struct for_each_loose_cb +{ +	struct progress *progress; +	struct strbuf obj_type; +}; +  static int fsck_loose(const struct object_id *oid, const char *path, void *data)  { +	struct for_each_loose_cb *cb_data = data;  	struct object *obj; -	enum object_type type; +	enum object_type type = OBJ_NONE;  	unsigned long size; -	void *contents; +	void *contents = NULL;  	int eaten; +	struct object_info oi = OBJECT_INFO_INIT; +	struct object_id real_oid = *null_oid(); +	int err = 0; -	if (read_loose_object(path, oid, &type, &size, &contents) < 0) { +	strbuf_reset(&cb_data->obj_type); +	oi.type_name = &cb_data->obj_type; +	oi.sizep = &size; +	oi.typep = &type; + +	if (read_loose_object(path, oid, &real_oid, &contents, &oi) < 0) { +		if (contents && !oideq(&real_oid, oid)) +			err = error(_("%s: hash-path mismatch, found at: %s"), +				    oid_to_hex(&real_oid), path); +		else +			err = error(_("%s: object corrupt or missing: %s"), +				    oid_to_hex(oid), path); +	} +	if (type != OBJ_NONE && type < 0) +		err = error(_("%s: object is of unknown type '%s': %s"), +			    oid_to_hex(&real_oid), cb_data->obj_type.buf, +			    path); +	if (err < 0) {  		errors_found |= ERROR_OBJECT; -		error(_("%s: object corrupt or missing: %s"), -		      oid_to_hex(oid), path); +		free(contents);  		return 0; /* keep checking other objects */  	} @@ -640,8 +666,10 @@ static int fsck_cruft(const char *basename, const char *path, void *data)  	return 0;  } -static int fsck_subdir(unsigned int nr, const char *path, void *progress) +static int fsck_subdir(unsigned int nr, const char *path, void *data)  { +	struct for_each_loose_cb *cb_data = data; +	struct progress *progress = cb_data->progress;  	display_progress(progress, nr + 1);  	return 0;  } @@ -649,6 +677,10 @@ static int fsck_subdir(unsigned int nr, const char *path, void *progress)  static void fsck_object_dir(const char *path)  {  	struct progress *progress = NULL; +	struct for_each_loose_cb cb_data = { +		.obj_type = STRBUF_INIT, +		.progress = progress, +	};  	if (verbose)  		fprintf_ln(stderr, _("Checking object directory")); @@ -657,9 +689,10 @@ static void fsck_object_dir(const char *path)  		progress = start_progress(_("Checking object directories"), 256);  	for_each_loose_file_in_objdir(path, fsck_loose, fsck_cruft, fsck_subdir, -				      progress); +				      &cb_data);  	display_progress(progress, 256);  	stop_progress(&progress); +	strbuf_release(&cb_data.obj_type);  }  static int fsck_head_link(const char *head_ref_name, @@ -803,6 +836,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)  		fsck_enable_object_names(&fsck_walk_options);  	git_config(git_fsck_config, &fsck_obj_options); +	prepare_repo_settings(the_repository);  	if (connectivity_only) {  		for_each_loose_object(mark_loose_for_connectivity, NULL, 0); @@ -908,7 +942,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)  	check_connectivity(); -	if (!git_config_get_bool("core.commitgraph", &i) && i) { +	if (the_repository->settings.core_commit_graph) {  		struct child_process commit_graph_verify = CHILD_PROCESS_INIT;  		const char *verify_argv[] = { "commit-graph", "verify", NULL, NULL, NULL }; @@ -924,7 +958,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)  		}  	} -	if (!git_config_get_bool("core.multipackindex", &i) && i) { +	if (the_repository->settings.core_multi_pack_index) {  		struct child_process midx_verify = CHILD_PROCESS_INIT;  		const char *midx_argv[] = { "multi-pack-index", "verify", NULL, NULL, NULL };  | 
