#!/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