#!/bin/bash ################################################################################################# # title :git-myshellconfig-checkout # # description :checkout git detached HEAD # # author :Jakobus Schürz # # changes by :Jakobus Schürz # # created :17.01.2019 # # updated :28.10.2020 # # version :2.0 # # usage :git myshellconfig-checkout [-h] # # notes : # ################################################################################################# [ -z "${SGIT+x}" ] && SGIT=git [ -z "${MYSHELLCONFIG_LOGDIR+x}" ] && export MYSHELLCONFIG_LOGDIR="${HOME}/logs" [ -z "${MYSHELLCONFIG_LOGFILE+x}" ] && export MYSHELLCONFIG_LOGFILE="${MYSHELLCONFIG_LOGDIR}/myshellconfig.log" #MYSHELLCONFIG_LOGDIR="./logs" #MYSHELLCONFIG_LOGFILE="${MYSHELLCONFIG_LOGDIR}/git.log" [ -d "${MYSHELLCONFIG_LOGDIR}" ] || mkdir -p "${MYSHELLCONFIG_LOGDIR}" [ -z "${MYSHELLCONFIG_GIT_REMOTE_NAME+x}" ] && export MYSHELLCONFIG_GIT_REMOTE_NAME=origin [ -z "${MYSHELLCONFIG_GIT_BRANCH+x}" ] && export MYSHELLCONFIG_GIT_BRANCH=master ENTRY cat << EOF >> "${MYSHELLCONFIG_LOGFILE}" +-----BEGINN git update repo $(date) -------------------------------+ EOF case $1 in -h) # Headless repo local PRE="${MYSHELLCONFIG_GIT_REMOTE_NAME}" ;; -s) GIT_FETCH_OPTIONS="--recurse-submodules" ;; *) PRE="" ;; esac # If TAG is set, checkout is always headless. [ -z "${MYSHELLCONFIG_GIT_TAG:+x}" ] || { export MYSHELLCONFIG_GIT_BRANCH=${MYSHELLCONFIG_GIT_TAG}; export PRE=""; } # Output #echo -n " remote: ${MYSHELLCONFIG_GIT_REMOTE_NAME}, branch: ${MYSHELLCONFIG_GIT_BRANCH}: " # Check for updates in submodules only if last check was INTERVALL hours in the past updated=$(cat ${MYSHELLCONFIG_BASE%/}${MYSHELLCONFIG_BASE:+/}.last_udate_submodules 2>/dev/null || echo 0 ) if [ $updated -lt $(date --date="${MYSHELLCONFIG_GIT_SUBMODULES_UPDATE_INTERVALL} hours ago" "+%s") ]; then GIT_FETCH_OPTIONS="--recurse-submodules" fi #echo $SGIT fetch ${MYSHELLCONFIG_GIT_REMOTE_NAME} -p 1>&2 $SGIT fetch ${GIT_FETCH_OPTIONS} ${MYSHELLCONFIG_GIT_REMOTE_NAME} -p 2>>"${MYSHELLCONFIG_LOGFILE}"|| { logwarn fetch failed; exit 1; } echo "Check for local changes:" >> "${MYSHELLCONFIG_LOGFILE}" if $SGIT diff-index --ignore-submodules --exit-code HEAD -- >> "${MYSHELLCONFIG_LOGFILE}" ; then cat << EOF >> "${MYSHELLCONFIG_LOGFILE}" no changes in local repo $SGIT checkout repo ${PRE}${PRE:+/}${MYSHELLCONFIG_GIT_BRANCH} EOF $SGIT checkout ${PRE}${PRE:+/}${MYSHELLCONFIG_GIT_BRANCH} 1>>"${MYSHELLCONFIG_LOGFILE}" 2>>"${MYSHELLCONFIG_LOGFILE}"|| exit 2 $SGIT merge FETCH_HEAD 1>>"${MYSHELLCONFIG_LOGFILE}" 2>>"${MYSHELLCONFIG_LOGFILE}"|| exit 3 else logwarn -n " Lokale Änderungen festgestellt:" echo " Siehe Logfile ${MYSHELLCONFIG_LOGFILE}" >&2 cat << EOF >> "${MYSHELLCONFIG_LOGFILE}" um die Änderung zurückzusetzen bitte $SGIT checkout \$FILENAME oder um alle lokalen Änderungen auf einmal zurückzusetzen: $SGIT checkout . ausführen Die Änderungen sind: $($SGIT diff-index HEAD --|awk '{print $5, $6}') $($SGIT diff-index -p HEAD --) EOF cat << EOF >> "${MYSHELLCONFIG_LOGFILE}" +-----ENDE git update repo $(date) ---------------------------------+ EOF exit 4 fi loginfo -n "repo synced" if ${MYSHELLCONFIG_GIT_SUBMODULES_UPDATE-${MYSHELLCONFIG_GIT_SUBMODULES_UPDATE_DEFAULT-true}}; then # updated=$(cat ${MYSHELLCONFIG_BASE%/}${MYSHELLCONFIG_BASE:+/}.last_udate_submodules 2>/dev/null || echo 0 ) # if [ $updated -lt $(date --date="${MYSHELLCONFIG_GIT_SUBMODULES_UPDATE_INTERVALL} hours ago" "+%s") ]; then logdebug "update submodules" rc=0 # srv="${MYSHELLCONFIG_GIT_SUBMODULES_SERVER-${MYSHELLCONFIG_GIT_SUBMODULES_SERVER_DEFAULT}}" # logwarn "srv $srv" # $SGIT config --file=.gitmodules -l | \ # grep url= | \ # awk -F "=" -v srv="${srv%/}${srv:+/}" \ # '{gsub(/^.*github.com\//,srv,$2); print $1" "$2}' | \ # while read a b; do # logdebug "$SGIT config --file=.gitmodules ${a} ${b}" # $SGIT config --file=.gitmodules "${a}" "${b}" # done # Submodules always have origin and master as repo and branch to track #$SGIT submodule init 1>>"${MYSHELLCONFIG_LOGFILE}" 2>&1|| { logwarn "update submodules failed on ini"; rc=5; } #$SGIT submodule foreach "git checkout master" 1>>"${MYSHELLCONFIG_LOGFILE}" 2>&1 || { logwarn "checkout master submodules failed on set upstream"; rc=7; } #$SGIT submodule foreach "git branch -u origin/master master" 1>>"${MYSHELLCONFIG_LOGFILE}" 2>&1|| { logwarn "set-upstream submodules failed on set upstream"; rc=8; } #$SGIT submodule update --init --recursive --remote --merge 1>>"${MYSHELLCONFIG_LOGFILE}" 2>&1 || { logwarn " update submodules failed on update"; rc=9; } # run git submodule sync only ich local repo should use submodule urls from main-project # so don't use it here # logdebug "$($SGIT submodule sync)" || { logwarn "sync submodules failed on sync"; rc=6; } logdebug "$($SGIT submodule update --remote)" #logdebug "$($SGIT submodule update --init --recursive)" logdebug "$($SGIT commit .gitmodules -m 'update submodules')" #$SGIT submodule update --init --remote --merge 1>>"${MYSHELLCONFIG_LOGFILE}" 2>&1 || { logwarn " update submodules failed on update"; rc=9; } #$SGIT checkout .gitmodules logdebug "submodules updated successfully" loginfo -n ", submodules synced" date "+%s" > ${MYSHELLCONFIG_BASE%/}${MYSHELLCONFIG_BASE:+/}.last_udate_submodules else logdebug "submodules not updated. last update is less then ${MYSHELLCONFIG_GIT_SUBMODULE_UPDATE_INTERVALL} hours ago" fi #else # loginfo -n ", submodules not synced" # logdebug "Do not update submodules. It's denied by environment MYSHELLCONFIG_GIT_UPDATE_SUBMODULES: ${MYSHELLCONFIG_GIT_SUBMODULES_UPDATE-${MYSHELLCONFIG_GIT_SUBMODULES_UPDATE_DEFAULT-true}}" #fi loginfo -n ": " EXIT exit $rc