gimme.sh 5.0 KB

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