#!/bin/sh set -e # setup.sh --- 10sr setup script # 2014, 10sr. Unlicensed __setups="shrc_common gitconf tmux scripts darwin dirs selfupdate windirs dotfiles env" __homelocal="$HOME/.local" __homevar="$HOME/.var" __dotfiles_dir_default="$HOME/10sr_dotfiles" _current_date=`date` # TODO: how to give args to command? ################################################################# _dotfiles_url_base=https://raw.githubusercontent.com/10sr/dotfiles/master/ if test -z "$DOTFILES_DIR" then DOTFILES_DIR="$__dotfiles_dir_default" fi ismsys= iscygwin= iswindows= isdarwin= isfreebsd= isbsd= islinux= ########################### # utils ##########################33 # Utilities __tput_bold=`tput bold || true` __tput_default=`tput sgr0 || true` __tput_yellow=`tput setaf 3 || true` _msg(){ echo ">> ${__tput_bold}$*${__tput_default}" } _warn(){ echo ">>> ${__tput_yellow}${__tput_bold}$*${__tput_default}" 1>&2 } _die(){ _warn "$@" exit 1 } _download(){ # download if type wget >/dev/null 2>&1 then wget $__my_wget_options "$1" -O "$2" elif type curl >/dev/null 2>&1 then curl --url "$1" --output "$2" else _warn "No download program found." _die "Install wget or curl." fi } # Detect systems detect_systems(){ ismsys=false iscygwin=false iswindows=false isdarwin=false isfreebsd=false isbsd=false islinux=false # $OSTYPE is another choice. which is better? # NOTE: sh on FreeBSD does not define OSTYPE case `uname` in (MINGW*) ismsys=true ;; (CYGWIN*) iscygwin=true ;; (Darwin*) isdarwin=true ;; (FreeBSD*) isfreebsd=true ;; (Linux*) islinux=true ;; esac ($ismsys || $iscygwin) && iswindows=true # is this true? ($isdarwin || $isfreebsd) && isbsd=true _msg "Detecting the system...done" } ################################ # setups ############################### # setup selfupdate setup_selfupdate(){ _msg "Download latest setup.sh from 10sr repository." if test -z "$1" then _warn "Filename for setup script is not given" echo "usage: setup.sh selfupdate " _die "Abort" fi mkdir -vp "`dirname $1`" _download $_dotfiles_url_base/setup.sh "$1" chmod +x "$1" } ################################## # setup dotfiles setup_dotfiles(){ _msg "Prepare latest dotfiles." mkdir -p "$DOTFILES_DIR" if test -d "$DOTFILES_DIR"/.git then # if git repository found, always skip _warn "Git repository $DOTFILES_DIR already exists" _warn "Skipping" elif test "$1" = "--git" then # git clone _msg "Option \"--git\" has been given. Using git" _msg "Checking github.com connectivity" ssh git@github.com 2>/dev/null && true if test $? -eq 1 then _git_clone_url=git@github.com:10sr/dotfiles.git _msg "Authentication succeeded" else _git_clone_url=https://github.com/10sr/dotfiles.git _msg "Authentication failed" fi _msg "Git cloning $_git_clone_url" git clone $_git_clone_url "$DOTFILES_DIR" else for f in $@ do _msg "Prepareing $f" mkdir -p "`dirname $DOTFILES_DIR/$f`" _download $_dotfiles_url_base/$f "$DOTFILES_DIR"/$f done fi } ############################# # setup shrc_common # Generate ~/.shrc.common, which contains system infos and is sourced from # setup.sh (this file) and dotfiles/shrc . # this variable must consistent with shrc __shrc_common="$HOME/.shrc.common" setup_shrc_common(){ _msg "Generate $__shrc_common" test -f "$__shrc_common" && rm -- "$__shrc_common" cat <<__EOC__ >"$__shrc_common" #!/bin/sh # $__shrc_common # Automatically generated by $0 at $_current_date ismsys=$ismsys iscygwin=$iscygwin iswindows=$iswindows isdarwin=$isdarwin isfreebsd=$isfreebsd isbsd=$isbsd islinux=$islinux __homelocal="$__homelocal" __homevar="$__homevar" __EOC__ } ################################ # setup gitconf setup_gitconf(){ _msg "Configure git environment" if ! command -v git >/dev/null then _msg "Git program not found" return 0 fi _gc="git config --global" $_gc user.name '10sr' $_gc user.email '8slashes+git@gmail.com' $_gc core.autocrlf false $_gc core.excludesfile '~/.gitignore' $_gc color.ui auto $_gc status.relativePaths false $_gc status.showUntrackedFiles normal $_gc log.date iso $_gc push.default current command -v xz >/dev/null && \ $_gc tar.txz.command "xz -c" $_gc alias.graph "log --graph --date-order -C -M --pretty=tformat:\"%C(green)%h%C(reset) %C(white)%ad%C(reset) %C(red)%an%C(reset)%C(yellow)%d%C(reset) %C(white bold)%s%C(reset)\" --date=short -n 499" $_gc alias.st "status -s -b" $_gc alias.b "branch" $_gc alias.sb "show-branch" $_gc alias.ci "commit --verbose" $_gc alias.co "checkout" $_gc alias.cim "commit --verbose -m" $_gc alias.di "diff --color" $_gc alias.me "merge --no-ff --stat --verbose" $_gc alias.ffme "merge --ff-only --stat --verbose" $_gc alias.gr "grep -n" $_gc alias.ls "ls-files" # $_gc alias.ls "ls-files -v --full-name" # $_gc alias.ls "status -u -s ." $_gc alias.sl "!sl" # $_gc alias.my-ls "ls-files | xargs ls" # $_gc alias.ll "!git ls-files | xargs ls -l -CFG --color=auto --time-style=long-iso" $_gc alias.addi "add -i" $_gc alias.clean-p "diff --quiet" $_gc alias.echo-ref "for-each-ref --format='%(refname:short)'" # alias open-branch and close-branch, which will be useful for topic branch # workflow _git_open_branch="checkout -b" _git_close_branch="!sh -cx 'git stash && \ git checkout master && git merge --no-ff --stat --verbose -'" $_gc alias.open-branch "$_git_open_branch" $_gc alias.close-branch "$_git_close_branch" $_gc alias.o "$_git_open_branch" $_gc alias.c "$_git_close_branch" $_gc alias.todo "grep -nH -E -i 'todo:|note:|fixme:'" $_gc alias.snap '! gitdir="`git rev-parse --git-dir`" && : >>"$gitdir"/logs/refs/snapshot && cmt=`git stash create` && test -n "$cmt" && git update-ref refs/snapshot $cmt && echo Snapshot created: $cmt' #$_gc alias.wc "!git ls-files -z | xargs -0 wc" # $_gc push.default "simple" if $iswindows; then $_gc core.fileMode false fi } ############################# # setup tmux setup_tmux(){ tmux_conf_local="$HOME/.tmux.conf.local" _msg "Generate $tmux_conf_local" case "`hostname`" in arch-aspireone) tmux_bg_color=yellow tmux_fg_color=black ;; arch-mba) tmux_bg_color=cyan tmux_fg_color=black ;; newkiwi) tmux_bg_color=magenta tmux_fg_color=white ;; debian-vb-win7-opti) tmux_bg_color=red tmux_fg_color=white ;; *) tmux_bg_color=green tmux_fg_color=black ;; esac cat <<__EOC__ >"$tmux_conf_local" # $tmux_conf_local # Automatically generated by $0 at $_current_date set -g status-right "${USER}@$(hostname) | #(tmux -V) " set -g status-bg $tmux_bg_color set -g status-fg $tmux_fg_color set -g mode-bg $tmux_bg_color set -g mode-fg $tmux_fg_color set -g pane-active-border-fg $tmux_bg_color __EOC__ _tmux_conf="$HOME"/.tmux.conf _msg "Prepare $_tmux_conf" if test -f "$_tmux_conf" then _warn "Tmux config file found. Skipping" else echo "source \"$DOTFILES_DIR/tmux.conf\"" >>"$_tmux_conf" fi setup_dotfiles tmux.conf } ############################### # setup emacs setup_emacs(){ _msg "Setup emacs init.el" _emacs_dir="$HOME"/.emacs.d mkdir -vp "$_emacs_dir" _emacs_init_el="$_emacs_dir"/init.el if test -f "$_emacs_init_el" then _warn "Emacs init.el found. Skipping" else cat <<__EOC__ >>"$_emacs_init_el" (and (file-readable-p "$DOTFILES_DIR/emacs.el") (load-file "$DOTFILES_DIR/emacs.el")) __EOC__ fi setup_dotfiles emacs.el } ################################## # setup vim setup_vim(){ _msg "Setup vimrc" _vimrc="$HOME"/.vimrc if test -f "$_vimrc" then _warn "Vim rcfile found. Skipping" else cat <<__EOC__ >>"$_vimrc" if filereadable(expand('$DOTFILES_DIR/vimrc')) source $DOTFILES_DIR/vimrc endif __EOC__ fi setup_dotfiles vimrc } ############################## # setup scripts _fetch_script(){ # _fetch_script url="$1" name="$2" dst="$HOME/.local/bin/$name" test -f "$dst" && return 0 command -v "$name" >/dev/null && return 0 if _download "$url" "$dst" then chmod u+x "$dst" else test -f "$dst" && rm -- "$dst" fi } setup_scripts(){ _msg "Download some utility scripts" _fetch_script \ https://gist.github.com/10sr/6852317/raw/colortable16.sh colortable16.sh _fetch_script \ https://gist.github.com/10sr/6852331/raw/256colors2.pl 256colors2.pl _fetch_script \ https://github.com/icy/pacapt/raw/ng/pacapt pacapt _fetch_script \ http://beyondgrep.com/ack-2.12-single-file ack-2.12 } ################################ # setup darwin __darwin_set_defaults(){ $isdarwin || return 0 # http://appdrill.net/60641/mac-boot-mute.html #sudo nvram SystemAudioVolume=%80 # add quit entry in menu defaults write com.apple.finder QuitMenuItem -bool YES # show full path on titlebar defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES # do not show desktop icons defaults write com.apple.finder CreateDesktop -boolean false killall Finder # disable dashboard #defaults write com.apple.dashboard mcx-disabled -bool YES } __darwin_start_daemon(){ $isdarwin || return 0 test "`launchctl getenv LC_ALL`" = C || sudo launchctl setenv LC_ALL C if ! (launchctl list | grep com.apple.locate) >/dev/null then sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist fi } setup_darwin(){ __darwin_set_defaults __darwin_start_daemon } ########################## # setup windirs setup_windirs(){ $iswindows || return 0 _msg "Setup some directories for windows environment" if $iscygwin then #__winhome="/cygdrive/c/Users/`whoami`" __winhome=`cygpath -H`/`whoami` fi if test -n "$__winhome" -a -d "$__winhome" -a '!' -e "$HOME/.winhome" then _msg Make symlink to "$__winhome" with name "$HOME/.winhome" ln -s "$__winhome" "$HOME/.winhome" fi } ######################### # setup dirs setup_dirs(){ _msg Make some direcoties mkdir -vp "$__homelocal" mkdir -vp "$__homelocal/bin" mkdir -vp "$__homevar" } #################################### # setup env # setup new environment with default options setup_env(){ setup_shrc_common setup_dirs setup_gitconf setup_tmux setup_scripts setup_dotfiles --git } ######################### # help and main help(){ echo "Usage: ./setup.sh ..." echo " or: ./setup.sh help" echo "Available cmds are: $__setups" } main(){ detect_systems if test -z "$1" then help return 1 fi _cmd=$1 shift if test "$_cmd" = help then help return 0 fi _msg Running setup_$_cmd setup_$_cmd "$@" _msg Running setup_$_cmd done } main "$@"