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