summaryrefslogtreecommitdiffstats
path: root/debian/_buildscripts/local/update_repositories.sh
diff options
context:
space:
mode:
Diffstat (limited to 'debian/_buildscripts/local/update_repositories.sh')
-rwxr-xr-xdebian/_buildscripts/local/update_repositories.sh334
1 files changed, 287 insertions, 47 deletions
diff --git a/debian/_buildscripts/local/update_repositories.sh b/debian/_buildscripts/local/update_repositories.sh
index 7c415cc4c..934a5a1b1 100755
--- a/debian/_buildscripts/local/update_repositories.sh
+++ b/debian/_buildscripts/local/update_repositories.sh
@@ -85,7 +85,6 @@ function _do_update()
fi
;;
-
"update")
cd "$MOD_PATH" &>/dev/null
if [ $? -eq 0 ]; then
@@ -148,6 +147,172 @@ function _do_update()
}
#----------------------------
+# Update a given module from the upstream repo
+# Parameters:
+# $1 - module folder and name
+# $2 - operation type
+# $3 - module url (for "add_repo")
+# branch name (for other operations)
+# $4 - parent module path (only for check_module operation)
+# $5 - module string (only for check_module operation)
+function _do_worktree_update()
+{
+ local MOD_FULLPATH=$1
+ local MOD_NAME=`echo ${MOD_FULLPATH} | sed "s|^.*/\([^/]\+\)$|\1|"`
+ local OP_TYPE=$2
+ local MOD_REPO_PATH="${REPOS_DIR}/${MOD_NAME}.git"
+ local RESULT=""
+ local LINE_CTRL_SUFFIX=""
+ local LOCAL_BRANCHES
+ local REMOTE_BRANCHES
+
+ case "$OP_TYPE" in
+ "add_repo")
+ if [ -z "`grep \"^${MOD_REPO_PATH} - ADD REPO$\" \"${UPDATE_LOCK_FILENAME}\"`" ]; then
+ RESULT="OK"
+ if [ ! -d "${MOD_REPO_PATH}" ]; then
+ RESULT="UPDATE"
+ local MOD_URLNAME="$3"
+ [ -n "${MOD_URLNAME}" ] || MOD_URLNAME="${MOD_NAME}"
+ eval git clone --bare --config "remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*" \
+ "${ORIGIN_PATH}/${MOD_URLNAME}.git" "${MOD_REPO_PATH}" $OPT_VERBOSE_LOG || RESULT="FAIL"
+ fi
+ if [ "$RESULT" != "OK" -o "$flag_VERBOSE_LOG" = "y" ]; then
+ LINE_CTRL_SUFFIX="\n"
+ fi
+ echo -ne "\033[2K\r${COLOR_STRINGS[$RESULT]}${RESULT_STRINGS[$RESULT]} ${MOD_NAME} - repo added${CNone}$LINE_CTRL_SUFFIX"
+ echo "${RESULT_STRINGS[$RESULT]} ${MOD_NAME} - repo added" >> "$LOG_UPDATE_REPO_FILENAME"
+ #
+ echo "${MOD_REPO_PATH} - ADD REPO" >> "${UPDATE_LOCK_FILENAME}"
+ fi
+ ;;
+
+ "fetch")
+ if [[ -z `grep "^${MOD_REPO_PATH} - FETCH$" "${UPDATE_LOCK_FILENAME}"` ]]; then
+ cd "${MOD_REPO_PATH}" &>/dev/null
+ RESULT="FAIL"
+ eval git fetch --all --prune $GIT_NO_RECURSE_SUBMODULES $OPT_VERBOSE_LOG &&
+ eval git worktree prune $OPT_VERBOSE_LOG && RESULT="OK"
+ if [ "$RESULT" != "OK" -o "$flag_VERBOSE_LOG" = "y" ]; then
+ LINE_CTRL_SUFFIX="\n"
+ fi
+ echo -ne "\033[2K\r${COLOR_STRINGS[$RESULT]}${RESULT_STRINGS[$RESULT]} ${MOD_NAME} - fetched${CNone}$LINE_CTRL_SUFFIX"
+ echo "${RESULT_STRINGS[$RESULT]} ${MOD_NAME} - fetched" >> "$LOG_UPDATE_REPO_FILENAME"
+ #
+ echo "${MOD_REPO_PATH} - FETCH" >> "${UPDATE_LOCK_FILENAME}"
+ fi
+ ;;
+
+ "check_worktree")
+ # Check/add worktrees
+ LOCAL_BRANCHES=$3
+ cd "${MOD_REPO_PATH}" &>/dev/null
+ REMOTE_BRANCHES=(`git branch --remote | sed "s|origin/||g"`)
+ for LCL_BR in $LOCAL_BRANCHES; do
+ CURR_BR=`echo "$LCL_BR" | sed -e "s|^[[:space:]]*||" -e "s|[[:space:]]*$||"`
+ local WORK_PATH="${WORKTREES_DIR}/${CURR_BR}/${MOD_FULLPATH}"
+ for REM_BR in "${REMOTE_BRANCHES[@]}"; do
+ if [ "${REM_BR}" = "${CURR_BR}" -a -z "`grep \"^${MOD_FULLPATH} - ${CURR_BR} - ADD WORKTREE$\" \"${UPDATE_LOCK_FILENAME}\"`" ]; then
+ cd "${MOD_REPO_PATH}" &>/dev/null
+ if [[ -z `git worktree list | grep "\[${CURR_BR}\]"` ]]; then
+ RESULT="FAIL"
+ eval git worktree add "${WORK_PATH}" "origin/${CURR_BR}" $OPT_VERBOSE_LOG &&
+ cd "${WORK_PATH}" &>/dev/null &&
+ eval git checkout ${CURR_BR} $OPT_VERBOSE_LOG &&
+ eval git branch --set-upstream-to=origin/${CURR_BR} $OPT_VERBOSE_LOG && RESULT="UPDATE"
+ LINE_CTRL_SUFFIX=""
+ [ "$RESULT" != "OK" -o "$flag_VERBOSE_LOG" = "y" ] && LINE_CTRL_SUFFIX="\n"
+ echo -ne "\033[2K\r${COLOR_STRINGS[$RESULT]}${RESULT_STRINGS[$RESULT]} ${MOD_NAME} - branch ${CURR_BR} - worktree added${CNone}$LINE_CTRL_SUFFIX"
+ echo "${RESULT_STRINGS[$RESULT]} ${MOD_NAME} - branch ${CURR_BR} - worktree added" >> "$LOG_UPDATE_REPO_FILENAME"
+ fi
+ #
+ echo "${MOD_FULLPATH} - ${CURR_BR} - ADD WORKTREE" >> "${UPDATE_LOCK_FILENAME}"
+ break
+ fi
+ done
+ done
+ ;;
+
+ "check_module")
+ # Make sure submodules are initialized and up to date if necessary
+ if [ -z "`grep \"^${MOD_FULLPATH} - ${CURR_BR} - CHECK MODULE$\" \"${UPDATE_LOCK_FILENAME}\"`" ]; then
+ local PARENT_PATH=$4
+ local SUBMOD_STR=$5
+ if [ -n "$PARENT_PATH" -a -n "$SUBMOD_STR" ]; then
+ # Only do this on a real submodule
+ RESULT="OK"
+ cd "$PARENT_PATH" &>/dev/null
+ git config submodule.$SUBMOD_STR.url "$MOD_REPO_PATH" &>/dev/null
+ if [[ -n "`git submodule status -- ${SUBMOD_STR} | grep "^-.*"`" ]]; then
+ RESULT="UPDATE"
+ eval git submodule init -- ${SUBMOD_STR} $OPT_VERBOSE_LOG || RESULT="FAIL"
+ fi
+ if [ "$RESULT" != "FAIL" -a ! -e "${SUBMOD_STR}/.git" ]; then
+ RESULT="UPDATE"
+ eval git submodule update -- ${SUBMOD_STR} $OPT_VERBOSE_LOG || RESULT="FAIL"
+ fi
+ LINE_CTRL_SUFFIX=""
+ [ "$RESULT" != "OK" -o "$flag_VERBOSE_LOG" = "y" ] && LINE_CTRL_SUFFIX="\n"
+ echo -ne "\033[2K\r${COLOR_STRINGS[$RESULT]}${RESULT_STRINGS[$RESULT]} ${MOD_NAME} - module checked${CNone}$LINE_CTRL_SUFFIX"
+ echo "${RESULT_STRINGS[$RESULT]} ${MOD_NAME} - module checked" >> "$LOG_UPDATE_REPO_FILENAME"
+ fi
+ #
+ echo "${MOD_FULLPATH} - ${CURR_BR} - CHECK MODULE" >> "${UPDATE_LOCK_FILENAME}"
+ fi
+ ;;
+
+ "update")
+ LOCAL_BRANCHES=$3
+ REMOTE_BRANCHES=(`git branch --remote | sed "s|origin/||g"`)
+ for LCL_BR in $LOCAL_BRANCHES; do
+ CURR_BR=`echo "$LCL_BR" | sed -e "s|^[[:space:]]*||" -e "s|[[:space:]]*$||"`
+ for REM_BR in "${REMOTE_BRANCHES[@]}"; do
+ if [ "${REM_BR}" = "${CURR_BR}" -a -z "`grep \"^${MOD_FULLPATH} - ${CURR_BR} - WORKTREE UPDATED$\" \"${UPDATE_LOCK_FILENAME}\"`" ]; then
+ local WORK_PATH="${WORKTREES_DIR}/${CURR_BR}/${MOD_FULLPATH}"
+ RESULT="FAIL"
+ if [ -d ${WORK_PATH} ]; then
+ cd "${WORK_PATH}" &>/dev/null &&
+ # 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 is a tracking branch
+ if [[ -z `git config branch."${CURR_BR}".remote` ]]; then
+ git branch -u "origin/${CURR_BR}" &>/dev/null #$
+ git reset --hard "origin/${CURR_BR}" &>/dev/null
+ fi
+ # Update
+ eval git reset --hard HEAD $OPT_VERBOSE_LOG
+ eval git clean -dxff $OPT_VERBOSE_LOG
+ eval git checkout "${CURR_BR}" $OPT_VERBOSE_LOG
+ if [[ $(git rev-parse HEAD) != $(git rev-parse "origin/${CURR_BR}") ]]; then
+ eval git rebase $OPT_VERBOSE_LOG
+ if [[ `git rev-parse HEAD` == `git rev-parse "origin/${CURR_BR}"` ]]; then
+ RESULT="UPDATE"
+ fi
+ else
+ RESULT="OK"
+ fi
+ fi
+ LINE_CTRL_SUFFIX=""
+ [ "$RESULT" != "OK" -o "$flag_VERBOSE_LOG" = "y" ] && LINE_CTRL_SUFFIX="\n"
+ echo -ne "\033[2K\r${COLOR_STRINGS[$RESULT]}${RESULT_STRINGS[$RESULT]} ${MOD_NAME} - branch ${CURR_BR} - worktree updated${CNone}$LINE_CTRL_SUFFIX"
+ echo "${RESULT_STRINGS[$RESULT]} ${MOD_NAME} - branch ${CURR_BR} - worktree updated" >> "$LOG_UPDATE_REPO_FILENAME"
+ echo "${MOD_FULLPATH} - ${CURR_BR} - WORKTREE UPDATED" >> "${UPDATE_LOCK_FILENAME}"
+ break
+ fi
+ done
+ done
+ ;;
+
+ *)
+ RESULT="INV-OP"
+ ;;
+ esac
+}
+
+#----------------------------
# Update a given module and all submodules from the upstream repo
# Parameters:
# $1 - module folder
@@ -165,20 +330,65 @@ function _update_module()
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
+ while read -r SUBMOD_STRING; 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
+ if [[ -z "`git config --get submodule.$SUBMOD_STRING.url`" ]]; then
+ eval git submodule init -- \"$SUBMOD_STRING\" $OPT_VERBOSE_LOG
fi
- if [[ ! -e "$MOD_PATH/$SUBMOD_PATH/.git" ]]; then
- eval git submodule update -- \"$SUBMOD_PATH\" $OPT_VERBOSE_LOG
+ if [[ ! -e "$MOD_PATH/$SUBMOD_STRING/.git" ]]; then
+ eval git submodule update -- \"$SUBMOD_STRING\" $OPT_VERBOSE_LOG
fi
- _update_module "$MOD_PATH/$SUBMOD_PATH" "$OP_TYPE" "$BRANCH"
+ _update_module "$MOD_PATH/$SUBMOD_STRING" "$OP_TYPE" "$BRANCH"
done
fi
}
#----------------------------
+# Update a given module and all submodules from the upstream repo
+# Parameters:
+# $1 - module folder and name (excluding base repo part)
+# $2 - list of branches to update
+# $3 - parent module path
+# $4 - module substring relative to parent
+function _update_worktree_module()
+{
+ local MOD_FULLPATH=$1
+ local MOD_NAME=`echo ${MOD_FULLPATH} | sed "s|^.*/\([^/]\+\)$|\1|"`
+ if [ -n "${MOD_FULLPATH}" -a -n "${MOD_NAME}" ]; then
+ local BRANCH_LIST=$2
+ [ -n "${BRANCH_LIST}" ] || BRANCH_LIST="${UPDATE_BRANCHES}"
+
+ # Current module
+ _do_worktree_update "${MOD_FULLPATH}" "fetch"
+ _do_worktree_update "${MOD_FULLPATH}" "check_worktree" "${BRANCH_LIST[@]}"
+ _do_worktree_update "${MOD_FULLPATH}" "check_module" "dummy arg" "$3" "$4"
+ _do_worktree_update "${MOD_FULLPATH}" "update" "${BRANCH_LIST[@]}"
+
+ # Submodules
+ for LCL_BR in ${BRANCH_LIST}; do
+ local WORK_PATH="${WORKTREES_DIR}/${LCL_BR}/${MOD_FULLPATH}"
+ if [ -d ${WORK_PATH} ]; then
+ local SUBMOD_LIST="${WORK_PATH}/.gitmodules"
+ if [ -e "${SUBMOD_LIST}" ]; then
+ sed -n "s|^\[submodule \"\([^\"]*\)\"\]$|\1|p" <${SUBMOD_LIST} |\
+ while read -r SUBMOD_STRING; do
+ cd "${WORK_PATH}" &>/dev/null
+ SUBMOD_NAME=`echo ${SUBMOD_STRING} | sed "s|.*/\([^/]\+\)$|\1|"`
+ SUBMOD_URLNAME=`git config --file .gitmodules --get submodule.${SUBMOD_STRING}.url | \
+ sed "s|.*/\([^/]\+\)$|\1|"`
+ _do_worktree_update "${MOD_FULLPATH}/${SUBMOD_STRING}" "add_repo" "${SUBMOD_URLNAME}"
+ _update_worktree_module "${MOD_FULLPATH}/${SUBMOD_STRING}" "${LCL_BR}" "${WORK_PATH}" "${SUBMOD_STRING}"
+ done
+ fi
+ fi
+ done
+ else
+ echo -ne "\033[2K\r${COLOR_STRINGS["FAIL"]}${RESULT_STRINGS["FAIL"]} Invalid module $1 passed to _update_worktree_module()${CNone}\n"
+ echo "${RESULT_STRINGS["FAIL"]} Invalid module $1 passed to _update_worktree_module()" >> "$LOG_UPDATE_REPO_FILENAME"
+ fi
+}
+
+#----------------------------
if [ "$flag_INCREMENTAL" = "y" ]; then
[ ! -f "$UPDATE_LOCK_FILENAME" ] && flag_INCREMENTAL="n"
else
@@ -206,61 +416,91 @@ if [ "$flag_INCREMENTAL" != "y" ]; then
echo "TDE repositories update started" > "$UPDATE_LOCK_FILENAME"
fi
-_LAST_BRANCH=""
-if [[ "$flag_SWITCH_ONLY" != "y" ]]; then
- # Update extra dependency repository
- if [[ "$USE_PREBUILD_EXTRA_DEPS" != "y" ]]; then
- echo_and_tee "${CLightCyan}---------------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME" "y"
- echo_and_tee "${CLightCyan} Fetching extra dependencies ${CNone}" "$LOG_UPDATE_REPO_FILENAME"
- echo_and_tee "${CLightCyan}---------------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME"
+if [ "${USE_GIT_WORKTREES}" != "y" ]; then
+ # Not using git worktree
+ _LAST_BRANCH=""
+ if [[ "$flag_SWITCH_ONLY" != "y" ]]; then
+ # Update extra dependency repository
+ if [[ "$USE_PREBUILD_EXTRA_DEPS" != "y" ]]; then
+ echo_and_tee "${CLightCyan}---------------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME" "y"
+ echo_and_tee "${CLightCyan} Fetching extra dependencies ${CNone}" "$LOG_UPDATE_REPO_FILENAME"
+ echo_and_tee "${CLightCyan}---------------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME"
+
+ # Fetch TDE extra dependency repository
+ _update_module "$REPO_EXTRA_DEPENDENCIES" "fetch"
+ _update_module "$REPO_EXTRA_DEPENDENCIES" "update" "master"
+
+ echo -e "\033[2K"
+ echo "" >> "$LOG_UPDATE_REPO_FILENAME"
+ fi
+
+ # Fetch all remotes first
+ echo_and_tee "${CLightCyan}-------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME" "y"
+ echo_and_tee "${CLightCyan} Fetching repos ${CNone}" "$LOG_UPDATE_REPO_FILENAME"
+ echo_and_tee "${CLightCyan}-------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME"
- # Fetch TDE extra dependency repository
- _update_module "$REPO_EXTRA_DEPENDENCIES" "fetch"
- _update_module "$REPO_EXTRA_DEPENDENCIES" "update" "master"
+ # Fetch TDE main repository
+ _update_module "$REPO_TDE" "fetch"
echo -e "\033[2K"
echo "" >> "$LOG_UPDATE_REPO_FILENAME"
- fi
- # Fetch all remotes first
- echo_and_tee "${CLightCyan}---------------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME" "y"
- echo_and_tee "${CLightCyan} Fetching remotes ${CNone}" "$LOG_UPDATE_REPO_FILENAME"
- echo_and_tee "${CLightCyan}---------------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME"
+ # Branch update
+ for branch in "${BRANCHES[@]}"; do
+ _LAST_BRANCH="$branch"
+ echo_and_tee "${CLightCyan}-------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME"
+ 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"
+
+ echo -e "\033[2K"
+ echo "" >> "$LOG_UPDATE_REPO_FILENAME"
+ done
+ fi
- # Fetch TDE main repository
- _update_module "$REPO_TDE" "fetch"
+ # Switch to specified branch if necessary
+ if [[ "$DEFAULT_REPO_BRANCH" != "$_LAST_BRANCH" ]]; then
+ echo_and_tee "${CLightCyan}-------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME" "$flag_SWITCH_ONLY"
+ 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"
- echo -e "\033[2K"
- echo "" >> "$LOG_UPDATE_REPO_FILENAME"
+ # Switch TDE main repository
+ _update_module "$REPO_TDE" "switch-to" "$DEFAULT_REPO_BRANCH"
+ fi
+else
+ # Using git worktree
- # Branch update
- for branch in "${BRANCHES[@]}"; do
- _LAST_BRANCH="$branch"
- echo_and_tee "${CLightCyan}---------------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME"
- echo_and_tee "${CLightCyan} Updating branch ${CYellow}$branch ${CNone}" "$LOG_UPDATE_REPO_FILENAME"
- echo_and_tee "${CLightCyan}---------------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME"
+ # Get TDE origin url
+ cd "${REPOS_DIR}/tde.git" &>/dev/null
+ ORIGIN_PATH=`git config --get remote.origin.url | sed "s|\(.*\)/tde.git$|\1|"`
- # Update TDE main repository
- _update_module "$REPO_TDE" "update" "$branch"
+ if [ ! -z "{ORIGIN_PATH}" ]; then
+ # Update extra dependency repository
+ if [[ "$USE_PREBUILD_EXTRA_DEPS" != "y" ]]; then
+ echo_and_tee "${CLightCyan}-------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME" "y"
+ echo_and_tee "${CLightCyan} Updating extra dependencies ${CNone}" "$LOG_UPDATE_REPO_FILENAME"
+ echo_and_tee "${CLightCyan}-------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME" "y"
- echo -e "\033[2K"
- echo "" >> "$LOG_UPDATE_REPO_FILENAME"
- done
-fi
+ _update_worktree_module "edeps"
-# Switch to specified branch if necessary
-if [[ "$DEFAULT_REPO_BRANCH" != "$_LAST_BRANCH" ]]; then
- echo_and_tee "${CLightCyan}---------------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME" "$flag_SWITCH_ONLY"
- 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"
+ echo -e "\033[2K"
+ echo "" >> "$LOG_UPDATE_REPO_FILENAME"
+ fi
- # Switch TDE main repository
- _update_module "$REPO_TDE" "switch-to" "$DEFAULT_REPO_BRANCH"
+ echo_and_tee "${CLightCyan}-------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME" "y"
+ echo_and_tee "${CLightCyan} Updating TDE repos ${CNone}" "$LOG_UPDATE_REPO_FILENAME"
+ echo_and_tee "${CLightCyan}-------------------------------${CNone}" "$LOG_UPDATE_REPO_FILENAME"
- echo -e "\033[2K"
- echo "" >> "$LOG_UPDATE_REPO_FILENAME"
+ # Main repo
+ _update_worktree_module "tde"
+ fi
fi
+echo -e "\033[2K"
+echo "" >> "$LOG_UPDATE_REPO_FILENAME"
+
# Update completed
[ -f "$UPDATE_LOCK_FILENAME" ] && rm "$UPDATE_LOCK_FILENAME"
cd $SCRIPT_DIR