diff options
| -rw-r--r-- | builtin-rev-parse.c | 32 | ||||
| -rwxr-xr-x | t/t6101-rev-parse-parents.sh | 2 | 
2 files changed, 34 insertions, 0 deletions
| diff --git a/builtin-rev-parse.c b/builtin-rev-parse.c index aa71f4a4fa..9aa049ec17 100644 --- a/builtin-rev-parse.c +++ b/builtin-rev-parse.c @@ -241,6 +241,36 @@ static int try_difference(const char *arg)  	return 0;  } +static int try_parent_shorthands(const char *arg) +{ +	char *dotdot; +	unsigned char sha1[20]; +	struct commit *commit; +	struct commit_list *parents; +	int parents_only; + +	if ((dotdot = strstr(arg, "^!"))) +		parents_only = 0; +	else if ((dotdot = strstr(arg, "^@"))) +		parents_only = 1; + +	if (!dotdot || dotdot[2]) +		return 0; + +	*dotdot = 0; +	if (get_sha1(arg, sha1)) +		return 0; + +	if (!parents_only) +		show_rev(NORMAL, sha1, arg); +	commit = lookup_commit_reference(sha1); +	for (parents = commit->parents; parents; parents = parents->next) +		show_rev(parents_only ? NORMAL : REVERSED, +				parents->item->object.sha1, arg); + +	return 1; +} +  static int parseopt_dump(const struct option *o, const char *arg, int unset)  {  	struct strbuf *parsed = o->value; @@ -573,6 +603,8 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)  		/* Not a flag argument */  		if (try_difference(arg))  			continue; +		if (try_parent_shorthands(arg)) +			continue;  		name = arg;  		type = NORMAL;  		if (*arg == '^') { diff --git a/t/t6101-rev-parse-parents.sh b/t/t6101-rev-parse-parents.sh index efc831363e..919552a2fc 100755 --- a/t/t6101-rev-parse-parents.sh +++ b/t/t6101-rev-parse-parents.sh @@ -28,6 +28,8 @@ test_expect_success 'final^1^2 != final^1^1' "test $(git rev-parse final^1^2) !=  test_expect_success 'final^1^3 not valid' "if git rev-parse --verify final^1^3; then false; else :; fi"  test_expect_success '--verify start2^1' 'test_must_fail git rev-parse --verify start2^1'  test_expect_success '--verify start2^0' 'git rev-parse --verify start2^0' +test_expect_success 'final^1^@ = final^1^1 final^1^2' "test \"$(git rev-parse final^1^@)\" = \"$(git rev-parse final^1^1 final^1^2)\"" +test_expect_success 'final^1^! = final^1 ^final^1^1 ^final^1^2' "test \"$(git rev-parse final^1^\!)\" = \"$(git rev-parse final^1 ^final^1^1 ^final^1^2)\""  test_expect_success 'repack for next test' 'git repack -a -d'  test_expect_success 'short SHA-1 works' ' | 
