You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
5.7 KiB
189 lines
5.7 KiB
6 years ago
|
#!/bin/bash
|
||
|
|
||
|
# 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
|
||
|
function _do_update()
|
||
|
{
|
||
|
local MOD_PATH=$1
|
||
|
local OP_TYPE=$2
|
||
|
local BRANCH=$3
|
||
|
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 and is a tracking branch
|
||
|
if [[ -z `git branch | grep -E "\b$BRANCH\b"` ]]; then
|
||
|
eval git checkout -b \"$BRANCH\" \"origin/$BRANCH\" $OPT_VERBOSE_LOG
|
||
|
else
|
||
|
eval git checkout \"$BRANCH\" $OPT_VERBOSE_LOG
|
||
|
fi
|
||
|
if [[ ! -z `git branch -v | grep -E "^\*\s+$BRANCH"` ]]; then
|
||
|
if [[ -z `git branch -vv | grep "origin/$BRANCH"` ]]; then
|
||
|
git branch -u "origin/$BRANCH" &>/dev/null #$
|
||
|
git reset --hard "origin/$BRANCH" &>/dev/null
|
||
|
fi
|
||
|
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
|
||
|
RESULT="[ OK ]"
|
||
|
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
|
||
|
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
|
||
|
function _update_module()
|
||
|
{
|
||
|
local MOD_PATH=$1
|
||
|
local OP_TYPE=$2
|
||
|
local BRANCH=$3
|
||
|
# Current module
|
||
|
_do_update "$@"
|
||
|
# Submodules
|
||
|
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
|
||
|
cd "$MOD_PATH" &>/dev/null
|
||
|
if [[ -z "`git config --get submodule.$SUBMOD_PATH.url`" ]]; then
|
||
|
eval git submodule init -- \"$SUBMOD_PATH\" $OPT_VERBOSE_LOG
|
||
|
fi
|
||
|
if [[ ! -e "$MOD_PATH/$SUBMOD_PATH/.git" ]]; then
|
||
|
eval git submodule update -- \"$SUBMOD_PATH\" $OPT_VERBOSE_LOG
|
||
|
fi
|
||
|
_update_module "$MOD_PATH/$SUBMOD_PATH" "$OP_TYPE" "$BRANCH"
|
||
|
done
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
#----------------------------
|
||
|
# Check command line arguments and set options
|
||
|
bool_INCREMENTAL="n"
|
||
|
bool_VERBOSE_LOG="n"
|
||
|
for arg in $@; do
|
||
|
if [ "$arg" = "-i" ]; then # continue from last updated module (Incremental)
|
||
|
bool_INCREMENTAL="y"
|
||
|
elif [ "$arg" = "-v" ]; then # display and log git command output
|
||
|
bool_VERBOSE_LOG="y"
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
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
|
||
|
|
||
|
# Branch update
|
||
|
_LAST_BRANCH=""
|
||
|
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"
|
||
|
|
||
|
# Update TDE packaging repository
|
||
|
_update_module "$TDE_DIR/$CFG_GIT_DIR/tde-packaging" "update" "$branch"
|
||
|
|
||
|
echo_and_tee "" "$LOG_UPDATE_REPO_FILENAME"
|
||
|
done
|
||
|
|
||
|
# 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"
|
||
|
|
||
|
# Switch TDE packaging repository
|
||
|
_update_module "$TDE_DIR/$CFG_GIT_DIR/tde-packaging" "switch-to" "$DEFAULT_REPO_BRANCH"
|
||
|
|
||
|
echo_and_tee "" "$LOG_UPDATE_REPO_FILENAME"
|
||
|
fi
|
||
|
|
||
|
# Update completed
|
||
|
[ -f "$UPDATE_LOCK_FILENAME" ] && rm "$UPDATE_LOCK_FILENAME"
|
||
|
cd $SCRIPT_DIR
|