gimme 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. #!/bin/bash
  2. # A meta micro manager for the masses.
  3. # USAGE:
  4. # gimme [-f|--force] stuff
  5. # gimme [-l|--list|--installed]
  6. # gimme [--old|--outdated]
  7. # gimme [-v|--verbose|--debug]
  8. # gimme [-h|--help|help]
  9. ###############################################################################
  10. [ "$GIMME_URL" ] || export GIMME_URL="https://github.com/KylePDavis/gimme"
  11. [ "$GIMME_DIR" ] || export GIMME_DIR="$HOME/.gimme"
  12. [ "$GIMME_GIMMES_DIR" ] || export GIMME_GIMMES_DIR="$GIMME_DIR/gimmes"
  13. [ "$GIMME_LINK" ] || export GIMME_LINK="$HOME/bin/gimme"
  14. [ "$GIMME_LINK_DIR" ] || export GIMME_LINK_DIR=$(dirname "$GIMME_LINK")
  15. [ "$GIMMES" ] || export GIMMES=""
  16. [ "$INIT_GIMMES" ] || export INIT_GIMMES=""
  17. [ "$OS" ] || export OS=$(uname -s)
  18. [ "$DEBUG" ] || export DEBUG=
  19. [ "$FORCE" ] || export FORCE=
  20. ###############################################################################
  21. ! [[ "$DEBUG" ]] || set -x
  22. has() {
  23. if [[ "$FORCE" ]] && echo " $INIT_GIMMES " | grep -q " $1 "; then
  24. false
  25. else
  26. which "$1" >/dev/null
  27. fi
  28. }
  29. gimme_pkg() {
  30. if [[ "$OS" = "Darwin" ]]; then
  31. if brew cask cat "$1" &>/dev/null; then
  32. if brew cask list "$1" &>/dev/null; then
  33. if [[ "$FORCE" ]]; then
  34. brew cask reinstall "$@"
  35. else
  36. echo "# SKIPPED: $GIMME (force reinstall/upgrade via: gimme -f $GIMME)"
  37. fi
  38. else
  39. brew cask install "$@"
  40. fi
  41. elif brew cat "$1" &>/dev/null; then
  42. if brew list "$1" &>/dev/null; then
  43. if [[ "$FORCE" ]]; then
  44. brew upgrade "$@" || echo "# WARN: forced upgrade failed (it may already be up to date)"
  45. else
  46. echo "# SKIPPED: $GIMME (force upgrade via: gimme -f $GIMME)"
  47. fi
  48. else
  49. brew install "$@"
  50. fi
  51. else
  52. brew search "$1"
  53. fi
  54. else
  55. sudo apt-get -y install "$@"
  56. fi
  57. }
  58. if [[ "$0" =~ [-]?bash ]]; then # sourced or piped
  59. if [[ "${BASH_SOURCE[@]}" ]]; then # sourced
  60. _gimme_completely() {
  61. if [[ "$2" = -* ]]; then
  62. COMPREPLY=( $(compgen -W "-v --verbose --debug --force --version --help -l --list --installed --old --outdated" -- "$2") )
  63. else
  64. COMPREPLY=( $(find "$GIMME_GIMMES_DIR" -type f -path "$GIMME_GIMMES_DIR/$2*" \! -name '.*' | cut -c$(( ${#GIMME_GIMMES_DIR} + 2))- ) )
  65. fi
  66. }
  67. complete -F _gimme_completely gimme
  68. else # piped
  69. set -o errexit -o pipefail
  70. # gimmes/gcc: inlined for curl-based installs
  71. if [[ "$OS" = "Darwin" ]]; then
  72. if ! "xcode-select" --version &>/dev/null; then
  73. echo "Try again after installing the Xcode command-line tools by running: xcode-select --install"
  74. exit 1
  75. fi
  76. if ! xcodebuild -help &>/dev/null; then
  77. echo "Try again after agreeing to the Xcode license by running: sudo xcodebuild -license"
  78. exit 1
  79. fi
  80. else
  81. has gcc || gimme_pkg build-essential
  82. fi
  83. # gimmes/git: inlined for curl-based installs
  84. has git || gimme_pkg git
  85. if ! [[ -d "$GIMME_DIR" ]]; then
  86. echo "Installing $GIMME_DIR/gimme ..."
  87. mkdir -p "$GIMME_DIR"
  88. git clone "$GIMME_URL" "$GIMME_DIR"
  89. mkdir -p "$(dirname "$GIMME_LINK")"
  90. ln -sf "$GIMME_DIR/gimme" "$GIMME_LINK"
  91. echo "Done! Now you can 'gimme stuff' or 'gimme dev/stuff' or even 'gimme gimme'!"
  92. else
  93. echo "Updating gimme (in $GIMME_DIR) ..."
  94. cd "$GIMME_DIR"
  95. OLD_REV=$(git rev-parse HEAD)
  96. git pull
  97. git log --oneline "$OLD_REV.."
  98. fi
  99. fi
  100. else # normal usage
  101. set -o errexit -o pipefail
  102. export -f has gimme_pkg
  103. [[ "$INIT_GIMMES" ]] || export INIT_GIMMES="$@"
  104. DID_GIMME=
  105. for GIMME; do
  106. case "$GIMME" in
  107. -v|--verbose|--debug)
  108. DEBUG=1
  109. continue
  110. ;;
  111. -f|--force)
  112. FORCE=1
  113. continue
  114. ;;
  115. --version)
  116. echo "Version:"
  117. git log -1
  118. exit 0
  119. ;;
  120. -h|--help|"")
  121. sed -n -e'/^#[[:space:]]/p' -e'/^###/q' "$0"
  122. echo "# GIMMES:"
  123. echo $(cd "$GIMME_GIMMES_DIR"; find . -type f -perm +1 | sed -e's/^..//' -e'/^_/d' | sort)
  124. exit 0
  125. ;;
  126. -l|--list|--installed)
  127. echo "# BREW (cask):"
  128. brew cask list
  129. echo
  130. echo "# BREW:"
  131. brew list
  132. echo
  133. echo "# NPM:"
  134. npm -g ls --depth 0
  135. echo
  136. echo "# PIP:"
  137. pip list --format=columns
  138. exit 0
  139. ;;
  140. --old|--outdated)
  141. echo "# BREW (cask):"
  142. brew cask outdated
  143. echo
  144. echo "# BREW:"
  145. brew outdated
  146. echo
  147. echo "# NPM:"
  148. npm outdated -g --depth 0
  149. echo
  150. echo "# PIP:"
  151. pip list --format=columns --outdated
  152. exit 0
  153. ;;
  154. esac
  155. ! [[ "$DEBUG" ]] || set -x
  156. echo "# WANT: $GIMME"
  157. ! [[ "$GIMMES" == *" $GIMME "* ]] || exit 0
  158. export GIMMES+=" $GIMME " GIMME
  159. P="$GIMME_GIMMES_DIR/$GIMME"
  160. if ! [[ -f "$P" ]]; then
  161. # find _default handler
  162. while P=$(dirname "$P") && [[ "$P" = "$GIMME_GIMMES_DIR"* ]]; do
  163. if [[ -f "$P/_default" ]]; then
  164. P="$P/_default"
  165. break;
  166. fi
  167. done
  168. # no default
  169. if ! [[ "$P" = "$GIMME_GIMMES_DIR"* ]]; then
  170. echo "# ERROR: Unable to find $GIMME_GIMMES_DIR/_default handler"
  171. exit 1
  172. fi
  173. fi
  174. if [[ -x "$P" ]]; then
  175. DID_GIMME=1
  176. [[ "$PATH" = "$LINK_DIR"* ]] || export PATH="$LINK_DIR:$PATH"
  177. if (if [[ "$DEBUG" ]]; then bash -x "$P"; else bash "$P"; fi); then
  178. echo "# DONE: $GIMME"
  179. else
  180. OUCH=$?
  181. echo "# FAIL: Error for gimme \"$GIMME\" (EXIT_CODE=$OUCH)"
  182. exit $OUCH
  183. fi
  184. else
  185. echo "# WARN: the gimme \"$GIMME\" was SKIPPED because \"$P\" is not marked executable!"
  186. fi
  187. done
  188. [[ "$DID_GIMME" ]] || echo "# WARN: nothing to do... try: gimme --help"
  189. fi