aboutsummaryrefslogtreecommitdiff
path: root/lib/keyringer/completions/bash/keyringer
blob: eeda27f25825109916defedbc7c80e3948346e18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#!bash
#
# Keyringer bash completion
#

if [[ -n ${ZSH_VERSION-} ]]; then
	autoload -U +X bashcompinit && bashcompinit
fi

# Completion for git subcommand
_keyringer_git_complete() {
  local git_completion=""

  if [ -e "/etc/bash_completion.d/git" ]; then
    git_completion="/etc/bash_completion.d/git"
  elif [ -e "/usr/share/bash-completion/completions/git" ]; then
    git_completion="/usr/share/bash-completion/completions/git"
  fi

  if [ ! -z "$git_completion" ]; then
    (
      source $git_completion
      cd $path
      COMP_WORDS=(git $*)
      COMP_CWORD=$((${#COMP_WORDS[*]} - 1))

      if [ "$COMP_CWORD" == "0" ]; then
        COMP_CWORD=1
      fi

      _git

      LAST=${COMP_WORDS[COMP_CWORD]}
      REPLY=${COMPREPLY[@]}

      if [ "$REPLY" == "$LAST" ]; then
        return
      fi

      echo ${COMPREPLY[@]}
    )
  fi
}

# Path completion
function _keyringer_path_complete() {
  # Thanks http://unix.stackexchange.com/questions/55520/create-bash-completion-script-to-autocomplete-paths-after-is-equal-sign
  cur=${1//\\ / }
  [[ ${cur} == "~"* ]] && cur=${cur/\~/$HOME}

  echo ${cur}
}

# Main completion
_keyringer() {
  # Standard stuff
  local cur prev command config path keyrings instances instance opts
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  prev="${COMP_WORDS[COMP_CWORD-1]}"
  command="${COMP_WORDS[2]}"

  # Initial options
  config="$HOME/.keyringer"

  # Check if we have initial configuration
  if [ ! -d "$config" ]; then
    return
  fi

  # Process config
  source $config/config
  keyrings="`ls --color=never $config | sed -e 's/config//' | xargs`"

  # Available instances
  instances="`echo $keyrings | sed -e 's/ /\\\|/g'`"

  # The current instance
  instance="${COMP_WORDS[1]}"
  path="`eval echo '$'$instance`"

  # Command completions
  if [ "${#COMP_WORDS[@]}" == "2" ]; then
    opts="$keyrings"
  elif [ "${#COMP_WORDS[@]}" == "3" ] && echo "${prev}" | grep -qe "$instances"; then
    opts="`export KEYRINGER_CHECK_VERSION=false && keyringer $instance commands`"
  elif [ "${#COMP_WORDS[@]}" == "3" ]; then
    opts="init"
  elif [ "${#COMP_WORDS[@]}" == "4" ]; then
    case "${prev}" in
      options|preferences)
        opts="ls edit add"
        ;;
      recipients)
        opts="ls edit"
        ;;
      ls|tree|encrypt|encrypt-batch|decrypt|edit|append|append-batch|del|rm|recrypt|open)
        cur="`echo ${cur} | sed -e "s|^/*||"`" # avoid leading slash
        opts="$(bash -c "set -f && export KEYRINGER_CHECK_VERSION=false && keyringer $instance ls -p -d ${cur}*" 2> /dev/null)"
        ;;
      genpair)
        opts="gpg ssh ssl ssl-self"
        ;;
      git)
        opts="$(_keyringer_git_complete ${cur})"
        ;;
      init)
        cur="$(_keyringer_path_complete ${cur})"
        opts="`compgen -o default "${cur}"`"
        ;;
      *)
        ;;
    esac
  elif [ "${#COMP_WORDS[@]}" == "5" ]; then
    case "${command}" in
      recipients)
        cur="`echo ${cur} | sed -e "s|^/*||"`" # avoid leading slash
        opts="$(cd $path/config/recipients && ls --color=never -p ${cur}* 2> /dev/null)"
        ;;
      genpair)
        cur="`echo ${cur} | sed -e "s|^/*||"`" # avoid leading slash
        opts="$(bash -c "set -f && export KEYRINGER_CHECK_VERSION=false && keyringer $instance ls -p -d ${cur}*" 2> /dev/null)"
        ;;
      git)
        # TODO
        opts="$(_keyringer_git_complete ${prev} ${cur})"
        ;;
      encrypt|encrypt-batch)
        cur="$(_keyringer_path_complete ${cur})"
        opts="`compgen -o default "${cur}"`"
        ;;
      *)
        ;;
    esac
  elif [ "${command}" == "git" ]; then
    # TODO
    opts="$(_keyringer_git_complete ${COMP_WORDS[@]:3})"
  fi

  # Avoid annoying bell and extra tab
  if [ -z "$ZSH_VERSION" ]; then
    bind 'set show-all-if-ambiguous on'
  fi

  # Return the available options
  COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )

  if [ -z "$ZSH_VERSION" ]; then
    [[ $COMPREPLY == */ ]] && compopt -o nospace
  fi

  return 0
}

complete -F _keyringer keyringer