Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Oh My Zsh
Commits
13260744
Commit
13260744
authored
Dec 27, 2019
by
Marc Cornellà
Browse files
knife: add README and reformat completion file
parent
a952854c
Changes
2
Show whitespace changes
Inline
Side-by-side
plugins/knife/README.md
0 → 100644
View file @
13260744
# knife plugin
This plugin adds completion for
[
knife
](
https://docs.chef.io/knife.html
)
, a command-line tool
to interact with
[
Chef
](
https://chef.io
)
, a platform to automate and manage infrastructure via
code.
To use it, add
`knife`
to the plugins array in your zshrc file:
```
zsh
plugins
=(
... knife
)
```
## Options
-
`KNIFE_RELATIVE_PATH`
: if set to
`true`
, the completion script will look for local cookbooks
under the
`cookbooks`
folder in the chef root directory. It has preference over the other two
options below.
**Default:**
empty.
-
`KNIFE_COOKBOOK_PATH`
: if set, it points to the folder that contains local cookbooks, for
example:
`/path/to/my/chef/cookbooks`
.
**Default:**
`cookbook_path`
field in
`knife.rb`
(see below).
-
`KNIFE_CONF_PATH`
: variable pointing to the
`knife.rb`
configuration file, for example
`/path/to/my/.chef/knife.rb`
. Only used if
`$KNIFE_COOKBOOK_PATH`
isn't set. If it exists,
`$PWD/.chef/knife.rb`
is used instead. Otherwise, if it's set, its value is used.
**Default**
:
`$HOME/.chef/knife.rb`
.
plugins/knife/_knife
View file @
13260744
...
@@ -9,7 +9,7 @@
...
@@ -9,7 +9,7 @@
# Read around where these are used for more detail.
# Read around where these are used for more detail.
# These flags should be available everywhere according to man knife
# These flags should be available everywhere according to man knife
knife_general_flags=(
--help --server-url --key --config --editor --format --log_level --logfile --no-editor --user --print-after --version --yes
)
knife_general_flags=(--help --server-url --key --config --editor --format --log_level --logfile --no-editor --user --print-after --version --yes)
# knife has a very special syntax, some example calls are:
# knife has a very special syntax, some example calls are:
# knife status
# knife status
...
@@ -25,8 +25,8 @@ _knife() {
...
@@ -25,8 +25,8 @@ _knife() {
typeset -A opt_args
typeset -A opt_args
cloudproviders=(bluebox ec2 rackspace slicehost terremark)
cloudproviders=(bluebox ec2 rackspace slicehost terremark)
_arguments \
_arguments \
'1: :->knifecmd'\
'1: :->knifecmd'
\
'2: :->knifesubcmd'\
'2: :->knifesubcmd'
\
'3: :->knifesubcmd2' \
'3: :->knifesubcmd2' \
'4: :->knifesubcmd3' \
'4: :->knifesubcmd3' \
'5: :->knifesubcmd4' \
'5: :->knifesubcmd4' \
...
@@ -38,7 +38,7 @@ _knife() {
...
@@ -38,7 +38,7 @@ _knife() {
;;
;;
knifesubcmd)
knifesubcmd)
case $words[2] in
case $words[2] in
(
bluebox|ec2|rackspace|slicehost|terremark)
bluebox|ec2|rackspace|slicehost|terremark)
compadd "$@" server images
compadd "$@" server images
;;
;;
client)
client)
...
@@ -76,6 +76,7 @@ _knife() {
...
@@ -76,6 +76,7 @@ _knife() {
;;
;;
*)
*)
_arguments '2:Subsubcommands:($(_knife_options1))'
_arguments '2:Subsubcommands:($(_knife_options1))'
;;
esac
esac
;;
;;
knifesubcmd2)
knifesubcmd2)
...
@@ -89,10 +90,10 @@ _knife() {
...
@@ -89,10 +90,10 @@ _knife() {
site)
site)
compadd "$@" vendor show share search download list unshare
compadd "$@" vendor show share search download list unshare
;;
;;
(
show|delete|edit)
show|delete|edit)
_arguments '3:Subsubcommands:($(_chef_$words[2]s_remote))'
_arguments '3:Subsubcommands:($(_chef_$words[2]s_remote))'
;;
;;
(
upload|test)
upload|test)
_arguments '3:Subsubcommands:($(_chef_$words[2]s_local) --all)'
_arguments '3:Subsubcommands:($(_chef_$words[2]s_local) --all)'
;;
;;
list)
list)
...
@@ -103,6 +104,7 @@ _knife() {
...
@@ -103,6 +104,7 @@ _knife() {
;;
;;
*)
*)
_arguments '3:Subsubcommands:($(_knife_options2))'
_arguments '3:Subsubcommands:($(_knife_options2))'
;;
esac
esac
;;
;;
knifesubcmd3)
knifesubcmd3)
...
@@ -113,12 +115,14 @@ _knife() {
...
@@ -113,12 +115,14 @@ _knife() {
versioncomp=1
versioncomp=1
_arguments '4:Cookbookversions:($(_cookbook_versions) latest)'
_arguments '4:Cookbookversions:($(_cookbook_versions) latest)'
;;
;;
(
node|client|role)
node|client|role)
compadd "$@" --attribute
compadd "$@" --attribute
;;
esac
esac
;;
esac
esac
case $words[4] in
case $words[4] in
(
show|edit)
show|edit)
_arguments '4:Subsubsubcommands:($(_chef_$words[2]_$words[3]s_remote))'
_arguments '4:Subsubsubcommands:($(_chef_$words[2]_$words[3]s_remote))'
;;
;;
file)
file)
...
@@ -134,6 +138,7 @@ _knife() {
...
@@ -134,6 +138,7 @@ _knife() {
;;
;;
*)
*)
_arguments '*:Subsubcommands:($(_knife_options3))'
_arguments '*:Subsubcommands:($(_knife_options3))'
;;
esac
esac
;;
;;
list)
list)
...
@@ -141,17 +146,18 @@ _knife() {
...
@@ -141,17 +146,18 @@ _knife() {
;;
;;
*)
*)
_arguments '*:Subsubcommands:($(_knife_options3))'
_arguments '*:Subsubcommands:($(_knife_options3))'
;;
esac
esac
;;
;;
knifesubcmd4)
knifesubcmd4)
if ((
versioncomp > 0
)); then
if ((versioncomp > 0)); then
compadd "$@" attributes definitions files libraries providers recipes resources templates
compadd "$@" attributes definitions files libraries providers recipes resources templates
else
else
case $words[5] in
case $words[5] in
file)
file)
_arguments '*:directory:_path_files -/ -W "$(_chef_root)/data_bags" -qS \ '
_arguments '*:directory:_path_files -/ -W "$(_chef_root)/data_bags" -qS \ '
;;
;;
*) _arguments '*:Subsubcommands:($(_knife_options2))'
*) _arguments '*:Subsubcommands:($(_knife_options2))'
;;
esac
esac
fi
fi
;;
;;
...
@@ -162,21 +168,23 @@ _knife() {
...
@@ -162,21 +168,23 @@ _knife() {
;;
;;
*)
*)
_arguments '*:Subsubcommands:($(_knife_options3))'
_arguments '*:Subsubcommands:($(_knife_options3))'
;;
esac
esac
;;
esac
esac
}
}
# Helper functions to provide the argument completion for several depths of commands
# Helper functions to provide the argument completion for several depths of commands
_knife_options1() {
_knife_options1() {
(
for line in $(
knife $words[2] --help | grep -v "^knife"
); do echo $line | grep "\-\-"; done
)
(
for line in $(knife $words[2] --help | grep -v "^knife"); do echo $line | grep "\-\-"; done)
}
}
_knife_options2() {
_knife_options2() {
(
for line in $(
knife $words[2] $words[3] --help | grep -v "^knife"
); do echo $line | grep "\-\-"; done
)
(
for line in $(knife $words[2] $words[3] --help | grep -v "^knife"); do echo $line | grep "\-\-"; done)
}
}
_knife_options3() {
_knife_options3() {
(
for line in $(
knife $words[2] $words[3] $words[4] --help | grep -v "^knife"
); do echo $line | grep "\-\-"; done
)
(
for line in $(knife $words[2] $words[3] $words[4] --help | grep -v "^knife"); do echo $line | grep "\-\-"; done)
}
}
# The chef_x_remote functions use knife to get a list of objects of type x on the server
# The chef_x_remote functions use knife to get a list of objects of type x on the server
...
@@ -217,7 +225,7 @@ _chef_cookbooks_local() {
...
@@ -217,7 +225,7 @@ _chef_cookbooks_local() {
if [ -f ./.chef/knife.rb ]; then
if [ -f ./.chef/knife.rb ]; then
knife_rb="./.chef/knife.rb"
knife_rb="./.chef/knife.rb"
fi
fi
local cookbook_path=${KNIFE_COOKBOOK_PATH:-$(grep cookbook_path $knife_rb | awk 'BEGIN {FS = "[" }; {print $2}' | sed 's/\,//g' | sed "s/'//g" | sed 's/\(.*\)]/\1/'
)}
local cookbook_path=${KNIFE_COOKBOOK_PATH:-$(grep cookbook_path $knife_rb | awk 'BEGIN {FS = "[" }; {print $2}' | sed 's/\,//g' | sed "s/'//g" | sed 's/\(.*\)]/\1/')}
fi
fi
(for i in $cookbook_path; do ls $i; done)
(for i in $cookbook_path; do ls $i; done)
}
}
...
@@ -229,10 +237,9 @@ _cookbook_versions() {
...
@@ -229,10 +237,9 @@ _cookbook_versions() {
# Searches up from current directory to find the closest folder that has a .chef folder
# Searches up from current directory to find the closest folder that has a .chef folder
# Useful for the knife upload/from file commands
# Useful for the knife upload/from file commands
_chef_root
() {
_chef_root() {
directory="$PWD"
directory="$PWD"
while [ $directory != '/' ]
while [ $directory != '/' ]; do
do
test -e "$directory/.chef" && echo "$directory" && return
test -e "$directory/.chef" && echo "$directory" && return
directory="${directory:h}"
directory="${directory:h}"
done
done
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment