#!/bin/bash # Check command line arguments and set options # Run before loading configuration, to allow branch overriding bool_INCREMENTAL="n" bool_VERBOSE_LOG="n" bool_SWITCH_ONLY="n" OVERRIDE_DEFAULT_REPO_BRANCH="" for ((idx=1; idx<=$#; idx++)); do arg="${!idx}" if [ "$arg" = "-i" ]; then # continue from last updated module (Incremental) bool_INCREMENTAL="y" elif [ "$arg" = "-v" ]; then # display and log git command output (Verbose) bool_VERBOSE_LOG="y" elif [ "$arg" = "-ub" ]; then # branches to update (Update Branches) ((idx++)) OVERRIDE_UPDATE_BRANCHES="${!idx}" [[ -z "$OVERRIDE_DEFAULT_REPO_BRANCH" ]] && OVERRIDE_DEFAULT_REPO_BRANCH="${!idx}" elif [ "$arg" = "-db" ]; then # default branch after update (Default Branch) ((idx++)) if [[ "$bool_SWITCH_ONLY" != 'y' ]]; then # '-db' is only used if no '-so' argument is specified. If '-so ' # is given, '-db is ignored OVERRIDE_DEFAULT_REPO_BRANCH="${!idx}" fi elif [ "$arg" = "-so" ]; then # switch branch only (Switch Only) bool_SWITCH_ONLY="y" && ((idx++)) OVERRIDE_DEFAULT_REPO_BRANCH="${!idx}" fi done # Load common code . ./internals/_build_common.sh init_common UPDATE_LOCK_FILENAME="/var/lock/TDE_update_repo_lock" # Lock file for incremental update #---------------------------- # Update a given module from the upstream repo # Parameters: # $1 - module folder # $2 - operation type # $3 - branch to update # $4 - new branch flag (only for reporting) function _do_update() { local MOD_PATH=$1 local OP_TYPE=$2 local BRANCH=$3 local NEW_BRANCH=$4 local RESULT="" case "$OP_TYPE" in "update") if [[ -z `grep "^$BRANCH - $MOD_PATH$" "$UPDATE_LOCK_FILENAME"` ]]; then cd "$MOD_PATH" &>/dev/null if [ $? -eq 0 ]; then # Clean up any possible uncommitted changes if [[ ! -z "`git status --porcelain $GIT_IGNORE_SUBMODULES`" ]]; then git reset --hard HEAD &>/dev/null git clean -dxff &>/dev/null fi # Make sure the local branch exists if [[ -z `git branch | grep -E "\b$BRANCH\b"` ]]; then NEW_BRANCH="y" eval git checkout -b \"$BRANCH\" \"origin/$BRANCH\" $OPT_VERBOSE_LOG else eval git checkout \"$BRANCH\" $OPT_VERBOSE_LOG fi # Make sure the local branch is a tracking branch if [[ -z `git config branch."$BRANCH".remote` ]]; then NEW_BRANCH="y" git branch -u "origin/$BRANCH" &>/dev/null #$ git reset --hard "origin/$BRANCH" &>/dev/null fi # Update eval git reset --hard HEAD $OPT_VERBOSE_LOG eval git clean -dxff $OPT_VERBOSE_LOG eval git fetch $OPT_VERBOSE_LOG if [[ $(git rev-parse HEAD) != $(git rev-parse "origin/$BRANCH") ]]; then eval git pull --rebase $GIT_NO_RECURSE_SUBMODULES $OPT_VERBOSE_LOG if [[ `git rev-parse HEAD` == `git rev-parse "origin/$BRANCH"` ]]; then RESULT="${CLightGreen}[ UPDATE ]" else RESULT="${CLightRed}[ FAIL ]" fi else if [[ "$NEW_BRANCH" = "y" ]]; then RESULT="${CLightGreen}[ UPDATE ]" else RESULT="[ OK ]" fi fi else RESULT="${CLightRed}[ FAIL ]" fi echo "$BRANCH - $MOD_PATH" >> "$UPDATE_LOCK_FILENAME" else RESULT="${CBrown}[ SKIP ]" fi ;; "switch-to") cd "$MOD_PATH" &>/dev/null eval git checkout \"$BRANCH\" $OPT_VERBOSE_LOG eval git reset --hard HEAD $OPT_VERBOSE_LOG eval git clean -dxff $OPT_VERBOSE_LOG if [[ ! -z `git branch -v | grep -E "^\*\s+$BRANCH"` ]]; then RESULT="[ OK ]" else RESULT="${CLightRed}[ FAIL ]" fi ;; *) RESULT="[ INV-OP ]" ;; esac echo_and_tee "$RESULT $MOD_PATH${CNone}" "$LOG_UPDATE_REPO_FILENAME" } #---------------------------- # Update a given module and all submodules from the upstream repo # Parameters: # $1 - module folder # $2 - operation type # $3 - branch to update # $4 - new branch flag (only for reporting) function _update_module() { local MOD_PATH=$1 local OP_TYPE=$2 local BRANCH=$3 # Current module _do_update "$@" # Submodules local NEW_BRANCH="n" local SUBMOD_LIST="$MOD_PATH/.gitmodules" if [[ -e "$SUBMOD_LIST" ]]; then sed -n "s|^\[submodule \"\([^\"]*\)\"\]$|\1|p" <$SUBMOD_LIST |\ while read -r SUBMOD_PATH; do NEW_BRANCH="n" cd "$MOD_PATH" &>/dev/null if [[ -z "`git config --get submodule.$SUBMOD_PATH.url`" ]]; then NEW_BRANCH="y" # if a submodule is missing, need to report "update" status eval git submodule init -- \"$SUBMOD_PATH\" $OPT_VERBOSE_LOG fi if [[ ! -e "$MOD_PATH/$SUBMOD_PATH/.git" ]]; then NEW_BRANCH="y" # if a submodule is incomplete, need to report "update" status eval git submodule update -- \"$SUBMOD_PATH\" $OPT_VERBOSE_LOG fi _update_module "$MOD_PATH/$SUBMOD_PATH" "$OP_TYPE" "$BRANCH" "$NEW_BRANCH" done fi } #---------------------------- if [ "$bool_INCREMENTAL" = "y" ]; then [ ! -f "$UPDATE_LOCK_FILENAME" ] && bool_INCREMENTAL="n" else [ -f "$UPDATE_LOCK_FILENAME" ] && rm "$UPDATE_LOCK_FILENAME" fi OPT_VERBOSE_LOG="&>/dev/null" if [[ "$bool_VERBOSE_LOG" = "y" ]]; then OPT_VERBOSE_LOG=" |& tee -a \"$LOG_UPDATE_REPO_FILENAME\"" fi #---------------------------- # Check git abilities GIT_IGNORE_SUBMODULES="" if [[ -n "`git status --help 2>/dev/null|grep -- '--ignore-submodules'`" ]]; then GIT_IGNORE_SUBMODULES="--ignore-submodules" fi GIT_NO_RECURSE_SUBMODULES="" if [[ -n "`git pull --help |grep -- '--\[no-\]recurse-submodules'`" ]]; then GIT_NO_RECURSE_SUBMODULES="--no-recurse-submodules" fi # Start update if [ "$bool_INCREMENTAL" != "y" ]; then echo "TDE repositories update started" > "$UPDATE_LOCK_FILENAME" fi _LAST_BRANCH="" if [[ "$bool_SWITCH_ONLY" != 'y' ]]; then # Branch update for branch in "${BRANCHES[@]}"; do _LAST_BRANCH="$branch" echo_and_tee "${CLightCyan}---------------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME" "y" echo_and_tee "${CLightCyan} Updating branch ${CYellow}$branch ${CNone}" "$LOG_UPDATE_REPO_FILENAME" echo_and_tee "${CLightCyan}---------------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME" # Update TDE main repository _update_module "$REPO_TDE" "update" "$branch" "n" # Update TDE packaging repository _update_module "$TDE_DIR/$CFG_GIT_DIR/tde-packaging" "update" "$branch" "n" echo_and_tee "" "$LOG_UPDATE_REPO_FILENAME" done fi # Switch to specified branch if necessary if [[ "$DEFAULT_REPO_BRANCH" != "$_LAST_BRANCH" ]]; then echo_and_tee "${CLightCyan}---------------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME" "y" echo_and_tee "${CLightCyan} Switching to branch ${CYellow}$DEFAULT_REPO_BRANCH ${CNone}" "$LOG_UPDATE_REPO_FILENAME" echo_and_tee "${CLightCyan}---------------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME" # Switch TDE main repository _update_module "$REPO_TDE" "switch-to" "$DEFAULT_REPO_BRANCH" "n" # Switch TDE packaging repository _update_module "$TDE_DIR/$CFG_GIT_DIR/tde-packaging" "switch-to" "$DEFAULT_REPO_BRANCH" "n" echo_and_tee "" "$LOG_UPDATE_REPO_FILENAME" fi # Update completed [ -f "$UPDATE_LOCK_FILENAME" ] && rm "$UPDATE_LOCK_FILENAME" cd $SCRIPT_DIR