mirror of https://github.com/jenv/jenv.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
3.2 KiB
162 lines
3.2 KiB
#!/usr/bin/env bash |
|
# |
|
# Summary: Display help for a command |
|
# |
|
# Usage: jenv help [--usage] COMMAND |
|
# |
|
# Parses and displays help contents from a command's source file. |
|
# |
|
# A command is considered documented if it starts with a comment block |
|
# that has a `Summary:' or `Usage:' section. Usage instructions can |
|
# span multiple lines as long as subsequent lines are indented. |
|
# The remainder of the comment block is displayed as extended |
|
# documentation. |
|
|
|
set -e |
|
[ -n "$JENV_DEBUG" ] && set -x |
|
|
|
command_path() { |
|
local command="$1" |
|
command -v jenv-"$command" || command -v jenv-sh-"$command" || true |
|
} |
|
|
|
extract_initial_comment_block() { |
|
sed -ne " |
|
/^#/ !{ |
|
q |
|
} |
|
|
|
s/^#$/# / |
|
|
|
/^# / { |
|
s/^# // |
|
p |
|
} |
|
" |
|
} |
|
|
|
collect_documentation() { |
|
awk ' |
|
/^Summary:/ { |
|
summary = substr($0, 10) |
|
next |
|
} |
|
|
|
/^Usage:/ { |
|
reading_usage = 1 |
|
usage = usage "\n" $0 |
|
next |
|
} |
|
|
|
/^( *$| )/ && reading_usage { |
|
usage = usage "\n" $0 |
|
next |
|
} |
|
|
|
{ |
|
reading_usage = 0 |
|
help = help "\n" $0 |
|
} |
|
|
|
function escape(str) { |
|
gsub(/[`\\$"]/, "\\\\&", str) |
|
return str |
|
} |
|
|
|
function trim(str) { |
|
sub(/^\n*/, "", str) |
|
sub(/\n*$/, "", str) |
|
return str |
|
} |
|
|
|
END { |
|
if (usage || summary) { |
|
print "summary=\"" escape(summary) "\"" |
|
print "usage=\"" escape(trim(usage)) "\"" |
|
print "help=\"" escape(trim(help)) "\"" |
|
} |
|
} |
|
' |
|
} |
|
|
|
documentation_for() { |
|
local filename="$(command_path "$1")" |
|
if [ -n "$filename" ]; then |
|
extract_initial_comment_block < "$filename" | collect_documentation |
|
fi |
|
} |
|
|
|
print_summary() { |
|
local command="$1" |
|
local summary usage help |
|
eval "$(documentation_for "$command")" |
|
|
|
if [ -n "$summary" ]; then |
|
printf " %-9s %s\n" "$command" "$summary" |
|
fi |
|
} |
|
|
|
print_summaries() { |
|
for command; do |
|
print_summary "$command" |
|
done |
|
} |
|
|
|
print_help() { |
|
local command="$1" |
|
local summary usage help |
|
eval "$(documentation_for "$command")" |
|
[ -n "$help" ] || help="$summary" |
|
|
|
if [ -n "$usage" -o -n "$summary" ]; then |
|
if [ -n "$usage" ]; then |
|
echo "$usage" |
|
else |
|
echo "Usage: jenv ${command}" |
|
fi |
|
if [ -n "$help" ]; then |
|
echo |
|
echo "$help" |
|
echo |
|
fi |
|
else |
|
echo "Sorry, this command isn't documented yet." >&2 |
|
return 1 |
|
fi |
|
} |
|
|
|
print_usage() { |
|
local command="$1" |
|
local summary usage help |
|
eval "$(documentation_for "$command")" |
|
[ -z "$usage" ] || echo "$usage" |
|
} |
|
|
|
unset usage |
|
if [ "$1" = "--usage" ]; then |
|
usage="1" |
|
shift |
|
fi |
|
|
|
if [ -z "$1" ] || [ "$1" == "jenv" ]; then |
|
echo "Usage: jenv <command> [<args>]" |
|
[ -z "$usage" ] || exit |
|
echo |
|
echo "Some useful jenv commands are:" |
|
print_summaries commands local global shell install uninstall rehash version versions which whence with add remove |
|
echo |
|
echo "See \`jenv help <command>' for information on a specific command." |
|
echo "For full documentation, see: https://github.com/jenv/jenv/blob/master/README.md" |
|
else |
|
command="$1" |
|
if [ -n "$(command_path "$command")" ]; then |
|
if [ -n "$usage" ]; then |
|
print_usage "$command" |
|
else |
|
print_help "$command" |
|
fi |
|
else |
|
echo "jenv: no such command \`$command'" >&2 |
|
exit 1 |
|
fi |
|
fi
|
|
|