[PATCH/RFC] Implemented return value for rev-list --quiet

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

 



If --quiet is given, the program will return non-zero if the traversed
commit set was empty. This way, rev-list can be used to check commit
ancestry as described by the documentation for --quiet.

"Non-zero" is implemented as 1 in order to avoid confusion with the
usual 128 for die_builtin().

Signed-off-by: Jonas Gehring <jonas.gehring@xxxxxxxxxxxx>
---
 builtin/rev-list.c        |    8 ++++++++
 revision.h                |    1 +
 t/t6041-rev-list-quiet.sh |   27 +++++++++++++++++++++++++++
 3 files changed, 36 insertions(+), 0 deletions(-)
 create mode 100755 t/t6041-rev-list-quiet.sh

diff --git a/builtin/rev-list.c b/builtin/rev-list.c
index 9bfb942..001d6af 100644
--- a/builtin/rev-list.c
+++ b/builtin/rev-list.c
@@ -157,12 +157,17 @@ static void show_commit(struct commit *commit, void *data)
 
 static void finish_commit(struct commit *commit, void *data)
 {
+	struct rev_list_info *info = data;
+	struct rev_info *revs = info->revs;
+
 	if (commit->parents) {
 		free_commit_list(commit->parents);
 		commit->parents = NULL;
 	}
 	free(commit->buffer);
 	commit->buffer = NULL;
+
+	revs->count_finished++;
 }
 
 static void finish_object(struct object *obj, const struct name_path *path, const char *name)
@@ -412,5 +417,8 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
 			printf("%d\n", revs.count_left + revs.count_right);
 	}
 
+	if (quiet)
+		/* Return non-zero if no commits have been traversed. */
+		return (revs.count_finished == 0 ? 1 : 0);
 	return 0;
 }
diff --git a/revision.h b/revision.h
index 9fd8f30..ddc35d2 100644
--- a/revision.h
+++ b/revision.h
@@ -141,6 +141,7 @@ struct rev_info {
 	/* commit counts */
 	int count_left;
 	int count_right;
+	int count_finished;
 };
 
 #define REV_TREE_SAME		0
diff --git a/t/t6041-rev-list-quiet.sh b/t/t6041-rev-list-quiet.sh
new file mode 100755
index 0000000..6cb9120
--- /dev/null
+++ b/t/t6041-rev-list-quiet.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+test_description='Non-zero return value for empty commit sets and --quiet'
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+	echo >fileA fileA
+	git add fileA
+	git commit -a -m "Initial"
+	echo >fileA fileA modified
+	git commit -a -m "fileA modified"
+'
+
+test_expect_success 'not quiet' '
+	test $(git rev-list master | wc -l) = 2 &&
+	test $(git rev-list master..master^ | wc -l) = 0 &&
+	test $(git rev-list master^..master | wc -l) = 1
+'
+
+test_expect_success '--quiet' '
+	test $(git rev-list --quiet master; echo $?) = 0 &&
+	test $(git rev-list --quiet master..master^; echo $?) != 0 &&
+	test $(git rev-list --quiet master^..master; echo $?) = 0
+'
+
+test_done
-- 
1.7.4.4

--
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]