[RFC PATCH 2/2] Teach git-blame --gui how to start git-gui blame

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

 



Jakub Narebski proposed the idea of having a new --gui option for
git-blame that would start `git gui blame` with the arguments that
were given to git-blame on the command line.  This actually makes
a lot of sense, as some users may first reach for `git blame` and
find the handy `--gui` option, rather than looking for the blame
subcommand of `git gui`.

To keep things really simple in git-blame we require that the new
--gui option be the first argument on the command line, and cannot
be combined with any other option.  If it is the first argument
then we punt our entire command line as-is into `git gui blame`,
where that program's option parser will handle selecting out the
revision and path, if present.

Signed-off-by: Shawn O. Pearce <spearce@xxxxxxxxxxx>
---

 From Jakub Narebski <jnareb@xxxxxxxxx>:
 > or have "git blame --gui" invoke "git gui blame"

 Not a bad idea.  Here's an implementation that does that.
 Its simple and not very intrusive, but has the odd behavior that
 no option (like --contents) can be used along with it, because
 git-gui's own blame subcommand doesn't recognize them.  On the
 other hand it is a useful DWIMery for `git gui blame`.


 Documentation/git-blame.txt |    8 ++++++++
 builtin-blame.c             |   12 +++++++++++-
 2 files changed, 19 insertions(+), 1 deletions(-)

diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt
index 66f1203..96ff02d 100644
--- a/Documentation/git-blame.txt
+++ b/Documentation/git-blame.txt
@@ -10,6 +10,7 @@ SYNOPSIS
 [verse]
 'git-blame' [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-p] [-w] [--incremental] [-L n,m]
             [-S <revs-file>] [-M] [-C] [-C] [--since=<date>]
+            [--gui]
             [<rev> | --contents <file>] [--] <file>
 
 DESCRIPTION
@@ -67,6 +68,13 @@ include::blame-options.txt[]
 	Ignore whitespace when comparing parent's version and
 	child's to find where the lines came from.
 
+--gui::
+	Instead of displaying the blame output on the text console,
+	start git-gui's graphical blame viewer.  This option must
+	be the first option supplied, and cannot be combined with
+	any other option described here, except the optional <rev>
+	and the required <file> arguments.
+
 
 THE PORCELAIN FORMAT
 --------------------
diff --git a/builtin-blame.c b/builtin-blame.c
index f7e2c13..2f50a4a 100644
--- a/builtin-blame.c
+++ b/builtin-blame.c
@@ -18,9 +18,10 @@
 #include "cache-tree.h"
 #include "path-list.h"
 #include "mailmap.h"
+#include "exec_cmd.h"
 
 static char blame_usage[] =
-"git-blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-p] [-w] [-L n,m] [-S <revs-file>] [-M] [-C] [-C] [--contents <filename>] [--incremental] [commit] [--] file\n"
+"git-blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-p] [-w] [-L n,m] [-S <revs-file>] [-M] [-C] [-C] [--contents <filename>] [--incremental] [--gui] [commit] [--] file\n"
 "  -c                  Use the same output mode as git-annotate (Default: off)\n"
 "  -b                  Show blank SHA-1 for boundary commits (Default: off)\n"
 "  -l                  Show long commit SHA1 (Default: off)\n"
@@ -34,6 +35,7 @@ static char blame_usage[] =
 "  -L n,m              Process only line range n,m, counting from 1\n"
 "  -M, -C              Find line movements within and across files\n"
 "  --incremental       Show blame entries as we find them, incrementally\n"
+"  --gui               Use git-gui's graphical blame viewer\n"
 "  --contents file     Use <file>'s contents as the final image\n"
 "  -S revs-file        Use revisions from revs-file instead of calling git-rev-list\n";
 
@@ -2137,6 +2139,12 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
 	const char *contents_from = NULL;
 
 	cmd_is_annotate = !strcmp(argv[0], "annotate");
+	if (!cmd_is_annotate && argc > 1 && !strcmp(argv[1], "--gui")) {
+		argv[0] = "gui";
+		argv[1] = "blame";
+		execv_git_cmd(argv);
+		die("Cannot execute git-gui blame: %s", strerror(errno));
+	}
 
 	git_config(git_blame_config);
 	save_commit_buffer = 0;
@@ -2214,6 +2222,8 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
 		else if (!strcmp("-p", arg) ||
 			 !strcmp("--porcelain", arg))
 			output_option |= OUTPUT_PORCELAIN;
+		else if (!strcmp("--gui", arg))
+			die("Cannot combine --gui with %s", argv[i - 1]);
 		else if (!strcmp("--", arg)) {
 			seen_dashdash = 1;
 			i++;
-- 
1.5.2.2.1050.g51a8b
-
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]

  Powered by Linux