#compdef tla autoload -z is-at-least local TLA=$words[1] local tla_version local hide_short # ask the user which version of tla this is if ! zstyle -s ":completion:${curcontext}:" tla-version tla_version; then # ask tla instead tla_version="$($TLA --version)" if [[ "${${(f)tla_version}[1]}" == The\ GNU\ Arch\ Revision\ Control\ System\ \(tla\)\ (#b)([0-9.]##) ]]; then tla_version="$match[1]" else tla_version="${${$($TLA --version)#tla tla-}%% from regexps.com*}" [[ $tla_version == *[a-zA-Z]* ]] && tla_version=1.3 # tla doesn't know fi fi # test whether to hide short options from completion if zstyle -s ":completion:${curcontext}:" hide-shortopts hide_short; then case $hide_short in true|yes|on|1) hide_short='!' ;; *) hide_short='' ;; esac fi # completion functions (( $+functions[_tla_archives] )) || _tla_archives () { _arch_archives tla "$@" } (( $+functions[_tla_categories] )) || _tla_categories () { _arch_namespace tla 1 "$argv[@]" } (( $+functions[_tla_branches] )) || _tla_branches () {_arch_namespace tla 2 "$argv[@]" } (( $+functions[_tla_versions] )) || _tla_versions () { _arch_namespace tla 3 "$argv[@]" } (( $+functions[_tla_revisions] )) || _tla_revisions () { _arch_namespace tla 4 "$argv[@]" } (( $+functions[_tla_local_revisions] )) || _tla_local_revisions () { local expl1 expl2 tree_version=`$TLA tree-version` _description -V applied-patches expl1 "patches from this version" _description -V other-patches expl2 "patches from other versions" compadd "$expl1[@]" `$TLA logs` compadd "$expl2[@]" `$TLA logs --full $($TLA log-versions | grep -v $tree_version)` # This is incredibly slow. # Should complete based on -A, -R, -d } (( $+functions[_tla_config] )) || _tla_config () { # zsh 4.1.1+ is recommended; 4.0.6 gives the error below when doing # tla build-config e # _path_files:322: no matches found: configs//e/.(/) # whereas 4.1.1 completes correctly local configdir root ret=1 n expl n=$opt_args[(i)(-d|--dir)] [[ -n "$n" ]] && configdir=$opt_args[$n] root="$(_call_program tla $TLA tree-root ${configdir} 2>&1)" if (( $? )); then _message -e messages "Error: $root" return $ret fi if [[ -d "$root/configs" ]]; then configdir=("$root/configs") _description files expl '%Bconfig file%b' _files -W configdir "$expl[@]" && ret=0 else _message -e messages "No configs/ directory in tree whose root is $root" fi return $ret } (( $+functions[_tla_limit] )) || _tla_limit () { #presently only does push-mirror style limits [[ $words[$CURRENT] == *@* ]] && return 1 local expl archive archive=${words[(r)*@*]:-$($TLA my-default-archive 2> /dev/null)} if [ $archive ]; then if [[ $PREFIX != *--* ]]; then _description -V categories expl "categories in $archive" compadd -q -S -- "$expl[@]" `$TLA categories -A $archive` else _tla_namespace_branches 3 fi fi } (( $+functions[_tla_tree_or_rev] )) || _tla_tree_or_rev () { _alternative 'trees:tree:_files -/' 'revisions:revision:_tla_revisions' } (( $+functions[_tla_libraries] )) || _tla_libraries () { local libraries expl libraries=($(_call_program tla $TLA my-revision-library)) _description -V libraries expl "revision libraries" compadd "$expl[@]" -a libraries } (( $+functions[_tla_my_revision_library] )) || _tla_my_revision_library () { if [[ -n $words[(r)-d] ]] || [[ -n $words[(r)--delete] ]]; then _tla_libraries else _files -/ fi } (( $+functions[_tla_log_versions] )) || _tla_log_versions () { local logs expl if is-at-least 1.1 $tla_version; then logs=($(_call_program tla $TLA log-versions)) else logs=($(_call_program tla $TLA logs)) fi _description -V versions expl "log versions" compadd "$expl[@]" -a logs } # command argument definitions # commands with different versions local cmd_register_archive cmd_archives cmd_ls_archives cmd_redo local cmd_redo_changes cmd_changes cmd_what_changed cmd_categories local cmd_branches cmd_versions cmd_cacherev cmd_logs cmd_log_versions local cmd_log_ls cmd_update cmd_join_branch cmd_replay cmd_deltapatch local cmd_delta_patch cmd_apply_delta cmd_sync_tree cmd_make_sync_tree local cmd_delta cmd_revdelta cmd_library_categories cmd_library_branches local cmd_library_versions cmd_library_revisions local cmd_archive_register cmd_log_ls=('*:version:_tla_log_versions') cmd_log_versions=() # the options should only complete items that are in the tree if is-at-least 1.1 $tla_version; then cmd_register_archive=('::archive:_tla_archives' ':location:_files -/') cmd_archive_register=($cmd_register_archive) cmd_archives=('::regex:') cmd_redo=('::changeset:_files -/') cmd_changes=('::revision:_tla_revisions' # ':separator:(--)' '*::limit:_files' #don't understand the limit usage ) cmd_categories=('::archive:_tla_archives') cmd_branches=('::category:_tla_categories') cmd_versions=('::branch:_tla_branches') cmd_cacherev=('::revision:_tla_revisions') #should only complete non-cached revisions cmd_logs=($cmd_log_ls) cmd_update=('::revision:_tla_revisions') cmd_join_branch=(':revision:_tla_revisions') #should only complete continuation revisions cmd_replay=('*::revision:_tla_revisions') cmd_deltapatch=(':FROM:_tla_tree_or_rev' ':TO:_tla_tree_or_rev') cmd_sync_tree=(':revision:_tla_revisions') cmd_delta=(':FROM:_tla_tree_or_rev' ':TO:_tla_tree_or_rev' '::DEST:_files -/') cmd_library_categories=('::archive:_tla_archives --library') cmd_library_branches=('::category:_tla_categories --library') cmd_library_versions=('::branch:_tla_branches --library') cmd_library_revisions=('::version:_tla_versions --library') else cmd_register_archive=(':archive:_tla_archives' ':location:_files -/') cmd_archives=() cmd_redo=() cmd_changes=('::revision:_tla_revisions') cmd_categories=() cmd_branches=(':category:_tla_categories') cmd_versions=(':branch:_tla_branches') cmd_cacherev=(':revision:_tla_revisions' '::dir:_files -/') cmd_logs=($cmd_log_versions) cmd_update=(':dir:_files -/' '::newdir:_files -/' '::revision:_tla_revisions') cmd_join_branch=(':dir:_files -/' '::newdir:_files -/' ':revision:_tla_revisions') cmd_replay=(':dir:_files -/' '::newdir:_files -/' '::revision:_tla_revisions') cmd_deltapatch=(':FROM:_tla_tree_or_rev' ':TO:_tla_tree_or_rev' ':UPON:_tla_tree_or_rev' '::DEST:_files -/') cmd_sync_tree=(':dir:_files -/' '::newdir:_files -/' ':revision:_tla_revisions') cmd_delta=(':FROM:_tla_tree_or_rev' ':TO:_tla_tree_or_rev') cmd_library_categories=() cmd_library_branches=(':category:_tla_categories --library') cmd_library_versions=(':branch:_tla_branches --library') cmd_library_revisions=(':version:_tla_versions --library') fi cmd_ls_archives=($cmd_archives) cmd_redo_changes=($cmd_redo) cmd_what_changed=($cmd_changes) cmd_delta_patch=($cmd_deltapatch) cmd_apply_delta=($cmd_deltapatch) cmd_make_sync_tree=($cmd_sync_tree) cmd_revdelta=($cmd_delta) # commands the same in all versions local cmd_help cmd_help=() local cmd_my_id cmd_my_id=('::id-string:') local cmd_my_default_archive cmd_my_default_archive=('::archive:_tla_archives') local cmd_whereis_archive cmd_whereis_archive=(':archive:_tla_archives') local cmd_init_tree cmd_init_tree=('::version:_tla_versions') local cmd_tree_root cmd_tree_root=('::directory:_files -/') local cmd_tree_version cmd_tree_version=('::directory:_files -/') local cmd_set_tree_version cmd_set_tree_version=(':version:_tla_versions') local cmd_build_config cmd_buildcfg cmd_build_config=(':config:_tla_config') cmd_buildcfg=($cmd_build_config) local cmd_cat_config cmd_catcfg cmd_cfgcat cmd_cat_config=(':config:_tla_config') cmd_catcfg=($cmd_cat_config) cmd_cfgcat=($cmd_cat_config) local cmd_undo cmd_undo_changes cmd_undo=('::revision:_tla_revisions') cmd_undo_changes=($cmd_undo) local cmd_file_diffs cmd_file_diffs=(':file:_files' '::revision:_tla_revisions') local cmd_file_find cmd_file_find=(':file:_files' '::revision:_tla_revisions') local cmd_inventory cmd_srcfind cmd_inventory=('::separator:(--)' '*:directory:_files -/') cmd_srcfind=($cmd_inventory) local cmd_tree_lint cmd_lint cmd_tree_lint=('::directory:_files -/') cmd_lint=($cmd_tree_lint) local cmd_id cmd_invtag cmd_id=('*:file:_files') cmd_invtag=($cmd_id) local cmd_id_tagging_method cmd_tagging_method methods cmd_id_tagging_method=('::tagging method:(($methods))') methods=( 'names:use naming conventions only' 'implicit:use naming conventions but permit for inventory tags' 'tagline:use naming conventions but permit for inventory tags' 'explicit:require explicit designation of source' ) cmd_tagging_method=($cmd_id_tagging_method) local cmd_add cmd_add_id cmd_add_tag cmd_add=('*:files to add:_files') cmd_add_id=($cmd_add) cmd_add_tag=($cmd_add) local cmd_delete cmd_delete_id cmd_delete_tag cmd_delete=('*:files to delete:_files') cmd_delete_id=($cmd_delete) cmd_delete_tag=($cmd_delete) local cmd_move cmd_move_id cmd_move_tag cmd_move_id=(':old name:_files' ':new name:_files') cmd_move_id=($cmd_move) cmd_move_tag=($cmd_move) #would be nice not to offer dirs for newname if oldname is a file, and #vice versa local cmd_mv cmd_mv=('*:file:_files') # not really right, but close enough local cmd_default_id cmd_explicit_default cmd_default_tag cmd_default_id=('::TAG-PREFIX:') cmd_explicit_default=($cmd_default_id) cmd_default_tag=($cmd_default_id) local cmd_tagging_defaults cmd_id_tagging_defaults cmd_tagging_defaults=() cmd_id_tagging_defaults=($cmd_tagging_defaults) local cmd_changeset cmd_mkpatch cmd_changeset=( ':ORIG:_files -/' ':MOD:_files -/' ':DEST:_files -/' '*:files:_files' ) cmd_mkpatch=("$cmd_changeset[@]") local cmd_dopatch cmd_do_changeset cmd_apply_changeset cmd_dopatch=(':changeset:_files -/' ':target:_files -/') cmd_do_changeset=($cmd_dopatch) cmd_apply_changeset=($cmd_dopatch) local cmd_show_changeset cmd_show_changeset=('::changeset:_files -/') local cmd_make_archive cmd_make_archive=('::name:' ':location:_files -/') local cmd_archive_setup cmd_archive_setup=('*:versions:_tla_branches --trailing-dashes') local cmd_make_category cmd_make_category=(':category:_tla_archives -S /') local cmd_make_branch cmd_make_branch=(':branch:_tla_categories --trailing-dashes') local cmd_make_version cmd_make_version=(':version:_tla_branches --trailing-dashes') local cmd_import cmd_imprev cmd_import=('::version:_tla_versions') cmd_imprev=($cmd_import) local cmd_commit cmd_cmtrev cmd_commit=('::version:_tla_versions' ':separator:(--)' '*:files:_files') cmd_cmtrev=($cmd_commit) local cmd_get cmd_getrev cmd_get=(':revision:_tla_revisions' '::directory:_files -/') cmd_getrev=($cmd_get) local cmd_get_patch cmd_get_changeset cmd_get_patch=(':revision:_tla_revisions' '::dir:_files -/') cmd_get_changeset=($cmd_get_patch) local cmd_lock_revision cmd_lock_revision=(':revision:_tla_revisions') local cmd_push_mirror cmd_archive_mirror cmd_push_mirror=( '::FROM or MINE:_tla_archives' '::TO:_tla_archives' '::LIMIT:_tla_limit' ) cmd_archive_mirror=($cmd_push_mirror) local cmd_revisions cmd_revisions=('::version:_tla_versions') local cmd_ancestry cmd_ancestry=('::revision:_tla_revisions') local cmd_ancestry_graph cmd_ancestry_graph=('::revision:_tla_revisions') local cmd_cat_archive_log cmd_cat_archive_log=(':revision:_tla_revisions') local cmd_cachedrevs cmd_cachedrevs=(':version:_tla_versions') local cmd_uncacherev cmd_uncacherev=(':revision:_tla_revisions' '::dir:_files -/') local cmd_archive_meta_info cmd_archive_meta_info=(':item-name:((name\:foo mirror\:bar))') local cmd_archive_snapshot cmd_archive_snapshot=(':dir:_files -/' '::limit:_tla_revisions') local cmd_archive_version cmd_archive_version=() local cmd_archive_fixup cmd_archive_fixup=() local cmd_make_log cmd_make_log=('::version:_tla_versions') local cmd_add_log cmd_add_log_version cmd_add_log=(':version:_tla_versions') cmd_add_log_version=($cmd_add_log) local cmd_remove_log cmd_remove_log_version cmd_remove_log=(':version:_tla_log_versions') cmd_remove_log_version=($cmd_remove_log) local cmd_abrowse cmd_abrowse=('::LIMIT:_tla_revisions') local cmd_cat_log cmd_cat_log=(':revision-spec:_tla_local_revisions') local cmd_changelog cmd_changelog=('::version:_tla_versions') local cmd_log_for_merge cmd_log_for_merge=('::version:_tla_versions') local cmd_merges cmd_merges=(':INTO:_tla_revisions' '::FROM:_tla_revisions') local cmd_new_merges cmd_new_merges=('::version:_tla_versions') local cmd_tag cmd_tagrev cmd_branch cmd_tag=(':SOURCE-REVISION:_tla_revisions' ':TAG-VERSION:_tla_versions') cmd_tagrev=($cmd_tag) cmd_branch=($cmd_tag) local cmd_star_merge cmd_star_merge=(':FROM:_tla_revisions') local cmd_missing cmd_whats_missing cmd_missing=('::revision:_tla_revisions') cmd_whats_missing=($cmd_missing) local cmd_pristines cmd_ls_pristines cmd_pristines=('::limit:_tla_revisions') cmd_ls_pristines=($cmd_pristines) local cmd_lock_pristine cmd_lock_pristine=(':revision:_tla_revisions') local cmd_add_pristine cmd_add_pristine=(':revision:_tla_revisions') local cmd_find_pristine cmd_find_pristine=(':revision:_tla_revisions') local cmd_my_revision_library cmd_library_dir cmd_my_revision_library=(':library:_tla_my_revision_library') cmd_library_dir=($my_revision_library) local cmd_library_find cmd_library_find=(':revision:_tla_revisions --library') local cmd_library_add cmd_library_add=(':revision:_tla_revisions --exclude-library-revisions') local cmd_library_remove cmd_library_remove=(':revision:_tla_revisions --library') local cmd_library_archives cmd_library_archives=() local cmd_library_log cmd_library_log=(':revision:_tla_revisions --library') local cmd_library_file cmd_library_file=(':file:_files' ':revision:_tla_revisions --library') local cmd_grab cmd_grab=(':location:_files') local cmd_parse_package_name cmd_parse_package_name=(':name:') local cmd_valid_package_name cmd_valid_package_name=(':name:') local cmd_library_config cmd_library_config=(':library:_tla_libraries') local cmd_rbrowse cmd_rbrowse=('::regular expression:') local cmd_rm cmd_rm=('*:file:_files') local cmd_escape cmd_escape=(':string:') local cmd_diff cmd_diff=('::revision:_tla_revisions') local cmd_export cmd_export=(':revision:_tla_revisions' ':dir:_files -/') #mutually exclusive options local -A excludes excludes=( # This first line means that if --output was given, don't complete # --no-output or --keep. The converse is not true. --output '--no-output --keep' --no-output --output --silent ' --quiet --report --verbose --debug' --quiet '--silent --report --verbose --debug' --report '--silent --quiet --verbose --debug' --verbose '--silent --quiet --report --debug' --debug '--silent --quiet --report --verbose ' --sparse --non-sparse --non-sparse --sparse --files ' --directories --both' --directories '--files --both' --both '--files --directories ' --mirror --mirror-from --mirror-from --mirror --no-cached --cached-tags --cached-tags --no-cached --non-greedy --greedy --greedy --non-greedy ) _tla_main () { typeset -A opt_args local arguments if (( CURRENT > 2 )); then local cmd=${words[2]} local var_cmd=cmd_${cmd//-/_} curcontext="${curcontext%:*:*}:tla-$cmd:" (( CURRENT-- )) shift words arguments=() local input input=(${${(M)${(f)"$($TLA $cmd -h)"}:# *}# }) local i j=1 local short long arg desc action short=() long=() arg=() desc=() action=() for (( i=1 ; i <= ${#input} ; i++ )); do [[ "$input[i]" != *[^\ ]* ]] && continue # stupid blank lines short[j]="${${${input[i]}[1,2]}#--}" long[j]="${${input[i]#-?, }%% *}" arg[j]="${${${input[i]%% *}##* }##-*}" [[ $long[j] == --archive ]] && arg[j]=ARCHIVE # tla doesn't mention this desc[j]="${input[i]##* }" if [[ "$input[i+1]" == \ *[^\ ]* ]]; then # description continues (( i++ )) desc[j]="$desc[j] ${input[i]##* }" fi [[ "$short[j]" == -[hHV] ]] && continue desc[j]="${${desc[j]//\[/\\[}//\]/\\]}" # escape brackets case $arg[j] in DIR|PATCH-DIR|DEST|OUTPUT|PATH) action[j]='_files -/' ;; FILES|FILE|SNAP-FILE) action[j]='_files' ;; MASTER|MASTER-SOURCE|ARCHIVE) action[j]='_tla_archives' ;; CATEGORY) action[j]='_tla_categories' ;; BRANCH) action[j]='_tla_branches' ;; VERSION) action[j]='_tla_versions' ;; CFG) action[j]='_tla_configs' ;; LIB) action[j]='_tla_libraries' ;; # PATCH,FILE) # not sure how to complete this # action[j]='_tla_patch_file' ;; *) action[j]='' ;; esac (( j++ )) done local excluded k for (( i = 1 ; i < j ; i++ )); do excluded=($short[i] $long[i]) foreach opt (${=excludes[$long[i]]}) k=$long[(i)$opt] excluded=($excluded $short[k] $long[k]) #excludes matching short options too :-) end # generate arguments to _arguments ;-) # make long and short options mutually exclusive [ $short[i] ] && arguments=("$arguments[@]" "${hide_short}(${excluded})${short[i]}[${desc[i]}]${arg[i]:+:$arg[i]:$action[i]}") [ $long[i] ] && arguments=("$arguments[@]" "(${excluded})${long[i]}[${desc[i]}]${arg[i]:+:$arg[i]:$action[i]}") done arguments=("$arguments[@]" "${(@P)var_cmd-*:FILE:_files}") else local help local -U cmds help=(${(f)"$($TLA help)"}) cmds=(${${${${(M)help:#* :*}/ #: #/:}%% ##}## #}) arguments=(':commands:(($cmds))') fi _arguments -S -A '-*' \ {"${hide_short}(: -)-V",'(: -)--version'}'[display version]' \ {"${hide_short}(: -)-h",'(: -)--help'}'[display help]' \ '(: -)-H[display verbose help]' \ "$arguments[@]" } _tla_main "$@"