diff --git a/.update.sh b/.update.sh index 06df086..fa8557f 100644 --- a/.update.sh +++ b/.update.sh @@ -1,29 +1,32 @@ #!/bin/bash -export DOTFILES=$( cd "$( dirname "${BASH_SOURCE[0]:-${(%):-%x}}" )" && pwd ) +THIS_DIR=$( cd "$( dirname "${BASH_SOURCE[0]:-${(%):-%x}}" )" && pwd ) +THIS_FILE=$(basename "${BASH_SOURCE}") +source "$THIS_DIR/tools/common.sh" + # get the specified commit id dfs_commit=$(curl -fsSL https://api.beardic.cn/get-var/dfs-commit-id) if [[ ${#dfs_commit} != 40 ]]; then - echo "Error: invalid commit id." - python3 "${DOTFILES}/tools/post-log.py" "[ERROR] update.sh: invalid commit id: ${dfs_commit}" + fmt_error "invalid commit id" + post_log "ERROR" "$THIS_FILE" "invalid commit id: ${dfs_commit}" exit fi # fetch origin cd $DOTFILES git fetch if [[ -n "$(git status -s)" ]]; then - echo "Error: directory not clean." - python3 "${DOTFILES}/tools/post-log.py" "[ERROR] update.sh: directory not clean" + fmt_error "directory not clean" + post_log "ERROR" "$THIS_FILE" "directory not clean" exit fi # update if [[ "$(git rev-parse HEAD)" == "$dfs_commit" ]]; then - echo "Nothing to do." - python3 "${DOTFILES}/tools/post-log.py" "[INFO] update.sh: Nothing to do" + fmt_info "nothing to do" + post_log "INFO" "$THIS_FILE" "nothing to do" else - echo "Checking out to commit $dfs_commit ..." + fmt_info "checking out to commit $dfs_commit ..." git -c advice.detachedHead=false checkout $dfs_commit cp ./.update.sh ./update.sh chmod +x ./update.sh - python3 "${DOTFILES}/tools/post-log.py" "[INFO] update.sh: Checked out to commit $dfs_commit" + post_log "INFO" "$THIS_FILE" "checked out to commit $dfs_commit" fi diff --git a/.zshrc2 b/.zshrc2 index c7e852d..084eddd 100644 --- a/.zshrc2 +++ b/.zshrc2 @@ -68,46 +68,32 @@ antigen theme ${ZSH_THEME:-ys} antigen apply # end of antigen config -# functions +# env export DOTFILES=$( cd "$( dirname "${BASH_SOURCE[0]:-${(%):-%x}}" )" && pwd ) +export PATH=$PATH:$DOTFILES/scripts -SUDO='' -if (( $EUID != 0 )); then - SUDO='sudo' -fi +# alias +alias "pls"='sudo $(fc -ln -1)' +alias "se"='sudo -sE' +alias "pbd"='ping baidu.com' +alias "p114"='ping 114.114.114.114' +alias "p666"='ping6 2001:da8::666' +case $(bash "$DOTFILES/tools/common.sh" get_os_type) in + macos ) alias l='ls -lAGh -D "%y-%m-%d %H:%M"' ;; + * ) alias l='ls -lAGh --time-style="+%y-%m-%d %H:%M"' ;; +esac -get_os_type() { - case "$(uname -s)" in - Darwin*) ans="MacOS";; - CYGWIN*) ans="Cygwin";; - MSYS* ) ans="MSYS";; - Linux* ) ans="Linux";; - *) ans="unknown";; - esac - echo $ans | tr '[:upper:]' '[:lower:]' -} - -get_linux_dist() { - if [ -f /etc/os-release ]; then - . /etc/os-release - ans=$ID - elif type lsb_release >/dev/null 2>&1; then - ans=$(lsb_release -si) - elif [ -f /etc/lsb-release ]; then - . /etc/lsb-release - ans=$DISTRIB_ID - elif [ -f /etc/debian_version ]; then - ans=Debian - elif [ -f /etc/SuSe-release ]; then - ans=SUSE - elif [ -f /etc/redhat-release ]; then - ans=RedHat - else - ans=unknown - fi - echo $ans | tr '[:upper:]' '[:lower:]' -} +# key bindings +bindkey "^b" beginning-of-line +bindkey "^e" end-of-line +bindkey "^[[H" beginning-of-line +bindkey "^[[F" end-of-line +bindkey "^[[1~" beginning-of-line +bindkey "^[[4~" end-of-line +bindkey "^[OH" beginning-of-line +bindkey "^[OF" end-of-line +# dfs dfs() { case $1 in @@ -129,37 +115,7 @@ dfs() echo 'Done. Please open a new shell to see the changes.' ;; cd ) cd "$DOTFILES" ;; - log ) "$DOTFILES/tools/post-log.py" "$2" ;; + log ) "$DOTFILES/tools/common.sh" "post_log" "INFO" "dfs" "$2" ;; * ) echo "unknown command \"$1\". available: update, force-update, version, reset, cd, log" ;; esac } - -dogo() -{ - if [[ -z "$1" || "$1" =~ "-h|--help" ]]; then - echo "usage: dogo " - else - $SUDO docker exec -it $1 zsh - fi -} - -# alias -alias "pls"='sudo $(fc -ln -1)' -alias "se"='sudo -sE' -alias "pbd"='ping baidu.com' -alias "p114"='ping 114.114.114.114' -alias "p666"='ping6 2001:da8::666' -case $(get_os_type) in - macos ) alias l='ls -lAGh -D "%y-%m-%d %H:%M"' ;; - * ) alias l='ls -lAGh --time-style="+%y-%m-%d %H:%M"' ;; -esac - -# key bindings -bindkey "^b" beginning-of-line -bindkey "^e" end-of-line -bindkey "^[[H" beginning-of-line -bindkey "^[[F" end-of-line -bindkey "^[[1~" beginning-of-line -bindkey "^[[4~" end-of-line -bindkey "^[OH" beginning-of-line -bindkey "^[OF" end-of-line diff --git a/install.sh b/install.sh index fdde7cb..993c622 100755 --- a/install.sh +++ b/install.sh @@ -1,114 +1,15 @@ #!/bin/bash -# Color settings -# Source: https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -if [ -t 1 ]; then - is_tty() { - true - } -else - is_tty() { - false - } -fi +THIS_DIR=$( cd "$( dirname "${BASH_SOURCE[0]:-${(%):-%x}}" )" && pwd ) +source "$THIS_DIR/tools/common.sh" -supports_truecolor() { - case "$COLORTERM" in - truecolor|24bit) return 0 ;; - esac - - case "$TERM" in - iterm |\ - tmux-truecolor |\ - linux-truecolor |\ - xterm-truecolor |\ - screen-truecolor) return 0 ;; - esac - - return 1 -} - -fmt_fatal() { - printf '%sfatal: %s%s\n' "${FMT_BOLD}${FMT_RED}" "$*" "$FMT_RESET" >&2 - exit -} - -fmt_error() { - printf '%serror: %s%s\n' "${FMT_RED}" "$*" "$FMT_RESET" >&2 -} - -fmt_warning() { - echo "${FMT_YELLOW}warning: $1 ${FMT_RESET}" -} - -fmt_note() { - echo "${FMT_GREEN}$1 ${FMT_RESET}" -} - -setup_color() { - # Only use colors if connected to a terminal - if ! is_tty; then - FMT_RAINBOW="" - FMT_RED="" - FMT_GREEN="" - FMT_YELLOW="" - FMT_BLUE="" - FMT_BOLD="" - FMT_RESET="" - return - fi - - if supports_truecolor; then - FMT_RAINBOW=" - $(printf '\033[38;2;255;0;0m') - $(printf '\033[38;2;255;97;0m') - $(printf '\033[38;2;247;255;0m') - $(printf '\033[38;2;0;255;30m') - $(printf '\033[38;2;77;0;255m') - $(printf '\033[38;2;168;0;255m') - $(printf '\033[38;2;245;0;172m') - " - else - FMT_RAINBOW=" - $(printf '\033[38;5;196m') - $(printf '\033[38;5;202m') - $(printf '\033[38;5;226m') - $(printf '\033[38;5;082m') - $(printf '\033[38;5;021m') - $(printf '\033[38;5;093m') - $(printf '\033[38;5;163m') - " - fi - - FMT_RED=$(printf '\033[31m') - FMT_GREEN=$(printf '\033[32m') - FMT_YELLOW=$(printf '\033[33m') - FMT_BLUE=$(printf '\033[34m') - FMT_BOLD=$(printf '\033[1m') - FMT_RESET=$(printf '\033[0m') -} -# END of color settings - -dotfile_path=$( cd "$( dirname "${BASH_SOURCE[0]:-${(%):-%x}}" )" && pwd ) home_slashes=${HOME//\//\\\/} -if [[ ! $dotfile_path == ${home_slashes}* ]]; then - fmt_fatal "\"$dotfile_path\" is not under \"$HOME\". aborting ..." +if [[ ! $DOTFILES == ${home_slashes}* ]]; then + fmt_fatal "\"$DOTFILES\" is not under \"$HOME\". aborting ..." fi -dotfile_home_path=${dotfile_path/${home_slashes}/\~} -dotfile_relative_path=${dotfile_path#${home_slashes}\/} -crontab_job="0 * * * * ${dotfile_path}/update.sh" - -ask_for_yN() -{ - while true; do - read -p "${FMT_YELLOW}$1${FMT_RESET} [yN]: " yn - case $yn in - [Yy]* ) return 1;; - [Nn]* ) return 0;; - * ) return 0;; - esac - done -} +dotfile_home_path=${DOTFILES/${home_slashes}/\~} +dotfile_relative_path=${DOTFILES#${home_slashes}\/} +crontab_job="0 * * * * ${DOTFILES}/update.sh" insert_if_not_exist() { @@ -211,15 +112,15 @@ install_vim_vundle(){ install_update(){ fmt_note "installing update.sh ..." - cp "${dotfile_path}/.update.sh" "${dotfile_path}/update.sh" - chmod +x "${dotfile_path}/update.sh" + cp "${DOTFILES}/.update.sh" "${DOTFILES}/update.sh" + chmod +x "${DOTFILES}/update.sh" fmt_note "running update.sh ..." - ${dotfile_path}/update.sh + ${DOTFILES}/update.sh } uninstall_update(){ fmt_note "removing update.sh ..." - rm "${dotfile_path}/update.sh" + rm "${DOTFILES}/update.sh" } install(){ @@ -229,7 +130,7 @@ install(){ insert_if_not_exist "${HOME}/.tmux.conf" "source-file ${dotfile_home_path}/.tmux.conf2" insert_if_not_exist "${HOME}/.vimrc" "source ${dotfile_home_path}/.vimrc2" insert_if_not_exist "${HOME}/.gitconfig" "[include] path = \"${dotfile_home_path}/.gitconfig2\"" - create_symlink "${dotfile_path}/.ssh/authorized_keys2" "${HOME}/.ssh/authorized_keys2" + create_symlink "${DOTFILES}/.ssh/authorized_keys2" "${HOME}/.ssh/authorized_keys2" # those that won't be uninstalled in the future install_tmux_tpm install_vim_vundle @@ -245,12 +146,12 @@ uninstall(){ delete_if_exist "${HOME}/.tmux.conf" "source-file ${dotfile_home_path}/.tmux.conf2" delete_if_exist "${HOME}/.vimrc" "source ${dotfile_home_path}/.vimrc2" delete_if_exist "${HOME}/.gitconfig" "[include] path = \"${dotfile_home_path}/.gitconfig2\"" - delete_link_if_match "${dotfile_path}/.ssh/authorized_keys2" "${HOME}/.ssh/authorized_keys2" + delete_link_if_match "${DOTFILES}/.ssh/authorized_keys2" "${HOME}/.ssh/authorized_keys2" fmt_note "done uninstalling!" fi } -setup_color + case $1 in ""|-i ) install ;; -r ) uninstall ;; diff --git a/scripts/dogo b/scripts/dogo new file mode 100755 index 0000000..fb071f6 --- /dev/null +++ b/scripts/dogo @@ -0,0 +1,11 @@ +#!/bin/bash + +THIS_DIR=$( cd "$( dirname "${BASH_SOURCE[0]:-${(%):-%x}}" )" && pwd ) +DOTFILES=${DOTFILES:-$( cd "$THIS_DIR/.." && pwd )} +source "$DOTFILES/tools/common.sh" + +if [[ -z "$1" || "$1" =~ "-h|--help" ]]; then + fmt_info "usage: dogo " +else + $SUDO docker exec -it $1 zsh +fi diff --git a/tools/alpine.sh b/tools/alpine.sh index 960abfb..b2b6aa3 100755 --- a/tools/alpine.sh +++ b/tools/alpine.sh @@ -1,9 +1,6 @@ #!/bin/bash -if [[ $USER != "root" ]]; then - echo "must run as root!" - exit 1 -fi +set -e set_mirror() { diff --git a/tools/common.sh b/tools/common.sh new file mode 100755 index 0000000..468f24f --- /dev/null +++ b/tools/common.sh @@ -0,0 +1,157 @@ +#!/bin/bash + +THIS_DIR=$( cd "$( dirname "${BASH_SOURCE[0]:-${(%):-%x}}" )" && pwd ) +export DOTFILES=$( cd "$THIS_DIR/.." && pwd ) + +SUDO='' +if (( $EUID != 0 )); then + SUDO='sudo' +fi + +# Color settings +# Source: https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh +if [ -t 1 ]; then + is_tty() { + true + } +else + is_tty() { + false + } +fi + +supports_truecolor() { + case "$COLORTERM" in + truecolor|24bit) return 0 ;; + esac + + case "$TERM" in + iterm |\ + tmux-truecolor |\ + linux-truecolor |\ + xterm-truecolor |\ + screen-truecolor) return 0 ;; + esac + + return 1 +} + +fmt_fatal() { + printf '%sfatal: %s%s\n' "${FMT_BOLD}${FMT_RED}" "$*" "${FMT_RESET}" >&2 + exit +} + +fmt_error() { + printf '%serror: %s%s\n' "${FMT_RED}" "$*" "${FMT_RESET}" >&2 +} + +fmt_warning() { + printf '%swarning: %s%s\n' "${FMT_YELLOW}" "$*" "${FMT_RESET}" >&2 +} + +fmt_info() { + printf '%sinfo: %s\n' "${FMT_RESET}" "$*" >&1 +} + +fmt_note() { + printf '%s%s%s\n' "${FMT_GREEN}" "$*" "${FMT_RESET}" >&1 +} + +setup_color() { + # Only use colors if connected to a terminal + if ! is_tty; then + FMT_RAINBOW="" + FMT_RED="" + FMT_GREEN="" + FMT_YELLOW="" + FMT_BLUE="" + FMT_BOLD="" + FMT_RESET="" + return + fi + + if supports_truecolor; then + FMT_RAINBOW=" + $(printf '\033[38;2;255;0;0m') + $(printf '\033[38;2;255;97;0m') + $(printf '\033[38;2;247;255;0m') + $(printf '\033[38;2;0;255;30m') + $(printf '\033[38;2;77;0;255m') + $(printf '\033[38;2;168;0;255m') + $(printf '\033[38;2;245;0;172m') + " + else + FMT_RAINBOW=" + $(printf '\033[38;5;196m') + $(printf '\033[38;5;202m') + $(printf '\033[38;5;226m') + $(printf '\033[38;5;082m') + $(printf '\033[38;5;021m') + $(printf '\033[38;5;093m') + $(printf '\033[38;5;163m') + " + fi + + FMT_RED=$(printf '\033[31m') + FMT_GREEN=$(printf '\033[32m') + FMT_YELLOW=$(printf '\033[33m') + FMT_BLUE=$(printf '\033[34m') + FMT_BOLD=$(printf '\033[1m') + FMT_RESET=$(printf '\033[0m') +} +# END of color settings + +ask_for_yN() +{ + while true; do + read -p "${FMT_YELLOW}$1${FMT_RESET} [yN]: " yn + case $yn in + [Yy]* ) return 1;; + [Nn]* ) return 0;; + * ) return 0;; + esac + done +} + +post_log() +{ + python3 "${DOTFILES}/tools/log.py" "[$1] $2: $3" +} + +get_os_type() { + case "$(uname -s)" in + Darwin*) ans="MacOS";; + CYGWIN*) ans="Cygwin";; + MSYS* ) ans="MSYS";; + Linux* ) ans="Linux";; + *) ans="unknown";; + esac + echo $ans | tr '[:upper:]' '[:lower:]' +} + +get_linux_dist() { + if [ -f /etc/os-release ]; then + . /etc/os-release + ans=$ID + elif type lsb_release >/dev/null 2>&1; then + ans=$(lsb_release -si) + elif [ -f /etc/lsb-release ]; then + . /etc/lsb-release + ans=$DISTRIB_ID + elif [ -f /etc/debian_version ]; then + ans=Debian + elif [ -f /etc/SuSe-release ]; then + ans=SUSE + elif [ -f /etc/redhat-release ]; then + ans=RedHat + else + ans=unknown + fi + echo $ans | tr '[:upper:]' '[:lower:]' +} + +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + $1 "${@:2}" +else + setup_color +fi diff --git a/tools/post-log.py b/tools/log.py old mode 100755 new mode 100644 similarity index 100% rename from tools/post-log.py rename to tools/log.py diff --git a/tools/msys2.sh b/tools/msys2.sh index 27812a0..3d41d1c 100755 --- a/tools/msys2.sh +++ b/tools/msys2.sh @@ -1,9 +1,6 @@ #!/bin/bash -if [[ $USER != "root" ]]; then - echo "must run as root!" - exit 1 -fi +set -e set_mirror() { diff --git a/tools/ubuntu.sh b/tools/ubuntu.sh index c06b6e8..c3d1b92 100755 --- a/tools/ubuntu.sh +++ b/tools/ubuntu.sh @@ -1,9 +1,6 @@ #!/bin/bash -if [[ $USER != "root" ]]; then - echo "must run as root!" - exit 1 -fi +set -e set_mirror() {