[PATCH 3/3] fsck: exit with non-zero status upon errors

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



git-fsck always exited with status 0, which was a bit sloppy.
This makes it exit with a non-zero status when errors are
found.  The error code is an OR'ed result of:

  1 if corrupted objects are found.
  2 if objects that are ought to be reachable are missing or corrupt.

For example, it would exit with 1 in a repository with an
unreachable corrupt object.  If a tree object of the HEAD commit
is corrupt, you would get 3.

Signed-off-by: Junio C Hamano <junkio@xxxxxxx>
---
 builtin-fsck.c |   26 +++++++++++++++++++++-----
 1 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/builtin-fsck.c b/builtin-fsck.c
index abdd0f2..4d03378 100644
--- a/builtin-fsck.c
+++ b/builtin-fsck.c
@@ -18,6 +18,9 @@ static int check_full;
 static int check_strict;
 static int keep_cache_objects;
 static unsigned char head_sha1[20];
+static int errors_found;
+#define ERROR_OBJECT 01
+#define ERROR_REACHABLE 02
 
 #ifdef NO_D_INO_IN_DIRENT
 #define SORT_DIRENT 0
@@ -40,6 +43,7 @@ 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);
 	return -1;
@@ -70,6 +74,7 @@ static void check_reachable_object(struct object *obj)
 		if (has_sha1_pack(obj->sha1, NULL))
 			return; /* it is in pack - forget about it */
 		printf("missing %s %s\n", typename(obj->type), sha1_to_hex(obj->sha1));
+		errors_found |= ERROR_REACHABLE;
 		return;
 	}
 
@@ -88,6 +93,7 @@ static void check_reachable_object(struct object *obj)
 			       typename(obj->type), sha1_to_hex(obj->sha1));
 			printf("              to %7s %s\n",
 			       typename(ref->type), sha1_to_hex(ref->sha1));
+			errors_found |= ERROR_REACHABLE;
 		}
 	}
 }
@@ -346,8 +352,11 @@ static int fsck_tag(struct tag *tag)
 static int fsck_sha1(unsigned char *sha1)
 {
 	struct object *obj = parse_object(sha1);
-	if (!obj)
-		return error("%s: object corrupt or missing", sha1_to_hex(sha1));
+	if (!obj) {
+		errors_found |= ERROR_OBJECT;
+		return error("%s: object corrupt or missing",
+			     sha1_to_hex(sha1));
+	}
 	if (obj->flags & SEEN)
 		return 0;
 	obj->flags |= SEEN;
@@ -359,8 +368,10 @@ static int fsck_sha1(unsigned char *sha1)
 		return fsck_commit((struct commit *) obj);
 	if (obj->type == OBJ_TAG)
 		return fsck_tag((struct tag *) obj);
+
 	/* By now, parse_object() would've returned NULL instead. */
-	return objerror(obj, "unknown type '%d' (internal fsck error)", obj->type);
+	return objerror(obj, "unknown type '%d' (internal fsck error)",
+			obj->type);
 }
 
 /*
@@ -576,11 +587,16 @@ static int fsck_cache_tree(struct cache_tree *it)
 	return err;
 }
 
+static const char fsck_usage[] =
+"git-fsck [--tags] [--root] [[--unreachable] [--cache] [--full] "
+"[--strict] <head-sha1>*]";
+
 int cmd_fsck(int argc, char **argv, const char *prefix)
 {
 	int i, heads;
 
 	track_object_refs = 1;
+	errors_found = 0;
 
 	for (i = 1; i < argc; i++) {
 		const char *arg = argv[i];
@@ -610,7 +626,7 @@ int cmd_fsck(int argc, char **argv, const char *prefix)
 			continue;
 		}
 		if (*arg == '-')
-			usage("git-fsck [--tags] [--root] [[--unreachable] [--cache] [--full] [--strict] <head-sha1>*]");
+			usage(fsck_usage);
 	}
 
 	fsck_head_link();
@@ -690,5 +706,5 @@ int cmd_fsck(int argc, char **argv, const char *prefix)
 	}
 
 	check_connectivity();
-	return 0;
+	return errors_found;
 }
-- 
1.5.0.3.855.ga3b2


-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]