git-bug

   1# bash completion for git-bug                              -*- shell-script -*-
   2
   3__git-bug_debug()
   4{
   5    if [[ -n ${BASH_COMP_DEBUG_FILE:-} ]]; then
   6        echo "$*" >> "${BASH_COMP_DEBUG_FILE}"
   7    fi
   8}
   9
  10# Homebrew on Macs have version 1.3 of bash-completion which doesn't include
  11# _init_completion. This is a very minimal version of that function.
  12__git-bug_init_completion()
  13{
  14    COMPREPLY=()
  15    _get_comp_words_by_ref "$@" cur prev words cword
  16}
  17
  18__git-bug_index_of_word()
  19{
  20    local w word=$1
  21    shift
  22    index=0
  23    for w in "$@"; do
  24        [[ $w = "$word" ]] && return
  25        index=$((index+1))
  26    done
  27    index=-1
  28}
  29
  30__git-bug_contains_word()
  31{
  32    local w word=$1; shift
  33    for w in "$@"; do
  34        [[ $w = "$word" ]] && return
  35    done
  36    return 1
  37}
  38
  39__git-bug_handle_go_custom_completion()
  40{
  41    __git-bug_debug "${FUNCNAME[0]}: cur is ${cur}, words[*] is ${words[*]}, #words[@] is ${#words[@]}"
  42
  43    local shellCompDirectiveError=1
  44    local shellCompDirectiveNoSpace=2
  45    local shellCompDirectiveNoFileComp=4
  46    local shellCompDirectiveFilterFileExt=8
  47    local shellCompDirectiveFilterDirs=16
  48
  49    local out requestComp lastParam lastChar comp directive args
  50
  51    # Prepare the command to request completions for the program.
  52    # Calling ${words[0]} instead of directly git-bug allows to handle aliases
  53    args=("${words[@]:1}")
  54    requestComp="${words[0]} __completeNoDesc ${args[*]}"
  55
  56    lastParam=${words[$((${#words[@]}-1))]}
  57    lastChar=${lastParam:$((${#lastParam}-1)):1}
  58    __git-bug_debug "${FUNCNAME[0]}: lastParam ${lastParam}, lastChar ${lastChar}"
  59
  60    if [ -z "${cur}" ] && [ "${lastChar}" != "=" ]; then
  61        # If the last parameter is complete (there is a space following it)
  62        # We add an extra empty parameter so we can indicate this to the go method.
  63        __git-bug_debug "${FUNCNAME[0]}: Adding extra empty parameter"
  64        requestComp="${requestComp} \"\""
  65    fi
  66
  67    __git-bug_debug "${FUNCNAME[0]}: calling ${requestComp}"
  68    # Use eval to handle any environment variables and such
  69    out=$(eval "${requestComp}" 2>/dev/null)
  70
  71    # Extract the directive integer at the very end of the output following a colon (:)
  72    directive=${out##*:}
  73    # Remove the directive
  74    out=${out%:*}
  75    if [ "${directive}" = "${out}" ]; then
  76        # There is not directive specified
  77        directive=0
  78    fi
  79    __git-bug_debug "${FUNCNAME[0]}: the completion directive is: ${directive}"
  80    __git-bug_debug "${FUNCNAME[0]}: the completions are: ${out[*]}"
  81
  82    if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then
  83        # Error code.  No completion.
  84        __git-bug_debug "${FUNCNAME[0]}: received error from custom completion go code"
  85        return
  86    else
  87        if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then
  88            if [[ $(type -t compopt) = "builtin" ]]; then
  89                __git-bug_debug "${FUNCNAME[0]}: activating no space"
  90                compopt -o nospace
  91            fi
  92        fi
  93        if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then
  94            if [[ $(type -t compopt) = "builtin" ]]; then
  95                __git-bug_debug "${FUNCNAME[0]}: activating no file completion"
  96                compopt +o default
  97            fi
  98        fi
  99    fi
 100
 101    if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then
 102        # File extension filtering
 103        local fullFilter filter filteringCmd
 104        # Do not use quotes around the $out variable or else newline
 105        # characters will be kept.
 106        for filter in ${out[*]}; do
 107            fullFilter+="$filter|"
 108        done
 109
 110        filteringCmd="_filedir $fullFilter"
 111        __git-bug_debug "File filtering command: $filteringCmd"
 112        $filteringCmd
 113    elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then
 114        # File completion for directories only
 115        local subdir
 116        # Use printf to strip any trailing newline
 117        subdir=$(printf "%s" "${out[0]}")
 118        if [ -n "$subdir" ]; then
 119            __git-bug_debug "Listing directories in $subdir"
 120            __git-bug_handle_subdirs_in_dir_flag "$subdir"
 121        else
 122            __git-bug_debug "Listing directories in ."
 123            _filedir -d
 124        fi
 125    else
 126        while IFS='' read -r comp; do
 127            COMPREPLY+=("$comp")
 128        done < <(compgen -W "${out[*]}" -- "$cur")
 129    fi
 130}
 131
 132__git-bug_handle_reply()
 133{
 134    __git-bug_debug "${FUNCNAME[0]}"
 135    local comp
 136    case $cur in
 137        -*)
 138            if [[ $(type -t compopt) = "builtin" ]]; then
 139                compopt -o nospace
 140            fi
 141            local allflags
 142            if [ ${#must_have_one_flag[@]} -ne 0 ]; then
 143                allflags=("${must_have_one_flag[@]}")
 144            else
 145                allflags=("${flags[*]} ${two_word_flags[*]}")
 146            fi
 147            while IFS='' read -r comp; do
 148                COMPREPLY+=("$comp")
 149            done < <(compgen -W "${allflags[*]}" -- "$cur")
 150            if [[ $(type -t compopt) = "builtin" ]]; then
 151                [[ "${COMPREPLY[0]}" == *= ]] || compopt +o nospace
 152            fi
 153
 154            # complete after --flag=abc
 155            if [[ $cur == *=* ]]; then
 156                if [[ $(type -t compopt) = "builtin" ]]; then
 157                    compopt +o nospace
 158                fi
 159
 160                local index flag
 161                flag="${cur%=*}"
 162                __git-bug_index_of_word "${flag}" "${flags_with_completion[@]}"
 163                COMPREPLY=()
 164                if [[ ${index} -ge 0 ]]; then
 165                    PREFIX=""
 166                    cur="${cur#*=}"
 167                    ${flags_completion[${index}]}
 168                    if [ -n "${ZSH_VERSION:-}" ]; then
 169                        # zsh completion needs --flag= prefix
 170                        eval "COMPREPLY=( \"\${COMPREPLY[@]/#/${flag}=}\" )"
 171                    fi
 172                fi
 173            fi
 174
 175            if [[ -z "${flag_parsing_disabled}" ]]; then
 176                # If flag parsing is enabled, we have completed the flags and can return.
 177                # If flag parsing is disabled, we may not know all (or any) of the flags, so we fallthrough
 178                # to possibly call handle_go_custom_completion.
 179                return 0;
 180            fi
 181            ;;
 182    esac
 183
 184    # check if we are handling a flag with special work handling
 185    local index
 186    __git-bug_index_of_word "${prev}" "${flags_with_completion[@]}"
 187    if [[ ${index} -ge 0 ]]; then
 188        ${flags_completion[${index}]}
 189        return
 190    fi
 191
 192    # we are parsing a flag and don't have a special handler, no completion
 193    if [[ ${cur} != "${words[cword]}" ]]; then
 194        return
 195    fi
 196
 197    local completions
 198    completions=("${commands[@]}")
 199    if [[ ${#must_have_one_noun[@]} -ne 0 ]]; then
 200        completions+=("${must_have_one_noun[@]}")
 201    elif [[ -n "${has_completion_function}" ]]; then
 202        # if a go completion function is provided, defer to that function
 203        __git-bug_handle_go_custom_completion
 204    fi
 205    if [[ ${#must_have_one_flag[@]} -ne 0 ]]; then
 206        completions+=("${must_have_one_flag[@]}")
 207    fi
 208    while IFS='' read -r comp; do
 209        COMPREPLY+=("$comp")
 210    done < <(compgen -W "${completions[*]}" -- "$cur")
 211
 212    if [[ ${#COMPREPLY[@]} -eq 0 && ${#noun_aliases[@]} -gt 0 && ${#must_have_one_noun[@]} -ne 0 ]]; then
 213        while IFS='' read -r comp; do
 214            COMPREPLY+=("$comp")
 215        done < <(compgen -W "${noun_aliases[*]}" -- "$cur")
 216    fi
 217
 218    if [[ ${#COMPREPLY[@]} -eq 0 ]]; then
 219        if declare -F __git-bug_custom_func >/dev/null; then
 220            # try command name qualified custom func
 221            __git-bug_custom_func
 222        else
 223            # otherwise fall back to unqualified for compatibility
 224            declare -F __custom_func >/dev/null && __custom_func
 225        fi
 226    fi
 227
 228    # available in bash-completion >= 2, not always present on macOS
 229    if declare -F __ltrim_colon_completions >/dev/null; then
 230        __ltrim_colon_completions "$cur"
 231    fi
 232
 233    # If there is only 1 completion and it is a flag with an = it will be completed
 234    # but we don't want a space after the =
 235    if [[ "${#COMPREPLY[@]}" -eq "1" ]] && [[ $(type -t compopt) = "builtin" ]] && [[ "${COMPREPLY[0]}" == --*= ]]; then
 236       compopt -o nospace
 237    fi
 238}
 239
 240# The arguments should be in the form "ext1|ext2|extn"
 241__git-bug_handle_filename_extension_flag()
 242{
 243    local ext="$1"
 244    _filedir "@(${ext})"
 245}
 246
 247__git-bug_handle_subdirs_in_dir_flag()
 248{
 249    local dir="$1"
 250    pushd "${dir}" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1 || return
 251}
 252
 253__git-bug_handle_flag()
 254{
 255    __git-bug_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}"
 256
 257    # if a command required a flag, and we found it, unset must_have_one_flag()
 258    local flagname=${words[c]}
 259    local flagvalue=""
 260    # if the word contained an =
 261    if [[ ${words[c]} == *"="* ]]; then
 262        flagvalue=${flagname#*=} # take in as flagvalue after the =
 263        flagname=${flagname%=*} # strip everything after the =
 264        flagname="${flagname}=" # but put the = back
 265    fi
 266    __git-bug_debug "${FUNCNAME[0]}: looking for ${flagname}"
 267    if __git-bug_contains_word "${flagname}" "${must_have_one_flag[@]}"; then
 268        must_have_one_flag=()
 269    fi
 270
 271    # if you set a flag which only applies to this command, don't show subcommands
 272    if __git-bug_contains_word "${flagname}" "${local_nonpersistent_flags[@]}"; then
 273      commands=()
 274    fi
 275
 276    # keep flag value with flagname as flaghash
 277    # flaghash variable is an associative array which is only supported in bash > 3.
 278    if [[ -z "${BASH_VERSION:-}" || "${BASH_VERSINFO[0]:-}" -gt 3 ]]; then
 279        if [ -n "${flagvalue}" ] ; then
 280            flaghash[${flagname}]=${flagvalue}
 281        elif [ -n "${words[ $((c+1)) ]}" ] ; then
 282            flaghash[${flagname}]=${words[ $((c+1)) ]}
 283        else
 284            flaghash[${flagname}]="true" # pad "true" for bool flag
 285        fi
 286    fi
 287
 288    # skip the argument to a two word flag
 289    if [[ ${words[c]} != *"="* ]] && __git-bug_contains_word "${words[c]}" "${two_word_flags[@]}"; then
 290        __git-bug_debug "${FUNCNAME[0]}: found a flag ${words[c]}, skip the next argument"
 291        c=$((c+1))
 292        # if we are looking for a flags value, don't show commands
 293        if [[ $c -eq $cword ]]; then
 294            commands=()
 295        fi
 296    fi
 297
 298    c=$((c+1))
 299
 300}
 301
 302__git-bug_handle_noun()
 303{
 304    __git-bug_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}"
 305
 306    if __git-bug_contains_word "${words[c]}" "${must_have_one_noun[@]}"; then
 307        must_have_one_noun=()
 308    elif __git-bug_contains_word "${words[c]}" "${noun_aliases[@]}"; then
 309        must_have_one_noun=()
 310    fi
 311
 312    nouns+=("${words[c]}")
 313    c=$((c+1))
 314}
 315
 316__git-bug_handle_command()
 317{
 318    __git-bug_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}"
 319
 320    local next_command
 321    if [[ -n ${last_command} ]]; then
 322        next_command="_${last_command}_${words[c]//:/__}"
 323    else
 324        if [[ $c -eq 0 ]]; then
 325            next_command="_git-bug_root_command"
 326        else
 327            next_command="_${words[c]//:/__}"
 328        fi
 329    fi
 330    c=$((c+1))
 331    __git-bug_debug "${FUNCNAME[0]}: looking for ${next_command}"
 332    declare -F "$next_command" >/dev/null && $next_command
 333}
 334
 335__git-bug_handle_word()
 336{
 337    if [[ $c -ge $cword ]]; then
 338        __git-bug_handle_reply
 339        return
 340    fi
 341    __git-bug_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}"
 342    if [[ "${words[c]}" == -* ]]; then
 343        __git-bug_handle_flag
 344    elif __git-bug_contains_word "${words[c]}" "${commands[@]}"; then
 345        __git-bug_handle_command
 346    elif [[ $c -eq 0 ]]; then
 347        __git-bug_handle_command
 348    elif __git-bug_contains_word "${words[c]}" "${command_aliases[@]}"; then
 349        # aliashash variable is an associative array which is only supported in bash > 3.
 350        if [[ -z "${BASH_VERSION:-}" || "${BASH_VERSINFO[0]:-}" -gt 3 ]]; then
 351            words[c]=${aliashash[${words[c]}]}
 352            __git-bug_handle_command
 353        else
 354            __git-bug_handle_noun
 355        fi
 356    else
 357        __git-bug_handle_noun
 358    fi
 359    __git-bug_handle_word
 360}
 361
 362
 363_git_bug() {
 364    __start_git-bug "$@"
 365}
 366
 367_git-bug_add()
 368{
 369    last_command="git-bug_add"
 370
 371    command_aliases=()
 372
 373    commands=()
 374
 375    flags=()
 376    two_word_flags=()
 377    local_nonpersistent_flags=()
 378    flags_with_completion=()
 379    flags_completion=()
 380
 381    flags+=("--title=")
 382    two_word_flags+=("--title")
 383    two_word_flags+=("-t")
 384    local_nonpersistent_flags+=("--title")
 385    local_nonpersistent_flags+=("--title=")
 386    local_nonpersistent_flags+=("-t")
 387    flags+=("--message=")
 388    two_word_flags+=("--message")
 389    two_word_flags+=("-m")
 390    local_nonpersistent_flags+=("--message")
 391    local_nonpersistent_flags+=("--message=")
 392    local_nonpersistent_flags+=("-m")
 393    flags+=("--file=")
 394    two_word_flags+=("--file")
 395    two_word_flags+=("-F")
 396    local_nonpersistent_flags+=("--file")
 397    local_nonpersistent_flags+=("--file=")
 398    local_nonpersistent_flags+=("-F")
 399    flags+=("--non-interactive")
 400    local_nonpersistent_flags+=("--non-interactive")
 401
 402    must_have_one_flag=()
 403    must_have_one_noun=()
 404    noun_aliases=()
 405}
 406
 407_git-bug_bridge_auth_add-token()
 408{
 409    last_command="git-bug_bridge_auth_add-token"
 410
 411    command_aliases=()
 412
 413    commands=()
 414
 415    flags=()
 416    two_word_flags=()
 417    local_nonpersistent_flags=()
 418    flags_with_completion=()
 419    flags_completion=()
 420
 421    flags+=("--target=")
 422    two_word_flags+=("--target")
 423    two_word_flags+=("-t")
 424    local_nonpersistent_flags+=("--target")
 425    local_nonpersistent_flags+=("--target=")
 426    local_nonpersistent_flags+=("-t")
 427    flags+=("--login=")
 428    two_word_flags+=("--login")
 429    two_word_flags+=("-l")
 430    local_nonpersistent_flags+=("--login")
 431    local_nonpersistent_flags+=("--login=")
 432    local_nonpersistent_flags+=("-l")
 433    flags+=("--user=")
 434    two_word_flags+=("--user")
 435    two_word_flags+=("-u")
 436    local_nonpersistent_flags+=("--user")
 437    local_nonpersistent_flags+=("--user=")
 438    local_nonpersistent_flags+=("-u")
 439
 440    must_have_one_flag=()
 441    must_have_one_noun=()
 442    noun_aliases=()
 443}
 444
 445_git-bug_bridge_auth_rm()
 446{
 447    last_command="git-bug_bridge_auth_rm"
 448
 449    command_aliases=()
 450
 451    commands=()
 452
 453    flags=()
 454    two_word_flags=()
 455    local_nonpersistent_flags=()
 456    flags_with_completion=()
 457    flags_completion=()
 458
 459
 460    must_have_one_flag=()
 461    must_have_one_noun=()
 462    noun_aliases=()
 463}
 464
 465_git-bug_bridge_auth_show()
 466{
 467    last_command="git-bug_bridge_auth_show"
 468
 469    command_aliases=()
 470
 471    commands=()
 472
 473    flags=()
 474    two_word_flags=()
 475    local_nonpersistent_flags=()
 476    flags_with_completion=()
 477    flags_completion=()
 478
 479
 480    must_have_one_flag=()
 481    must_have_one_noun=()
 482    noun_aliases=()
 483}
 484
 485_git-bug_bridge_auth()
 486{
 487    last_command="git-bug_bridge_auth"
 488
 489    command_aliases=()
 490
 491    commands=()
 492    commands+=("add-token")
 493    commands+=("rm")
 494    commands+=("show")
 495
 496    flags=()
 497    two_word_flags=()
 498    local_nonpersistent_flags=()
 499    flags_with_completion=()
 500    flags_completion=()
 501
 502
 503    must_have_one_flag=()
 504    must_have_one_noun=()
 505    noun_aliases=()
 506}
 507
 508_git-bug_bridge_configure()
 509{
 510    last_command="git-bug_bridge_configure"
 511
 512    command_aliases=()
 513
 514    commands=()
 515
 516    flags=()
 517    two_word_flags=()
 518    local_nonpersistent_flags=()
 519    flags_with_completion=()
 520    flags_completion=()
 521
 522    flags+=("--name=")
 523    two_word_flags+=("--name")
 524    two_word_flags+=("-n")
 525    local_nonpersistent_flags+=("--name")
 526    local_nonpersistent_flags+=("--name=")
 527    local_nonpersistent_flags+=("-n")
 528    flags+=("--target=")
 529    two_word_flags+=("--target")
 530    two_word_flags+=("-t")
 531    local_nonpersistent_flags+=("--target")
 532    local_nonpersistent_flags+=("--target=")
 533    local_nonpersistent_flags+=("-t")
 534    flags+=("--url=")
 535    two_word_flags+=("--url")
 536    two_word_flags+=("-u")
 537    local_nonpersistent_flags+=("--url")
 538    local_nonpersistent_flags+=("--url=")
 539    local_nonpersistent_flags+=("-u")
 540    flags+=("--base-url=")
 541    two_word_flags+=("--base-url")
 542    two_word_flags+=("-b")
 543    local_nonpersistent_flags+=("--base-url")
 544    local_nonpersistent_flags+=("--base-url=")
 545    local_nonpersistent_flags+=("-b")
 546    flags+=("--login=")
 547    two_word_flags+=("--login")
 548    two_word_flags+=("-l")
 549    local_nonpersistent_flags+=("--login")
 550    local_nonpersistent_flags+=("--login=")
 551    local_nonpersistent_flags+=("-l")
 552    flags+=("--credential=")
 553    two_word_flags+=("--credential")
 554    two_word_flags+=("-c")
 555    local_nonpersistent_flags+=("--credential")
 556    local_nonpersistent_flags+=("--credential=")
 557    local_nonpersistent_flags+=("-c")
 558    flags+=("--token=")
 559    two_word_flags+=("--token")
 560    local_nonpersistent_flags+=("--token")
 561    local_nonpersistent_flags+=("--token=")
 562    flags+=("--token-stdin")
 563    local_nonpersistent_flags+=("--token-stdin")
 564    flags+=("--owner=")
 565    two_word_flags+=("--owner")
 566    two_word_flags+=("-o")
 567    local_nonpersistent_flags+=("--owner")
 568    local_nonpersistent_flags+=("--owner=")
 569    local_nonpersistent_flags+=("-o")
 570    flags+=("--project=")
 571    two_word_flags+=("--project")
 572    two_word_flags+=("-p")
 573    local_nonpersistent_flags+=("--project")
 574    local_nonpersistent_flags+=("--project=")
 575    local_nonpersistent_flags+=("-p")
 576    flags+=("--non-interactive")
 577    local_nonpersistent_flags+=("--non-interactive")
 578
 579    must_have_one_flag=()
 580    must_have_one_noun=()
 581    noun_aliases=()
 582}
 583
 584_git-bug_bridge_pull()
 585{
 586    last_command="git-bug_bridge_pull"
 587
 588    command_aliases=()
 589
 590    commands=()
 591
 592    flags=()
 593    two_word_flags=()
 594    local_nonpersistent_flags=()
 595    flags_with_completion=()
 596    flags_completion=()
 597
 598    flags+=("--no-resume")
 599    flags+=("-n")
 600    local_nonpersistent_flags+=("--no-resume")
 601    local_nonpersistent_flags+=("-n")
 602    flags+=("--since=")
 603    two_word_flags+=("--since")
 604    two_word_flags+=("-s")
 605    local_nonpersistent_flags+=("--since")
 606    local_nonpersistent_flags+=("--since=")
 607    local_nonpersistent_flags+=("-s")
 608
 609    must_have_one_flag=()
 610    must_have_one_noun=()
 611    noun_aliases=()
 612}
 613
 614_git-bug_bridge_push()
 615{
 616    last_command="git-bug_bridge_push"
 617
 618    command_aliases=()
 619
 620    commands=()
 621
 622    flags=()
 623    two_word_flags=()
 624    local_nonpersistent_flags=()
 625    flags_with_completion=()
 626    flags_completion=()
 627
 628
 629    must_have_one_flag=()
 630    must_have_one_noun=()
 631    noun_aliases=()
 632}
 633
 634_git-bug_bridge_rm()
 635{
 636    last_command="git-bug_bridge_rm"
 637
 638    command_aliases=()
 639
 640    commands=()
 641
 642    flags=()
 643    two_word_flags=()
 644    local_nonpersistent_flags=()
 645    flags_with_completion=()
 646    flags_completion=()
 647
 648
 649    must_have_one_flag=()
 650    must_have_one_noun=()
 651    noun_aliases=()
 652}
 653
 654_git-bug_bridge()
 655{
 656    last_command="git-bug_bridge"
 657
 658    command_aliases=()
 659
 660    commands=()
 661    commands+=("auth")
 662    commands+=("configure")
 663    commands+=("pull")
 664    commands+=("push")
 665    commands+=("rm")
 666
 667    flags=()
 668    two_word_flags=()
 669    local_nonpersistent_flags=()
 670    flags_with_completion=()
 671    flags_completion=()
 672
 673
 674    must_have_one_flag=()
 675    must_have_one_noun=()
 676    noun_aliases=()
 677}
 678
 679_git-bug_commands()
 680{
 681    last_command="git-bug_commands"
 682
 683    command_aliases=()
 684
 685    commands=()
 686
 687    flags=()
 688    two_word_flags=()
 689    local_nonpersistent_flags=()
 690    flags_with_completion=()
 691    flags_completion=()
 692
 693    flags+=("--pretty")
 694    flags+=("-p")
 695    local_nonpersistent_flags+=("--pretty")
 696    local_nonpersistent_flags+=("-p")
 697
 698    must_have_one_flag=()
 699    must_have_one_noun=()
 700    noun_aliases=()
 701}
 702
 703_git-bug_comment_add()
 704{
 705    last_command="git-bug_comment_add"
 706
 707    command_aliases=()
 708
 709    commands=()
 710
 711    flags=()
 712    two_word_flags=()
 713    local_nonpersistent_flags=()
 714    flags_with_completion=()
 715    flags_completion=()
 716
 717    flags+=("--file=")
 718    two_word_flags+=("--file")
 719    two_word_flags+=("-F")
 720    local_nonpersistent_flags+=("--file")
 721    local_nonpersistent_flags+=("--file=")
 722    local_nonpersistent_flags+=("-F")
 723    flags+=("--message=")
 724    two_word_flags+=("--message")
 725    two_word_flags+=("-m")
 726    local_nonpersistent_flags+=("--message")
 727    local_nonpersistent_flags+=("--message=")
 728    local_nonpersistent_flags+=("-m")
 729    flags+=("--non-interactive")
 730    local_nonpersistent_flags+=("--non-interactive")
 731
 732    must_have_one_flag=()
 733    must_have_one_noun=()
 734    noun_aliases=()
 735}
 736
 737_git-bug_comment_edit()
 738{
 739    last_command="git-bug_comment_edit"
 740
 741    command_aliases=()
 742
 743    commands=()
 744
 745    flags=()
 746    two_word_flags=()
 747    local_nonpersistent_flags=()
 748    flags_with_completion=()
 749    flags_completion=()
 750
 751    flags+=("--file=")
 752    two_word_flags+=("--file")
 753    two_word_flags+=("-F")
 754    local_nonpersistent_flags+=("--file")
 755    local_nonpersistent_flags+=("--file=")
 756    local_nonpersistent_flags+=("-F")
 757    flags+=("--message=")
 758    two_word_flags+=("--message")
 759    two_word_flags+=("-m")
 760    local_nonpersistent_flags+=("--message")
 761    local_nonpersistent_flags+=("--message=")
 762    local_nonpersistent_flags+=("-m")
 763    flags+=("--non-interactive")
 764    local_nonpersistent_flags+=("--non-interactive")
 765
 766    must_have_one_flag=()
 767    must_have_one_noun=()
 768    noun_aliases=()
 769}
 770
 771_git-bug_comment()
 772{
 773    last_command="git-bug_comment"
 774
 775    command_aliases=()
 776
 777    commands=()
 778    commands+=("add")
 779    commands+=("edit")
 780
 781    flags=()
 782    two_word_flags=()
 783    local_nonpersistent_flags=()
 784    flags_with_completion=()
 785    flags_completion=()
 786
 787
 788    must_have_one_flag=()
 789    must_have_one_noun=()
 790    noun_aliases=()
 791}
 792
 793_git-bug_deselect()
 794{
 795    last_command="git-bug_deselect"
 796
 797    command_aliases=()
 798
 799    commands=()
 800
 801    flags=()
 802    two_word_flags=()
 803    local_nonpersistent_flags=()
 804    flags_with_completion=()
 805    flags_completion=()
 806
 807
 808    must_have_one_flag=()
 809    must_have_one_noun=()
 810    noun_aliases=()
 811}
 812
 813_git-bug_label_add()
 814{
 815    last_command="git-bug_label_add"
 816
 817    command_aliases=()
 818
 819    commands=()
 820
 821    flags=()
 822    two_word_flags=()
 823    local_nonpersistent_flags=()
 824    flags_with_completion=()
 825    flags_completion=()
 826
 827
 828    must_have_one_flag=()
 829    must_have_one_noun=()
 830    noun_aliases=()
 831}
 832
 833_git-bug_label_rm()
 834{
 835    last_command="git-bug_label_rm"
 836
 837    command_aliases=()
 838
 839    commands=()
 840
 841    flags=()
 842    two_word_flags=()
 843    local_nonpersistent_flags=()
 844    flags_with_completion=()
 845    flags_completion=()
 846
 847
 848    must_have_one_flag=()
 849    must_have_one_noun=()
 850    noun_aliases=()
 851}
 852
 853_git-bug_label()
 854{
 855    last_command="git-bug_label"
 856
 857    command_aliases=()
 858
 859    commands=()
 860    commands+=("add")
 861    commands+=("rm")
 862
 863    flags=()
 864    two_word_flags=()
 865    local_nonpersistent_flags=()
 866    flags_with_completion=()
 867    flags_completion=()
 868
 869
 870    must_have_one_flag=()
 871    must_have_one_noun=()
 872    noun_aliases=()
 873}
 874
 875_git-bug_ls()
 876{
 877    last_command="git-bug_ls"
 878
 879    command_aliases=()
 880
 881    commands=()
 882
 883    flags=()
 884    two_word_flags=()
 885    local_nonpersistent_flags=()
 886    flags_with_completion=()
 887    flags_completion=()
 888
 889    flags+=("--status=")
 890    two_word_flags+=("--status")
 891    two_word_flags+=("-s")
 892    local_nonpersistent_flags+=("--status")
 893    local_nonpersistent_flags+=("--status=")
 894    local_nonpersistent_flags+=("-s")
 895    flags+=("--author=")
 896    two_word_flags+=("--author")
 897    two_word_flags+=("-a")
 898    local_nonpersistent_flags+=("--author")
 899    local_nonpersistent_flags+=("--author=")
 900    local_nonpersistent_flags+=("-a")
 901    flags+=("--metadata=")
 902    two_word_flags+=("--metadata")
 903    two_word_flags+=("-m")
 904    local_nonpersistent_flags+=("--metadata")
 905    local_nonpersistent_flags+=("--metadata=")
 906    local_nonpersistent_flags+=("-m")
 907    flags+=("--participant=")
 908    two_word_flags+=("--participant")
 909    two_word_flags+=("-p")
 910    local_nonpersistent_flags+=("--participant")
 911    local_nonpersistent_flags+=("--participant=")
 912    local_nonpersistent_flags+=("-p")
 913    flags+=("--actor=")
 914    two_word_flags+=("--actor")
 915    two_word_flags+=("-A")
 916    local_nonpersistent_flags+=("--actor")
 917    local_nonpersistent_flags+=("--actor=")
 918    local_nonpersistent_flags+=("-A")
 919    flags+=("--label=")
 920    two_word_flags+=("--label")
 921    two_word_flags+=("-l")
 922    local_nonpersistent_flags+=("--label")
 923    local_nonpersistent_flags+=("--label=")
 924    local_nonpersistent_flags+=("-l")
 925    flags+=("--title=")
 926    two_word_flags+=("--title")
 927    two_word_flags+=("-t")
 928    local_nonpersistent_flags+=("--title")
 929    local_nonpersistent_flags+=("--title=")
 930    local_nonpersistent_flags+=("-t")
 931    flags+=("--no=")
 932    two_word_flags+=("--no")
 933    two_word_flags+=("-n")
 934    local_nonpersistent_flags+=("--no")
 935    local_nonpersistent_flags+=("--no=")
 936    local_nonpersistent_flags+=("-n")
 937    flags+=("--by=")
 938    two_word_flags+=("--by")
 939    two_word_flags+=("-b")
 940    local_nonpersistent_flags+=("--by")
 941    local_nonpersistent_flags+=("--by=")
 942    local_nonpersistent_flags+=("-b")
 943    flags+=("--direction=")
 944    two_word_flags+=("--direction")
 945    two_word_flags+=("-d")
 946    local_nonpersistent_flags+=("--direction")
 947    local_nonpersistent_flags+=("--direction=")
 948    local_nonpersistent_flags+=("-d")
 949    flags+=("--format=")
 950    two_word_flags+=("--format")
 951    two_word_flags+=("-f")
 952    local_nonpersistent_flags+=("--format")
 953    local_nonpersistent_flags+=("--format=")
 954    local_nonpersistent_flags+=("-f")
 955
 956    must_have_one_flag=()
 957    must_have_one_noun=()
 958    noun_aliases=()
 959}
 960
 961_git-bug_ls-id()
 962{
 963    last_command="git-bug_ls-id"
 964
 965    command_aliases=()
 966
 967    commands=()
 968
 969    flags=()
 970    two_word_flags=()
 971    local_nonpersistent_flags=()
 972    flags_with_completion=()
 973    flags_completion=()
 974
 975
 976    must_have_one_flag=()
 977    must_have_one_noun=()
 978    noun_aliases=()
 979}
 980
 981_git-bug_ls-label()
 982{
 983    last_command="git-bug_ls-label"
 984
 985    command_aliases=()
 986
 987    commands=()
 988
 989    flags=()
 990    two_word_flags=()
 991    local_nonpersistent_flags=()
 992    flags_with_completion=()
 993    flags_completion=()
 994
 995
 996    must_have_one_flag=()
 997    must_have_one_noun=()
 998    noun_aliases=()
 999}
1000
1001_git-bug_pull()
1002{
1003    last_command="git-bug_pull"
1004
1005    command_aliases=()
1006
1007    commands=()
1008
1009    flags=()
1010    two_word_flags=()
1011    local_nonpersistent_flags=()
1012    flags_with_completion=()
1013    flags_completion=()
1014
1015
1016    must_have_one_flag=()
1017    must_have_one_noun=()
1018    noun_aliases=()
1019}
1020
1021_git-bug_push()
1022{
1023    last_command="git-bug_push"
1024
1025    command_aliases=()
1026
1027    commands=()
1028
1029    flags=()
1030    two_word_flags=()
1031    local_nonpersistent_flags=()
1032    flags_with_completion=()
1033    flags_completion=()
1034
1035
1036    must_have_one_flag=()
1037    must_have_one_noun=()
1038    noun_aliases=()
1039}
1040
1041_git-bug_rm()
1042{
1043    last_command="git-bug_rm"
1044
1045    command_aliases=()
1046
1047    commands=()
1048
1049    flags=()
1050    two_word_flags=()
1051    local_nonpersistent_flags=()
1052    flags_with_completion=()
1053    flags_completion=()
1054
1055
1056    must_have_one_flag=()
1057    must_have_one_noun=()
1058    noun_aliases=()
1059}
1060
1061_git-bug_select()
1062{
1063    last_command="git-bug_select"
1064
1065    command_aliases=()
1066
1067    commands=()
1068
1069    flags=()
1070    two_word_flags=()
1071    local_nonpersistent_flags=()
1072    flags_with_completion=()
1073    flags_completion=()
1074
1075
1076    must_have_one_flag=()
1077    must_have_one_noun=()
1078    noun_aliases=()
1079}
1080
1081_git-bug_show()
1082{
1083    last_command="git-bug_show"
1084
1085    command_aliases=()
1086
1087    commands=()
1088
1089    flags=()
1090    two_word_flags=()
1091    local_nonpersistent_flags=()
1092    flags_with_completion=()
1093    flags_completion=()
1094
1095    flags+=("--field=")
1096    two_word_flags+=("--field")
1097    local_nonpersistent_flags+=("--field")
1098    local_nonpersistent_flags+=("--field=")
1099    flags+=("--format=")
1100    two_word_flags+=("--format")
1101    two_word_flags+=("-f")
1102    local_nonpersistent_flags+=("--format")
1103    local_nonpersistent_flags+=("--format=")
1104    local_nonpersistent_flags+=("-f")
1105
1106    must_have_one_flag=()
1107    must_have_one_noun=()
1108    noun_aliases=()
1109}
1110
1111_git-bug_status_close()
1112{
1113    last_command="git-bug_status_close"
1114
1115    command_aliases=()
1116
1117    commands=()
1118
1119    flags=()
1120    two_word_flags=()
1121    local_nonpersistent_flags=()
1122    flags_with_completion=()
1123    flags_completion=()
1124
1125
1126    must_have_one_flag=()
1127    must_have_one_noun=()
1128    noun_aliases=()
1129}
1130
1131_git-bug_status_open()
1132{
1133    last_command="git-bug_status_open"
1134
1135    command_aliases=()
1136
1137    commands=()
1138
1139    flags=()
1140    two_word_flags=()
1141    local_nonpersistent_flags=()
1142    flags_with_completion=()
1143    flags_completion=()
1144
1145
1146    must_have_one_flag=()
1147    must_have_one_noun=()
1148    noun_aliases=()
1149}
1150
1151_git-bug_status()
1152{
1153    last_command="git-bug_status"
1154
1155    command_aliases=()
1156
1157    commands=()
1158    commands+=("close")
1159    commands+=("open")
1160
1161    flags=()
1162    two_word_flags=()
1163    local_nonpersistent_flags=()
1164    flags_with_completion=()
1165    flags_completion=()
1166
1167
1168    must_have_one_flag=()
1169    must_have_one_noun=()
1170    noun_aliases=()
1171}
1172
1173_git-bug_termui()
1174{
1175    last_command="git-bug_termui"
1176
1177    command_aliases=()
1178
1179    commands=()
1180
1181    flags=()
1182    two_word_flags=()
1183    local_nonpersistent_flags=()
1184    flags_with_completion=()
1185    flags_completion=()
1186
1187
1188    must_have_one_flag=()
1189    must_have_one_noun=()
1190    noun_aliases=()
1191}
1192
1193_git-bug_title_edit()
1194{
1195    last_command="git-bug_title_edit"
1196
1197    command_aliases=()
1198
1199    commands=()
1200
1201    flags=()
1202    two_word_flags=()
1203    local_nonpersistent_flags=()
1204    flags_with_completion=()
1205    flags_completion=()
1206
1207    flags+=("--title=")
1208    two_word_flags+=("--title")
1209    two_word_flags+=("-t")
1210    local_nonpersistent_flags+=("--title")
1211    local_nonpersistent_flags+=("--title=")
1212    local_nonpersistent_flags+=("-t")
1213    flags+=("--non-interactive")
1214    local_nonpersistent_flags+=("--non-interactive")
1215
1216    must_have_one_flag=()
1217    must_have_one_noun=()
1218    noun_aliases=()
1219}
1220
1221_git-bug_title()
1222{
1223    last_command="git-bug_title"
1224
1225    command_aliases=()
1226
1227    commands=()
1228    commands+=("edit")
1229
1230    flags=()
1231    two_word_flags=()
1232    local_nonpersistent_flags=()
1233    flags_with_completion=()
1234    flags_completion=()
1235
1236
1237    must_have_one_flag=()
1238    must_have_one_noun=()
1239    noun_aliases=()
1240}
1241
1242_git-bug_user_adopt()
1243{
1244    last_command="git-bug_user_adopt"
1245
1246    command_aliases=()
1247
1248    commands=()
1249
1250    flags=()
1251    two_word_flags=()
1252    local_nonpersistent_flags=()
1253    flags_with_completion=()
1254    flags_completion=()
1255
1256
1257    must_have_one_flag=()
1258    must_have_one_noun=()
1259    noun_aliases=()
1260}
1261
1262_git-bug_user_create()
1263{
1264    last_command="git-bug_user_create"
1265
1266    command_aliases=()
1267
1268    commands=()
1269
1270    flags=()
1271    two_word_flags=()
1272    local_nonpersistent_flags=()
1273    flags_with_completion=()
1274    flags_completion=()
1275
1276    flags+=("--avatar=")
1277    two_word_flags+=("--avatar")
1278    two_word_flags+=("-a")
1279    local_nonpersistent_flags+=("--avatar")
1280    local_nonpersistent_flags+=("--avatar=")
1281    local_nonpersistent_flags+=("-a")
1282    flags+=("--email=")
1283    two_word_flags+=("--email")
1284    two_word_flags+=("-e")
1285    local_nonpersistent_flags+=("--email")
1286    local_nonpersistent_flags+=("--email=")
1287    local_nonpersistent_flags+=("-e")
1288    flags+=("--name=")
1289    two_word_flags+=("--name")
1290    two_word_flags+=("-n")
1291    local_nonpersistent_flags+=("--name")
1292    local_nonpersistent_flags+=("--name=")
1293    local_nonpersistent_flags+=("-n")
1294    flags+=("--non-interactive")
1295    local_nonpersistent_flags+=("--non-interactive")
1296
1297    must_have_one_flag=()
1298    must_have_one_noun=()
1299    noun_aliases=()
1300}
1301
1302_git-bug_user_ls()
1303{
1304    last_command="git-bug_user_ls"
1305
1306    command_aliases=()
1307
1308    commands=()
1309
1310    flags=()
1311    two_word_flags=()
1312    local_nonpersistent_flags=()
1313    flags_with_completion=()
1314    flags_completion=()
1315
1316    flags+=("--format=")
1317    two_word_flags+=("--format")
1318    two_word_flags+=("-f")
1319    local_nonpersistent_flags+=("--format")
1320    local_nonpersistent_flags+=("--format=")
1321    local_nonpersistent_flags+=("-f")
1322
1323    must_have_one_flag=()
1324    must_have_one_noun=()
1325    noun_aliases=()
1326}
1327
1328_git-bug_user()
1329{
1330    last_command="git-bug_user"
1331
1332    command_aliases=()
1333
1334    commands=()
1335    commands+=("adopt")
1336    commands+=("create")
1337    commands+=("ls")
1338
1339    flags=()
1340    two_word_flags=()
1341    local_nonpersistent_flags=()
1342    flags_with_completion=()
1343    flags_completion=()
1344
1345    flags+=("--field=")
1346    two_word_flags+=("--field")
1347    two_word_flags+=("-f")
1348    local_nonpersistent_flags+=("--field")
1349    local_nonpersistent_flags+=("--field=")
1350    local_nonpersistent_flags+=("-f")
1351
1352    must_have_one_flag=()
1353    must_have_one_noun=()
1354    noun_aliases=()
1355}
1356
1357_git-bug_version()
1358{
1359    last_command="git-bug_version"
1360
1361    command_aliases=()
1362
1363    commands=()
1364
1365    flags=()
1366    two_word_flags=()
1367    local_nonpersistent_flags=()
1368    flags_with_completion=()
1369    flags_completion=()
1370
1371    flags+=("--number")
1372    flags+=("-n")
1373    local_nonpersistent_flags+=("--number")
1374    local_nonpersistent_flags+=("-n")
1375    flags+=("--commit")
1376    flags+=("-c")
1377    local_nonpersistent_flags+=("--commit")
1378    local_nonpersistent_flags+=("-c")
1379    flags+=("--all")
1380    flags+=("-a")
1381    local_nonpersistent_flags+=("--all")
1382    local_nonpersistent_flags+=("-a")
1383
1384    must_have_one_flag=()
1385    must_have_one_noun=()
1386    noun_aliases=()
1387}
1388
1389_git-bug_webui()
1390{
1391    last_command="git-bug_webui"
1392
1393    command_aliases=()
1394
1395    commands=()
1396
1397    flags=()
1398    two_word_flags=()
1399    local_nonpersistent_flags=()
1400    flags_with_completion=()
1401    flags_completion=()
1402
1403    flags+=("--host=")
1404    two_word_flags+=("--host")
1405    local_nonpersistent_flags+=("--host")
1406    local_nonpersistent_flags+=("--host=")
1407    flags+=("--open")
1408    local_nonpersistent_flags+=("--open")
1409    flags+=("--no-open")
1410    local_nonpersistent_flags+=("--no-open")
1411    flags+=("--port=")
1412    two_word_flags+=("--port")
1413    two_word_flags+=("-p")
1414    local_nonpersistent_flags+=("--port")
1415    local_nonpersistent_flags+=("--port=")
1416    local_nonpersistent_flags+=("-p")
1417    flags+=("--read-only")
1418    local_nonpersistent_flags+=("--read-only")
1419    flags+=("--query=")
1420    two_word_flags+=("--query")
1421    two_word_flags+=("-q")
1422    local_nonpersistent_flags+=("--query")
1423    local_nonpersistent_flags+=("--query=")
1424    local_nonpersistent_flags+=("-q")
1425
1426    must_have_one_flag=()
1427    must_have_one_noun=()
1428    noun_aliases=()
1429}
1430
1431_git-bug_root_command()
1432{
1433    last_command="git-bug"
1434
1435    command_aliases=()
1436
1437    commands=()
1438    commands+=("add")
1439    commands+=("bridge")
1440    commands+=("commands")
1441    commands+=("comment")
1442    commands+=("deselect")
1443    commands+=("label")
1444    commands+=("ls")
1445    commands+=("ls-id")
1446    commands+=("ls-label")
1447    commands+=("pull")
1448    commands+=("push")
1449    commands+=("rm")
1450    commands+=("select")
1451    commands+=("show")
1452    commands+=("status")
1453    commands+=("termui")
1454    if [[ -z "${BASH_VERSION:-}" || "${BASH_VERSINFO[0]:-}" -gt 3 ]]; then
1455        command_aliases+=("tui")
1456        aliashash["tui"]="termui"
1457    fi
1458    commands+=("title")
1459    commands+=("user")
1460    commands+=("version")
1461    commands+=("webui")
1462
1463    flags=()
1464    two_word_flags=()
1465    local_nonpersistent_flags=()
1466    flags_with_completion=()
1467    flags_completion=()
1468
1469
1470    must_have_one_flag=()
1471    must_have_one_noun=()
1472    noun_aliases=()
1473}
1474
1475__start_git-bug()
1476{
1477    local cur prev words cword split
1478    declare -A flaghash 2>/dev/null || :
1479    declare -A aliashash 2>/dev/null || :
1480    if declare -F _init_completion >/dev/null 2>&1; then
1481        _init_completion -s || return
1482    else
1483        __git-bug_init_completion -n "=" || return
1484    fi
1485
1486    local c=0
1487    local flag_parsing_disabled=
1488    local flags=()
1489    local two_word_flags=()
1490    local local_nonpersistent_flags=()
1491    local flags_with_completion=()
1492    local flags_completion=()
1493    local commands=("git-bug")
1494    local command_aliases=()
1495    local must_have_one_flag=()
1496    local must_have_one_noun=()
1497    local has_completion_function=""
1498    local last_command=""
1499    local nouns=()
1500    local noun_aliases=()
1501
1502    __git-bug_handle_word
1503}
1504
1505if [[ $(type -t compopt) = "builtin" ]]; then
1506    complete -o default -F __start_git-bug git-bug
1507else
1508    complete -o default -o nospace -F __start_git-bug git-bug
1509fi
1510
1511# ex: ts=4 sw=4 et filetype=sh