Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: PATCH: _bzr



There's another _bzr completion function available that was in the bzr
repository (in the contrib/zsh subdir).  This one is more complete than
what we have, so I refined it quite a bit, and then checked it in.

Since many of you folks are much better at completion functions than me,
please feel free to give it a look and see if it can't be improved even
more.  I'll attach it to this message to make it easy to review...

..wayne..
#compdef bzr

# bzr is the bazaar-ng revision-control system

local curcontext="$curcontext" state line expl cmd args ret=1
typeset -A opt_args

_arguments -C \
    '1: :->cmd' \
    '*:: :->args' && ret=0

if (( ! $+_bzr_cmds )); then
    typeset -gH _bzr_cmds
    _bzr_cmds=(${(f)"$(_call_program bzr bzr shell-complete)"})
fi

if [[ $state != 'args' ]]; then
    _describe -t subcommand 'subcommand' _bzr_cmds
    return 0
fi

cmd="$words[1]"
curcontext="${curcontext%:*:*}:bzr-$cmd:"

(( $+functions[_bzr_unknownFiles] )) ||
_bzr_unknownFiles() {
    local fileList
    fileList=(${(ps:\0:)"$(bzr ls --null --unknown)"})
    compadd -af fileList
    return 0
}

(( $+functions[_bzr_unknownRoot] )) ||
_bzr_unknownRoot() {
    local fileList
    fileList=(${(ps:\0:)"$(bzr ls --null --from-root --unknown)"})
    compadd -af fileList
    return 0
}

(( $+functions[_bzr_versionedFiles] )) ||
_bzr_versionedFiles() {
    local fileList
    fileList=(${(ps:\0:)"$(bzr ls --null --versioned)"})
    compadd -af fileList
    return 0
}

(( $+functions[_bzr_completeParents] )) ||
_bzr_completeParents() {
    local parentFile=$(bzr root 2>/dev/null)/.bzr/parent
    [[ -r $parentFile ]] && compadd -X "Completing parents" $(cat $parentFile)
}

args=( '(-)'{--help,-h}'[show help message]' )

case $cmd in
(add)
    args+=(
	'--no-recurse[do not recurse into subdirectories]'
	'(-q --quiet)'{--quiet,-q}'[be quiet]'
	'*:unknown files:_bzr_unknownFiles'
	)
    ;;

(annotate|praise|blame)
    args+=( '*:files:_bzr_versionedFiles' )
    ;;

(clone|branch|get)
    args+=(
	'(-r --revision)'{--revision,-r}'[revision]:rev:'
	'--basis[specify basis branch]:basis:'
	)
    if (( CURRENT == 2 )); then
	args+=( '*:FROM_LOCATION:_files -/' )
    elif (( CURRENT == 3 )); then
	args+=( '*:TO_LOCATION:_files -/' )
    fi
    ;;

(rename|mv)
    if (( CURRENT == 2 )); then
	args+=( '*:old name:_bzr_versionedFiles' )
    else
	args+=( '*:new name:' )
    fi
    ;;

(cat)
    args+=(
	'(-r --revision)'{--revision,-r}'[revision]:rev:'
	'*:file:_bzr_versionedFiles'
	)
    ;;

(root)
    args+=( '*:file:_files' )
    ;;

(log)
    args+=(
	'(-r --revision)'{--revision,-r}'[revision or range]:rev or rev range:'
	'(-v --verbose)'{--verbose,-v}'[show revision manifest]'
	'(-l --short --long)'{--long,-l}'[use long format (default)]'
	'(-l --long)--short[use short format]'
	'(-m --message)'{--message,-m}'[specify regexp]:regexp:'
	'--show-ids[show file IDs]'
	'--forward[reverse direction of revisions]'
	'--timezone[specify timezone for dates]:timezone:'
	'*:file:_bzr_versionedFiles'
	)
    ;;

(resolve)
    args+=(
	'--all[resolve all conflicts in this tree]'
	'*:file:_bzr_versionedFiles'
	)
    ;;

(status|st|stat)
    args+=(
	'--all[include unchanged versioned files]'
	'--show-ids[show file IDs]'
	'*:file:_bzr_versionedFiles'
	)
    ;;

(check)
    args+=(
	'(-v --verbose)'{--verbose,-v}'[display more information]'
	'*:DIR:_files -/'
	)
    ;;

(mkdir|upgrade|renames)
    args+=( '*:DIR:_files -/' )
    ;;

(remove|rm)
    args+=(
	'(-v --verbose)'{--verbose,-v}'[display more information]'
	'*:file:_bzr_versionedFiles'
	)
    ;;

(pull)
    args+=(
	'--remember[Remember the specified location as a default]'
	'--overwrite[Ignore differences, overwrite unconditionally]'
	'*:local repository:_files -/'
	)
    _bzr_completeParents
    ;;

(missing)
    args+=(
	'(-v --verbose -q --quiet)'{--verbose,-v}'[display more information]'
	'(-q --quiet -v --verbose)'{--quiet,-q}'[be quiet]'
	'(-l --long --short --log_format)--line[Use log format with one line per revision. Same as "--log-format line"]'
	'(-l --long --short --line)--log-format[Use the specified log format]:log format'
	'(-l --long --short --line --log-format)'{--long,-l}'[Use detailed log format. Same as "--log-format long"]'
	'--mine-only[Display changes in the local branch only]'
	'--reverse[Reverse the order of revisions]'
	'(-l --long --log_format)--short[Use moderately short log format. Same as "--log-format short"]'
	'--show-ids[show internal object ids]'
	'--theirs-only[Display changes in the remote branch only]'
	'*:local repository:_files -/'
	)
    _bzr_completeParents
    ;;

(commit|checkin|ci)
    args+=(
	'(-m --message)'{--message,-m}'[commit message]:message text:'
	'(-F --file)'{--file,-F}'[commit message from file]:message file:'
	'--unchanged[include unchanged files]'
	'(-v --verbose)'{--verbose,-v}'[display more information]'
	'*:modified files:_bzr_versionedFiles'
	)
    ;;

(conflicts|added|deleted|modified|unknowns|directories|ignored)
    ;;

(revno|init|version)
    ;;

(whoami)
    args+=( '--email[only show e-mail address]' )
    ;;

(inventory)
    args+=(
	'(-r --revision)'{--revision,-r}'[show inventory of a revision]:revision:'
	'--show-ids[show file IDs]'
	)
    ;;

(diff|dif|di)
    args+=(
	'(-r --revision)'{--revision,-r}'[revision]:revision:'
	'--diff-options[options to pass to gdiff]:diff options:'
	'*:files:_files'
	)
    ;;

(export)
    args+=(
	'(-r --revision)'{--revision,-r}'[revision]:revision:'
	'--format=[format of exported file]:format:(dir tar tgz tbz2)'
	'--root[root directory of patch]:_files -/'
	'*:destination:_files'
	)
    ;;

(ignore)
    args+=( '*:NAME_PATTERN:_bzr_unknownRoot' )
    ;;

(info)
    args+=( '*:branch:_files -/' )
    ;;

(testament)
    args+=(
	'(-r --revision)'{--revision,-r}'[revision]:revision:'
	'(-l --long)'{--long,-l}'[use long format]'
	'*:branch:_files -/'
	)
    ;;

(revert|merge-revert)
    args+=(
	'(-r --revision)'{--revision,-r}'[revision]:revision:'
	'--no-backup[skip generation of backup~ files]'
	'*:file:_bzr_versionedFiles'
	)
    ;;

(merge)
    args+=(
	'(-r --revision)'{--revision,-r}'[revision]:revision:'
	'--reprocess[Reprocess to reduce spurious conflicts]'
	'--show-base[Show base revision text in conflicts]'
	'--force[ignore uncommitted changes]'
	'--merge-type:merge type:(diff3 merge3 weave)'
	'*:local repository:_files -/'
	)
    _bzr_completeParents
    ;;

(ls)
    args+=(
	'(-v --verbose)'{--verbose,-v}'[display more information]'
	'(-r --revision)'{--revision,-r}'[revision]:revision:'
	'--from-root[Print all paths from the root of the branch]'
	'--non-recursive[Do not recurse into subdirectories]'
	'--null[Null separate the files]'
	'--ignored[Print ignored files]'
	'--unknown[Print unknown files]'
	'--versioned[Print versioned files]'
	)
    ;;

(move)
    if (( CURRENT == 2 )); then
	args+=(
	   '*:files:_bzr_versionedFiles'
	   )
    else
	args=(
	    '*:destination dir:_files -/'
	    )
    fi
    ;;

(help)
    args=(
	'(-l --long)'{--long,-l}'[use long format]'
	'*:subcmds:->cmds'
	)
    _arguments -s "$args[@]" && ret=0
    _describe -t subcommand 'subcommand' _bzr_cmds
    return 0
    ;;

    # Plugins

(visualize|visualise|viz|vis)
    args+=( '(-r --revision)'{--revision,-r}'[starting revision]:rev:' )
    ;;

(gannotate|gblame|gpraise)
    args+=(
	'--all[show annotations on all lines]'
	'--plain[do not hightlight annotation lines]'
	'*:files:_bzr_versionedFiles'
	)
    ;;

(push)
    args+=(
	'--overwrite[Ignore differences, overwrite unconditionally]'
	'*:local repository:_files -/'
	)
    _bzr_completeParents
    ;;

(clean-tree)
    args+=(
	'--dry-run[show files to delete instead of deleting them]'
	'--ignored[delete all ignored files]'
	'--detritus[delete conflict files, merge backups, failed self-tests, *~, *.tmp, etc]'
	)
    ;;

(*)
    _message "unknown bzr command completion: $cmd"
    return 1
    ;;
esac

_arguments -s "$args[@]" && ret=0
return ret


Messages sorted by: Reverse Date, Date, Thread, Author