123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- #!/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
- command -v "$1" >/dev/null
- fi
- }
- gimme_pkg() {
- if [[ "$OS" = "Darwin" ]]; then
- if ! has brew; then
- has curl || gimme_pkg curl
- [[ -d "$HOME/homebrew" ]] || (mkdir "$HOME/homebrew" 2>/dev/null && curl -L "https://github.com/Homebrew/brew/tarball/master" | tar xz --strip 1 -C "$HOME/homebrew" && "$HOME/homebrew/bin/brew" update)
- fi
- if [[ "$1" ]]; then
- if brew cat --cask "$1" &>/dev/null; then
- if brew list --cask "$1" &>/dev/null; then
- if [[ "$FORCE" ]]; then
- brew reinstall --cask "$@"
- else
- echo "# SKIPPED: $GIMME (force reinstall/upgrade via: gimme -f $GIMME)"
- fi
- else
- brew install --cask "$@"
- 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
- fi
- elif [[ "$1" ]]; then
- if has apt-get; then
- sudo apt-get -y install "$@"
- elif has yum; then
- sudo yum -y install "$@"
- elif has apk; then
- sudo apk add "$@"
- else
- echo "ERROR: This OS is not currently supported. See the website for details: $GIMME_URL"
- fi
- fi
- }
- if [[ "$ZSH_VERSION" ]]; then
- setopt posixargzero
- fi
- if [[ "$0" =~ -?(z|ba)sh ]]; then # sourced or piped
- if [[ "$ZSH_EVAL_CONTEXT" =~ :file$ || "${BASH_SOURCE[*]}" ]]; then # sourced
- # if 'gimme' is not Add gimme to the PATH if not already found
- if ! [[ "$PATH" == *"$GIMME_DIR"* ]]; then
- export PATH="$PATH:$GIMME_DIR"
- fi
- # setup autocompletion for gimmes
- _gimme_completely() {
- if [[ "$2" = -* ]]; then
- COMPREPLY=( $(compgen -W "-v --verbose --debug --force --version --help -l --list --installed --old --outdated" -- "$2") )
- else
- COMPREPLY=( $(cd "$GIMME_GIMMES_DIR"; find . -path "./$2*" \! -type d \! -name '.*' \! -name '_*' | cut -c3- ) )
- 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 || gimme_pkg gcc
- 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 "Installed '$GIMME_DIR/gimme'"
- echo "You can use this script directly or include in your shell's startup profile script to enable tab completion."
- echo "Example usage 'gimme stuff' or 'gimme dev/stuff' or even 'gimme gimme'!"
- else
- echo "Updating '$GIMME_DIR/gimme' ..."
- cd "$GIMME_DIR"
- OLD_REV="$(git rev-parse HEAD)"
- git pull
- NEW_REV="$(git rev-parse HEAD)"
- if [[ "$NEW_REV" != "$OLD_REV" ]]; then
- echo "Updates to '$GIMME_DIR/gimme' ..."
- git log --oneline "$OLD_REV.."
- fi
- echo "Updated '$GIMME_DIR/gimme'"
- 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
- ;;
- -*)
- echo "# ERROR: Unknown option: $GIMME"
- continue
- ;;
- 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
|