#!/bin/bash # doc cmd_update{ # # DESCRIPTION # cmd_update - Updates database of TARGET from git HEAD to last commit hash. # # USAGE # cmd_update [] # # DEPENDENCIES src/db_update # # } cmd_update() { local GIT_DIR="${1}" local TARGET="${2}" local OLD_COMMIT="${3}" local DB_FILE="${TARGET}/${_OPT_DB_FILE}" [[ ! -f "${DB_FILE}" ]] && return 3 [[ ! -d "${GIT_DIR}/.git" ]] && return 2 [[ "$(git -C "${GIT_DIR}" rev-list HEAD | tail -n 1)" != "$(awk 'BEGIN{FS="\t"}{if($1=="REPO_ID"){print $2}}' "${DB_FILE}")" ]] && return 2 # In the event that LAST_COMMIT OR DB_FILE does not exist, echo out that the LAST_COMMIT # is the first COMMIT of GIT_DIR, thus stating that no database update has ever occured if [[ -z "$(grep LAST_UPDATE ${DB_FILE})" ]]; then echo -e "LAST_UPDATE\t$(git -C "${GIT_DIR}" rev-list HEAD | tail -n 1)" >> ${DB_FILE} fi # Defines what imageids needs updating by determining what files has changed since last # update via git diff --name-only. local NEW_COMMIT=$(git -C "${GIT_DIR}" rev-parse HEAD) [[ -z "${OLD_COMMIT}" ]] && local OLD_COMMIT=$(awk 'BEGIN{FS="\t"}{if($1=="LAST_UPDATE"){print $2}}' ${DB_FILE}) local imageidList=($(sed 's/\(.*\)\..*/\1/' <<< $(git -C "${GIT_DIR}" diff --name-only ${NEW_COMMIT} ${OLD_COMMIT}) | awk '!seen[$0]++' | grep SHA256)) local COUNT=1 for imageid in ${imageidList[@]}; do echo "[ ${COUNT} / ${#imageidList[@]} ] Processing ${imageid}" db_update "${GIT_DIR}" "${TARGET}" "${DB_FILE}" ${imageid} >${STDERR} 2>&1 local EXIT=$? [[ ${EXIT} -eq 0 ]] && { _ansi up 2; echo -en '\033[K'; echo "[ ${COUNT} / ${#imageidList[@]} ] Added ${imageid}"; } [[ ${EXIT} -eq 1 ]] && { _ansi up 2; echo -en '\033[K'; echo "[ ${COUNT} / ${#imageidList[@]} ] Removed ${imageid}"; } local COUNT=$(( ${COUNT} + 1 )) done [[ ${ERR} ]] && return 1 || { gawk -i inplace -v newcommit=${NEW_COMMIT} 'BEGIN{FS="\t";OFS="\t"}{if($1=="LAST_UPDATE"){$2=newcommit}{print $0}}' ${DB_FILE}; return 0; } }