#!/bin/bash REPOSFILE=(~/.git_repos) if [ -n "$1" ]; then REPOSFILE="$1" fi saveIFS="$IFS" IFS=$'\n' LINES=($(<"$REPOSFILE")) IFS="$saveIFS" # Set defaults to user's homedir and no group (e.g., subdir) WORKSPACE=$HOME GRP="" for LINE in "${LINES[@]}"; do if [ ${LINE:0:1} = '#' ] || [ -z $LINE ]; then # Comment or empty line encountered, skip #echo "comment or empty line" continue fi if [ ${LINE:0:10} = 'workspace=' ]; then length=${#LINE} WORKSPACEDIR=`echo $LINE | cut -d'=' -f 2` if [ -z $WORKSPACEDIR ]; then WORKSPACE=$HOME else WORKSPACE="$HOME/$WORKSPACEDIR" fi echo "workspace: $WORKSPACE" # Reset GRP, as we enter a new workspace GRP="" GPRDIR="" if [ ! -e $WORKSPACE ]; then mkdir -p $WORKSPACE fi continue fi if [ ${LINE:0:6} = 'group=' ]; then GRP=`echo $LINE | cut -d'=' -f 2` if [ ! -z $GRP ]; then GRPDIR=$WORKSPACE/$GRP else GRPDIR=$WORKSPACE fi continue fi if [ ! -e $GRPDIR ]; then mkdir $GRPDIR elif [ -f $GRPDIR ]; then echo -e "[\e[31mX\e[0m] Group directory already exists as file: $GRPDIR" exit 1 fi cd $GRPDIR REPODIR=$(basename "$LINE") #extension="${filename##*.}" REPODIR="${REPODIR%.*}" if [ -e $REPODIR ]; then cd $REPODIR git remote update &> /dev/null LOCAL=$(git rev-parse @) REMOTE=$(git rev-parse @{u}) BASE=$(git merge-base @ @{u}) # 31: red, 32: green, 33: orange/yellow if ! git diff --quiet; then echo -e "[\e[31mX\e[0m] $GRP/$REPODIR changed - $WORKSPACE/$GRP/$REPODIR" elif [ $LOCAL = $REMOTE ]; then # Up-to-date echo -e "[\e[32m-\e[0m] $GRP/$REPODIR" elif [ $LOCAL = $BASE ]; then # Need to pull echo -e "[\e[33mU\e[0m] $GRP/$REPODIR" git pull --all --quiet elif [ $REMOTE = $BASE ]; then # Need to push echo -e "[\e[33mP\e[0m] $GRP/$REPODIR pushing" git push --all --quiet git push --tags --quiet else # Diverged echo -e "[\e[31mX\e[0m] $GRP/$REPODIR diverged - $WORKSPACE/$GRP/$REPODIR" fi else echo -e "[\e[33mC\e[0m] $GRP/$REPODIR" git clone --quiet $LINE fi done