gimme.sh 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. #!/bin/bash
  2. # a quick and dirty meta pkg installer
  3. #
  4. #TODO: output help if used wrong
  5. #
  6. ###############################################################################
  7. set -e
  8. [ "$GIMME_URL" ] || GIMME_URL="http://git.kylepdavis.com/kylepdavis/gimme.git"
  9. [ "$GIMME_DIR" ] || GIMME_DIR="$HOME/.gimme"
  10. [ "$GIMMES" ] || GIMMES=""
  11. has() {
  12. which "$1" >/dev/null
  13. }
  14. pkgtool() {
  15. if [[ "$OS" = "Darwin" ]]; then
  16. brew "$@"
  17. else
  18. sudo apt-get -y "$@"
  19. fi
  20. }
  21. gimme_pkg() {
  22. pkgtool install "$@"
  23. }
  24. __gimme() {
  25. local PKG="$1"
  26. ! [[ "$_GIMMES" == *" $PKG "* ]] || return 0
  27. _GIMMES+=" $PKG "
  28. case "$PKG" in
  29. dotfiles)
  30. #TODO: install my dotfiles
  31. ;;
  32. gcc)
  33. if [[ "$OS" = "Darwin" ]]; then
  34. "xcode-select" --install 2>&1 | grep -q "already installed"
  35. else
  36. has gcc || gimme_pkg build-essential
  37. _gimme curl
  38. fi
  39. ;;
  40. bash_profile) _gimme liquidprompt
  41. [[ -f "$HOME/.bash_profile" ]] || ln -sv "$HOME/.profile" "$HOME/.bash_profile"
  42. [[ -f "$HOME/.bashrc" ]] || ln -sv "$HOME/.profile" "$HOME/.bashrc"
  43. ;;
  44. liquidprompt) _gimme bash_profile git
  45. [[ -d "$HOME/.liquidprompt" ]] || git clone "https://github.com/nojhan/liquidprompt.git" "$HOME/.liquidprompt"
  46. ;;
  47. git)
  48. has git || gimme_pkg git
  49. if ! [[ -f "$HOME/.gitconfig" ]]; then
  50. git config --global color.ui true
  51. if [[ "$OS" = "Darwin" ]]; then
  52. git config --global credential.helper "osxkeychain"
  53. else
  54. git config --global credential.helper "cache --timeout=3600"
  55. fi
  56. fi
  57. ;;
  58. git-extras) _gimme git
  59. has git-alias || (cd /tmp && git clone --depth 1 https://github.com/tj/git-extras.git && cd git-extras && sudo make install)
  60. if ! [[ "$(git alias)" ]]; then
  61. git alias br branch
  62. git alias ci commit
  63. git alias co checkout
  64. git alias di diff
  65. git alias st status
  66. fi
  67. ;;
  68. python)
  69. if [[ "$OS" = "Darwin" ]]; then
  70. mkdir -p "$PYTHONPATH"
  71. fi
  72. has python || gimme_pkg python
  73. ;;
  74. pylint|pep8) _gimme python
  75. if ! has "$PKG"; then
  76. if [[ "$OS" = "Darwin" ]]; then
  77. easy_install -d "$PYTHONPATH" "$PKG"
  78. ln -sv "$PYTHONPATH/$PKG" "$(brew --prefix)/bin/$PKG"
  79. else
  80. easy_install "$PKG"
  81. fi
  82. fi
  83. ;;
  84. node)
  85. if [[ "$OS" = "Darwin" ]]; then
  86. has node || gimme_pkg node
  87. else #TODO: might get old version here ...
  88. _gimme nodejs npm
  89. fi
  90. ;;
  91. jshint|js-beautify|json)
  92. if [[ "$OS" = "Darwin" ]]; then
  93. has "$PKG" || npm install -g "$PKG"
  94. else
  95. has "$PKG" || sudo npm install -g "$PKG"
  96. fi
  97. ;;
  98. mongodb)
  99. has "mongod" || gimme_pkg mongodb
  100. ;;
  101. redis)
  102. if ! has "redis-server"; then
  103. if [[ "$OS" = "Darwin" ]]; then
  104. gimme_pkg redis
  105. else
  106. gimme_pkg redis-server
  107. fi
  108. fi
  109. ;;
  110. go)
  111. _gimme curl
  112. #TODO: setup go vs golang dirs?
  113. if ! which "$PKG" >/dev/null; then
  114. if [[ "$OS" = "Darwin" ]]; then
  115. gimme_pkg go --cross-compile-common
  116. else
  117. gimme_pkg golang
  118. fi
  119. fi
  120. ;;
  121. difftool)
  122. _gimme colordiff
  123. ;;
  124. mergetool)
  125. if [[ "$OS" = "Darwin" ]]; then
  126. true #TODO: usually use opendiff but SourceTree installer would be nice
  127. else
  128. _gimme meld
  129. fi
  130. ;;
  131. tools)
  132. _gimme bash_profile liquidprompt git tmux tree vim
  133. ;;
  134. dev/generic)
  135. _gimme gcc mergetool
  136. ;;
  137. dev/js)
  138. _gimme node jshint js-beautify json
  139. ;;
  140. dev/sh)
  141. _gimme shellcheck
  142. ;;
  143. dev/py)
  144. _gimme python pylint pep8
  145. ;;
  146. dev/db)
  147. _gimme mongodb redis postgresql
  148. ;;
  149. dev/go)
  150. _gimme go
  151. ;;
  152. dev)
  153. _gimme dev/generic dev+js dev+sh dev+py dev+db dev+go
  154. ;;
  155. stuff)
  156. _gimme tools dev
  157. ;;
  158. homebrew) _gimme gcc git
  159. [[ -d "$HOME/homebrew" ]] || (mkdir "$HOME/homebrew" 2>/dev/null && curl -L "https://github.com/Homebrew/homebrew/tarball/master" | tar xz --strip 1 -C "$HOME/homebrew" && brew update)
  160. [[ "$BREW_PREFIX" ]] || BREW_PREFIX=$(brew --prefix)
  161. has brew-cask || brew install caskroom/cask/brew-cask
  162. ;;
  163. pkgtool)
  164. if [[ "$OS" = "Darwin" ]]; then
  165. _gimme homebrew
  166. else
  167. has apt-get || return 123
  168. fi
  169. ;;
  170. pkgtool_metadata)
  171. pkgtool update
  172. ;;
  173. gimme)
  174. echo "Checking gimme ..."
  175. _gimme git
  176. if ! [[ -d "$GIMME_DIR" ]]; then
  177. echo "Installing $HOME/bin/gimme ..."
  178. mkdir -p "$GIMME_DIR"
  179. git clone "$GIMME_URL" "$GIMME_DIR"
  180. mkdir -p "$HOME/bin"
  181. ln -sf "$GIMME_DIR/gimme.sh" "$HOME/bin/gimme"
  182. else
  183. echo "Updating gimme ..."
  184. pushd "$GIMME_DIR" >/dev/null
  185. git pull
  186. popd >/dev/null
  187. fi
  188. ;;
  189. *)
  190. _gimme pkgtool
  191. #TODO: _gimme pkgtool_metadata
  192. has "$PKG" || gimme_pkg "$PKG"
  193. ;;
  194. esac
  195. echo "# DONE: gimme $PKG"
  196. }
  197. _gimme() {
  198. local PKG
  199. for PKG in "$@"; do
  200. if ! __gimme "$PKG"; then
  201. echo "ERROR: Unable to fulfill gimme for $PKG!"
  202. return 123
  203. fi
  204. done
  205. }
  206. gimme() {
  207. _GIMMES=
  208. _gimme "$@"
  209. }
  210. GIMME_GIMMES=$(type __gimme | grep ')$' | tr -d ')|*')
  211. _gimme_complete() {
  212. COMPREPLY=( $(compgen -W "$GIMME_GIMMES" -- "${COMP_WORDS[COMP_CWORD]}") )
  213. }
  214. complete -F _gimme_complete gimme
  215. if [[ "$BASH_SOURCE" && "$0" = "bash" ]]; then
  216. set +e
  217. elif ! [[ "$0" ]]; then
  218. gimme gimme
  219. else
  220. gimme "$@"
  221. fi