git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v4 02/19] fsck: Introduce identifiers for fsck messages

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Jan 31, 2015, 21:04 UTC
Message-ID
<50f28536d4f68766fb293cd07d2ca655c380e7db.1422737997.git.johannes.schindelin@gmx.de>
In-Reply-To
<cover.1422737997.git.johannes.schindelin@gmx.de>

Instead of specifying whether a message by the fsck machinery constitutes an error or a warning, let's specify an identifier relating to the concrete problem that was encountered. This is necessary for upcoming support to be able to demote certain errors to warnings.

In the process, simplify the requirements on the calling code: instead of having to handle full-blown varargs in every callback, we now send a string buffer ready to be used by the callback.

We could use a simple enum for the message IDs here, but we want to guarantee that the enum values are associated with the appropriate severity levels. Besides, we want to introduce a parser in the next commit that maps the string representation to the enum value, hence we use the slightly ugly preprocessor construct that is extensible for use with said parser.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 builtin/fsck.c |  24 ++-----
 fsck.c         | 201 +++++++++++++++++++++++++++++++++++++++++----------------
 fsck.h         |   5 +-
 3 files changed, 153 insertions(+), 77 deletions(-)
diff --git a/builtin/fsck.c b/builtin/fsck.c
index 0d03c15..1f7944c 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -47,32 +47,22 @@ static int show_dangling = 1;
 #endif
 
 static void objreport(struct object *obj, const char *severity,
-                      const char *err, va_list params)
+                      const char *err)
 {
-	fprintf(stderr, "%s in %s %s: ",
-	        severity, typename(obj->type), sha1_to_hex(obj->sha1));
-	vfprintf(stderr, err, params);
-	fputs("\n", stderr);
+	fprintf(stderr, "%s in %s %s: %s\n",
+	        severity, typename(obj->type), sha1_to_hex(obj->sha1), err);
 }
 
-__attribute__((format (printf, 2, 3)))
-static int objerror(struct object *obj, const char *err, ...)
+static int objerror(struct object *obj, const char *err)
 {
-	va_list params;
-	va_start(params, err);
 	errors_found |= ERROR_OBJECT;
-	objreport(obj, "error", err, params);
-	va_end(params);
+	objreport(obj, "error", err);
 	return -1;
 }
 
-__attribute__((format (printf, 3, 4)))
-static int fsck_error_func(struct object *obj, int type, const char *err, ...)
+static int fsck_error_func(struct object *obj, int type, const char *message)
 {
-	va_list params;
-	va_start(params, err);
-	objreport(obj, (type == FSCK_WARN) ? "warning" : "error", err, params);
-	va_end(params);
+	objreport(obj, (type == FSCK_WARN) ? "warning" : "error", message);
 	return (type == FSCK_WARN) ? 0 : 1;
 }
 
diff --git a/fsck.c b/fsck.c
index d83b811..30f7a48 100644
--- a/fsck.c
+++ b/fsck.c
@@ -9,6 +9,98 @@
 #include "refs.h"
 #include "utf8.h"
 
+#define FOREACH_MSG_ID(FUNC) \
+	/* errors */ \
+	FUNC(BAD_DATE, ERROR) \
+	FUNC(BAD_EMAIL, ERROR) \
+	FUNC(BAD_NAME, ERROR) \
+	FUNC(BAD_PARENT_SHA1, ERROR) \
+	FUNC(BAD_TIMEZONE, ERROR) \
+	FUNC(BAD_TREE_SHA1, ERROR) \
+	FUNC(DATE_OVERFLOW, ERROR) \
+	FUNC(DUPLICATE_ENTRIES, ERROR) \
+	FUNC(INVALID_OBJECT_SHA1, ERROR) \
+	FUNC(INVALID_TAG_OBJECT, ERROR) \
+	FUNC(INVALID_TREE, ERROR) \
+	FUNC(INVALID_TYPE, ERROR) \
+	FUNC(MISSING_AUTHOR, ERROR) \
+	FUNC(MISSING_COMMITTER, ERROR) \
+	FUNC(MISSING_EMAIL, ERROR) \
+	FUNC(MISSING_GRAFT, ERROR) \
+	FUNC(MISSING_NAME_BEFORE_EMAIL, ERROR) \
+	FUNC(MISSING_OBJECT, ERROR) \
+	FUNC(MISSING_PARENT, ERROR) \
+	FUNC(MISSING_SPACE_BEFORE_DATE, ERROR) \
+	FUNC(MISSING_SPACE_BEFORE_EMAIL, ERROR) \
+	FUNC(MISSING_TAG, ERROR) \
+	FUNC(MISSING_TAG_ENTRY, ERROR) \
+	FUNC(MISSING_TAG_OBJECT, ERROR) \
+	FUNC(MISSING_TREE, ERROR) \
+	FUNC(MISSING_TYPE, ERROR) \
+	FUNC(MISSING_TYPE_ENTRY, ERROR) \
+	FUNC(NOT_SORTED, ERROR) \
+	FUNC(NUL_IN_HEADER, ERROR) \
+	FUNC(TAG_OBJECT_NOT_TAG, ERROR) \
+	FUNC(UNKNOWN_TYPE, ERROR) \
+	FUNC(UNTERMINATED_HEADER, ERROR) \
+	FUNC(ZERO_PADDED_DATE, ERROR) \
+	/* warnings */ \
+	FUNC(BAD_FILEMODE, WARN) \
+	FUNC(EMPTY_NAME, WARN) \
+	FUNC(FULL_PATHNAME, WARN) \
+	FUNC(HAS_DOT, WARN) \
+	FUNC(HAS_DOTDOT, WARN) \
+	FUNC(HAS_DOTGIT, WARN) \
+	FUNC(INVALID_TAG_NAME, WARN) \
+	FUNC(MISSING_TAGGER_ENTRY, WARN) \
+	FUNC(NULL_SHA1, WARN) \
+	FUNC(ZERO_PADDED_FILEMODE, WARN)
+
+#define MSG_ID(id, severity) FSCK_MSG_##id,
+enum fsck_msg_id {
+	FOREACH_MSG_ID(MSG_ID)
+	FSCK_MSG_MAX
+};
+#undef MSG_ID
+
+#define MSG_ID(id, severity) { FSCK_##severity },
+static struct {
+	int severity;
+} msg_id_info[FSCK_MSG_MAX + 1] = {
+	FOREACH_MSG_ID(MSG_ID)
+	{ -1 }
+};
+#undef MSG_ID
+
+static int fsck_msg_severity(enum fsck_msg_id msg_id,
+	struct fsck_options *options)
+{
+	int severity;
+
+	severity = msg_id_info[msg_id].severity;
+	if (options->strict && severity == FSCK_WARN)
+		severity = FSCK_ERROR;
+
+	return severity;
+}
+
+__attribute__((format (printf, 4, 5)))
+static int report(struct fsck_options *options, struct object *object,
+	enum fsck_msg_id id, const char *fmt, ...)
+{
+	va_list ap;
+	struct strbuf sb = STRBUF_INIT;
+	int msg_severity = fsck_msg_severity(id, options), result;
+
+	va_start(ap, fmt);
+	strbuf_vaddf(&sb, fmt, ap);
+	result = options->error_func(object, msg_severity, sb.buf);
+	strbuf_release(&sb);
+	va_end(ap);
+
+	return result;
+}
+
 static int fsck_walk_tree(struct tree *tree, void *data, struct fsck_options *options)
 {
 	struct tree_desc desc;
@@ -219,25 +311,25 @@ static int fsck_tree(struct tree *item, struct fsck_options *options)
 
 	retval = 0;
 	if (has_null_sha1)
-		retval += options->error_func(&item->object, FSCK_WARN, "contains entries pointing to null sha1");
+		retval += report(options, &item->object, FSCK_MSG_NULL_SHA1, "contains entries pointing to null sha1");
 	if (has_full_path)
-		retval += options->error_func(&item->object, FSCK_WARN, "contains full pathnames");
+		retval += report(options, &item->object, FSCK_MSG_FULL_PATHNAME, "contains full pathnames");
 	if (has_empty_name)
-		retval += options->error_func(&item->object, FSCK_WARN, "contains empty pathname");
+		retval += report(options, &item->object, FSCK_MSG_EMPTY_NAME, "contains empty pathname");
 	if (has_dot)
-		retval += options->error_func(&item->object, FSCK_WARN, "contains '.'");
+		retval += report(options, &item->object, FSCK_MSG_HAS_DOT, "contains '.'");
 	if (has_dotdot)
-		retval += options->error_func(&item->object, FSCK_WARN, "contains '..'");
+		retval += report(options, &item->object, FSCK_MSG_HAS_DOTDOT, "contains '..'");
 	if (has_dotgit)
-		retval += options->error_func(&item->object, FSCK_WARN, "contains '.git'");
+		retval += report(options, &item->object, FSCK_MSG_HAS_DOTGIT, "contains '.git'");
 	if (has_zero_pad)
-		retval += options->error_func(&item->object, FSCK_WARN, "contains zero-padded file modes");
+		retval += report(options, &item->object, FSCK_MSG_ZERO_PADDED_FILEMODE, "contains zero-padded file modes");
 	if (has_bad_modes)
-		retval += options->error_func(&item->object, FSCK_WARN, "contains bad file modes");
+		retval += report(options, &item->object, FSCK_MSG_BAD_FILEMODE, "contains bad file modes");
 	if (has_dup_entries)
-		retval += options->error_func(&item->object, FSCK_ERROR, "contains duplicate file entries");
+		retval += report(options, &item->object, FSCK_MSG_DUPLICATE_ENTRIES, "contains duplicate file entries");
 	if (not_properly_sorted)
-		retval += options->error_func(&item->object, FSCK_ERROR, "not properly sorted");
+		retval += report(options, &item->object, FSCK_MSG_NOT_SORTED, "not properly sorted");
 	return retval;
 }
 
@@ -250,15 +342,17 @@ static int require_end_of_header(const void *data, unsigned long size,
 	for (i = 0; i < size; i++) {
 		switch (buffer[i]) {
 		case '\0':
-			return options->error_func(obj, FSCK_ERROR,
-				"unterminated header: NUL at offset %d", i);
+			return report(options, obj,
+				FSCK_MSG_NUL_IN_HEADER,
+				"unterminated header: NUL at offset %ld", i);
 		case '\n':
 			if (i + 1 < size && buffer[i + 1] == '\n')
 				return 0;
 		}
 	}
 
-	return options->error_func(obj, FSCK_ERROR, "unterminated header");
+	return report(options, obj,
+		FSCK_MSG_UNTERMINATED_HEADER, "unterminated header");
 }
 
 static int fsck_ident(const char **ident, struct object *obj, struct fsck_options *options)
@@ -266,28 +360,28 @@ static int fsck_ident(const char **ident, struct object *obj, struct fsck_option
 	char *end;
 
 	if (**ident == '<')
-		return options->error_func(obj, FSCK_ERROR, "invalid author/committer line - missing space before email");
+		return report(options, obj, FSCK_MSG_MISSING_NAME_BEFORE_EMAIL, "invalid author/committer line - missing space before email");
 	*ident += strcspn(*ident, "<>\n");
 	if (**ident == '>')
-		return options->error_func(obj, FSCK_ERROR, "invalid author/committer line - bad name");
+		return report(options, obj, FSCK_MSG_BAD_NAME, "invalid author/committer line - bad name");
 	if (**ident != '<')
-		return options->error_func(obj, FSCK_ERROR, "invalid author/committer line - missing email");
+		return report(options, obj, FSCK_MSG_MISSING_EMAIL, "invalid author/committer line - missing email");
 	if ((*ident)[-1] != ' ')
-		return options->error_func(obj, FSCK_ERROR, "invalid author/committer line - missing space before email");
+		return report(options, obj, FSCK_MSG_MISSING_SPACE_BEFORE_EMAIL, "invalid author/committer line - missing space before email");
 	(*ident)++;
 	*ident += strcspn(*ident, "<>\n");
 	if (**ident != '>')
-		return options->error_func(obj, FSCK_ERROR, "invalid author/committer line - bad email");
+		return report(options, obj, FSCK_MSG_BAD_EMAIL, "invalid author/committer line - bad email");
 	(*ident)++;
 	if (**ident != ' ')
-		return options->error_func(obj, FSCK_ERROR, "invalid author/committer line - missing space before date");
+		return report(options, obj, FSCK_MSG_MISSING_SPACE_BEFORE_DATE, "invalid author/committer line - missing space before date");
 	(*ident)++;
 	if (**ident == '0' && (*ident)[1] != ' ')
-		return options->error_func(obj, FSCK_ERROR, "invalid author/committer line - zero-padded date");
+		return report(options, obj, FSCK_MSG_ZERO_PADDED_DATE, "invalid author/committer line - zero-padded date");
 	if (date_overflows(strtoul(*ident, &end, 10)))
-		return options->error_func(obj, FSCK_ERROR, "invalid author/committer line - date causes integer overflow");
+		return report(options, obj, FSCK_MSG_DATE_OVERFLOW, "invalid author/committer line - date causes integer overflow");
 	if (end == *ident || *end != ' ')
-		return options->error_func(obj, FSCK_ERROR, "invalid author/committer line - bad date");
+		return report(options, obj, FSCK_MSG_BAD_DATE, "invalid author/committer line - bad date");
 	*ident = end + 1;
 	if ((**ident != '+' && **ident != '-') ||
 	    !isdigit((*ident)[1]) ||
@@ -295,7 +389,7 @@ static int fsck_ident(const char **ident, struct object *obj, struct fsck_option
 	    !isdigit((*ident)[3]) ||
 	    !isdigit((*ident)[4]) ||
 	    ((*ident)[5] != '\n'))
-		return options->error_func(obj, FSCK_ERROR, "invalid author/committer line - bad time zone");
+		return report(options, obj, FSCK_MSG_BAD_TIMEZONE, "invalid author/committer line - bad time zone");
 	(*ident) += 6;
 	return 0;
 }
@@ -312,13 +406,13 @@ static int fsck_commit_buffer(struct commit *commit, const char *buffer,
 		return -1;
 
 	if (!skip_prefix(buffer, "tree ", &buffer))
-		return options->error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'tree' line");
+		return report(options, &commit->object, FSCK_MSG_MISSING_TREE, "invalid format - expected 'tree' line");
 	if (get_sha1_hex(buffer, tree_sha1) || buffer[40] != '\n')
-		return options->error_func(&commit->object, FSCK_ERROR, "invalid 'tree' line format - bad sha1");
+		return report(options, &commit->object, FSCK_MSG_BAD_TREE_SHA1, "invalid 'tree' line format - bad sha1");
 	buffer += 41;
 	while (skip_prefix(buffer, "parent ", &buffer)) {
 		if (get_sha1_hex(buffer, sha1) || buffer[40] != '\n')
-			return options->error_func(&commit->object, FSCK_ERROR, "invalid 'parent' line format - bad sha1");
+			return report(options, &commit->object, FSCK_MSG_BAD_PARENT_SHA1, "invalid 'parent' line format - bad sha1");
 		buffer += 41;
 		parent_line_count++;
 	}
@@ -328,23 +422,23 @@ static int fsck_commit_buffer(struct commit *commit, const char *buffer,
 		if (graft->nr_parent == -1 && !parent_count)
 			; /* shallow commit */
 		else if (graft->nr_parent != parent_count)
-			return options->error_func(&commit->object, FSCK_ERROR, "graft objects missing");
+			return report(options, &commit->object, FSCK_MSG_MISSING_GRAFT, "graft objects missing");
 	} else {
 		if (parent_count != parent_line_count)
-			return options->error_func(&commit->object, FSCK_ERROR, "parent objects missing");
+			return report(options, &commit->object, FSCK_MSG_MISSING_PARENT, "parent objects missing");
 	}
 	if (!skip_prefix(buffer, "author ", &buffer))
-		return options->error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'author' line");
+		return report(options, &commit->object, FSCK_MSG_MISSING_AUTHOR, "invalid format - expected 'author' line");
 	err = fsck_ident(&buffer, &commit->object, options);
 	if (err)
 		return err;
 	if (!skip_prefix(buffer, "committer ", &buffer))
-		return options->error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'committer' line");
+		return report(options, &commit->object, FSCK_MSG_MISSING_COMMITTER, "invalid format - expected 'committer' line");
 	err = fsck_ident(&buffer, &commit->object, options);
 	if (err)
 		return err;
 	if (!commit->tree)
-		return options->error_func(&commit->object, FSCK_ERROR, "could not load commit's tree %s", sha1_to_hex(tree_sha1));
+		return report(options, &commit->object, FSCK_MSG_INVALID_TREE, "could not load commit's tree %s", sha1_to_hex(tree_sha1));
 
 	return 0;
 }
@@ -376,11 +470,13 @@ static int fsck_tag_buffer(struct tag *tag, const char *data,
 		buffer = to_free =
 			read_sha1_file(tag->object.sha1, &type, &size);
 		if (!buffer)
-			return options->error_func(&tag->object, FSCK_ERROR,
+			return report(options, &tag->object,
+				FSCK_MSG_MISSING_TAG_OBJECT,
 				"cannot read tag object");
 
 		if (type != OBJ_TAG) {
-			ret = options->error_func(&tag->object, FSCK_ERROR,
+			ret = report(options, &tag->object,
+				FSCK_MSG_TAG_OBJECT_NOT_TAG,
 				"expected tag got %s",
 			    typename(type));
 			goto done;
@@ -391,48 +487,49 @@ static int fsck_tag_buffer(struct tag *tag, const char *data,
 		goto done;
 
 	if (!skip_prefix(buffer, "object ", &buffer)) {
-		ret = options->error_func(&tag->object, FSCK_ERROR, "invalid format - expected 'object' line");
+		ret = report(options, &tag->object, FSCK_MSG_MISSING_OBJECT, "invalid format - expected 'object' line");
 		goto done;
 	}
 	if (get_sha1_hex(buffer, sha1) || buffer[40] != '\n') {
-		ret = options->error_func(&tag->object, FSCK_ERROR, "invalid 'object' line format - bad sha1");
+		ret = report(options, &tag->object, FSCK_MSG_INVALID_OBJECT_SHA1, "invalid 'object' line format - bad sha1");
 		goto done;
 	}
 	buffer += 41;
 
 	if (!skip_prefix(buffer, "type ", &buffer)) {
-		ret = options->error_func(&tag->object, FSCK_ERROR, "invalid format - expected 'type' line");
+		ret = report(options, &tag->object, FSCK_MSG_MISSING_TYPE_ENTRY, "invalid format - expected 'type' line");
 		goto done;
 	}
 	eol = strchr(buffer, '\n');
 	if (!eol) {
-		ret = options->error_func(&tag->object, FSCK_ERROR, "invalid format - unexpected end after 'type' line");
+		ret = report(options, &tag->object, FSCK_MSG_MISSING_TYPE, "invalid format - unexpected end after 'type' line");
 		goto done;
 	}
 	if (type_from_string_gently(buffer, eol - buffer, 1) < 0)
-		ret = options->error_func(&tag->object, FSCK_ERROR, "invalid 'type' value");
+		ret = report(options, &tag->object, FSCK_MSG_INVALID_TYPE, "invalid 'type' value");
 	if (ret)
 		goto done;
 	buffer = eol + 1;
 
 	if (!skip_prefix(buffer, "tag ", &buffer)) {
-		ret = options->error_func(&tag->object, FSCK_ERROR, "invalid format - expected 'tag' line");
+		ret = report(options, &tag->object, FSCK_MSG_MISSING_TAG_ENTRY, "invalid format - expected 'tag' line");
 		goto done;
 	}
 	eol = strchr(buffer, '\n');
 	if (!eol) {
-		ret = options->error_func(&tag->object, FSCK_ERROR, "invalid format - unexpected end after 'type' line");
+		ret = report(options, &tag->object, FSCK_MSG_MISSING_TAG, "invalid format - unexpected end after 'type' line");
 		goto done;
 	}
 	strbuf_addf(&sb, "refs/tags/%.*s", (int)(eol - buffer), buffer);
 	if (check_refname_format(sb.buf, 0))
-		options->error_func(&tag->object, FSCK_WARN, "invalid 'tag' name: %.*s",
+		report(options, &tag->object, FSCK_MSG_INVALID_TAG_NAME,
+			   "invalid 'tag' name: %.*s",
 			   (int)(eol - buffer), buffer);
 	buffer = eol + 1;
 
 	if (!skip_prefix(buffer, "tagger ", &buffer))
 		/* early tags do not contain 'tagger' lines; warn only */
-		options->error_func(&tag->object, FSCK_WARN, "invalid format - expected 'tagger' line");
+		report(options, &tag->object, FSCK_MSG_MISSING_TAGGER_ENTRY, "invalid format - expected 'tagger' line");
 	else
 		ret = fsck_ident(&buffer, &tag->object, options);
 
@@ -448,7 +545,7 @@ static int fsck_tag(struct tag *tag, const char *data,
 	struct object *tagged = tag->tagged;
 
 	if (!tagged)
-		return options->error_func(&tag->object, FSCK_ERROR, "could not load tagged object");
+		return report(options, &tag->object, FSCK_MSG_INVALID_TAG_OBJECT, "could not load tagged object");
 
 	return fsck_tag_buffer(tag, data, size, options);
 }
@@ -457,7 +554,7 @@ int fsck_object(struct object *obj, void *data, unsigned long size,
 	struct fsck_options *options)
 {
 	if (!obj)
-		return options->error_func(obj, FSCK_ERROR, "no valid object to fsck");
+		return report(options, obj, FSCK_MSG_INVALID_OBJECT_SHA1, "no valid object to fsck");
 
 	if (obj->type == OBJ_BLOB)
 		return 0;
@@ -470,22 +567,12 @@ int fsck_object(struct object *obj, void *data, unsigned long size,
 		return fsck_tag((struct tag *) obj, (const char *) data,
 			size, options);
 
-	return options->error_func(obj, FSCK_ERROR, "unknown type '%d' (internal fsck error)",
+	return report(options, obj, FSCK_MSG_UNKNOWN_TYPE, "unknown type '%d' (internal fsck error)",
 			  obj->type);
 }
 
-int fsck_error_function(struct object *obj, int type, const char *fmt, ...)
+int fsck_error_function(struct object *obj, int severity, const char *message)
 {
-	va_list ap;
-	struct strbuf sb = STRBUF_INIT;
-
-	strbuf_addf(&sb, "object %s:", sha1_to_hex(obj->sha1));
-
-	va_start(ap, fmt);
-	strbuf_vaddf(&sb, fmt, ap);
-	va_end(ap);
-
-	error("%s", sb.buf);
-	strbuf_release(&sb);
+	error("object %s: %s", sha1_to_hex(obj->sha1), message);
 	return 1;
 }
diff --git a/fsck.h b/fsck.h
index 07d0ab2..f6f268a 100644
--- a/fsck.h
+++ b/fsck.h
@@ -17,10 +17,9 @@ struct fsck_options;
 typedef int (*fsck_walk_func)(struct object *obj, int type, void *data, struct fsck_options *options);
 
 /* callback for fsck_object, type is FSCK_ERROR or FSCK_WARN */
-typedef int (*fsck_error)(struct object *obj, int type, const char *err, ...);
+typedef int (*fsck_error)(struct object *obj, int type, const char *message);
 
-__attribute__((format (printf, 3, 4)))
-int fsck_error_function(struct object *obj, int type, const char *fmt, ...);
+int fsck_error_function(struct object *obj, int type, const char *message);
 
 struct fsck_options {
 	fsck_walk_func walk;
-- 
2.2.0.33.gc18b867
Previous: Johannes SchindelinNext: Johannes Schindelin
Message 132 of 275 in “Introduce an internal API to interact with the fsck machinery”
  1. 00/18 Introduce an internal API to interact with the fsck machineryJohannes Schindelin, Dec 8, 2014
  2. 01/18 Introduce fsck optionsJohannes Schindelin, Dec 8, 2014
  3. Junio C HamanoDec 10, 2014
  4. Johannes SchindelinDec 22, 2014
  5. Junio C HamanoDec 22, 2014
  6. 02/18 Introduce identifiers for fsck messagesJohannes Schindelin, Dec 8, 2014
  7. 03/18 Provide a function to parse fsck message IDsJohannes Schindelin, Dec 8, 2014
  8. Junio C HamanoDec 10, 2014
  9. Johannes SchindelinDec 22, 2014
  10. 04/18 Offer a function to demote fsck errors to warningsJohannes Schindelin, Dec 8, 2014
  11. Junio C HamanoDec 10, 2014
  12. Johannes SchindelinDec 22, 2014
  13. Junio C HamanoDec 22, 2014
  14. Johannes SchindelinDec 22, 2014
  15. Junio C HamanoDec 22, 2014
  16. Johannes SchindelinDec 22, 2014
  17. Junio C HamanoDec 22, 2014
  18. Johannes SchindelinDec 23, 2014
  19. Junio C HamanoDec 23, 2014
  20. Johannes SchindelinDec 23, 2014
  21. Junio C HamanoDec 23, 2014
  22. Johannes SchindelinDec 23, 2014
  23. Junio C HamanoDec 23, 2014
  24. Johannes SchindelinDec 23, 2014
  25. 05/18 Allow demoting errors to warnings via receive.fsck.<key> = warnJohannes Schindelin, Dec 8, 2014
  26. Junio C HamanoDec 10, 2014
  27. Johannes SchindelinDec 22, 2014
  28. 06/18 fsck: report the ID of the error/warningJohannes Schindelin, Dec 8, 2014
  29. 07/18 Make fsck_ident() warn-friendlyJohannes Schindelin, Dec 8, 2014
  30. 08/18 Make fsck_commit() warn-friendlyJohannes Schindelin, Dec 8, 2014
  31. 09/18 fsck: handle multiple authors in commits speciallyJohannes Schindelin, Dec 8, 2014
  32. Junio C HamanoDec 10, 2014
  33. Johannes SchindelinDec 22, 2014
  34. 10/18 Make fsck_tag() warn-friendlyJohannes Schindelin, Dec 8, 2014
  35. 11/18 Add a simple test for receive.fsck.*Johannes Schindelin, Dec 8, 2014
  36. 12/18 Disallow demoting grave fsck errors to warningsJohannes Schindelin, Dec 8, 2014
  37. Junio C HamanoDec 10, 2014
  38. Johannes SchindelinDec 22, 2014
  39. 13/18 Optionally ignore specific fsck issues completelyJohannes Schindelin, Dec 8, 2014
  40. Junio C HamanoDec 10, 2014
  41. 14/18 fsck: allow upgrading fsck warnings to errorsJohannes Schindelin, Dec 8, 2014
  42. Junio C HamanoDec 10, 2014
  43. Johannes SchindelinDec 22, 2014
  44. Junio C HamanoDec 22, 2014
  45. Johannes SchindelinDec 22, 2014
  46. 15/18 Document the new receive.fsck.* options.Johannes Schindelin, Dec 8, 2014
  47. 16/18 fsck: support demoting errors to warningsJohannes Schindelin, Dec 8, 2014
  48. Junio C HamanoDec 10, 2014
  49. Johannes SchindelinDec 22, 2014
  50. Junio C HamanoDec 22, 2014
  51. Johannes SchindelinDec 22, 2014
  52. Junio C HamanoDec 22, 2014
  53. Johannes SchindelinDec 22, 2014
  54. Junio C HamanoDec 22, 2014
  55. Johannes SchindelinDec 23, 2014
  56. Junio C HamanoDec 23, 2014
  57. Johannes SchindelinDec 23, 2014
  58. Junio C HamanoDec 23, 2014
  59. Johannes SchindelinDec 23, 2014
  60. Junio C HamanoDec 23, 2014
  61. Johannes SchindelinDec 23, 2014
  62. Junio C HamanoDec 23, 2014
  63. Johannes SchindelinDec 23, 2014
  64. Junio C HamanoDec 23, 2014
  65. Johannes SchindelinDec 23, 2014
  66. Junio C HamanoDec 23, 2014
  67. Michael HaggertyJan 22, 2015
  68. Johannes SchindelinJan 22, 2015
  69. Johannes SchindelinJan 31, 2015
  70. Junio C HamanoDec 23, 2014
  71. 17/18 Introduce `git fsck --quick`Johannes Schindelin, Dec 8, 2014
  72. 18/18 git receive-pack: support excluding objects from fsck'ingJohannes Schindelin, Dec 8, 2014
  73. Junio C HamanoDec 10, 2014
  74. Johannes SchindelinDec 22, 2014
  75. Junio C HamanoDec 10, 2014
  76. 00/18 Introduce an internal API to interact with the fsck machineryJohannes Schindelin, Jan 19, 2015
  77. 01/18 fsck: Introduce fsck optionsJohannes Schindelin, Jan 19, 2015
  78. 02/18 fsck: Introduce identifiers for fsck messagesJohannes Schindelin, Jan 19, 2015
  79. 03/18 fsck: Provide a function to parse fsck message IDsJohannes Schindelin, Jan 19, 2015
  80. 04/18 fsck: Offer a function to demote fsck errors to warningsJohannes Schindelin, Jan 19, 2015
  81. Junio C HamanoJan 21, 2015
  82. Johannes SchindelinJan 21, 2015
  83. 05/18 fsck: Allow demoting errors to warnings via receive.fsck.warn = <key>Johannes Schindelin, Jan 19, 2015
  84. Junio C HamanoJan 21, 2015
  85. Johannes SchindelinJan 21, 2015
  86. Junio C HamanoJan 21, 2015
  87. Johannes SchindelinJan 22, 2015
  88. 06/18 fsck: Report the ID of the error/warningJohannes Schindelin, Jan 19, 2015
  89. 07/18 fsck: Make fsck_ident() warn-friendlyJohannes Schindelin, Jan 19, 2015
  90. Junio C HamanoJan 21, 2015
  91. 08/18 fsck: Make fsck_commit() warn-friendlyJohannes Schindelin, Jan 19, 2015
  92. 09/18 fsck: Handle multiple authors in commits speciallyJohannes Schindelin, Jan 19, 2015
  93. 10/18 fsck: Make fsck_tag() warn-friendlyJohannes Schindelin, Jan 19, 2015
  94. 11/18 fsck: Add a simple test for receive.fsck.*Johannes Schindelin, Jan 19, 2015
  95. Junio C HamanoJan 21, 2015
  96. Johannes SchindelinJan 21, 2015
  97. 12/18 fsck: Disallow demoting grave fsck errors to warningsJohannes Schindelin, Jan 19, 2015
  98. 13/18 fsck: Optionally ignore specific fsck issues completelyJohannes Schindelin, Jan 19, 2015
  99. 14/18 fsck: Allow upgrading fsck warnings to errorsJohannes Schindelin, Jan 19, 2015
  100. 15/18 fsck: Document the new receive.fsck.* options.Johannes Schindelin, Jan 19, 2015
  101. Eric SunshineJan 19, 2015
  102. Johannes SchindelinJan 20, 2015
  103. 16/18 fsck: Support demoting errors to warningsJohannes Schindelin, Jan 19, 2015
  104. 17/18 fsck: Introduce `git fsck --quick`Johannes Schindelin, Jan 19, 2015
  105. 18/18 fsck: git receive-pack: support excluding objects from fsck'ingJohannes Schindelin, Jan 19, 2015
  106. Junio C HamanoJan 21, 2015
  107. Johannes SchindelinJan 21, 2015
  108. Junio C HamanoJan 21, 2015
  109. Johannes SchindelinJan 21, 2015
  110. 00/19 Introduce an internal API to interact with the fsck machineryJohannes Schindelin, Jan 21, 2015
  111. 01/19 fsck: Introduce fsck optionsJohannes Schindelin, Jan 21, 2015
  112. 02/19 fsck: Introduce identifiers for fsck messagesJohannes Schindelin, Jan 21, 2015
  113. 03/19 fsck: Provide a function to parse fsck message IDsJohannes Schindelin, Jan 21, 2015
  114. 04/19 fsck: Offer a function to demote fsck errors to warningsJohannes Schindelin, Jan 21, 2015
  115. 05/19 fsck: Allow demoting errors to warnings via receive.fsck.warn = <key>Johannes Schindelin, Jan 21, 2015
  116. 06/19 fsck: Report the ID of the error/warningJohannes Schindelin, Jan 21, 2015
  117. 07/19 fsck: Make fsck_ident() warn-friendlyJohannes Schindelin, Jan 21, 2015
  118. 08/19 fsck: Make fsck_commit() warn-friendlyJohannes Schindelin, Jan 21, 2015
  119. 09/19 fsck: Handle multiple authors in commits speciallyJohannes Schindelin, Jan 21, 2015
  120. 10/19 fsck: Make fsck_tag() warn-friendlyJohannes Schindelin, Jan 21, 2015
  121. 11/19 fsck: Add a simple test for receive.fsck.*Johannes Schindelin, Jan 21, 2015
  122. 12/19 fsck: Disallow demoting grave fsck errors to warningsJohannes Schindelin, Jan 21, 2015
  123. 13/19 fsck: Optionally ignore specific fsck issues completelyJohannes Schindelin, Jan 21, 2015
  124. 14/19 fsck: Allow upgrading fsck warnings to errorsJohannes Schindelin, Jan 21, 2015
  125. 15/19 fsck: Document the new receive.fsck.* options.Johannes Schindelin, Jan 21, 2015
  126. 16/19 fsck: Support demoting errors to warningsJohannes Schindelin, Jan 21, 2015
  127. 17/19 fsck: Introduce `git fsck --quick`Johannes Schindelin, Jan 21, 2015
  128. 18/19 fsck: git receive-pack: support excluding objects from fsck'ingJohannes Schindelin, Jan 21, 2015
  129. 19/19 fsck: support ignoring objects in `git fsck` via fsck.skiplistJohannes Schindelin, Jan 21, 2015
  130. 00/19 Introduce an internal API to interact with the fsck machineryJohannes Schindelin, Jan 31, 2015
  131. 01/19 fsck: Introduce fsck optionsJohannes Schindelin, Jan 31, 2015
  132. 02/19 fsck: Introduce identifiers for fsck messagesJohannes Schindelin, Jan 31, 2015
  133. 03/19 fsck: Provide a function to parse fsck message IDsJohannes Schindelin, Jan 31, 2015
  134. 05/19 fsck: Allow demoting errors to warningsJohannes Schindelin, Jan 31, 2015
  135. 04/19 fsck: Offer a function to demote fsck errors to warningsJohannes Schindelin, Jan 31, 2015
  136. 11/19 fsck: Add a simple test for receive.fsck.severityJohannes Schindelin, Jan 31, 2015
  137. 12/19 fsck: Disallow demoting grave fsck errors to warningsJohannes Schindelin, Jan 31, 2015
  138. 07/19 fsck: Make fsck_ident() warn-friendlyJohannes Schindelin, Jan 31, 2015
  139. 08/19 fsck: Make fsck_commit() warn-friendlyJohannes Schindelin, Jan 31, 2015
  140. 10/19 fsck: Make fsck_tag() warn-friendlyJohannes Schindelin, Jan 31, 2015
  141. 15/19 fsck: Document the new receive.fsck.severity options.Johannes Schindelin, Jan 31, 2015
  142. 09/19 fsck: Handle multiple authors in commits speciallyJohannes Schindelin, Jan 31, 2015
  143. 14/19 fsck: Allow upgrading fsck warnings to errorsJohannes Schindelin, Jan 31, 2015
  144. 06/19 fsck: Report the ID of the error/warningJohannes Schindelin, Jan 31, 2015
  145. 13/19 fsck: Optionally ignore specific fsck issues completelyJohannes Schindelin, Jan 31, 2015
  146. 16/19 fsck: Support demoting errors to warningsJohannes Schindelin, Jan 31, 2015
  147. 17/19 fsck: Introduce `git fsck --quick`Johannes Schindelin, Jan 31, 2015
  148. 18/19 fsck: git receive-pack: support excluding objects from fsck'ingJohannes Schindelin, Jan 31, 2015
  149. 19/19 fsck: support ignoring objects in `git fsck` via fsck.skiplistJohannes Schindelin, Jan 31, 2015
  150. Johannes SchindelinFeb 2, 2015
  151. Michael HaggertyFeb 2, 2015
  152. Johannes SchindelinFeb 2, 2015
  153. Michael HaggertyFeb 3, 2015
  154. Johannes SchindelinFeb 3, 2015
  155. Junio C HamanoFeb 4, 2015
  156. Johannes SchindelinFeb 4, 2015
  157. 00/19 Introduce an internal API to interact with the fsck machineryJohannes Schindelin, Jun 18, 2015
  158. 01/19 fsck: Introduce fsck optionsJohannes Schindelin, Jun 18, 2015
  159. 02/19 fsck: Introduce identifiers for fsck messagesJohannes Schindelin, Jun 18, 2015
  160. 03/19 fsck: Provide a function to parse fsck message IDsJohannes Schindelin, Jun 18, 2015
  161. 04/19 fsck: Offer a function to demote fsck errors to warningsJohannes Schindelin, Jun 18, 2015
  162. 05/19 fsck (receive-pack): Allow demoting errors to warningsJohannes Schindelin, Jun 18, 2015
  163. 06/19 fsck: Report the ID of the error/warningJohannes Schindelin, Jun 18, 2015
  164. 07/19 fsck: Make fsck_ident() warn-friendlyJohannes Schindelin, Jun 18, 2015
  165. 08/19 fsck: Make fsck_commit() warn-friendlyJohannes Schindelin, Jun 18, 2015
  166. 09/19 fsck: Handle multiple authors in commits speciallyJohannes Schindelin, Jun 18, 2015
  167. 11/19 fsck: Add a simple test for receive.fsck.<msg-id>Johannes Schindelin, Jun 18, 2015
  168. 10/19 fsck: Make fsck_tag() warn-friendlyJohannes Schindelin, Jun 18, 2015
  169. 12/19 fsck: Disallow demoting grave fsck errors to warningsJohannes Schindelin, Jun 18, 2015
  170. 13/19 fsck: Optionally ignore specific fsck issues completelyJohannes Schindelin, Jun 18, 2015
  171. 14/19 fsck: Allow upgrading fsck warnings to errorsJohannes Schindelin, Jun 18, 2015
  172. 15/19 fsck: Document the new receive.fsck.<msg-id> optionsJohannes Schindelin, Jun 18, 2015
  173. 16/19 fsck: Support demoting errors to warningsJohannes Schindelin, Jun 18, 2015
  174. 17/19 fsck: Introduce `git fsck --quick`Johannes Schindelin, Jun 18, 2015
  175. 18/19 fsck: git receive-pack: support excluding objects from fsck'ingJohannes Schindelin, Jun 18, 2015
  176. 19/19 fsck: support ignoring objects in `git fsck` via fsck.skiplistJohannes Schindelin, Jun 18, 2015
  177. Junio C HamanoJun 18, 2015
  178. Johannes SchindelinJun 19, 2015
  179. Junio C HamanoJun 19, 2015
  180. Johannes SchindelinJun 19, 2015
  181. 00/19 Introduce an internal API to interact with the fsck machineryJohannes Schindelin, Jun 19, 2015
  182. 01/19 fsck: Introduce fsck optionsJohannes Schindelin, Jun 19, 2015
  183. Junio C HamanoJun 19, 2015
  184. Johannes SchindelinJun 20, 2015
  185. 02/19 fsck: Introduce identifiers for fsck messagesJohannes Schindelin, Jun 19, 2015
  186. Junio C HamanoJun 19, 2015
  187. 03/19 fsck: Provide a function to parse fsck message IDsJohannes Schindelin, Jun 19, 2015
  188. Junio C HamanoJun 19, 2015
  189. Johannes SchindelinJun 21, 2015
  190. 04/19 fsck: Offer a function to demote fsck errors to warningsJohannes Schindelin, Jun 19, 2015
  191. Junio C HamanoJun 19, 2015
  192. Johannes SchindelinJun 21, 2015
  193. Junio C HamanoJun 21, 2015
  194. Johannes SchindelinJun 21, 2015
  195. Junio C HamanoJun 21, 2015
  196. Johannes SchindelinJun 22, 2015
  197. 05/19 fsck (receive-pack): Allow demoting errors to warningsJohannes Schindelin, Jun 19, 2015
  198. 06/19 fsck: Report the ID of the error/warningJohannes Schindelin, Jun 19, 2015
  199. Junio C HamanoJun 19, 2015
  200. Johannes SchindelinJun 19, 2015
  201. Junio C HamanoJun 19, 2015
  202. 07/19 fsck: Make fsck_ident() warn-friendlyJohannes Schindelin, Jun 19, 2015
  203. Junio C HamanoJun 19, 2015
  204. 08/19 fsck: Make fsck_commit() warn-friendlyJohannes Schindelin, Jun 19, 2015
  205. Junio C HamanoJun 19, 2015
  206. Johannes SchindelinJun 19, 2015
  207. Junio C HamanoJun 19, 2015
  208. Junio C HamanoJun 19, 2015
  209. 09/19 fsck: Handle multiple authors in commits speciallyJohannes Schindelin, Jun 19, 2015
  210. Junio C HamanoJun 19, 2015
  211. Johannes SchindelinJun 19, 2015
  212. 10/19 fsck: Make fsck_tag() warn-friendlyJohannes Schindelin, Jun 19, 2015
  213. Junio C HamanoJun 19, 2015
  214. Johannes SchindelinJun 19, 2015
  215. 11/19 fsck: Add a simple test for receive.fsck.<msg-id>Johannes Schindelin, Jun 19, 2015
  216. 12/19 fsck: Disallow demoting grave fsck errors to warningsJohannes Schindelin, Jun 19, 2015
  217. Junio C HamanoJun 19, 2015
  218. Johannes SchindelinJun 19, 2015
  219. Junio C HamanoJun 19, 2015
  220. 13/19 fsck: Optionally ignore specific fsck issues completelyJohannes Schindelin, Jun 19, 2015
  221. 14/19 fsck: Allow upgrading fsck warnings to errorsJohannes Schindelin, Jun 19, 2015
  222. Junio C HamanoJun 19, 2015
  223. Johannes SchindelinJun 19, 2015
  224. 15/19 fsck: Document the new receive.fsck.<msg-id> optionsJohannes Schindelin, Jun 19, 2015
  225. 16/19 fsck: Support demoting errors to warningsJohannes Schindelin, Jun 19, 2015
  226. 17/19 fsck: Introduce `git fsck --quick`Johannes Schindelin, Jun 19, 2015
  227. Junio C HamanoJun 19, 2015
  228. Johannes SchindelinJun 19, 2015
  229. Junio C HamanoJun 19, 2015
  230. Scott SchmitJun 19, 2015
  231. Junio C HamanoJun 20, 2015
  232. Michael HaggertyJun 21, 2015
  233. Randall S. BeckerJun 21, 2015
  234. Johannes SchindelinJun 21, 2015
  235. Johannes SchindelinJun 21, 2015
  236. Junio C HamanoJun 21, 2015
  237. Johannes SchindelinJun 21, 2015
  238. Junio C HamanoJun 21, 2015
  239. Junio C HamanoJun 21, 2015
  240. Johannes SchindelinJun 22, 2015
  241. Junio C HamanoJun 20, 2015
  242. 18/19 fsck: git receive-pack: support excluding objects from fsck'ingJohannes Schindelin, Jun 19, 2015
  243. Junio C HamanoJun 19, 2015
  244. Johannes SchindelinJun 20, 2015
  245. Junio C HamanoJun 20, 2015
  246. Junio C HamanoJun 22, 2015
  247. Johannes SchindelinJun 22, 2015
  248. 19/19 fsck: support ignoring objects in `git fsck` via fsck.skiplistJohannes Schindelin, Jun 19, 2015
  249. Junio C HamanoJun 19, 2015
  250. 00/19 Introduce an internal API to interact with the fsck machineryJohannes Schindelin, Jun 22, 2015
  251. 01/19 fsck: Introduce fsck optionsJohannes Schindelin, Jun 22, 2015
  252. 02/19 fsck: Introduce identifiers for fsck messagesJohannes Schindelin, Jun 22, 2015
  253. 03/19 fsck: Provide a function to parse fsck message IDsJohannes Schindelin, Jun 22, 2015
  254. 04/19 fsck: Offer a function to demote fsck errors to warningsJohannes Schindelin, Jun 22, 2015
  255. Junio C HamanoJun 22, 2015
  256. Johannes SchindelinJun 22, 2015
  257. 05/19 fsck (receive-pack): Allow demoting errors to warningsJohannes Schindelin, Jun 22, 2015
  258. 06/19 fsck: Report the ID of the error/warningJohannes Schindelin, Jun 22, 2015
  259. 07/19 fsck: Make fsck_ident() warn-friendlyJohannes Schindelin, Jun 22, 2015
  260. 08/19 fsck: Make fsck_commit() warn-friendlyJohannes Schindelin, Jun 22, 2015
  261. 09/19 fsck: Handle multiple authors in commits speciallyJohannes Schindelin, Jun 22, 2015
  262. 10/19 fsck: Make fsck_tag() warn-friendlyJohannes Schindelin, Jun 22, 2015
  263. 11/19 fsck: Add a simple test for receive.fsck.<msg-id>Johannes Schindelin, Jun 22, 2015
  264. 12/19 fsck: Disallow demoting grave fsck errors to warningsJohannes Schindelin, Jun 22, 2015
  265. 13/19 fsck: Optionally ignore specific fsck issues completelyJohannes Schindelin, Jun 22, 2015
  266. Junio C HamanoJun 22, 2015
  267. Johannes SchindelinJun 22, 2015
  268. 14/19 fsck: Allow upgrading fsck warnings to errorsJohannes Schindelin, Jun 22, 2015
  269. 15/19 fsck: Document the new receive.fsck.<msg-id> optionsJohannes Schindelin, Jun 22, 2015
  270. 16/19 fsck: Support demoting errors to warningsJohannes Schindelin, Jun 22, 2015
  271. 17/19 fsck: Introduce `git fsck --connectivity-only`Johannes Schindelin, Jun 22, 2015
  272. 18/19 fsck: git receive-pack: support excluding objects from fsck'ingJohannes Schindelin, Jun 22, 2015
  273. 19/19 fsck: support ignoring objects in `git fsck` via fsck.skiplistJohannes Schindelin, Jun 22, 2015
  274. Junio C HamanoJun 22, 2015
  275. Johannes SchindelinJun 22, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.