git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Catalin Marinas" <catalin.marinas@gmail.com>
To: "Karl Hasselström" <kha@treskal.com>
Cc: git@vger.kernel.org, "Shawn Pearce" <spearce@spearce.org>
Subject: Re: [StGIT PATCH] StGIT bash completion
Date: Thu, 16 Nov 2006 16:12:43 +0000	[thread overview]
Message-ID: <b0943d9e0611160812s6ffec19fm4bf079e08e5fce01@mail.gmail.com> (raw)
In-Reply-To: <20061116154002.GA20729@diana.vm.bytemark.co.uk>

[-- Attachment #1: Type: text/plain, Size: 1245 bytes --]

On 16/11/06, Karl Hasselström <kha@treskal.com> wrote:
> On 2006-11-16 14:21:27 +0000, Catalin Marinas wrote:
> > 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

[-- Attachment #2: stgit-completion.bash --]
[-- Type: application/octet-stream, Size: 4282 bytes --]

# 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

stg_commands="
    --help
    --version
    add
    applied
    assimilate
    branch
    delete
    diff
    clean
    clone
    commit
    export
    files
    float
    fold
    goto
    help
    id
    import
    init
    log
    mail
    new
    patches
    pick
    pop
    pull
    push
    refresh
    rename
    resolved
    rm
    series
    show
    status
    top
    unapplied
    uncommit
"

# The path to .git, or empty if we're not in a repository.
_gitdir ()
{
    echo "$(git rev-parse --git-dir 2>/dev/null)"
}

# Name of the current branch, or empty if there isn't one.
_current_branch ()
{
    local b=$(git symbolic-ref HEAD 2>/dev/null)
    echo ${b#refs/heads/}
}

# List of all applied patches.
_applied_patches ()
{
    local g=$(_gitdir)
    [ "$g" ] && cat "$g/patches/$(_current_branch)/applied"
}

# List of all unapplied patches.
_unapplied_patches ()
{
    local g=$(_gitdir)
    [ "$g" ] && cat "$g/patches/$(_current_branch)/unapplied"
}

# List of all patches.
_all_patches ()
{
    local b=$(_current_branch)
    local g=$(_gitdir)
    [ "$g" ] && cat "$g/patches/$b/applied" "$g/patches/$b/unapplied"
}

# List of all patches except the current patch.
_all_other_patches ()
{
    local b=$(_current_branch)
    local g=$(_gitdir)
    [ "$g" ] && cat "$g/patches/$b/applied" "$g/patches/$b/unapplied" \
        | grep -v "^$(< $g/patches/$b/current)$"
}

# List the command options
_cmd_options ()
{
    stg $1 --help | grep -e " --[A-Za-z]" | sed -e "s/.*\(--[A-Za-z]\+\).*/\1/"
}

# Generate completions for patches and patch ranges from the given
# patch list function, and options from the given list.
_complete_patch_range ()
{
    local patchlist="$1" options="$2"
    local pfx cur="${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 ()
{
    local options="$1"
    COMPREPLY=($(compgen -W "$options" -- "${COMP_WORDS[COMP_CWORD]}"))
}

_stg_common ()
{
    _complete_options "$(_cmd_options $1)"
}

_stg_all_patches ()
{
    _complete_patch_range _all_patches "$(_cmd_options $1)"
}

_stg_other_patches ()
{
    _complete_patch_range _all_other_patches "$(_cmd_options $1)"
}

_stg_applied_patches ()
{
    _complete_patch_range _applied_patches "$(_cmd_options $1)"
}

_stg_unapplied_patches ()
{
    _complete_patch_range _unapplied_patches "$(_cmd_options $1)"
}

_stg ()
{
    local i c=1 command

    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 "$stg_commands" \
            -- "${COMP_WORDS[COMP_CWORD]}"))
        return;
    fi

    # Complete arguments to subcommands.
    case "$command" in
        # repository commands
        id)     _stg_all_patches $command ;;
        # stack commands
        float)  _stg_all_patches $command ;;
        goto)   _stg_other_patches $command ;;
        pop)    _stg_applied_patches $command ;;
        push)   _stg_unapplied_patches $command ;;
        # patch commands
        delete) _stg_all_patches $command ;;
        export) _stg_applied_patches $command ;;
        files)  _stg_all_patches $command ;;
        log)    _stg_all_patches $command ;;
        mail)   _stg_applied_patches $command ;;
        pick)   _stg_unapplied_patches $command ;;
        rename) _stg_all_patches $command ;;
        show)   _stg_all_patches $command ;;
        # all the other commands
        *)      _stg_common $command ;;
    esac
}

complete -o default -F _stg stg

  reply	other threads:[~2006-11-16 16:12 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-11-12 21:18 [StGIT PATCH] StGIT bash completion Karl Hasselström
2006-11-13  5:04 ` Shawn Pearce
2006-11-16 14:21 ` Catalin Marinas
2006-11-16 15:40   ` Karl Hasselström
2006-11-16 16:12     ` Catalin Marinas [this message]
2006-11-16 16:29       ` Karl Hasselström

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b0943d9e0611160812s6ffec19fm4bf079e08e5fce01@mail.gmail.com \
    --to=catalin.marinas@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=kha@treskal.com \
    --cc=spearce@spearce.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).