Previous: Switch Emacs Init, Up: Build Scripts [Index]
This code synchronizes the following configuration files:
It first verifies that the files differ; then it will copy a newer file over an
older file. If a local file is updated with a newer template file, then this
program updates the Emacs server-socket-dir
variable, if such exists. If a
template is updated with a newer local file, then delete the
server-socket-dir
value.
[ -v TEMPLATES ] || { printf "${RED}ERROR: missing \$TEMPLATES env var${CLEAR}\n" exit 1 } [ -v COMP ] || { printf "${RED}ERROR: missing \$COMP env var${CLEAR}\n" exit 1 } set -e ## usage: syncrc [-f system|rc -t rc|system -h] ## if no options, process by natural age ## if -f and -t options, force update from ... to ... usage () { printf "\n${GREEN}USAGE: ${YELLOW}syncrc \ ${WHITEBOLD}[${CYAN}-f ${MAGENTA}system|rc \ ${CYAN}-t ${MAGENTA}rc|system \ ${WHITEBOLD}]${CLEAR}\n" printf "${GREEN}force sync rc files \ ${CYAN}'-f'${GREEN}rom ${MAGENTA}system|rc \ ${CYAN}'-t'${GREEN}o ${MAGENTA}rc|system\ ${CLEAR}\n\n" exit $1 } # force update of either system or rc file touchup () { printf "In touchup with \$from: $from\n"; case $from in "system") printf "${WHITEBOLD}Touching $1..."; sudo touch $1; printf "${CLEAR}" ;; "rc") printf "${WHITEBOLD}Touching $2..."; touch $2; printf "${CLEAR}" ;; esac } # compare files to determine which one is newer comp () { [[ -e $1 && -e $2 ]] && { # only process if both files exist if ! cmp -s $1 $2 then [[ -n $from ]] && { # force update if $from is non-zero length touchup $1 $2 } || { :; } [[ $1 -nt $2 ]] && { # system file is newer [[ -d $(dirname "$2") ]] || { # make sure rc dir exists mkdir -vp $(dirname "$2") } || { :; } printf "${YELLOW}system is newer than rc${CLEAR}\n" echo; ls -l $1 $2; echo printf "${BLUE}"; cp -ipv "$1" "$2"; printf "${CLEAR}" ## delete the value of the emacs server-socket-dir in the rc file grep -q "EMACS_SERVER_SOCKET_DIR=" "$2" && { #printf "${WHITE}UNSETTING socket_dir...${CLEAR}\n" sed -i'.bak' -Ee '/(EMACS_SERVER_SOCKET_DIR)=.*$/ s!!\1=TBD!' "$2" } || { :; } } || { [[ "$2" -nt "$1" ]] && { # rc file is newer printf "${YELLOW}rc is newer than system${CLEAR}\n" echo; ls -l $2 $1; echo [[ -w "$1" ]] && { # check if the system file is writable printf "${PURPLE}" cp -ipv "$2" "$1" printf "${CLEAR}" } || { printf "${RED}You must authenticate... ${CLEAR}" printf "${PURPLE}" sudo cp -ipv "$2" "$1" printf "${CLEAR}" } ## update the value of the emacs server-socket-dir in the system file grep -q "EMACS_SERVER_SOCKET_DIR=" "$1" && { socket_dir=$(${EMACS} -Q --batch --eval '(progn (require (quote server))(princ (file-name-as-directory server-socket-dir)))') printf "${WHITE}SETTING socket_dir=${socket_dir}${CLEAR}...\n" sed -i'.bak'-$$ -Ee '/(EMACS_SERVER_SOCKET_DIR)=.*$/ s!!\1='"$socket_dir"'!' "$1" } || { :; } } || { printf "${REDBOLD}ERROR: the files don't match but are the same age?${CLEAR}\n" } } else printf "${CYAN}No difference.${CLEAR}\n" fi } || { tocreate=$( if test -e "$1"; then echo "$2"; else echo "$1"; fi; ) printf "${WHITE}one file: ${RED}${tocreate} ${WHITE}does not exist...Create?${CLEAR}" read -sn 1 if [[ $REPLY == [yY] ]] then echo " Creating" outof=$( if test -e "$1"; then echo $1; else echo "$2"; fi; ) mkdir -pv $(dirname "${tocreate}") cp -ivp "${outof}" "${tocreate}" else echo " Not creating" fi } } # end of comp() declare -a rcfiles=(/private/etc/profile /private/etc/bashrc /private/etc/tmux.conf ~/.bash_profile ~/.bashrc ~/.tmux.conf) ## see usage() abaove while getopts "f:t:h" opt do case $opt in 'f') from=${OPTARG} ;; 't') to=${OPTARG} ;; 'h') usage 0 ;; '?') printf "${RED}ERROR ${CLEAR}\n"; usage 1; ;; *) printf "OPTIND: ${RED}${OPTIND}${CLEAR}\n"; usage 1; ;; esac done ## OPTIND must be either 1 (no options) or 5 (2 options) if [[ $OPTIND -gt 1 && $OPTIND -ne 5 ]] then printf "${RED}ERROR: need both -f and -t${CLEAR}\n" usage 1 fi ## check for correct combination of from and to if [[ -n $from ]] then if [[ $from == "system" ]] then if [[ $to != "rc" ]] then printf "${RED}ERROR: incorrect combination: $from -- $to${CLEAR}\n" usage 1 fi elif [[ $from == "rc" ]] then if [[ $to != "system" ]] then printf "${RED}ERROR: incorrect combination: $from -- $to${CLEAR}\n" usage 1 fi else printf "${RED}ERROR; incorrect combination: $from -- $to${CLEAR}\n" usage 1 fi fi ## everything checks out; now process the files for file in "${rcfiles[@]}" do printf "Considering ${GREEN}$file... ${CLEAR}" case $file in *etc?profile) comp $file $TEMPLATES/rc/etc/${COMP}/profile ;; *etc?bashrc) comp $file $TEMPLATES/rc/etc/${COMP}/bashrc ;; *etc?tmux.conf) comp $file $TEMPLATES/rc/etc/${COMP}/tmux.conf ;; *bash_profile) comp $file $TEMPLATES/rc/${COMP}/bash_profile ;; *bashrc) comp $file $TEMPLATES/rc/${COMP}/bashrc ;; *tmux?conf) comp $file $TEMPLATES/rc/${COMP}/tmux.conf ;; esac done
Previous: Switch Emacs Init, Up: Build Scripts [Index]