bash-completion 5.68 KB
Newer Older
liuzhe-lz's avatar
liuzhe-lz committed
1
# list of commands/arguments
liuzhe-lz's avatar
liuzhe-lz committed
2
__nnictl_cmds="create resume view update stop trial experiment platform import export webui config log package tensorboard top"
3
4
__nnictl_create_cmds="--config --port --debug"
__nnictl_resume_cmds="--port --debug"
liuzhe-lz's avatar
liuzhe-lz committed
5
__nnictl_view_cmds="--port"
6
__nnictl_update_cmds="searchspace concurrency duration trialnum"
liuzhe-lz's avatar
liuzhe-lz committed
7
8
9
__nnictl_update_searchspace_cmds="--filename"
__nnictl_update_concurrency_cmds="--value"
__nnictl_update_duration_cmds="--value"
10
__nnictl_update_trialnum_cmds="--value"
11
__nnictl_stop_cmds="--port --all"
12
13
14
15
16
17
18
19
20
21
__nnictl_trial_cmds="ls kill codegen"
__nnictl_trial_kill_cmds="--trial_id"
__nnictl_trial_codegen_cmds="--trial_id"
__nnictl_experiment_cmds="show status list delete"
__nnictl_experiment_list_cmds="--all"
__nnictl_experiment_delete_cmds="--all"
__nnictl_platform_cmds="clean"
__nnictl_platform_clean_cmds="--config"
__nnictl_import_cmds="--filename"
__nnictl_export_cmds="--type --filename"
22
__nnictl_webui_cmds="url"
liuzhe-lz's avatar
liuzhe-lz committed
23
__nnictl_config_cmds="show"
24
__nnictl_log_cmds="stdout stderr trial"
liuzhe-lz's avatar
liuzhe-lz committed
25
26
__nnictl_log_stdout_cmds="--tail --head --path"
__nnictl_log_stderr_cmds="--tail --head --path"
27
28
29
30
31
32
__nnictl_log_trial_cmds="--trial_id"
__nnictl_package_cmds="install show"
__nnictl_package_install_cmds="--name"
__nnictl_tensorboard_cmds="start stop"
__nnictl_tensorboard_start_cmds="--trial_id --port"
__nnictl_top_cmds="--time"
liuzhe-lz's avatar
liuzhe-lz committed
33

34
# list of commands that accept an experiment ID as second argument
liuzhe-lz's avatar
liuzhe-lz committed
35
__nnictl_2nd_expid_cmds=" resume view stop import export "
36
37
# list of commands that accept an experiment ID as third argument
__nnictl_3rd_expid_cmds=" update trial experiment webui config log tensorboard "
liuzhe-lz's avatar
liuzhe-lz committed
38
39
40
41
42
43
44
45


# remove already set arguments from candidates
__nnictl_remain_args()
{
    local ret=${!1}  # ret = $__nnictl_xxx_cmds
    # for arg in COMP_WORDS[:-1]:
    for arg in "${COMP_WORDS[@]::${#COMP_WORDS[@]}-1}"; do
46
        local ret=${ret/$arg/}  # remove it from $ret
liuzhe-lz's avatar
liuzhe-lz committed
47
48
49
50
    done
    echo $ret
}

51
52
53
54
55
56
57
58
59
60
61
# complete files with specific extension
__nnictl_complete_extension()
{
    COMPREPLY=($(compgen -f -X "!*.$1" -- ${COMP_WORDS[-1]}))
    if [[ -z "${COMPREPLY[*]}" ]]; then
        # if there is no matching file here, search in sub-directories
        COMPREPLY=($(compgen -d -S "/" -- ${COMP_WORDS[-1]}))
        compopt -o nospace
    fi
}

liuzhe-lz's avatar
liuzhe-lz committed
62
63
_nnictl()
{
64
65
66
    local cur=${COMP_WORDS[-1]}
    local last=${COMP_WORDS[-2]}

liuzhe-lz's avatar
liuzhe-lz committed
67
    if [[ ${#COMP_WORDS[@]} -eq 2 ]]; then
liuzhe-lz's avatar
liuzhe-lz committed
68
69
70
        # completing frst argument from __nnictl_cmds
        COMPREPLY=($(compgen -W "$__nnictl_cmds" -- "${COMP_WORDS[1]}"))

liuzhe-lz's avatar
liuzhe-lz committed
71
    elif [[ ${#COMP_WORDS[@]} -eq 3 ]]; then
liuzhe-lz's avatar
liuzhe-lz committed
72
73
74
75
        # completing second argument from __nnictl_${FirstArg}_cmds
        local args=__nnictl_${COMP_WORDS[1]}_cmds
        COMPREPLY=($(compgen -W "${!args}" -- "${COMP_WORDS[2]}"))

76
        # add experiment IDs to candidates if desired
liuzhe-lz's avatar
liuzhe-lz committed
77
        if [[ $__nnictl_2nd_expid_cmds =~ " ${COMP_WORDS[1]} " ]]; then
78
79
80
81
82
            local experiments=$(ls ~/nni/experiments 2>/dev/null)
            COMPREPLY+=($(compgen -W "$experiments" -- $cur))
        fi

    elif [[ $last != -* || $last == --debug ]]; then
liuzhe-lz's avatar
liuzhe-lz committed
83
        # last argument does not starts with "-", so this one is likely to be "--xxx"
84
85
86
        local args=__nnictl_${COMP_WORDS[1]}_${COMP_WORDS[2]}_cmds
        if [[ $args =~ "-" || -z ${!args} ]]; then
            # the second argument starts with "-", use __nnictl_${FirstArg}_cmds
liuzhe-lz's avatar
liuzhe-lz committed
87
88
89
90
            local args=__nnictl_${COMP_WORDS[1]}_cmds
        fi
        # remove already set arguments from candidates
        local remain_args=$(__nnictl_remain_args ${args})
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
        COMPREPLY=($(compgen -W "$remain_args" -- $cur))

        # if this is 3rd arguments, try adding experiment IDs to candidates
        if [[ ${#COMP_WORDS[@]} -eq 4 ]]; then
            if [[ $__nnictl_3rd_expid_cmds =~ " ${COMP_WORDS[1]} " && ${COMP_WORDS[2]} != "list" ]]; then
                local experiments=$(ls ~/nni/experiments 2>/dev/null)
                COMPREPLY+=($(compgen -W "$experiments" -- $cur))
            fi
        fi

    elif [[ ${COMP_WORDS[1]} == "export" ]]; then
        # "export" command is somewhat unique
        if [[ " --type -t " =~ " $last " ]]; then
            COMPREPLY=($(compgen -W "json csv" -- $cur))

        elif [[ " --filename -f " =~ " $last " ]]; then
            # try to detect whether complete CSV file or JSON file
            [[ "$COMP_LINE" =~ "csv" ]] && local export_csv=1
            [[ "$COMP_LINE" =~ "json" ]] && local export_json=1
            if [[ -n $export_csv && -z $export_json ]]; then
                local ext="csv"         # CSV only
            elif [[ -n $export_json && -z $export_csv ]]; then
                local ext="json"        # JSON only
            else
                local ext="@(csv|json)" # both
            fi
            __nnictl_complete_extension "$ext"
        fi

    elif [[ " --trial_id -t " =~ " $last " ]]; then
        # complete trial ID
        if [[ -e ${HOME}/nni/experiments/${COMP_WORDS[2]} ]]; then
            local trials=$(ls -d ~/nni/experiments/${COMP_WORDS[2]}/trials/* 2>/dev/null | grep -o '[^/]*$')
        elif [[ -e "${HOME}/nni/experiments/${COMP_WORDS[3]}" ]]; then
            local trials=$(ls -d ~/nni/experiments/${COMP_WORDS[3]}/trials/* 2>/dev/null | grep -o '[^/]*$')
        else
            local trials=$(ls -d ~/nni/experiments/*/trials/* 2>/dev/null | grep -o '[^/]*$')
        fi
        COMPREPLY=($(compgen -W "$trials" -- $cur))
liuzhe-lz's avatar
liuzhe-lz committed
130

131
132
133
    elif [[ " --config -c " =~ " $last " ]]; then
        # complete YAML file
        __nnictl_complete_extension "@(yml|yaml)"
liuzhe-lz's avatar
liuzhe-lz committed
134

135
136
137
    elif [[ " --filename -f " =~ " $last " ]]; then
        # complete JSON file
        __nnictl_complete_extension "json"
liuzhe-lz's avatar
liuzhe-lz committed
138
139
140
141

    fi
}

liuzhe-lz's avatar
liuzhe-lz committed
142
143
144
145
146
if [[ ${BASH_VERSINFO[0]} -le 4 && ${BASH_VERSINFO[1]} -le 4 ]]; then
    complete -F _nnictl nnictl
else
    complete -o nosort -F _nnictl nnictl
fi