From: Karl Hasselström <hidden> Date: 2016-08-11 20:34:02
From: Karl Hasselström <redacted>
A minimal bash completion script for StGIT. It completes the
subcommand names, and options and patch names for some subcommands.
Signed-off-by: Karl Hasselström <redacted>
---
I'm not good at all at bash programming -- this script was basically
put together by pattern-matching Shawns git completion code -- so
comments are even more welcome than usual.
contrib/stgit-completion.bash | 156 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 156 insertions(+), 0 deletions(-)
@@ -0,0 +1,156 @@+# bash completion support for StGIT -*- shell-script -*-+#+# Copyright (C) 2006, Karl Hasselström <kha@treskal.com>+# Based on git-completion.sh+#+# To use these routines:+#+# 1. Copy this file to somewhere (e.g. ~/.stgit-completion.bash).+#+# 2. Add the following line to your .bashrc:+# . ~/.stgit-completion.bash++# The path to .git, or empty if we're not in a repository.+_gitdir()+{+echo"$(gitrev-parse--git-dir2>/dev/null)"+}++# Name of the current branch, or empty if there isn't one.+_current_branch()+{+localb=$(gitsymbolic-refHEAD2>/dev/null)+echo${b#refs/heads/}+}++# List of all applied patches.+_applied_patches()+{+localg=$(_gitdir)+["$g"]&&cat"$g/patches/$(_current_branch)/applied"+}++# List of all unapplied patches.+_unapplied_patches()+{+localg=$(_gitdir)+["$g"]&&cat"$g/patches/$(_current_branch)/unapplied"+}++# List of all patches.+_all_patches()+{+localb=$(_current_branch)+localg=$(_gitdir)+["$g"]&&cat"$g/patches/$b/applied""$g/patches/$b/unapplied"+}++# List of all patches except the current patch.+_all_other_patches()+{+localb=$(_current_branch)+localg=$(_gitdir)+["$g"]&&cat"$g/patches/$b/applied""$g/patches/$b/unapplied"\+|grep-v"^$(<$g/patches/$b/current)$"+}++# Generate completions for patches and patch ranges from the given+# patch list function, and options from the given list.+_complete_patch_range()+{+localpatchlist="$1"options="$2"+localpfxcur="${COMP_WORDS[COMP_CWORD]}"+case"$cur"in+*..*)+pfx="${cur%..*}.."+cur="${cur#*..}"+COMPREPLY=($(compgen-P"$pfx"-W"$($patchlist)"--"$cur"))+;;+*)+COMPREPLY=($(compgen-W"$options$($patchlist)"--"$cur"))+;;+esac+}++# Generate completions for options from the given list.+_complete_options()+{+localoptions="$1"+COMPREPLY=($(compgen-W"$options"--"${COMP_WORDS[COMP_CWORD]}"))+}++_stg_delete()+{+_complete_patch_range_all_patches"--branch --help"+}++_stg_goto()+{+_complete_patch_range_all_other_patches"--help"+}++_stg_mail()+{+_complete_patch_range_all_patches\+"--all --to --cc --bcc --auto --noreply --version --prefix --template \+--cover--edit-cover--edit-patches--sleep--refid--smtp-user\+--smtp-password--branch--mbox--help"+}++_stg_new()+{+_complete_options"--message --showpatch --author --authname --authemail \+--authdate--commname--commemail--help"+}++_stg_pop()+{+_complete_patch_range_applied_patches"--all --number --keep --help"+}++_stg_push()+{+_complete_patch_range_unapplied_patches"--all --number --reverse \+--merged--undo--help"+}++_stg_status()+{+_complete_options"--modified --new --deleted --conflict --unknown \+--noexclude--reset--help"+}++_stg()+{+localic=1command++while[$c-lt$COMP_CWORD];do+if[$c==1];then+command="${COMP_WORDS[c]}"+fi+c=$((++c))+done++# Complete name of subcommand.+if[$c-eq$COMP_CWORD-a-z"$command"];then+COMPREPLY=($(compgen\+-W"--help --version \+$(stghelp|grep'^ '|sed's/ *\([^ ]\) .*/\1/')" \+--"${COMP_WORDS[COMP_CWORD]}"))+return;+fi++# Complete arguments to subcommands.+case"$command"in+delete)_stg_delete;;+goto)_stg_goto;;+mail)_stg_mail;;+new)_stg_new;;+pop)_stg_pop;;+push)_stg_push;;+status)_stg_status;;+*)COMPREPLY=();;+esac+}+
From: Karl Hasselström <hidden> Date: 2016-08-11 19:27:55
On 2006-11-16 16:12:43 +0000, Catalin Marinas wrote:
Indeed, stg help takes over 200ms on my machine as well, with hot
caches but this is mainly because it imports all the
stgit.commands.* modules in order to read the short description. The
'stg help <command>' takes around 90ms on my machine since it only
imports one module
Excellent. However, this suggests that an option should be added to
stg that makes it print just the subcommand names, without importing
anything, to get this kind of speed there as well. Call it
--generate-tab-completion or something, and don't print it in the help
output.
(I actually reduced it to 85ms by minimizing the imports even
further).
Goodie. For reference, I think git was able to list its subcommands in
about 20 ms. Just so you know what to aim for. :-)
I could actually hard-code the commands only in the script. At the
moment I removed the _stg_* functions and added some common
_stg_all_patches() to avoid duplicating the code (see attached).
Seems reasonable.
Next time I do some StGIT hacking (not this weekend, unfortunately), I
was planning to build more tab-completion stuff. On top of my list are
fixing basic completion for all subcommands, and fixing some kind of
filename completion. But do feel free to do it first if you like. :-)
--
Karl Hasselström, kha@treskal.com
On 12/11/06, Karl Hasselström [off-list ref] wrote:
A minimal bash completion script for StGIT. It completes the
subcommand names, and options and patch names for some subcommands.
Thanks for the patch. I modified it slightly to automatically generate
the options for other commands as well (by invoking "stg help
<command>" and it doesn't seem to be slow). I'll try to push it
tonight.
Thanks for the other patches as well. I included some but haven't
finished them yet.
--
On 16/11/06, Karl Hasselström [off-list ref] wrote:
On 2006-11-16 14:21:27 +0000, Catalin Marinas wrote:
quoted
Thanks for the patch. I modified it slightly to automatically
generate the options for other commands as well (by invoking "stg
help <command>" and it doesn't seem to be slow). I'll try to push it
tonight.
Hmm. I'll have to try it, but I was half planning to hard-code the
list of subcommands instead of calling "stg help" since it causes a
tangible delay. On the machines I've tried, it easily takes 0.2
seconds to run "stg help" (with hot caches; with cold caches, it's
_really_ bad), and that's bad for interactive behavior.
Indeed, stg help takes over 200ms on my machine as well, with hot
caches but this is mainly because it imports all the stgit.commands.*
modules in order to read the short description. The 'stg help
<command>' takes around 90ms on my machine since it only imports one
module (I actually reduced it to 85ms by minimizing the imports even
further).
I could actually hard-code the commands only in the script. At the
moment I removed the _stg_* functions and added some common
_stg_all_patches() to avoid duplicating the code (see attached).
--
Catalin
From: Karl Hasselström <hidden> Date: 2016-08-11 20:31:14
On 2006-11-16 14:21:27 +0000, Catalin Marinas wrote:
On 12/11/06, Karl Hasselström [off-list ref] wrote:
quoted
A minimal bash completion script for StGIT. It completes the
subcommand names, and options and patch names for some
subcommands.
Thanks for the patch. I modified it slightly to automatically
generate the options for other commands as well (by invoking "stg
help <command>" and it doesn't seem to be slow). I'll try to push it
tonight.
Hmm. I'll have to try it, but I was half planning to hard-code the
list of subcommands instead of calling "stg help" since it causes a
tangible delay. On the machines I've tried, it easily takes 0.2
seconds to run "stg help" (with hot caches; with cold caches, it's
_really_ bad), and that's bad for interactive behavior.
There's also the point that some switches need (or can benefit from)
the tab completion machinery, and thus can't just be automatically
extracted and used. But autocompleting the switch names shouldn't
interfere with that, and hard-coding stuff that changes every now and
then is both morally wrong and a lot of work.
Thanks for the other patches as well. I included some
Ah, thanks!
but haven't finished them yet.
No problem. Thanks to the power of modern version control systems, I'm
able to use my own branch of StGIT in the meantime, on all the various
computers that I use. :-)
--
Karl Hasselström, kha@treskal.com
From: Karl Hasselström <redacted>
A minimal bash completion script for StGIT. It completes the
subcommand names, and options and patch names for some subcommands.
Signed-off-by: Karl Hasselström <redacted>
---
I'm not good at all at bash programming -- this script was basically
put together by pattern-matching Shawns git completion code -- so
comments are even more welcome than usual.
I'm not an StGIT user, but this looks pretty good.
--