summaryrefslogblamecommitdiffstats
path: root/bashrc/main.sh
blob: e2075fd90b4b1bb3286d0cd87face25d3b55d735 (plain) (tree)
1
2
3
4
5
6
7
8

                                                    


                            
                                         
                                                          
 


                                                
                   

                          
                 


                    
 


                                          
 
                                                         






                                                            

                                             
                                                       

                                                                            
                                





                                            



                                                                                    
                                                                         
                                                                    
 
                                                                                   

                                                                                                                     



                                                                                                  
                                                                                       
                                                              

                          

                                                             
                                                                        
 

                                                                                               

                                                           
                                                                  

                          
                                                                 



                                                                                              
                                                                                         

                                          
 
                                                       

                                                                                                             


                                                                                             
                                                                                                   
                          
 























                                                            
                                                           


                    

                                                   
                                  




                                                 
                                          
                                                                             



              
            
 
                



                
                
 



                                          
                       

                              
                 
# this file is sourced by all bash shells on startup

# test for interactive shell
[[ $- != *i* ]] && return

# return if this script is executed twice
[[ -n $(declare -p _DOTFILES_DIR 2>/dev/null) ]] && return

declare -r _DOTFILES_DIR="${HOME}/.dotfiles"
declare -r _BASHRC_DIR="${_DOTFILES_DIR}/bashrc"

# start in home dir
if [[ -n "${DIR}" ]]; then
	cd "${DIR}"
	unset DIR
else
	cd "${HOME}"
fi

# self update magic
_self_update() {
	pushd ${_DOTFILES_DIR} &>/dev/null

	# save the origin, the current master is based of
    if ! git tag | grep old-origin -q; then
	    if git branch | grep old-origin -q; then
		    git branch -D old-origin >/dev/null 2>&1
	    fi

        git tag old-origin origin/master >/dev/null 2>&1
    fi

	if hash timeout >/dev/null 2>&1; then
		timeout 3s git fetch origin 2>/dev/null
		if [[ "$?" == "124" ]]; then
			echo -e "\033[31m*\033[0m timeout: git fetch origin"
	        popd &>/dev/null
			return
		fi
	else
		git fetch origin 2>/dev/null
	fi

	if [[ -n "$(git whatchanged HEAD..origin/master)" ]]; then
		echo -ne "\033[31m*\033[0m dotfile updates found, merge now? (Y/n) "
		read _merge;
		if [[ $_merge != 'n' ]]; then
			_local_changes="$(git status | grep '^# Change')"
			_old_origin="$(git rev-list -n1 old-origin)"

			if [[ "$_old_origin" != "$(git rev-list -n1 HEAD)" ]]; then
				echo -e "\033[31m*\033[0m You have some local commits. I will now try to rebase them"
				echo "  onto the new origin/master."
			fi

			if [[ -n "$_local_changes" ]]; then
				echo -e "\033[31m*\033[0m You have some uncommited local changes."
				echo "  I will try to preserve it using the git stash."
				git stash >/dev/null || return
			fi

			# update old-origin
			git tag -d old-origin >/dev/null 2>&1
			git tag old-origin origin/master >/dev/null 2>&1

			echo -e "\033[33m*\033[0m git rebase --onto origin/master $_old_origin"
			git rebase --onto origin/master $_old_origin || return

			if [[ -n "$_local_changes" ]]; then
				git stash pop >/dev/null || return
			fi

			if [[ -e management/symlinks.md5 ]]; then
				if hash md5sum 2> /dev/null ; then
					md5sum -c management/symlinks.md5 --status 2>/dev/null
				else
					if hash md5 2> /dev/null ; then
						md5 -c management/symlinks.md5 >/dev/null
					fi
				fi

				if [[ $? -ne 0 ]]; then
					echo -e "\033[33m*\033[0m symlink mapping changed!"
					echo -e "\033[33m*\033[0m Maybe you should execute godot.sh again..."
				fi
			else
				echo -e "\033[33m*\033[0m symlink mapping checksum not found"
				echo -e "\033[33m*\033[0m Maybe you should execute godot.sh again."
			fi

			popd &>/dev/null
			exec $SHELL
		fi
	fi

	popd &>/dev/null
}

# module load magic
_load() {
	local base path
	local pedantic=0

	[[ -z $1 || -z $2 ]] && return

	base=${_BASHRC_DIR}/${1}

	if [[ $1 == "common" || $2 == "init" ]]; then
		path=${2}.sh
		pedantic=1
	else
		case $1 in
			(dist)  path=${_DISTNAME}/${2}.sh ;;
			(node)  path=${_NODENAME}/${2}.sh ;;
			(net)	path=${_NETNAME}/${2}.sh ;;
		esac
	fi

	if [[ -r ${base}/${path} ]]; then
	    source ${base}/${path} 2>&1 > /dev/null
	elif [[ $2 == "*" ]]; then
	    for file in ${base}/${path}; do
		if [[ -r $file ]]; then
		    source $file 2>&1 > /dev/null
		fi
	    done
	elif [[ ${pedantic} -eq 1 ]]; then
	    echo "error: cannot find necessary startup file: ${base}/${path}"
	fi
}

# update first
_self_update

_load common '*'

# load internals
_load dist  init
_load node  init
_load net   init

# load common distribution settings
_load dist common

# load distribution specific node settings
_load node ${_DISTNAME}

# initialize preexec hack last
init_preexec_hack