git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* [PATCH v2 GSoC RFC] diff: allow "-" as a short-hand for "last branch"
  2017-03-08  9:50 [PATCH] " mash
@ 2017-03-09 20:26 ` mash
       [not found]   ` <20170310034106.GB1984@instance-1.c.mfqp-source.internal>
  0 siblings, 1 reply; 4+ messages in thread
From: mash @ 2017-03-09 20:26 UTC (permalink / raw)
  To: Git Mailing List
  Cc: Junio C Hamano, Vegard Nossum, Štěpán Němec,
	Stefan Beller, Vedant Bassi, Prathamesh Chavan

Just like "git merge -" is a short-hand for "git merge @{-1}" to
conveniently merge the previous branch, "git diff -" is a short-hand for
"git diff @{-1}" to conveniently diff against the previous branch.

Allow the usage of "-" in the dot dot notation to allow the use of
"git diff -..HEAD^" as a short-hand for "git diff @{-1}..HEAD^".

Signed-off-by: mash <mash+git@crossperf.com>
---
Add tests to confirm that passing in this short-hand from stdin works.

Handling the dash in sha1_name:get_sha1_basic is not an issue but git was
designed with the dash in mind for options not for this weird short-hand so as
long as there's no decision made that git should actually have this short-hand
everywhere it does not seem like a good idea to change anything in there
because it would probably have unwanted side-effects.

For example for now just handle_revision_arg was modified which is mainly used
by git diff but also used in builtin/pack-objects.c:get_object_list#2785 which
is terrible since this may have already introduced an unwanted the side-effect.

Bypassing the whatever starts with a dash is always an option filters is not a
nice thing to do either.

Overall I see the benefit of the dash short-hand when doing checkouts since
it's very similar to "cd -" and switching between two branches is something one
would commonly do but for every git command where executing it twice results
into the same action achieving the same result twice it seems like a not that
useful short-hand.

Example:
master# g co maint
maint# g co -  # Switch to master
master# g co -  # Switch to maint (different result)
maint# g d -  # diff master..HEAD
maint# g d -  # diff master..HEAD (same result - less useful)

This is obviously only my own option.
Because of what was stated above I've now marked this as open for discussion
since I'm currently not convinced that applying the patch is a good idea.

 revision.c           | 22 +++++++++++++++--
 t/t4063-diff-last.sh | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 88 insertions(+), 2 deletions(-)
 create mode 100755 t/t4063-diff-last.sh

diff --git a/revision.c b/revision.c
index b37dbec..c331bd5 100644
--- a/revision.c
+++ b/revision.c
@@ -1439,6 +1439,7 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi
 	const char *arg = arg_;
 	int cant_be_filename = revarg_opt & REVARG_CANNOT_BE_FILENAME;
 	unsigned get_sha1_flags = 0;
+	static const char previous_branch[] = "@{-1}";
 
 	flags = flags & UNINTERESTING ? flags | BOTTOM : flags & ~BOTTOM;
 
@@ -1457,6 +1458,8 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi
 
 		if (!*next)
 			next = head_by_default;
+		else if (!strcmp(next, "-"))
+			next = previous_branch;
 		if (dotdot == arg)
 			this = head_by_default;
 		if (this == head_by_default && next == head_by_default &&
@@ -1469,6 +1472,8 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi
 				*dotdot = '.';
 				return -1;
 			}
+		} else if (!strcmp(this, "-")) {
+			this = previous_branch;
 		}
 		if (!get_sha1_committish(this, from_sha1) &&
 		    !get_sha1_committish(next, sha1)) {
@@ -1568,6 +1573,8 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi
 	if (revarg_opt & REVARG_COMMITTISH)
 		get_sha1_flags = GET_SHA1_COMMITTISH;
 
+	if (!strcmp(arg, "-"))
+		arg = previous_branch;
 	if (get_sha1_with_context(arg, get_sha1_flags, sha1, &oc))
 		return revs->ignore_missing ? 0 : -1;
 	if (!cant_be_filename)
@@ -1578,6 +1585,15 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi
 	return 0;
 }
 
+/*
+ * Check if the argument is supposed to be a revision argument instead of an
+ * option even though it starts with a dash.
+ */
+static int is_revision_arg(const char *arg)
+{
+	return *arg == '\0' || starts_with(arg, "..");
+}
+
 struct cmdline_pathspec {
 	int alloc;
 	int nr;
@@ -1621,7 +1637,9 @@ static void read_revisions_from_stdin(struct rev_info *revs,
 				seen_dashdash = 1;
 				break;
 			}
-			die("options not supported in --stdin mode");
+			if (!is_revision_arg(sb.buf + 1)) {
+				die("options not supported in --stdin mode");
+			}
 		}
 		if (handle_revision_arg(sb.buf, revs, 0,
 					REVARG_CANNOT_BE_FILENAME))
@@ -2205,7 +2223,7 @@ 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 == '-') {
+		if (*arg == '-' && !is_revision_arg(arg + 1)) {
 			int opts;
 
 			opts = handle_revision_pseudo_opt(submodule,
diff --git a/t/t4063-diff-last.sh b/t/t4063-diff-last.sh
new file mode 100755
index 0000000..dc28f9d
--- /dev/null
+++ b/t/t4063-diff-last.sh
@@ -0,0 +1,68 @@
+#!/bin/sh
+
+test_description='diff against last branch'
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+	echo hello >world &&
+	git add world &&
+	git commit -m initial &&
+	git branch other &&
+	echo "hello again" >>world &&
+	git add world &&
+	git commit -m second
+'
+
+test_expect_success '"diff -" does not work initially' '
+	test_must_fail git diff -
+'
+
+test_expect_success '"diff -" diffs against previous branch' '
+	git checkout other &&
+
+	cat <<-\EOF >expect &&
+	diff --git a/world b/world
+	index c66f159..ce01362 100644
+	--- a/world
+	+++ b/world
+	@@ -1,2 +1 @@
+	 hello
+	-hello again
+	EOF
+
+	git diff - >out &&
+	test_cmp expect out
+'
+
+test_expect_success '"diff -" arguments from stdin' '
+	echo "-" | git diff --stdin >out &&
+	test_cmp expect out
+'
+
+test_expect_success '"diff -.." diffs against previous branch' '
+	git diff -.. >out &&
+	test_cmp expect out
+'
+
+test_expect_success '"diff -.." arguments from stdin' '
+	echo "-.." | git diff --stdin >out &&
+	test_cmp expect out
+'
+
+test_expect_success '"diff ..-" diffs inverted' '
+	cat <<-\EOF >expect &&
+	diff --git a/world b/world
+	index ce01362..c66f159 100644
+	--- a/world
+	+++ b/world
+	@@ -1 +1,2 @@
+	 hello
+	+hello again
+	EOF
+
+	git diff ..- >out &&
+	test_cmp expect out
+'
+
+test_done
-- 
2.9.3

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

* RE: [PATCH v2 GSoC RFC] diff: allow "-" as a short-hand for "last branch"
       [not found]   ` <20170310034106.GB1984@instance-1.c.mfqp-source.internal>
@ 2017-03-10  4:52     ` mash
  2017-03-10  5:00       ` Siddharth Kannan
  0 siblings, 1 reply; 4+ messages in thread
From: mash @ 2017-03-10  4:52 UTC (permalink / raw)
  To: Siddharth Kannan
  Cc: Junio C Hamano, Vegard Nossum, stepnem, Stefan Beller,
	Vedant Bassi, Prathamesh Chavan, Matthieu Moy, Git Mailing List

> From the discussion over the different versions of my patch, I get
> the feeling that enabling this shorthand for all the commands is the
> direction that git wants to move in.

Interesting.

> Sorry about the time you spent on this patch.

Don't worry about it. I just seem to be too stupid to search through the
mailing list archive properly.

Maybe you can reuse the diff tests. I'll do another microproject then.

mash

The original message doesn't seem to cc the mailing list:
> Hey, I have already worked on this, and I made the change inside
> sha1_name.c.

> The final version of my patch is here[1].

> > Handling the dash in sha1_name:get_sha1_basic is not an issue but git
> > was designed with the dash in mind for options not for this weird
> > short-hand so as long as there's no decision made that git should
> > actually have this short-hand everywhere it does not seem like a good
> > idea to change anything in there because it would probably have
> > unwanted side-effects.

> Actually, this was discussed even when I was working on this patch.

> I said [2]

> > Making a change in sha1_name.c will touch a lot of commands
> > (setup_revisions is called from everywhere in the codebase), so, I am
> > still trying to figure out how to do this such that the rest of the
> > codepath remains unchanged.

> Matthieu replied to this [3]

> > I don't have strong opinion on this: I tend to favor consistency and
> > supporting "-" everywhere goes in this direction, but I think the
> > downsides should be considered too. A large part of the exercice here
> > is to write a good commit message!

> From the discussion over the different versions of my patch, I get
> the feeling that enabling this shorthand for all the commands is the
> direction that git wants to move in.

> Sorry about the time you spent on this patch.

> [1]: http://public-inbox.org/git/1488007487-12965-1-git-send-email-kannan.siddharth12@gmail.com/
> [2]: https://public-inbox.org/git/20170207191450.GA5569@ubuntu-512mb-blr1-01.localdomain/
> [3]: https://public-inbox.org/git/vpqh944eof7.fsf@anie.imag.fr/

> Thanks,
> Siddharth.

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

* [PATCH v2 GSoC RFC] diff: allow "-" as a short-hand for "last branch"
@ 2017-03-10  4:59 Siddharth Kannan
  0 siblings, 0 replies; 4+ messages in thread
From: Siddharth Kannan @ 2017-03-10  4:59 UTC (permalink / raw)
  To: mash
  Cc: Git Mailing List, Junio C Hamano, Vegard Nossum, stepnem,
	Stefan Beller, Vedant Bassi, Prathamesh Chavan, Matthieu Moy

Hey, I have already worked on this, and I made the change inside
sha1_name.c.

The final version of my patch is here[1].

> Handling the dash in sha1_name:get_sha1_basic is not an issue but
> git
> was designed with the dash in mind for options not for this weird
> short-hand so as long as there's no decision made that git should
> actually have this short-hand everywhere it does not seem like a
> good
> idea to change anything in there because it would probably have
> unwanted side-effects.

Actually, this was discussed even when I was working on this patch.

I said [2]

> Making a change in sha1_name.c will touch a lot of commands
> (setup_revisions is called from everywhere in the codebase), so, I
> am
> still trying to figure out how to do this such that the rest of the
> codepath remains unchanged.

Matthieu replied to this [3]

> I don't have strong opinion on this: I tend to favor consistency and
> supporting "-" everywhere goes in this direction, but I think the
> downsides should be considered too. A large part of the exercice
> here
> is to write a good commit message!

From the discussion over the different versions of my patch, I get
the feeling that enabling this shorthand for all the commands is the
direction that git wants to move in.

Sorry about the time you spent on this patch.

[1]: http://public-inbox.org/git/1488007487-12965-1-git-send-email-kannan.siddharth12@gmail.com/
[2]: https://public-inbox.org/git/20170207191450.GA5569@ubuntu-512mb-blr1-01.localdomain/
[3]: https://public-inbox.org/git/vpqh944eof7.fsf@anie.imag.fr/

Thanks,
Siddharth.

P.S. This message was sent _before_ 1cmCXH-0000ND-9K@crossperf.com but
I didn't CC The mailing list in that message. I am sending it with the
mailing list cc-ed to ensure that the conversation makes sense.


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

* Re: [PATCH v2 GSoC RFC] diff: allow "-" as a short-hand for "last branch"
  2017-03-10  4:52     ` mash
@ 2017-03-10  5:00       ` Siddharth Kannan
  0 siblings, 0 replies; 4+ messages in thread
From: Siddharth Kannan @ 2017-03-10  5:00 UTC (permalink / raw)
  To: mash
  Cc: Junio C Hamano, Vegard Nossum, stepnem, Stefan Beller,
	Vedant Bassi, Prathamesh Chavan, Matthieu Moy, Git Mailing List

On Fri, Mar 10, 2017 at 04:52:07AM +0000, mash wrote:
> Maybe you can reuse the diff tests. I'll do another microproject then.

Yeah, definitely. If there are more tests required, then I will reuse
your ones!
> 
> mash
> 
> The original message doesn't seem to cc the mailing list:

Thanks! It was rather daft of me to not realise this. I was waiting
for it to appear on public-inbox.

I re-sent it with the CC. The timestamp is a little bit
skewed, but I think it should make sense.

Thanks,
Siddharth.

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

end of thread, other threads:[~2017-03-10  5:02 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-10  4:59 [PATCH v2 GSoC RFC] diff: allow "-" as a short-hand for "last branch" Siddharth Kannan
  -- strict thread matches above, loose matches on Subject: below --
2017-03-08  9:50 [PATCH] " mash
2017-03-09 20:26 ` [PATCH v2 GSoC RFC] " mash
     [not found]   ` <20170310034106.GB1984@instance-1.c.mfqp-source.internal>
2017-03-10  4:52     ` mash
2017-03-10  5:00       ` Siddharth Kannan

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).