gimme 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #!/bin/bash
  2. # A meta micro manager for the masses.
  3. # USAGE:
  4. # gimme [stuff]
  5. ###############################################################################
  6. [ "$GIMME_URL" ] || export GIMME_URL="https://github.com/KylePDavis/gimme"
  7. [ "$GIMME_DIR" ] || export GIMME_DIR="$HOME/.gimme"
  8. [ "$GIMME_GIMMES_DIR" ] || export GIMME_GIMMES_DIR="$GIMME_DIR/gimmes"
  9. [ "$GIMME_LINK" ] || export GIMME_LINK="$HOME/bin/gimme"
  10. [ "$GIMME_LINK_DIR" ] || export GIMME_LINK_DIR=$(dirname "$GIMME_LINK")
  11. [ "$GIMMES" ] || export GIMMES=""
  12. [ "$OS" ] || export OS=$(uname -s)
  13. [ "$DEBUG" ] || export DEBUG=
  14. has() { which "$1" >/dev/null; }
  15. pkgtool() {
  16. if [[ "$OS" = "Darwin" ]]; then
  17. brew "$@"
  18. else
  19. sudo apt-get -y "$@"
  20. fi
  21. }
  22. gimme_pkg() {
  23. pkgtool install "$@"
  24. }
  25. export -f has pkgtool gimme_pkg
  26. if [[ "$0" =~ [-]?bash ]]; then # sourced or piped
  27. if [[ "$BASH_SOURCE" ]]; then # sourced
  28. _gimme_completely() {
  29. if [[ "$2" = -* ]]; then
  30. COMPREPLY=( $(compgen -W "--help --version" -- "$2") )
  31. else
  32. COMPREPLY=( $(find "$GIMME_GIMMES_DIR" -type f -path "$GIMME_GIMMES_DIR/$2*" \! -name '.*' | cut -c$(( ${#GIMME_GIMMES_DIR} + 2))- ) )
  33. fi
  34. }
  35. complete -F _gimme_completely gimme
  36. else # piped
  37. set -o errexit -o pipefail
  38. # gimmes/gcc: inlined for curl-based installs
  39. if [[ "$OS" = "Darwin" ]]; then
  40. if ! "xcode-select" --version &>/dev/null; then
  41. echo "Try again after installing the Xcode command-line tools by running: xcode-select --install"
  42. exit 1
  43. fi
  44. if ! xcodebuild -help &>/dev/null; then
  45. echo "Try again after agreeing to the Xcode license by running: sudo xcodebuild -license"
  46. exit 1
  47. fi
  48. else
  49. has gcc || gimme_pkg build-essential
  50. fi
  51. # gimmes/git: inlined for curl-based installs
  52. has git || gimme_pkg git
  53. if ! [[ -d "$GIMME_DIR" ]]; then
  54. echo "Installing $GIMME_DIR/gimme ..."
  55. mkdir -p "$GIMME_DIR"
  56. git clone "$GIMME_URL" "$GIMME_DIR"
  57. mkdir -p "$(dirname "$GIMME_LINK")"
  58. ln -sf "$GIMME_DIR/gimme" "$GIMME_LINK"
  59. echo "Done! Now you can 'gimme stuff' or 'gimme dev/stuff' or even 'gimme gimme'!"
  60. else
  61. echo "Updating gimme (in $GIMME_DIR) ..."
  62. cd "$GIMME_DIR"
  63. git pull
  64. fi
  65. fi
  66. else # normal usage
  67. set -o errexit -o pipefail
  68. for GIMME; do
  69. echo "# WANT: $GIMME"
  70. ! [[ "$GIMMES" == *" $GIMME "* ]] || exit 0
  71. export GIMMES+=" $GIMME " GIMME
  72. P="$GIMME_GIMMES_DIR/$GIMME"
  73. if ! [[ -f "$P" ]]; then
  74. # find _default handler
  75. while P=$(dirname "$P") && [[ "$P" = "$GIMME_GIMMES_DIR"* ]]; do
  76. if [[ -f "$P/_default" ]]; then
  77. P="$P/_default"
  78. break;
  79. fi
  80. done
  81. # no default
  82. if ! [[ "$P" = "$GIMME_GIMMES_DIR"* ]]; then
  83. echo "# ERROR: Unable to find $GIMME_GIMMES_DIR/_default handler"
  84. exit 1
  85. fi
  86. fi
  87. if [[ -x "$P" ]]; then
  88. [[ "$PATH" = "$LINK_DIR"* ]] || export PATH="$LINK_DIR:$PATH"
  89. if "$P" | sed "s/^/ /"; then
  90. echo "# DONE: $GIMME"
  91. else
  92. OUCH=$?
  93. echo "# FAIL: Error for gimme \"$GIMME\" (EXIT_CODE=$OUCH)"
  94. exit $OUCH
  95. fi
  96. else
  97. echo "# WARN: the gimme \"$GIMME\" was SKIPPED because \"$P\" is not marked executable!"
  98. fi
  99. done
  100. fi