#!/bin/bash # A meta micro manager for the masses. # USAGE: # gimme [-f|--force] stuff # gimme [-l|--list|--installed] # gimme [--old|--outdated] # gimme [-v|--verbose|--debug] # gimme [-h|--help|help] ############################################################################### [ "$GIMME_URL" ] || export GIMME_URL="https://github.com/KylePDavis/gimme" [ "$GIMME_DIR" ] || export GIMME_DIR="$HOME/.gimme" [ "$GIMME_GIMMES_DIR" ] || export GIMME_GIMMES_DIR="$GIMME_DIR/gimmes" [ "$GIMME_LINK" ] || export GIMME_LINK="$HOME/bin/gimme" [ "$GIMME_LINK_DIR" ] || export GIMME_LINK_DIR=$(dirname "$GIMME_LINK") [ "$GIMMES" ] || export GIMMES="" [ "$INIT_GIMMES" ] || export INIT_GIMMES="" [ "$OS" ] || export OS=$(uname -s) [ "$DEBUG" ] || export DEBUG= [ "$FORCE" ] || export FORCE= ############################################################################### ! [[ "$DEBUG" ]] || set -x has() { if [[ "$FORCE" ]] && echo " $INIT_GIMMES " | grep -q " $1 "; then false else which "$1" >/dev/null fi } gimme_pkg() { if [[ "$OS" = "Darwin" ]]; then if brew cask cat "$1" &>/dev/null; then if brew cask list "$1" &>/dev/null; then if [[ "$FORCE" ]]; then brew cask reinstall "$@" else echo "# SKIPPED: $GIMME (force reinstall/upgrade via: gimme -f $GIMME)" fi else brew cask install "$@" fi elif brew cat "$1" &>/dev/null; then if brew list "$1" &>/dev/null; then if [[ "$FORCE" ]]; then brew upgrade "$@" || echo "# WARN: forced upgrade failed (it may already be up to date)" else echo "# SKIPPED: $GIMME (force upgrade via: gimme -f $GIMME)" fi else brew install "$@" fi else brew search "$1" fi else sudo apt-get -y install "$@" fi } if [[ "$0" =~ [-]?bash ]]; then # sourced or piped if [[ "${BASH_SOURCE[@]}" ]]; then # sourced _gimme_completely() { if [[ "$2" = -* ]]; then COMPREPLY=( $(compgen -W "-v --verbose --debug --force --version --help -l --list --installed --old --outdated" -- "$2") ) else COMPREPLY=( $(find "$GIMME_GIMMES_DIR" -type f -path "$GIMME_GIMMES_DIR/$2*" \! -name '.*' | cut -c$(( ${#GIMME_GIMMES_DIR} + 2))- ) ) fi } complete -F _gimme_completely gimme else # piped set -o errexit -o pipefail # gimmes/gcc: inlined for curl-based installs if [[ "$OS" = "Darwin" ]]; then if ! "xcode-select" --version &>/dev/null; then echo "Try again after installing the Xcode command-line tools by running: xcode-select --install" exit 1 fi if ! xcodebuild -help &>/dev/null; then echo "Try again after agreeing to the Xcode license by running: sudo xcodebuild -license" exit 1 fi else has gcc || gimme_pkg build-essential fi # gimmes/git: inlined for curl-based installs has git || gimme_pkg git if ! [[ -d "$GIMME_DIR" ]]; then echo "Installing $GIMME_DIR/gimme ..." mkdir -p "$GIMME_DIR" git clone "$GIMME_URL" "$GIMME_DIR" mkdir -p "$(dirname "$GIMME_LINK")" ln -sf "$GIMME_DIR/gimme" "$GIMME_LINK" echo "Done! Now you can 'gimme stuff' or 'gimme dev/stuff' or even 'gimme gimme'!" else echo "Updating gimme (in $GIMME_DIR) ..." cd "$GIMME_DIR" OLD_REV=$(git rev-parse HEAD) git pull git log --oneline "$OLD_REV.." fi fi else # normal usage set -o errexit -o pipefail export -f has gimme_pkg [[ "$INIT_GIMMES" ]] || export INIT_GIMMES="$@" DID_GIMME= for GIMME; do case "$GIMME" in -v|--verbose|--debug) DEBUG=1 continue ;; -f|--force) FORCE=1 continue ;; --version) echo "Version:" git log -1 exit 0 ;; -h|--help|"") sed -n -e'/^#[[:space:]]/p' -e'/^###/q' "$0" echo "# GIMMES:" echo $(cd "$GIMME_GIMMES_DIR"; find . -type f -perm +1 | sed -e's/^..//' -e'/^_/d' | sort) exit 0 ;; -l|--list|--installed) echo "# BREW (cask):" brew cask list echo echo "# BREW:" brew list echo echo "# NPM:" npm -g ls --depth 0 echo echo "# PIP:" pip list --format=columns exit 0 ;; --old|--outdated) echo "# BREW (cask):" brew cask outdated echo echo "# BREW:" brew outdated echo echo "# NPM:" npm outdated -g --depth 0 echo echo "# PIP:" pip list --format=columns --outdated exit 0 ;; esac ! [[ "$DEBUG" ]] || set -x echo "# WANT: $GIMME" ! [[ "$GIMMES" == *" $GIMME "* ]] || exit 0 export GIMMES+=" $GIMME " GIMME P="$GIMME_GIMMES_DIR/$GIMME" if ! [[ -f "$P" ]]; then # find _default handler while P=$(dirname "$P") && [[ "$P" = "$GIMME_GIMMES_DIR"* ]]; do if [[ -f "$P/_default" ]]; then P="$P/_default" break; fi done # no default if ! [[ "$P" = "$GIMME_GIMMES_DIR"* ]]; then echo "# ERROR: Unable to find $GIMME_GIMMES_DIR/_default handler" exit 1 fi fi if [[ -x "$P" ]]; then DID_GIMME=1 [[ "$PATH" = "$LINK_DIR"* ]] || export PATH="$LINK_DIR:$PATH" if (if [[ "$DEBUG" ]]; then bash -x "$P"; else bash "$P"; fi); then echo "# DONE: $GIMME" else OUCH=$? echo "# FAIL: Error for gimme \"$GIMME\" (EXIT_CODE=$OUCH)" exit $OUCH fi else echo "# WARN: the gimme \"$GIMME\" was SKIPPED because \"$P\" is not marked executable!" fi done [[ "$DID_GIMME" ]] || echo "# WARN: nothing to do... try: gimme --help" fi