Re: [PATCH 0/1] contrib/git-jump: support alias expansion

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

 



On Wed, Sep 04, 2019 at 01:55:00PM -0400, Taylor Blau wrote:

> I often find myself parsing the output of 'git diff' (which I spell 'g
> di') in less, and then wanting to jump to some specific diff in a file,
> i.e., by running 'git jump diff -- <filename>'.
> 
> But, I am so used to typing 'di' instead of 'diff', that I often write
> the later invocation as 'g jump di -- <filename>', and 'git-jump'
> complains that it doesn't know what 'di' means.

Hmm. I'm not exactly _opposed_ to this patch, but it does feel like it's
weirdly conflating git commands with jump modes. Which just happen to
use some of the same verbs, but not not always (e.g., "mode_ws").

And as you note, aliases may carry along options which do not make any
sense for jump modes (or they might; we pass command-line options to
diff and grep, so it's possible the alias could do something useful).

Your case would be equally helped if the tool allowed any non-ambiguous
prefix to be used. But it wouldn't if somebody had "alias.foo = diff" or
something. So I dunno.

I solved this for myself long ago with a mix of git and shell aliases:

  $ git help vgrep
  'vgrep' is aliased to 'jump grep'
  
  $ type d
  d is aliased to `git jump diff'
  
  $ type m
  m is aliased to `git jump merge'

For fun, here's a patch that does the prefix thing (though the $0
hackery may be too much; we list the modes by hand in the usage, after
all).

diff --git a/contrib/git-jump/git-jump b/contrib/git-jump/git-jump
index 931b0fe3a9..c2a092806e 100755
--- a/contrib/git-jump/git-jump
+++ b/contrib/git-jump/git-jump
@@ -64,15 +64,35 @@ mode_ws() {
 	git diff --check "$@"
 }
 
+list_modes() {
+	perl -lne '/^mode_([a-z]+)[ (]/ and print $1' "$0"
+}
+
 if test $# -lt 1; then
 	usage >&2
 	exit 1
 fi
 mode=$1; shift
 
+if ! type "mode_$mode" >/dev/null 2>&1; then
+	found=
+	for i in $(list_modes | grep "^$mode"); do
+		if test -n "$found"; then
+			echo >&2 "ambiguous mode: $mode (matches $found and $i)"
+			exit 1
+		fi
+		found=$i
+	done
+	if test -n "$found"; then
+		mode=$found
+	else
+		usage >&2
+		exit 1
+	fi
+fi
+
 trap 'rm -f "$tmp"' 0 1 2 3 15
 tmp=`mktemp -t git-jump.XXXXXX` || exit 1
-type "mode_$mode" >/dev/null 2>&1 || { usage >&2; exit 1; }
 "mode_$mode" "$@" >"$tmp"
 test -s "$tmp" || exit 0
 open_editor "$tmp"



[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