All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] completion: Handle '!f() { ... }; f' aliases
@ 2014-06-07 14:10 Steffen Prohaska
  2014-06-08  9:02 ` Eric Sunshine
  0 siblings, 1 reply; 6+ messages in thread
From: Steffen Prohaska @ 2014-06-07 14:10 UTC (permalink / raw)
  To: git; +Cc: Steffen Prohaska

'!f() { ... }; f' is a recommended pattern to declare more complex
aliases (see git wiki [1]).  This commit teaches the completion to
handle them.

When determining which completion to use for an alias, the opening brace
is now ignored in order to continue the search for a git command inside
the function body.  For example, the alias '!f() { git commit ... }' now
triggers commit completion.  Previously, the search stopped on '{', and
the completion tried it to determine how to complete, which obviously
was useless.

Furthermore, the null command ':' is now skipped, so that it can be used
as a workaround to declare the desired completion style.  For example,
the alias '!f() { : git commit ; if ...  ' now triggers commit
completion.

[1] https://git.wiki.kernel.org/index.php/Aliases

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
---
 contrib/completion/git-completion.bash |  7 +++++++
 t/t9902-completion.sh                  | 20 ++++++++++++++++++++
 2 files changed, 27 insertions(+)

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 2c59a76..aecb975 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -21,6 +21,11 @@
 #        source ~/.git-completion.sh
 #    3) Consider changing your PS1 to also show the current branch,
 #       see git-prompt.sh for details.
+#
+# If you use complex aliases of form '!f() { ... }; f', you can use the null
+# command ':' as the first command in the function body to declare the desired
+# completion style.  For example '!f() { : git commit ; ... }; f' will
+# tell the completion to use commit completion.
 
 case "$COMP_WORDBREAKS" in
 *:*) : great ;;
@@ -781,6 +786,8 @@ __git_aliased_command ()
 		-*)	: option ;;
 		*=*)	: setting env ;;
 		git)	: git itself ;;
+		{)	: skip start of shell helper function ;;
+		:)	: skip null command ;;
 		*)
 			echo "$word"
 			return
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 2d4beb5..ea48681 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -550,6 +550,26 @@ test_expect_success 'complete files' '
 	test_completion "git add mom" "momified"
 '
 
+test_expect_success 'completion uses <cmd> completion for alias !f() { VAR=val git <cmd> ... }' '
+	git config alias.co "!f() { VAR=val git checkout ... ; } f" &&
+	test_completion "git co m" <<-\EOF &&
+	master Z
+	mybranch Z
+	mytag Z
+	EOF
+	git config --unset alias.co
+'
+
+test_expect_success 'completion used <cmd> completion for alias !f() { : git <cmd> ; ... }' '
+	git config alias.co "!f() { : git checkout ; if ... } f" &&
+	test_completion "git co m" <<-\EOF &&
+	master Z
+	mybranch Z
+	mytag Z
+	EOF
+	git config --unset alias.co
+'
+
 test_expect_failure 'complete with tilde expansion' '
 	git init tmp && cd tmp &&
 	test_when_finished "cd .. && rm -rf tmp" &&
-- 
2.0.0.244.g4e8e734

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

* Re: [PATCH] completion: Handle '!f() { ... }; f' aliases
  2014-06-07 14:10 [PATCH] completion: Handle '!f() { ... }; f' aliases Steffen Prohaska
@ 2014-06-08  9:02 ` Eric Sunshine
  2014-06-09 12:54   ` [PATCH v2] " Steffen Prohaska
  0 siblings, 1 reply; 6+ messages in thread
From: Eric Sunshine @ 2014-06-08  9:02 UTC (permalink / raw)
  To: Steffen Prohaska; +Cc: Git List

On Sat, Jun 7, 2014 at 10:10 AM, Steffen Prohaska <prohaska@zib.de> wrote:
> '!f() { ... }; f' is a recommended pattern to declare more complex
> aliases (see git wiki [1]).  This commit teaches the completion to
> handle them.
>
> When determining which completion to use for an alias, the opening brace
> is now ignored in order to continue the search for a git command inside
> the function body.  For example, the alias '!f() { git commit ... }' now
> triggers commit completion.  Previously, the search stopped on '{', and
> the completion tried it to determine how to complete, which obviously
> was useless.
>
> Furthermore, the null command ':' is now skipped, so that it can be used
> as a workaround to declare the desired completion style.  For example,
> the alias '!f() { : git commit ; if ...  ' now triggers commit
> completion.
>
> [1] https://git.wiki.kernel.org/index.php/Aliases
>
> Signed-off-by: Steffen Prohaska <prohaska@zib.de>
> ---
> diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
> index 2d4beb5..ea48681 100755
> --- a/t/t9902-completion.sh
> +++ b/t/t9902-completion.sh
> @@ -550,6 +550,26 @@ test_expect_success 'complete files' '
>         test_completion "git add mom" "momified"
>  '
>
> +test_expect_success 'completion uses <cmd> completion for alias !f() { VAR=val git <cmd> ... }' '
> +       git config alias.co "!f() { VAR=val git checkout ... ; } f" &&

test_config would be an appropriate replacement for "git config" +
"git config --unset".

> +       test_completion "git co m" <<-\EOF &&
> +       master Z
> +       mybranch Z
> +       mytag Z
> +       EOF
> +       git config --unset alias.co
> +'
> +
> +test_expect_success 'completion used <cmd> completion for alias !f() { : git <cmd> ; ... }' '
> +       git config alias.co "!f() { : git checkout ; if ... } f" &&

Ditto.

> +       test_completion "git co m" <<-\EOF &&
> +       master Z
> +       mybranch Z
> +       mytag Z
> +       EOF
> +       git config --unset alias.co
> +'
> +
>  test_expect_failure 'complete with tilde expansion' '
>         git init tmp && cd tmp &&
>         test_when_finished "cd .. && rm -rf tmp" &&
> --
> 2.0.0.244.g4e8e734

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

* [PATCH v2] completion: Handle '!f() { ... }; f' aliases
  2014-06-08  9:02 ` Eric Sunshine
@ 2014-06-09 12:54   ` Steffen Prohaska
  2014-06-10  5:27     ` Junio C Hamano
  0 siblings, 1 reply; 6+ messages in thread
From: Steffen Prohaska @ 2014-06-09 12:54 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Eric Sunshine, Steffen Prohaska

'!f() { ... }; f' is a recommended pattern to declare more complex
aliases (see git wiki [1]).  This commit teaches the completion to
handle them.

When determining which completion to use for an alias, the opening brace
is now ignored in order to continue the search for a git command inside
the function body.  For example, the alias '!f() { git commit ... }' now
triggers commit completion.  Previously, the search stopped on '{', and
the completion tried it to determine how to complete, which obviously
was useless.

Furthermore, the null command ':' is now skipped, so that it can be used
as a workaround to declare the desired completion style.  For example,
the alias '!f() { : git commit ; if ...  ' now triggers commit
completion.

[1] https://git.wiki.kernel.org/index.php/Aliases

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
---

I changed the tests to use test_config, as Eric suggested.  Thanks.

 contrib/completion/git-completion.bash |  7 +++++++
 t/t9902-completion.sh                  | 18 ++++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 2c59a76..aecb975 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -21,6 +21,11 @@
 #        source ~/.git-completion.sh
 #    3) Consider changing your PS1 to also show the current branch,
 #       see git-prompt.sh for details.
+#
+# If you use complex aliases of form '!f() { ... }; f', you can use the null
+# command ':' as the first command in the function body to declare the desired
+# completion style.  For example '!f() { : git commit ; ... }; f' will
+# tell the completion to use commit completion.
 
 case "$COMP_WORDBREAKS" in
 *:*) : great ;;
@@ -781,6 +786,8 @@ __git_aliased_command ()
 		-*)	: option ;;
 		*=*)	: setting env ;;
 		git)	: git itself ;;
+		{)	: skip start of shell helper function ;;
+		:)	: skip null command ;;
 		*)
 			echo "$word"
 			return
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 2d4beb5..10ceb29 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -550,6 +550,24 @@ test_expect_success 'complete files' '
 	test_completion "git add mom" "momified"
 '
 
+test_expect_success 'completion uses <cmd> completion for alias !f() { VAR=val git <cmd> ... }' '
+	test_config alias.co "!f() { VAR=val git checkout ... ; } f" &&
+	test_completion "git co m" <<-\EOF
+	master Z
+	mybranch Z
+	mytag Z
+	EOF
+'
+
+test_expect_success 'completion used <cmd> completion for alias !f() { : git <cmd> ; ... }' '
+	test_config alias.co "!f() { : git checkout ; if ... } f" &&
+	test_completion "git co m" <<-\EOF
+	master Z
+	mybranch Z
+	mytag Z
+	EOF
+'
+
 test_expect_failure 'complete with tilde expansion' '
 	git init tmp && cd tmp &&
 	test_when_finished "cd .. && rm -rf tmp" &&
-- 
2.0.0.244.g4e8e734

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

* Re: [PATCH v2] completion: Handle '!f() { ... }; f' aliases
  2014-06-09 12:54   ` [PATCH v2] " Steffen Prohaska
@ 2014-06-10  5:27     ` Junio C Hamano
  2014-06-12 18:41       ` Steffen Prohaska
  0 siblings, 1 reply; 6+ messages in thread
From: Junio C Hamano @ 2014-06-10  5:27 UTC (permalink / raw)
  To: Steffen Prohaska; +Cc: git, Eric Sunshine

Steffen Prohaska <prohaska@zib.de> writes:

> '!f() { ... }; f' is a recommended pattern to declare more complex
> aliases (see git wiki [1]).  This commit teaches the completion to
> handle them.

Hmm, I've never endorsed nor recommended such a notation myself ;-)
I tend to prefer writing it like so instead:

    sh -c '...' -

so that I won't clobber "f" (or any other name).  I wonder if you
can help users of this other pattern as well.

> When determining which completion to use for an alias, the opening brace
> is now ignored in order to continue the search for a git command inside
> the function body.  For example, the alias '!f() { git commit ... }' now
> triggers commit completion.

I suspect that "scanning" is error-prone.  I like this one for its
cuteness very much, though:

> Furthermore, the null command ':' is now skipped, so that it can be used
> as a workaround to declare the desired completion style.  For example,
> the alias '!f() { : git commit ; if ...  ' now triggers commit
> completion.



> +test_expect_success 'completion uses <cmd> completion for alias !f() { VAR=val git <cmd> ... }' '
> +	test_config alias.co "!f() { VAR=val git checkout ... ; } f" &&

Is it only "f" that is completed, or can I spell it using another
arbitrary token, e.g.

	test_config alias.co "!co () { git checkout ... } co"

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

* Re: [PATCH v2] completion: Handle '!f() { ... }; f' aliases
  2014-06-10  5:27     ` Junio C Hamano
@ 2014-06-12 18:41       ` Steffen Prohaska
  2014-06-12 18:49         ` [PATCH v2] completion: Handle '!f() { ... }; f' and "!sh -c '...'" aliases Steffen Prohaska
  0 siblings, 1 reply; 6+ messages in thread
From: Steffen Prohaska @ 2014-06-12 18:41 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Eric Sunshine


On Jun 10, 2014, at 7:27 AM, Junio C Hamano <gitster@pobox.com> wrote:

> Steffen Prohaska <prohaska@zib.de> writes:
> 
> I tend to prefer writing it like so instead:
> 
>    sh -c '...' -
> 
> so that I won't clobber "f" (or any other name).  I wonder if you
> can help users of this other pattern as well.

I'll send an updated patch that handles it.


>> +test_expect_success 'completion uses <cmd> completion for alias !f() { VAR=val git <cmd> ... }' '
>> +	test_config alias.co "!f() { VAR=val git checkout ... ; } f" &&
> 
> Is it only "f" that is completed, or can I spell it using another
> arbitrary token, e.g.
> 
> 	test_config alias.co "!co () { git checkout ... } co"

Any token that starts with ! already worked before. 

The updated patch will also handle spaces before the parens.

	Steffen

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

* [PATCH v2] completion: Handle '!f() { ... }; f' and "!sh -c '...'" aliases
  2014-06-12 18:41       ` Steffen Prohaska
@ 2014-06-12 18:49         ` Steffen Prohaska
  0 siblings, 0 replies; 6+ messages in thread
From: Steffen Prohaska @ 2014-06-12 18:49 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Eric Sunshine, Steffen Prohaska

'!f() { ... }; f' and "!sh -c '....'" are recommended patterns for
declaring more complex aliases (see git wiki [1]).  This commit teaches
the completion to handle them.

When determining which completion to use for an alias, an opening brace
or single quote is now skipped, and the search for a git command is
continued.  For example, the aliases '!f() { git commit ... }' or "!sh
-c 'git commit ...'" now trigger commit completion.  Previously, the
search stopped on the opening brace or quote, and the completion tried
it to determine how to complete, which obviously was useless.

The null command ':' is now skipped, so that it can be used as
a workaround to declare the desired completion style.  For example, the
aliases '!f() { : git commit ; if ...  ' and "!sh -c ': git commit; if
...'" now trigger commit completion.

Shell function declarations now work with or without space before
the parens, i.e. '!f() ...' and '!f () ...' both work.

[1] https://git.wiki.kernel.org/index.php/Aliases

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
---
 contrib/completion/git-completion.bash | 10 ++++++++++
 t/t9902-completion.sh                  | 27 +++++++++++++++++++++++++++
 2 files changed, 37 insertions(+)

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 2c59a76..575f8f7 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -21,6 +21,12 @@
 #        source ~/.git-completion.sh
 #    3) Consider changing your PS1 to also show the current branch,
 #       see git-prompt.sh for details.
+#
+# If you use complex aliases of form '!f() { ... }; f', you can use the null
+# command ':' as the first command in the function body to declare the desired
+# completion style.  For example '!f() { : git commit ; ... }; f' will
+# tell the completion to use commit completion.  This also works with aliases
+# of form "!sh -c '...'".  For example, "!sh -c ': git commit ; ... '".
 
 case "$COMP_WORDBREAKS" in
 *:*) : great ;;
@@ -781,6 +787,10 @@ __git_aliased_command ()
 		-*)	: option ;;
 		*=*)	: setting env ;;
 		git)	: git itself ;;
+		\(\))   : skip parens of shell function definition ;;
+		{)	: skip start of shell helper function ;;
+		:)	: skip null command ;;
+		\'*)	: skip opening quote after sh -c ;;
 		*)
 			echo "$word"
 			return
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 2d4beb5..1d1c106 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -550,6 +550,33 @@ test_expect_success 'complete files' '
 	test_completion "git add mom" "momified"
 '
 
+test_expect_success "completion uses <cmd> completion for alias: !sh -c 'git <cmd> ...'" '
+	test_config alias.co "!sh -c '"'"'git checkout ...'"'"'" &&
+	test_completion "git co m" <<-\EOF
+	master Z
+	mybranch Z
+	mytag Z
+	EOF
+'
+
+test_expect_success 'completion uses <cmd> completion for alias: !f () { VAR=val git <cmd> ... }' '
+	test_config alias.co "!f () { VAR=val git checkout ... ; } f" &&
+	test_completion "git co m" <<-\EOF
+	master Z
+	mybranch Z
+	mytag Z
+	EOF
+'
+
+test_expect_success 'completion used <cmd> completion for alias: !f() { : git <cmd> ; ... }' '
+	test_config alias.co "!f() { : git checkout ; if ... } f" &&
+	test_completion "git co m" <<-\EOF
+	master Z
+	mybranch Z
+	mytag Z
+	EOF
+'
+
 test_expect_failure 'complete with tilde expansion' '
 	git init tmp && cd tmp &&
 	test_when_finished "cd .. && rm -rf tmp" &&
-- 
2.0.0.244.g4e8e734

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

end of thread, other threads:[~2014-06-12 18:50 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-07 14:10 [PATCH] completion: Handle '!f() { ... }; f' aliases Steffen Prohaska
2014-06-08  9:02 ` Eric Sunshine
2014-06-09 12:54   ` [PATCH v2] " Steffen Prohaska
2014-06-10  5:27     ` Junio C Hamano
2014-06-12 18:41       ` Steffen Prohaska
2014-06-12 18:49         ` [PATCH v2] completion: Handle '!f() { ... }; f' and "!sh -c '...'" aliases Steffen Prohaska

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.