#!/bin/bash # echo in bold echobd () { if [ -p /dev/stdout ]; then echo "$1" else echo -ne "\033[1m" echo -n "$1" echo -e "\033[0m" fi } # verify git directory and branch if [[ ! -e .git ]] && [[ -z "`git rev-parse --git-dir 2>/dev/null`" ]]; then echo "Current directory does not contain a .git folder. Exiting..." exit 1 fi branch=`git symbolic-ref -q HEAD | sed "s|^refs/heads/||"` if [[ -z "$branch" ]]; then branch=`git branch --contains HEAD | egrep -v "no branch|detached" | head -n1 | cut -c 3-` fi if [[ -z "$branch" ]]; then echo "There is not active branch. Exiting..." exit 1 fi remote=`git config branch."$branch".remote` if [[ -z "$remote" ]]; then echo "Active branch is not remote tracked. Exiting..." exit 1 fi # get git user echobd "Preparing $(git rev-parse --show-toplevel | xargs -r basename) on $branch branch for development use" if [[ $1 == "" ]]; then gituser=`git config --local remote.$remote.url | sed -n "s|\(https\?://\)\?\([^@]*\)@.*|\2|p" | grep -v "\(anonymous\|system\)"` else gituser=$1 fi if [[ $gituser == "" ]]; then read -p "Enter your TDE GIT username []: " -e gituser fi if [[ $gituser == "" ]]; then gituser="anonymous" fi if [[ -n "$(git config --get user.signingkey)" ]]; then GIT_SIGN="-S" fi # check git abilities if [[ -n "`git status --help 2>/dev/null|grep -- '--ignore-submodules'`" ]]; then GIT_IGNORE_SUBMODULES="--ignore-submodules" fi if [[ -n "`git pull --help |grep -- '--\[no-\]recurse-submodules'`" ]]; then GIT_NO_RECURSE_SUBMODULES="--no-recurse-submodules" fi # update module and submodules updateModule() { local MODULE local REPO_URL local REPO_PROTO local REPO_MODULE local REPO_WORKTREE if [[ "$1" != "" ]]; then MODULE=$1/ else MODULE="" fi cd $PARENTDIR/$MODULE if [[ ! -z "`git status --porcelain $GIT_IGNORE_SUBMODULES`" ]]; then git reset --hard HEAD git clean -dxff fi git remote | while read REMOTE; do REPO_URL=$(git config remote."$REMOTE".url) REPO_SERVER=$(echo "$REPO_URL" | sed -n "s|^http[^/]*/*\([^@]*@\)\?\([^/]*\)/.*|\2|p") if [ -x /usr/bin/curl ] && [ "${REPO_URL}" != "${REPO_URL#http}" ]; then curl --silent --connect-timeout 10 --max-time 15 --location --netrc \ $REPO_URL/info/refs?service=git-upload-pack >/dev/null || continue elif [ -x /usr/bin/fping ] && [ -n "$REPO_SERVER" ]; then fping -q -r1 "$REPO_SERVER" || continue fi echo Fetching $REMOTE git fetch $REMOTE --prune $GIT_NO_RECURSE_SUBMODULES done git branch | grep -x "* $branch" >/dev/null || \ git checkout $branch remote=`git config branch."$branch".remote` [[ -n "$remote" ]] || return git rebase $GIT_SIGN $remote/$branch $branch if [[ ! -z "`git status --porcelain $GIT_IGNORE_SUBMODULES`" ]]; then git reset --hard HEAD git clean -dxff fi if [[ -e $PARENTDIR/$MODULE.gitmodules ]]; then if [[ $gituser == "anonymous" ]]; then sed -i 's/system@//g' $PARENTDIR/$MODULE.gitmodules else sed -i "s/system@/$gituser@/g" $PARENTDIR/$MODULE.gitmodules fi REPO_URL=$(git config --get remote.$remote.url |\ sed "s|\(https\?://\)\?\([^@]*@\)\?\(.*\)/[^/]*$|\3|") REPO_PROTO=$(git config --get remote.$remote.url |\ sed "s|\(https\?://\)\?\([^@]*@\)\?\(.*\)/[^/]*$|\1|") REPO_MASTER=scm.trinitydesktop.org/scm/git REPO_MODULE=$(git config --get remote.$remote.url |\ sed -e "s|\(https\?://\)\?\([^@]*@\)\?\(.*\)/\([^/]*\)$|\4|" -e "s|\.git$||") REPO_GITDIR=$(git rev-parse --git-dir) if [[ "${REPO_GITDIR/worktrees//}" != "$REPO_GITDIR" ]]; then REPO_WORKTREE=${REPO_GITDIR%/[^/]*/worktrees/[^/]*} fi if [[ "$REPO_URL" != "$REPO_MASTER" ]]; then sed -i "s#https\?://\([^@]*@\)\?$REPO_MASTER#$REPO_PROTO\1$REPO_URL#g" $PARENTDIR/$MODULE.gitmodules fi sed -n "s|^\[submodule \"\([^\"]*\)\"\]$|\1|p" <$PARENTDIR/$MODULE.gitmodules |\ while read submodule; do echobd "Attempting to switch submodule ${MODULE}${submodule}" cd $PARENTDIR/$MODULE if [[ -n "$REPO_WORKTREE" ]] && [[ ! -e "$submodule/.git" ]]; then REPO_LOCALTREE=$(git config --file .gitmodules --get submodule.$submodule.url | \ sed "s#^\(https\?://\)\?\([^@]*@\)\?$REPO_URL#$REPO_WORKTREE#g") if [[ ! -d "$REPO_LOCALTREE" ]]; then REPO_LOCALTREE=$REPO_LOCALTREE.git fi if [[ ! -d "$REPO_LOCALTREE" ]]; then git clone --bare --config "remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*" \ "$(git config --file .gitmodules --get submodule.$submodule.url)" "$REPO_LOCALTREE" fi if [[ "$REPO_MODULE" != "tde" ]]; then git config --file .gitmodules submodule.$submodule.url "$REPO_LOCALTREE" else ( cd $REPO_LOCALTREE && git fetch && git worktree prune && git worktree add $PARENTDIR/$MODULE$submodule origin/$branch && cd $PARENTDIR/$MODULE$submodule && git checkout $branch && git branch --set-upstream-to=origin/$branch ) || continue fi fi if [[ -z "`git config --get submodule.$submodule.url`" ]]; then git submodule init -- $submodule fi if [[ ! -e "$submodule/.git" ]]; then git submodule update -- $submodule fi updateModule ${MODULE}${submodule} done git checkout -- $PARENTDIR/$MODULE.gitmodules fi } # Update from top module cd `git rev-parse --show-toplevel` PARENTDIR=$PWD echobd "Working in $PARENTDIR" updateModule echobd "Done in $PARENTDIR"