fsck: disallow demoting grave fsck errors to warnings

Some kinds of errors are intrinsically unrecoverable (e.g. errors while
uncompressing objects). It does not make sense to allow demoting them to
mere warnings.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Johannes Schindelin 2015-06-22 17:26:42 +02:00 committed by Junio C Hamano
parent 70a4ae73d8
commit f50c440730
2 changed files with 22 additions and 2 deletions

13
fsck.c
View File

@ -9,7 +9,12 @@
#include "refs.h"
#include "utf8.h"
#define FSCK_FATAL -1
#define FOREACH_MSG_ID(FUNC) \
/* fatal errors */ \
FUNC(NUL_IN_HEADER, FATAL) \
FUNC(UNTERMINATED_HEADER, FATAL) \
/* errors */ \
FUNC(BAD_DATE, ERROR) \
FUNC(BAD_DATE_OVERFLOW, ERROR) \
@ -39,11 +44,9 @@
FUNC(MISSING_TYPE, ERROR) \
FUNC(MISSING_TYPE_ENTRY, ERROR) \
FUNC(MULTIPLE_AUTHORS, ERROR) \
FUNC(NUL_IN_HEADER, ERROR) \
FUNC(TAG_OBJECT_NOT_TAG, ERROR) \
FUNC(TREE_NOT_SORTED, ERROR) \
FUNC(UNKNOWN_TYPE, ERROR) \
FUNC(UNTERMINATED_HEADER, ERROR) \
FUNC(ZERO_PADDED_DATE, ERROR) \
/* warnings */ \
FUNC(BAD_FILEMODE, WARN) \
@ -149,6 +152,9 @@ void fsck_set_msg_type(struct fsck_options *options,
die("Unhandled message id: %s", msg_id);
type = parse_msg_type(msg_type);
if (type != FSCK_ERROR && msg_id_info[id].msg_type == FSCK_FATAL)
die("Cannot demote %s to %s", msg_id, msg_type);
if (!options->msg_type) {
int i;
int *msg_type = xmalloc(sizeof(int) * FSCK_MSG_MAX);
@ -216,6 +222,9 @@ static int report(struct fsck_options *options, struct object *object,
struct strbuf sb = STRBUF_INIT;
int msg_type = fsck_msg_type(id, options), result;
if (msg_type == FSCK_FATAL)
msg_type = FSCK_ERROR;
append_msg_id(&sb, msg_id_info[id].id_string);
va_start(ap, fmt);

View File

@ -136,4 +136,15 @@ test_expect_success 'push with receive.fsck.missingEmail=warn' '
grep "missingEmail" act
'
test_expect_success \
'receive.fsck.unterminatedHeader=warn triggers error' '
rm -rf dst &&
git init dst &&
git --git-dir=dst/.git config receive.fsckobjects true &&
git --git-dir=dst/.git config \
receive.fsck.unterminatedheader warn &&
test_must_fail git push --porcelain dst HEAD >act 2>&1 &&
grep "Cannot demote unterminatedheader" act
'
test_done