#!/usr/bin/env bash # # Show help for Cogito commands. # Copyright (c) Petr Baudis, 2005 # # Takes an optional argument describing the command to show the help for. # The command can be specified either as 'COMMAND' or 'cg-COMMAND'. # If the argument is left out an overview of all the Cogito commands will # be shown. # # Note, short help for a command is also available by passing `--help` or # `-h` to the command. The complete command manual is shown when passing # `--long-help` (and is the same as doing "`cg-help command`"). # # OPTIONS # ------- # -c:: Colorize # Colorize the output. USAGE="cg-help [-c] [cg-COMMAND | COMMAND]" _git_repo_unneeded=1 . "${COGITO_LIB}"cg-Xlib || exit 1 setup_colors() { local color_none="$(tput op)" local emphasize="$(tput setaf 1)" local desclist="$(tput setaf 3)" local cgcmd="$(tput setaf 2)" local codesnippet="$(tput setaf 6)" local usage="$(tput setaf 3)" local section="$(tput setaf 5)" local copyright="$(tput setaf 4)" apply_colors=" s/^\(-.*\)::.*/$desclist\1$color_none:/ s/^\(.*\)::/$desclist\1$color_none:/ s/\`\(cg-[a-z-]*\)\`/$cgcmd\1$color_none/g s/\`\([^\`]*\)\`/$codesnippet&$color_none/g s/[^A-Z0-9a-z_-]\$ .*/$codesnippet&$color_none/g s/'\([^ ]*\)'/$emphasize&$color_none/g s/'\(-[A-Z0-9a-z_-]* [^']*\)'/$emphasize&$color_none/g s/^Usage: .*/$usage&$color_none/ /^[A-Z -_]*/,/^---*$/s/^[A-Z -_]*\$/$section&$color_none/ s/^Copyright .*/$copyright&$color_none/ " } print_command_listing() { for command in "$@"; do [ -f "$command" -a ! -L "$command" ] || continue cmdname="$(basename "$command")" shortdesc="$(sed -n 'n;n;p;q' <"$command")" # Some minimal sanity check that we didn't pick up some # random binary named cg-* [ "${shortdesc:0:1}" = "#" ] || continue printf " %-18s %s\n" "$cmdname" "${shortdesc:2}" done } colorize() { sed -e "$apply_colors" | pager } apply_colors= while optparse; do if optparse -c; then setup_colors else optfail fi done bin_path="$(dirname "$0")" if [ "$ARGS" = "admin" ]; then echo "The advanced (low-level, dangerous, or administrative) commands:" IFS=$'\n' print_command_listing $(ls "$bin_path"/cg-admin*) exit elif [ "$ARGS" = "branch" ]; then echo "The branch commands family:" IFS=$'\n' print_command_listing $(ls "$bin_path"/cg-branch*) exit elif [ "$ARGS" = "tag" ]; then echo "The tag commands family:" IFS=$'\n' print_command_listing $(ls "$bin_path"/cg-tag*) exit elif [ "$ARGS" ]; then cmd="$(echo "${ARGS[0]}" | sed 's/^cg-//')" print_help long "$cmd" | colorize [ "${PIPESTATUS[0]}" -eq 0 ] && exit echo "cg-help: no help available for command \"${ARGS[0]}\"" echo "Call cg-help without any arguments for the list of available commands" exit 1 fi REGULAR_COMMANDS="$(ls "$bin_path"/cg-* | grep -v /cg-X | grep -v /cg-admin | grep -v /cg-branch | grep -v /cg-tag)" # TODO: Some uberevil `column` tricks... BRANCH_COMMANDS="$(ls "$bin_path"/cg-branch* | sed 's#.*/##' | tr '\n' ' ')" TAG_COMMANDS="$(ls "$bin_path"/cg-tag* | sed 's#.*/##' | tr '\n' ' ')" ADVANCED_COMMANDS="$(ls "$bin_path"/cg-admin-* | sed 's#.*/##' | tr '\n' ' ')" IFS=$'\n' colorize <<__END__ The Cogito version control system $(cg-version) Available regular commands: $(print_command_listing $REGULAR_COMMANDS) Special command families: cg-help admin ($ADVANCED_COMMANDS) cg-help branch ($BRANCH_COMMANDS) cg-help tag ($TAG_COMMANDS) These expressions can be used interchangeably as "ID"s: empty string, "this" or "HEAD" (current HEAD) branch name (as registered with cg-branch-add) tag name (as registered with cg-tag) date string (as recognized by the date tool) shortcut hash (shorted unambiguous hash lead) commit object hash (as returned by cg-object-id -c) tree object hash (accepted only by some commands) For details on individual commands, do e.g.: cg-help cg-log cg-log --long-help (both variants are equivalent) __END__