You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

439 regels
9.1 KiB

  1. #!/bin/sh
  2. set -e
  3. # setup.sh --- 10sr setup script
  4. # 2014, 10sr. Unlicensed <http://unlicense.org>
  5. __setups="shrc_common tmux scripts darwin dirs selfupdate windirs dotfiles env"
  6. __homelocal="$HOME/.local"
  7. __homevar="$HOME/.var"
  8. __dotfiles_dir_default="$HOME/10sr_dotfiles"
  9. _current_date=`date`
  10. # TODO: how to give args to command?
  11. #################################################################
  12. _dotfiles_url_base=https://raw.githubusercontent.com/10sr/dotfiles/master/
  13. if test -z "$DOTFILES_DIR"
  14. then
  15. DOTFILES_DIR="$__dotfiles_dir_default"
  16. fi
  17. ismsys=
  18. iscygwin=
  19. iswindows=
  20. isdarwin=
  21. isfreebsd=
  22. isbsd=
  23. islinux=
  24. ###########################
  25. # utils
  26. ##########################33
  27. # Utilities
  28. __tput_bold=`tput bold || true`
  29. __tput_default=`tput sgr0 || true`
  30. __tput_yellow=`tput setaf 3 || true`
  31. _msg(){
  32. echo ">> ${__tput_bold}$*${__tput_default}"
  33. }
  34. _warn(){
  35. echo ">>> ${__tput_yellow}${__tput_bold}$*${__tput_default}" 1>&2
  36. }
  37. _die(){
  38. _warn "$@"
  39. exit 1
  40. }
  41. _download(){
  42. # download <url> <file>
  43. if type wget >/dev/null 2>&1
  44. then
  45. wget $__my_wget_options "$1" -O "$2"
  46. elif type curl >/dev/null 2>&1
  47. then
  48. curl --url "$1" --output "$2"
  49. else
  50. _warn "No download program found."
  51. _die "Install wget or curl."
  52. fi
  53. }
  54. # Detect systems
  55. detect_systems(){
  56. ismsys=false
  57. iscygwin=false
  58. iswindows=false
  59. isdarwin=false
  60. isfreebsd=false
  61. isbsd=false
  62. islinux=false
  63. # $OSTYPE is another choice. which is better?
  64. # NOTE: sh on FreeBSD does not define OSTYPE
  65. case `uname` in
  66. (MINGW*) ismsys=true ;;
  67. (CYGWIN*) iscygwin=true ;;
  68. (Darwin*) isdarwin=true ;;
  69. (FreeBSD*) isfreebsd=true ;;
  70. (Linux*) islinux=true ;;
  71. esac
  72. ($ismsys || $iscygwin) && iswindows=true
  73. # is this true?
  74. ($isdarwin || $isfreebsd) && isbsd=true
  75. _msg "Detecting the system...done"
  76. }
  77. ################################
  78. # setups
  79. ###############################
  80. # setup selfupdate
  81. setup_selfupdate(){
  82. _msg "Download latest setup.sh from 10sr repository."
  83. if test -z "$1"
  84. then
  85. _warn "Filename for setup script is not given"
  86. echo "usage: setup.sh selfupdate <filename>"
  87. _die "Abort"
  88. fi
  89. mkdir -vp "`dirname $1`"
  90. _download $_dotfiles_url_base/setup.sh "$1"
  91. chmod +x "$1"
  92. }
  93. ##################################
  94. # setup dotfiles
  95. setup_dotfiles(){
  96. _msg "Prepare latest dotfiles."
  97. mkdir -p "$DOTFILES_DIR"
  98. if test -d "$DOTFILES_DIR"/.git
  99. then
  100. # if git repository found, always skip
  101. _warn "Git repository $DOTFILES_DIR already exists"
  102. _warn "Skipping"
  103. elif test "$1" = "--git"
  104. then
  105. # git clone
  106. _msg "Option \"--git\" has been given. Using git"
  107. _msg "Checking github.com connectivity"
  108. ssh git@github.com 2>/dev/null && true
  109. if test $? -eq 1
  110. then
  111. _git_clone_url=git@github.com:10sr/dotfiles.git
  112. _msg "Authentication succeeded"
  113. else
  114. _git_clone_url=https://github.com/10sr/dotfiles.git
  115. _msg "Authentication failed"
  116. fi
  117. _msg "Git cloning $_git_clone_url"
  118. git clone $_git_clone_url "$DOTFILES_DIR"
  119. else
  120. for f in $@
  121. do
  122. _msg "Prepareing $f"
  123. mkdir -p "`dirname $DOTFILES_DIR/$f`"
  124. _download $_dotfiles_url_base/$f "$DOTFILES_DIR"/$f
  125. done
  126. fi
  127. }
  128. #############################
  129. # setup shrc_common
  130. # Generate ~/.shrc.common, which contains system infos and is sourced from
  131. # setup.sh (this file) and dotfiles/shrc .
  132. # this variable must consistent with shrc
  133. __shrc_common="$HOME/.shrc.common"
  134. setup_shrc_common(){
  135. _msg "Generate $__shrc_common"
  136. test -f "$__shrc_common" && rm -- "$__shrc_common"
  137. cat <<__EOC__ >"$__shrc_common"
  138. #!/bin/sh
  139. # $__shrc_common
  140. # Automatically generated by $0 at $_current_date
  141. ismsys=$ismsys
  142. iscygwin=$iscygwin
  143. iswindows=$iswindows
  144. isdarwin=$isdarwin
  145. isfreebsd=$isfreebsd
  146. isbsd=$isbsd
  147. islinux=$islinux
  148. __homelocal="$__homelocal"
  149. __homevar="$__homevar"
  150. __EOC__
  151. }
  152. #############################
  153. # setup tmux
  154. setup_tmux(){
  155. tmux_conf_local="$HOME/.tmux.conf.local"
  156. _msg "Generate $tmux_conf_local"
  157. case "`hostname`" in
  158. arch-aspireone)
  159. tmux_bg_color=yellow
  160. tmux_fg_color=black
  161. ;;
  162. arch-mba)
  163. tmux_bg_color=cyan
  164. tmux_fg_color=black
  165. ;;
  166. newkiwi)
  167. tmux_bg_color=magenta
  168. tmux_fg_color=white
  169. ;;
  170. debian-vb-win7-opti)
  171. tmux_bg_color=red
  172. tmux_fg_color=white
  173. ;;
  174. *)
  175. tmux_bg_color=green
  176. tmux_fg_color=black
  177. ;;
  178. esac
  179. cat <<__EOC__ >"$tmux_conf_local"
  180. # $tmux_conf_local
  181. # Automatically generated by $0 at $_current_date
  182. set -g status-right "${USER}@$(hostname) | #(tmux -V) "
  183. set -g status-bg $tmux_bg_color
  184. set -g status-fg $tmux_fg_color
  185. set -g mode-bg $tmux_bg_color
  186. set -g mode-fg $tmux_fg_color
  187. set -g pane-active-border-fg $tmux_bg_color
  188. __EOC__
  189. _tmux_conf="$HOME"/.tmux.conf
  190. _msg "Prepare $_tmux_conf"
  191. if test -f "$_tmux_conf"
  192. then
  193. _warn "Tmux config file found. Skipping"
  194. else
  195. echo "source \"$DOTFILES_DIR/tmux.conf\"" >>"$_tmux_conf"
  196. fi
  197. setup_dotfiles tmux.conf
  198. }
  199. ###############################
  200. # setup emacs
  201. setup_emacs(){
  202. _msg "Setup emacs init.el"
  203. _emacs_dir="$HOME"/.emacs.d
  204. mkdir -vp "$_emacs_dir"
  205. _emacs_init_el="$_emacs_dir"/init.el
  206. if test -f "$_emacs_init_el"
  207. then
  208. _warn "Emacs init.el found. Skipping"
  209. else
  210. cat <<__EOC__ >>"$_emacs_init_el"
  211. (and (file-readable-p "$DOTFILES_DIR/emacs.el")
  212. (load-file "$DOTFILES_DIR/emacs.el"))
  213. __EOC__
  214. fi
  215. setup_dotfiles emacs.el
  216. }
  217. ##################################
  218. # setup vim
  219. setup_vim(){
  220. _msg "Setup vimrc"
  221. _vimrc="$HOME"/.vimrc
  222. if test -f "$_vimrc"
  223. then
  224. _warn "Vim rcfile found. Skipping"
  225. else
  226. cat <<__EOC__ >>"$_vimrc"
  227. if filereadable(expand('$DOTFILES_DIR/vimrc'))
  228. source $DOTFILES_DIR/vimrc
  229. endif
  230. __EOC__
  231. fi
  232. setup_dotfiles vimrc
  233. }
  234. ##############################
  235. # setup scripts
  236. _fetch_script(){
  237. # _fetch_script <url> <binname>
  238. url="$1"
  239. name="$2"
  240. dst="$HOME/.local/bin/$name"
  241. test -f "$dst" && return 0
  242. command -v "$name" >/dev/null && return 0
  243. if _download "$url" "$dst"
  244. then
  245. chmod u+x "$dst"
  246. else
  247. test -f "$dst" && rm -- "$dst"
  248. fi
  249. }
  250. setup_scripts(){
  251. _msg "Download some utility scripts"
  252. _fetch_script \
  253. https://gist.github.com/10sr/6852317/raw/colortable16.sh colortable16.sh
  254. _fetch_script \
  255. https://gist.github.com/10sr/6852331/raw/256colors2.pl 256colors2.pl
  256. _fetch_script \
  257. https://github.com/icy/pacapt/raw/ng/pacapt pacapt
  258. _fetch_script \
  259. http://beyondgrep.com/ack-2.12-single-file ack-2.12
  260. }
  261. ################################
  262. # setup darwin
  263. __darwin_set_defaults(){
  264. $isdarwin || return 0
  265. # http://appdrill.net/60641/mac-boot-mute.html
  266. #sudo nvram SystemAudioVolume=%80
  267. # add quit entry in menu
  268. defaults write com.apple.finder QuitMenuItem -bool YES
  269. # show full path on titlebar
  270. defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES
  271. # do not show desktop icons
  272. defaults write com.apple.finder CreateDesktop -boolean false
  273. killall Finder
  274. # disable dashboard
  275. #defaults write com.apple.dashboard mcx-disabled -bool YES
  276. }
  277. __darwin_start_daemon(){
  278. $isdarwin || return 0
  279. test "`launchctl getenv LC_ALL`" = C || sudo launchctl setenv LC_ALL C
  280. if ! (launchctl list | grep com.apple.locate) >/dev/null
  281. then
  282. sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
  283. fi
  284. }
  285. setup_darwin(){
  286. __darwin_set_defaults
  287. __darwin_start_daemon
  288. }
  289. ##########################
  290. # setup windirs
  291. setup_windirs(){
  292. $iswindows || return 0
  293. _msg "Setup some directories for windows environment"
  294. if $iscygwin
  295. then
  296. #__winhome="/cygdrive/c/Users/`whoami`"
  297. __winhome=`cygpath -H`/`whoami`
  298. fi
  299. if test -n "$__winhome" -a -d "$__winhome" -a '!' -e "$HOME/.winhome"
  300. then
  301. _msg Make symlink to "$__winhome" with name "$HOME/.winhome"
  302. ln -s "$__winhome" "$HOME/.winhome"
  303. fi
  304. }
  305. #########################
  306. # setup dirs
  307. setup_dirs(){
  308. _msg Make some direcoties
  309. mkdir -vp "$__homelocal"
  310. mkdir -vp "$__homelocal/bin"
  311. mkdir -vp "$__homevar"
  312. }
  313. ####################################
  314. # setup env
  315. # setup new environment with default options
  316. setup_env(){
  317. setup_shrc_common
  318. setup_dirs
  319. setup_tmux
  320. setup_scripts
  321. setup_dotfiles --git
  322. }
  323. #########################
  324. # help and main
  325. help(){
  326. echo "Usage: ./setup.sh <cmd> ..."
  327. echo " or: ./setup.sh help"
  328. echo "Available cmds are: $__setups"
  329. }
  330. main(){
  331. detect_systems
  332. if test -z "$1"
  333. then
  334. help
  335. return 1
  336. fi
  337. _cmd=$1
  338. shift
  339. if test "$_cmd" = help
  340. then
  341. help
  342. return 0
  343. fi
  344. _msg Running setup_$_cmd
  345. setup_$_cmd "$@"
  346. _msg Running setup_$_cmd done
  347. }
  348. main "$@"