1
0
Fork 0
Scripts/Perso/INTech/gitUpdate.sh

89 lines
No EOL
1.9 KiB
Bash
Executable file

#!/bin/bash
export LC_ALL=POSIX
WORK_DIR=$HOME"/.gitAutoPull"
work_array="."
if [ $# -gt 0 ]; then
work_array=$@
fi
for GIT_REPO in $work_array ; do
GIT_REPO_NAME="$(echo '$GIT_REPO' | tr '/' '_' | tr -d '~')"
CHECK_TIMER_FILE=$WORK_DIR/localCommitsCheck"$GIT_REPO_NAME"
cd $GIT_REPO > /dev/null
if [ $? -ne 0 ]; then
echo $GIT_REPO" Does not exist or is not a directory"
exit -2
fi
if [ -z "$(git rev-parse --git-dir 2>/dev/null)" ]; then
echo $GIT_REPO" is not a git repository"
exit -2
fi
if [ ! -d $WORK_DIR ]; then
mkdir $WORK_DIR > /dev/null
fi
if [ ! -d $WORK_DIR ]; then
echo "Could not create work directory, aborting"
exit -4
fi
if [ -e $CHECK_TIMER_FILE ]; then
read count < $CHECK_TIMER_FILE
if [ $cout -ne 0 ]; then
echo $(( $count - 1 )) > $CHECK_TIMER_FILE
exit -1
else
rm -f $CHECK_TIMER_FILE
fi
fi
remoteStatus="$(git fetch --dry-run 2>&1 | tail -n 1 | grep -v -e'+')" # Empty if there are no commits to fetch
refChanges=$(git push -n --porcelain | grep -e'refs')
nbRefs=$(echo "$refChanges" | wc -l)
nbNonPushRefs=$(echo $(echo "$refChanges" | cut -f1) | wc -w)
localStatus="Nothing to do" # Empty if there are commits to push
if [ ! -z $(echo $refChanges | grep -e"*") ]; then
localStatus=""
fi
if [ ! $nbRefs -eq $nbNonPushRefs ]; then
localStatus=""
fi
output=$(
if [ -z "$remoteStatus" ]; then
if [ -z "$localStatus" ]; then
echo "Pushing "$GIT_REPO" updates to origin"
git push 2>&1
exit 1
fi
else
if [ -z "localStatus" ]; then
echo "Local and remote diverged, stopping auto-update for 30 iterations..."
echo 30 > $WORK_DIR/localCommitsCheck"$GIT_REPO_NAME"
else
echo "Updating "$GIT_REPO" with remote commits"
git fetch --all 2>&1
git remote update 2>&1
exit 1
fi
fi )
if [ ! -z "$output" ]; then
echo "$output" | wall
fi
done
exit 0