git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* [PATCH/RFC 0/4] Adding '-' notation as @{-1}  (pu, d40f108)
@ 2015-03-30 17:41 Kenny Lee Sin Cheong
  2015-03-30 17:41 ` [PATCH/RFC 1/4] Add "-" as @{-1} support for the rev-parse command Kenny Lee Sin Cheong
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Kenny Lee Sin Cheong @ 2015-03-30 17:41 UTC (permalink / raw)
  To: git; +Cc: gitster, Kenny Lee Sin Cheong

This is an attempt to allow '-' everywhere a revision is normally allowed.
I previously attempted this  as a microproject and the subject was disscussed at : http://article.gmane.org/gmane.comp.version-control.git/265672

Currently, something like '-~2' does not work. I tried tracing the execution of, say 'log -~2' vs 'log master -~2' and noticed when calling dwim_ref() with '-~2', it returns 0 (no refs found) whereas when given 'master~2', it returned non-zero. However I'm not sure how exactly dwim_ref() works.

Kenny Lee Sin Cheong (4):
  Add "-" as @{-1} support for the rev-parse command
  t1505: add tests for '-' notation in rev-parse
  Handle arg as revision first, then option.
  t0102: add tests for '-' notation

 builtin/rev-parse.c           | 37 +++++++++++++-------------
 revision.c                    | 61 +++++++++++++++++++++++--------------------
 sha1_name.c                   |  2 +-
 t/t0102-previous-shorthand.sh | 40 ++++++++++++++++++++++++++++
 t/t1505-rev-parse-last.sh     | 12 ++++++---
 5 files changed, 101 insertions(+), 51 deletions(-)
 create mode 100644 t/t0102-previous-shorthand.sh

-- 
2.3.3.203.g8ffb468.dirty

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH/RFC 1/4] Add "-" as @{-1} support for the rev-parse command
  2015-03-30 17:41 [PATCH/RFC 0/4] Adding '-' notation as @{-1} (pu, d40f108) Kenny Lee Sin Cheong
@ 2015-03-30 17:41 ` Kenny Lee Sin Cheong
  2015-03-30 19:46   ` Junio C Hamano
  2015-03-30 17:41 ` [PATCH/RFC 2/4] t1505: add tests for '-' notation in rev-parse Kenny Lee Sin Cheong
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 7+ messages in thread
From: Kenny Lee Sin Cheong @ 2015-03-30 17:41 UTC (permalink / raw)
  To: git; +Cc: gitster, Kenny Lee Sin Cheong

Allows the use of the "-" shorthand notation, including
use with revision ranges. If we plan to allow "-" as a stand in every
where a revision is allowed, then "-" would also need to be usable in
plumbing commands, for writing tests, for example.

Checks if the argument can be interpreted as a revision range first
before checking for flags. This saves us from having to check that
something that begins with "-" does not get checked as a possible flag.

Signed-off-by: Kenny Lee Sin Cheong <kenny.lee28@gmail.com>
---
 builtin/rev-parse.c | 37 +++++++++++++++++++------------------
 1 file changed, 19 insertions(+), 18 deletions(-)

diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 3626c61..8da95b5 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -553,6 +553,25 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 			continue;
 		}
 
+		/* Not a flag argument */
+		if (try_difference(arg))
+			continue;
+		if (try_parent_shorthands(arg))
+			continue;
+		name = arg;
+		type = NORMAL;
+		if (*arg == '^') {
+			name++;
+			type = REVERSED;
+		}
+		if (!get_sha1_with_context(name, flags, sha1, &unused)) {
+			if (verify)
+				revs_count++;
+			else
+				show_rev(type, sha1, name);
+			continue;
+		}
+
 		if (*arg == '-') {
 			if (!strcmp(arg, "--")) {
 				as_is = 2;
@@ -810,24 +829,6 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 			continue;
 		}
 
-		/* Not a flag argument */
-		if (try_difference(arg))
-			continue;
-		if (try_parent_shorthands(arg))
-			continue;
-		name = arg;
-		type = NORMAL;
-		if (*arg == '^') {
-			name++;
-			type = REVERSED;
-		}
-		if (!get_sha1_with_context(name, flags, sha1, &unused)) {
-			if (verify)
-				revs_count++;
-			else
-				show_rev(type, sha1, name);
-			continue;
-		}
 		if (verify)
 			die_no_single_rev(quiet);
 		if (has_dashdash)
-- 
2.3.3.203.g8ffb468.dirty

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH/RFC 2/4] t1505: add tests for '-' notation in rev-parse
  2015-03-30 17:41 [PATCH/RFC 0/4] Adding '-' notation as @{-1} (pu, d40f108) Kenny Lee Sin Cheong
  2015-03-30 17:41 ` [PATCH/RFC 1/4] Add "-" as @{-1} support for the rev-parse command Kenny Lee Sin Cheong
@ 2015-03-30 17:41 ` Kenny Lee Sin Cheong
  2015-03-31  4:55   ` Torsten Bögershausen
  2015-03-30 17:41 ` [PATCH/RFC 3/4] Handle arg as revision first, then option Kenny Lee Sin Cheong
  2015-03-30 17:41 ` [PATCH/RFC 4/4] t0102: add tests for '-' notation Kenny Lee Sin Cheong
  3 siblings, 1 reply; 7+ messages in thread
From: Kenny Lee Sin Cheong @ 2015-03-30 17:41 UTC (permalink / raw)
  To: git; +Cc: gitster, Kenny Lee Sin Cheong

Signed-off-by: Kenny Lee Sin Cheong <kenny.lee28@gmail.com>
---
 t/t1505-rev-parse-last.sh | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/t/t1505-rev-parse-last.sh b/t/t1505-rev-parse-last.sh
index 4969edb..a1976ad 100755
--- a/t/t1505-rev-parse-last.sh
+++ b/t/t1505-rev-parse-last.sh
@@ -33,19 +33,23 @@ test_expect_success 'setup' '
 # and 'side' should be the last branch
 
 test_expect_success '@{-1} works' '
-	test_cmp_rev side @{-1}
+	test_cmp_rev side @{-1} &&
+	test_cmp_rev side -
 '
 
 test_expect_success '@{-1}~2 works' '
-	test_cmp_rev side~2 @{-1}~2
+	test_cmp_rev side~2 @{-1}~2 &&
+	test_cmp_rev side~2 -~2
 '
 
 test_expect_success '@{-1}^2 works' '
-	test_cmp_rev side^2 @{-1}^2
+	test_cmp_rev side^2 @{-1}^2 &&
+	test_cmp_rev side^2 -^2
 '
 
 test_expect_success '@{-1}@{1} works' '
-	test_cmp_rev side@{1} @{-1}@{1}
+	test_cmp_rev side@{1} @{-1}@{1} &&
+	test_cmp_rev side@{1} -@{1}
 '
 
 test_expect_success '@{-2} works' '
-- 
2.3.3.203.g8ffb468.dirty

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH/RFC 3/4] Handle arg as revision first, then option.
  2015-03-30 17:41 [PATCH/RFC 0/4] Adding '-' notation as @{-1} (pu, d40f108) Kenny Lee Sin Cheong
  2015-03-30 17:41 ` [PATCH/RFC 1/4] Add "-" as @{-1} support for the rev-parse command Kenny Lee Sin Cheong
  2015-03-30 17:41 ` [PATCH/RFC 2/4] t1505: add tests for '-' notation in rev-parse Kenny Lee Sin Cheong
@ 2015-03-30 17:41 ` Kenny Lee Sin Cheong
  2015-03-30 17:41 ` [PATCH/RFC 4/4] t0102: add tests for '-' notation Kenny Lee Sin Cheong
  3 siblings, 0 replies; 7+ messages in thread
From: Kenny Lee Sin Cheong @ 2015-03-30 17:41 UTC (permalink / raw)
  To: git; +Cc: gitster, Kenny Lee Sin Cheong

Check the argument as a revision at first. If it fails, then tries to
check it as an option, and finally as a pathspec.

Returns -1 when we have an ambiguous revision range, such as
"master..next", to allow the argument to get checked as an option before
calling die() from verify_non_filename(). This is because we are
allowing "-" to be given in a revision range, but making the revision
check first. Otherwise, an ambiguous argument that starts with
"-" (let's say an option) would die even though its normal behaviour is
to silently return. Instead we check for ambiguity in a revision after
making sure that the argument cannot be parsed as an option.

This problem is discussed in:
http://article.gmane.org/gmane.comp.version-control.git/265672

Signed-off-by: Kenny Lee Sin Cheong <kenny.lee28@gmail.com>
---
 revision.c  | 61 +++++++++++++++++++++++++++++++++----------------------------
 sha1_name.c |  2 +-
 2 files changed, 34 insertions(+), 29 deletions(-)

diff --git a/revision.c b/revision.c
index 570945a..1ea290f 100644
--- a/revision.c
+++ b/revision.c
@@ -1516,7 +1516,10 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi
 
 			if (!cant_be_filename) {
 				*dotdot = '.';
-				verify_non_filename(revs->prefix, arg);
+				if (is_inside_work_tree() && !is_inside_git_dir() &&
+				    check_filename(revs->prefix, arg)) {
+					return -1;
+				}
 			}
 
 			a_obj = parse_object(from_sha1);
@@ -2198,40 +2201,39 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
 	read_from_stdin = 0;
 	for (left = i = 1; i < argc; i++) {
 		const char *arg = argv[i];
-		if (arg[0] == '-' && arg[1] && !starts_with(arg + 1, "..")) {
-			int opts;
-
-			opts = handle_revision_pseudo_opt(submodule,
-						revs, argc - i, argv + i,
-						&flags);
-			if (opts > 0) {
-				i += opts - 1;
-				continue;
-			}
+		if (handle_revision_arg(arg, revs, flags, revarg_opt)) {
+			if (arg[0] == '-' && arg[1] && !starts_with(arg + 1, "..")) {
+				int opts;
+
+				opts = handle_revision_pseudo_opt(submodule,
+								  revs, argc - i, argv + i,
+								  &flags);
+				if (opts > 0) {
+					i += opts - 1;
+					continue;
+				}
 
-			if (!strcmp(arg, "--stdin")) {
-				if (revs->disable_stdin) {
-					argv[left++] = arg;
+				if (!strcmp(arg, "--stdin")) {
+					if (revs->disable_stdin) {
+						argv[left++] = arg;
+						continue;
+					}
+					if (read_from_stdin++)
+						die("--stdin given twice?");
+					read_revisions_from_stdin(revs, &prune_data);
 					continue;
 				}
-				if (read_from_stdin++)
-					die("--stdin given twice?");
-				read_revisions_from_stdin(revs, &prune_data);
-				continue;
-			}
 
-			opts = handle_revision_opt(revs, argc - i, argv + i, &left, argv);
-			if (opts > 0) {
-				i += opts - 1;
+				opts = handle_revision_opt(revs, argc - i, argv + i, &left, argv);
+				if (opts > 0) {
+					i += opts - 1;
+					continue;
+				}
+				if (opts < 0)
+					exit(128);
 				continue;
 			}
-			if (opts < 0)
-				exit(128);
-			continue;
-		}
-
 
-		if (handle_revision_arg(arg, revs, flags, revarg_opt)) {
 			int j;
 			if (seen_dashdash || *arg == '^')
 				die("bad revision '%s'", arg);
@@ -2249,6 +2251,9 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
 			break;
 		}
 		else
+			/* Make sure that a filename doesn't get interpreted as a revision */
+			if (!seen_dashdash)
+				verify_non_filename(revs->prefix, arg);
 			got_rev_arg = 1;
 	}
 
diff --git a/sha1_name.c b/sha1_name.c
index 7a621ba..b99b1dc 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -483,7 +483,7 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1,
 				break;
 			}
 		}
-	} else if (len == 1 && str[0] == '-') {
+	} else if (len == 1 && str[0] == '-' && !str[1]) {
 		nth_prior = 1;
 	}
 
-- 
2.3.3.203.g8ffb468.dirty

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH/RFC 4/4] t0102: add tests for '-' notation
  2015-03-30 17:41 [PATCH/RFC 0/4] Adding '-' notation as @{-1} (pu, d40f108) Kenny Lee Sin Cheong
                   ` (2 preceding siblings ...)
  2015-03-30 17:41 ` [PATCH/RFC 3/4] Handle arg as revision first, then option Kenny Lee Sin Cheong
@ 2015-03-30 17:41 ` Kenny Lee Sin Cheong
  3 siblings, 0 replies; 7+ messages in thread
From: Kenny Lee Sin Cheong @ 2015-03-30 17:41 UTC (permalink / raw)
  To: git; +Cc: gitster, Kenny Lee Sin Cheong

Signed-off-by: Kenny Lee Sin Cheong <kenny.lee28@gmail.com>
---
 t/t0102-previous-shorthand.sh | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)
 create mode 100644 t/t0102-previous-shorthand.sh

diff --git a/t/t0102-previous-shorthand.sh b/t/t0102-previous-shorthand.sh
new file mode 100644
index 0000000..919b055
--- /dev/null
+++ b/t/t0102-previous-shorthand.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+test_description='previous branch syntax @{-n}'
+
+. ./test-lib.sh
+
+test_expect_success 'branch -d -' '
+	test_commit A &&
+	git checkout -b junk2 &&
+	git checkout - &&
+	test "$(git symbolic-ref HEAD)" = refs/heads/master &&
+	git branch -d - &&
+	test_must_fail git rev-parse --verify refs/heads/junk2
+'
+
+test_expect_success 'merge -' '
+	git checkout A &&
+	test_commit B &&
+	git checkout A &&
+	test_commit C &&
+	test_commit D &&
+	git branch -f master B &&
+	git branch -f other &&
+	git checkout other &&
+	git checkout master &&
+	git merge - &&
+	git cat-file commit HEAD | grep "Merge branch '\''other'\''"
+'
+
+test_expect_success 'merge -~1' '
+	git checkout master &&
+	git reset --hard B &&
+	git checkout other &&
+	git checkout master &&
+	git merge -~1 &&
+	git cat-file commit HEAD >actual &&
+	grep "Merge branch '\''other'\''" actual
+'
+
+test_done
-- 
2.3.3.203.g8ffb468.dirty

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH/RFC 1/4] Add "-" as @{-1} support for the rev-parse command
  2015-03-30 17:41 ` [PATCH/RFC 1/4] Add "-" as @{-1} support for the rev-parse command Kenny Lee Sin Cheong
@ 2015-03-30 19:46   ` Junio C Hamano
  0 siblings, 0 replies; 7+ messages in thread
From: Junio C Hamano @ 2015-03-30 19:46 UTC (permalink / raw)
  To: Kenny Lee Sin Cheong; +Cc: git

Kenny Lee Sin Cheong <kenny.lee28@gmail.com> writes:

> Allows the use of the "-" shorthand notation, including
> use with revision ranges. If we plan to allow "-" as a stand in every
> where a revision is allowed, then "-" would also need to be usable in
> plumbing commands, for writing tests, for example.
>
> Checks if the argument can be interpreted as a revision range first
> before checking for flags. This saves us from having to check that
> something that begins with "-" does not get checked as a possible flag.

Doesn't that mean -<something> that is a valid flag can no longer be
recognised as a flag if the same string can be an extended SHA-1
whose formulation starts from "the previous branch"?  It sounds like
a regression to me.

Hmmm.

After all, "we often call for the previous branch, so let's give a
short-and-sweet '-' as an even shorter short-hand than '@{-1}'" and
"allow '-' anywhere" are two quite different things.  We may do "git
checkout -" very often to go back to what we were working on, but I
do not think "git log -.." or "git log ..-" are something we want to
do very often.

I think what I am saying is that it may be perfectly fine if we said
"'-' can be used for '@{-1}' only by itself; no ranges, no
parent-traversals, no other uses", if it makes it less likely for
mistakes and confusions to happen.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH/RFC 2/4] t1505: add tests for '-' notation in rev-parse
  2015-03-30 17:41 ` [PATCH/RFC 2/4] t1505: add tests for '-' notation in rev-parse Kenny Lee Sin Cheong
@ 2015-03-31  4:55   ` Torsten Bögershausen
  0 siblings, 0 replies; 7+ messages in thread
From: Torsten Bögershausen @ 2015-03-31  4:55 UTC (permalink / raw)
  To: Kenny Lee Sin Cheong, git; +Cc: gitster

On 03/30/2015 07:41 PM, Kenny Lee Sin Cheong wrote:
> Signed-off-by: Kenny Lee Sin Cheong <kenny.lee28@gmail.com>
> ---
>   t/t1505-rev-parse-last.sh | 12 ++++++++----
>   1 file changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/t/t1505-rev-parse-last.sh b/t/t1505-rev-parse-last.sh
> index 4969edb..a1976ad 100755
> --- a/t/t1505-rev-parse-last.sh
> +++ b/t/t1505-rev-parse-last.sh
> @@ -33,19 +33,23 @@ test_expect_success 'setup' '
>   # and 'side' should be the last branch
>   
>   test_expect_success '@{-1} works' '
> -	test_cmp_rev side @{-1}
> +	test_cmp_rev side @{-1} &&
> +	test_cmp_rev side -
>   '
(Beside that "-" is often used for "stdin" in many unix-like tools,
and my favorite would be "-1" ):

I think the test heading should be updated as well:

test_expect_success '@{-1} or - works' '
	test_cmp_rev side @{-1} &&
	test_cmp_rev side -
  '


>   
>   test_expect_success '@{-1}~2 works' '
> -	test_cmp_rev side~2 @{-1}~2
> +	test_cmp_rev side~2 @{-1}~2 &&
> +	test_cmp_rev side~2 -~2
>   '
>   
>   test_expect_success '@{-1}^2 works' '
> -	test_cmp_rev side^2 @{-1}^2
> +	test_cmp_rev side^2 @{-1}^2 &&
> +	test_cmp_rev side^2 -^2
>   '
>   
>   test_expect_success '@{-1}@{1} works' '
> -	test_cmp_rev side@{1} @{-1}@{1}
> +	test_cmp_rev side@{1} @{-1}@{1} &&
> +	test_cmp_rev side@{1} -@{1}
>   '
>   
>   test_expect_success '@{-2} works' '

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2015-03-31  4:57 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-30 17:41 [PATCH/RFC 0/4] Adding '-' notation as @{-1} (pu, d40f108) Kenny Lee Sin Cheong
2015-03-30 17:41 ` [PATCH/RFC 1/4] Add "-" as @{-1} support for the rev-parse command Kenny Lee Sin Cheong
2015-03-30 19:46   ` Junio C Hamano
2015-03-30 17:41 ` [PATCH/RFC 2/4] t1505: add tests for '-' notation in rev-parse Kenny Lee Sin Cheong
2015-03-31  4:55   ` Torsten Bögershausen
2015-03-30 17:41 ` [PATCH/RFC 3/4] Handle arg as revision first, then option Kenny Lee Sin Cheong
2015-03-30 17:41 ` [PATCH/RFC 4/4] t0102: add tests for '-' notation Kenny Lee Sin Cheong

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).