diff options
Diffstat (limited to 'debian/_buildscripts/local/update_repositories.sh')
-rwxr-xr-x | debian/_buildscripts/local/update_repositories.sh | 334 |
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 |