131 lines
6.3 KiB
Bash
Executable file
131 lines
6.3 KiB
Bash
Executable file
#!/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 $(date) -------------------------------+
|
||
EOF
|
||
|
||
case $1 in
|
||
-h)
|
||
# Headless repo local
|
||
PRE="${MYSHELLCONFIG_GIT_REMOTE_NAME}"
|
||
;;
|
||
*)
|
||
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}: "
|
||
|
||
#echo $SGIT fetch ${MYSHELLCONFIG_GIT_REMOTE_NAME} -p 1>&2
|
||
$SGIT fetch ${MYSHELLCONFIG_GIT_REMOTE_NAME} -p 2>>"${MYSHELLCONFIG_LOGFILE}"|| { logwarn fetch failed; exit 1; }
|
||
|
||
if $SGIT diff-index --ignore-submodules --exit-code HEAD -- >> "${MYSHELLCONFIG_LOGFILE}" ; then
|
||
cat << EOF >> "${MYSHELLCONFIG_LOGFILE}"
|
||
Check for local changes:
|
||
no changes in local repo
|
||
$SGIT checkout repo ${PRE}${PRE:+/}${MYSHELLCONFIG_GIT_BRANCH}
|
||
EOF
|
||
#echo "checkout origin/master as detached HEAD"
|
||
$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
|
||
cat << EOF >> "${MYSHELLCONFIG_LOGFILE}"
|
||
Check for local changes:
|
||
Ich habe lokale Änderungen festgestellt
|
||
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:
|
||
EOF
|
||
$SGIT diff-index HEAD --|awk '{print $5, $6}' >> "${MYSHELLCONFIG_LOGFILE}"
|
||
$SGIT diff-index -p HEAD -- >> "${MYSHELLCONFIG_LOGFILE}"
|
||
|
||
logwarn "Lokale Änderungen festgestellt: Siehe Logfile ${MYSHELLCONFIG_LOGFILE}" >&2
|
||
cat << EOF >> "${MYSHELLCONFIG_LOGFILE}"
|
||
|
||
+-----ENDE $(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
|
||
|