git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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

From
Jeff King <peff@peff.net>
Date
Sep 5, 2019, 06:04 UTC
Message-ID
<20190905060427.GA21450@sigill.intra.peff.net>
In-Reply-To
<cover.1567619579.git.me@ttaylorr.com>
On Wed, Sep 04, 2019 at 01:55:00PM -0400, Taylor Blau wrote:
Show 7 quoted lines
> 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"
Previous: Taylor Blau
Message 4 of 4 in “contrib/git-jump: support alias expansion”
  1. 0/1 contrib/git-jump: support alias expansionTaylor Blau, Sep 4, 2019
  2. 1/1 contrib/git-jump/git-jump: support alias expansionTaylor Blau, Sep 4, 2019
  3. Taylor BlauSep 4, 2019
  4. Jeff KingSep 5, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.