From a25202530ebabc3b28d028fc76c993ff5dde7ebe Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Thu, 3 Jul 2025 20:11:57 +0200 Subject: [PATCH] maint(common): consolidate `write_download_info` functions Fixes: #14259 Build-bot: skip Test-bot: skip --- android/build.sh | 9 +- ios/tools/prepRelease.sh | 10 +- resources/shellHelperFunctions.sh | 113 ++++++++---------- .../teamcity/includes/tc-download-info.inc.sh | 54 --------- 4 files changed, 57 insertions(+), 129 deletions(-) delete mode 100644 resources/teamcity/includes/tc-download-info.inc.sh diff --git a/android/build.sh b/android/build.sh index caeddb5b51..41a4df0de9 100755 --- a/android/build.sh +++ b/android/build.sh @@ -109,12 +109,11 @@ if builder_start_action archive; then # Write download info files # - cd "${UPLOAD_PATH}" - write_download_info "Keyman Engine for Android" "${KEYMAN_ENGINE_ANDROID_ZIP}" "${KEYMAN_VERSION}" "${KEYMAN_TIER}" "android" - write_download_info "Keyman for Android" "${KEYMAN_APK}" "${KEYMAN_VERSION}" "${KEYMAN_TIER}" "android" + write_download_info "${UPLOAD_PATH}" "${KEYMAN_ENGINE_ANDROID_ZIP}" "Keyman Engine for Android" zip android + write_download_info "${UPLOAD_PATH}" "${KEYMAN_APK}" "Keyman for Android" apk android - if [ "${RELEASE_OEM_FIRSTVOICES-false}" = true ]; then - write_download_info "FirstVoices Keyboards" "${FIRSTVOICES_APK}" "${KEYMAN_VERSION}" "${KEYMAN_TIER}" "android" + if [[ "${RELEASE_OEM_FIRSTVOICES-false}" = true ]]; then + write_download_info "${UPLOAD_PATH}" "${FIRSTVOICES_APK}" "FirstVoices Keyboards" apk android fi builder_finish_action success archive diff --git a/ios/tools/prepRelease.sh b/ios/tools/prepRelease.sh index cd82520662..c9e47edd20 100755 --- a/ios/tools/prepRelease.sh +++ b/ios/tools/prepRelease.sh @@ -129,11 +129,9 @@ fi # Write download info files # -cd "${UPLOAD_DIR}" +write_download_info "${UPLOAD_DIR}" "${KMEI_DST_NAME}" "Keyman Engine for iOS" zip ios +write_download_info "${UPLOAD_DIR}" "${KEYMANAPP_IPA_DST}" "Keyman for iPhone and iPad" ipa ios -write_download_info "Keyman Engine for iOS" "${KMEI_DST_NAME}" "${BUILD_NUMBER}" "${KEYMAN_TIER}" "ios" -write_download_info "Keyman for iPhone and iPad" "${KEYMANAPP_IPA_DST}" "${BUILD_NUMBER}" "${KEYMAN_TIER}" "ios" - -if [ ${RELEASE_OEM_FIRSTVOICES} = true ]; then - write_download_info "FirstVoices Keyboards" "${FIRSTVOICESAPP_IPA_DST}" "${BUILD_NUMBER}" "${KEYMAN_TIER}" "ios" +if [[ ${RELEASE_OEM_FIRSTVOICES} = true ]]; then + write_download_info "${UPLOAD_DIR}" "${FIRSTVOICESAPP_IPA_DST}" "FirstVoices Keyboards" ipa ios fi diff --git a/resources/shellHelperFunctions.sh b/resources/shellHelperFunctions.sh index c7163f1c92..6b30918cb7 100755 --- a/resources/shellHelperFunctions.sh +++ b/resources/shellHelperFunctions.sh @@ -16,7 +16,7 @@ verify_on_mac() { projects=("android" "ios" "linux" "lmlayer" "mac" "web" "windows") # Used to validate a specified 'project' parameter. -verify_project() { +_verify_project() { match=false for proj in "${projects[@]}" do @@ -88,79 +88,64 @@ dl_info_display_usage() { exit 1 } +# +# Write ${UPLOAD_DIR}/${ARTIFACT_FILENAME}.download_info file for the target +# artifact +# +# Parameters: +# 1: UPLOAD_DIR Directory where artifact can be found +# 2: ARTIFACT_FILENAME Filename (without path) of artifact +# 3: ARTIFACT_NAME Descriptive name of artifact +# 4: ARTIFACT_TYPE File extension of artifact, without initial period (e.g. tar.gz) +# 5: PLATFORM Target platform for artifact +# write_download_info() { - #Process file & path information. - PRODUCT_NAME="$1" - BASE_PATH="$2" - KM_VERSION="$3" - KM_TIER="$4" - KM_PLATFORM="$5" + local UPLOAD_DIR="$1" + local ARTIFACT_FILENAME="$2" + local ARTFIACT_NAME="$3" + local ARTIFACT_TYPE="$4" + local PLATFORM="$5" - verify_project "$KM_PLATFORM" + local DATE HASH SIZE DOWNLOAD_INFO STAT_FLAGS - BASE_DIR=$(dirname "${BASE_PATH}") - BASE_FILE=$(basename "${BASE_PATH}"); + _verify_project "${PLATFORM}" - if ([ -h "${BASE_DIR}" ]) then - while([ -h "${BASE_DIR}" ]) do BASE_PATH=`readlink "${BASE_DIR}"`; - done - fi - - assertFileExists "$2" - - pushd . > /dev/null - cd `dirname ${BASE_DIR}` > /dev/null - BASE_PATH=`pwd`; - popd > /dev/null - - DEST_DIR="$BASE_DIR" - - #Process version parameter. - assertValidVersionNbr "$3" - KM_BLD_COUNTER="$((${KM_VERSION##*.}))" - - if [ "$KM_VERSION" = "" ]; then - builder_die "Required -version parameter not specified!" - fi - - if [ "$KM_TIER" = "" ]; then - builder_die "Required -tier parameter not specified!" - fi - - DOWNLOAD_INFO_FILEPATH="${BASE_PATH}/${BASE_FILE}.download_info" - if [[ ! -f "${BASE_PATH}/${BASE_FILE}" ]]; then - builder_die "Cannot compute file size or MD5 for non-existent DMG file: ${BASE_PATH}/${BASE_FILE}" - fi - - FILE_EXTENSION="${BASE_FILE##*.}" - - # stat flags to get filesize in bytes - if [ "$BUILDER_OS" == "mac" ] && [[ $(which stat) == /usr/bin/stat ]]; then + # shellcheck disable=SC2312 + if [[ "${BUILDER_OS}" == "mac" ]] && [[ $(command -v stat) == /usr/bin/stat ]]; then # /usr/bin/stat on mac is BSD STAT_FLAGS="-f%z" else # GNU (coreutils) - STAT_FLAGS="-c%s" - fi - FILE_SIZE=$(stat ${STAT_FLAGS} "${BASE_PATH}/${BASE_FILE}") - MD5_HASH=$(md5sum "${BASE_PATH}/${BASE_FILE}" | cut -d" " -f 1 -) # hash is the first element returned - - if [[ -f "$DOWNLOAD_INFO_FILEPATH" ]]; then - builder_warn "Overwriting $DOWNLOAD_INFO_FILEPATH" + STAT_FLAGS="--print=%s" fi - echo { > "$DOWNLOAD_INFO_FILEPATH" - echo " \"name\": \"${PRODUCT_NAME}\"," >> "$DOWNLOAD_INFO_FILEPATH" - echo " \"version\": \"${KM_VERSION}\"," >> "$DOWNLOAD_INFO_FILEPATH" - echo " \"date\": \"$(date "+%Y-%m-%d")\"," >> "$DOWNLOAD_INFO_FILEPATH" - echo " \"platform\": \"${KM_PLATFORM}\"," >> "$DOWNLOAD_INFO_FILEPATH" - echo " \"stability\": \"${KM_TIER}\"," >> "$DOWNLOAD_INFO_FILEPATH" - echo " \"file\": \"${BASE_FILE}\"," >> "$DOWNLOAD_INFO_FILEPATH" - echo " \"md5\": \"${MD5_HASH}\"," >> "$DOWNLOAD_INFO_FILEPATH" - echo " \"type\": \"${FILE_EXTENSION}\"," >> "$DOWNLOAD_INFO_FILEPATH" - echo " \"build\": \"${KM_BLD_COUNTER}\"," >> "$DOWNLOAD_INFO_FILEPATH" - echo " \"size\": \"${FILE_SIZE}\"" >> "$DOWNLOAD_INFO_FILEPATH" - echo } >> "$DOWNLOAD_INFO_FILEPATH" + # Construct .download_info + DATE=$(date +%F) + # shellcheck disable=SC2312 + HASH=$(md5sum "${UPLOAD_DIR}/${ARTIFACT_FILENAME}" | cut -d ' ' -f 1) + # shellcheck disable=SC2248 + SIZE=$(stat ${STAT_FLAGS} "${UPLOAD_DIR}/${ARTIFACT_FILENAME}") + + # shellcheck disable=SC2016,SC2154 + DOWNLOAD_INFO=$( + "${JQ}" -n \ + --arg NAME "${ARTFIACT_NAME}" \ + --arg BUILD_NUMBER "${KEYMAN_VERSION}" \ + --arg DATE "${DATE}" \ + --arg PLATFORM "${PLATFORM}" \ + --arg KEYMAN_TIER "${KEYMAN_TIER}" \ + --arg FILENAME "${ARTIFACT_FILENAME}" \ + --arg ARTIFACT_TYPE "${ARTIFACT_TYPE}" \ + --arg HASH "${HASH}" \ + --arg BUILD_COUNTER "${KEYMAN_VERSION_PATCH}" \ + --arg SIZE "${SIZE}" \ + '{ + name: $NAME, version: $BUILD_NUMBER, date: $DATE, platform: $PLATFORM, + stability: $KEYMAN_TIER, file: $FILENAME, md5: $HASH, type: $ARTIFACT_TYPE, + build: $BUILD_COUNTER, size: $SIZE + }' + ) + echo "${DOWNLOAD_INFO}" | "${JQ}" . >> "${UPLOAD_DIR}/${ARTIFACT_FILENAME}.download_info" } # set_version sets the file version on mac/ios projects diff --git a/resources/teamcity/includes/tc-download-info.inc.sh b/resources/teamcity/includes/tc-download-info.inc.sh deleted file mode 100644 index c1e596a394..0000000000 --- a/resources/teamcity/includes/tc-download-info.inc.sh +++ /dev/null @@ -1,54 +0,0 @@ -# shellcheck shell=bash -# Keyman is copyright (C) SIL Global. MIT License. - -# shellcheck disable=SC2154 -. "${KEYMAN_ROOT}/resources/build/jq.inc.sh" - -# -# Write ${UPLOAD_DIR}/${ARTIFACT_FILENAME}.download_info file for the target -# artifact -# -# Parameters: -# 1: UPLOAD_DIR Directory where artifact can be found -# 2: ARTIFACT_FILENAME Filename (without path) of artifact -# 3: ARTIFACT_NAME Descriptive name of artifact -# 4: ARTIFACT_TYPE File extension of artifact, without initial period (e.g. tar.gz) -# 5: PLATFORM Target platform for artifact -# -write_download_info() { - # TODO: DRY out with Linux download_info writer, others - local UPLOAD_DIR="$1" - local ARTIFACT_FILENAME="$2" - local ARTFIACT_NAME="$3" - local ARTIFACT_TYPE="$4" - local PLATFORM="$5" - - local DATE HASH SIZE DOWNLOAD_INFO - - # Construct .download_info - DATE=$(date +%F) - # shellcheck disable=SC2312 - HASH=$(md5sum "${UPLOAD_DIR}/${ARTIFACT_FILENAME}" | cut -d ' ' -f 1) - SIZE=$(stat --print="%s" "${UPLOAD_DIR}/${ARTIFACT_FILENAME}") - - # shellcheck disable=SC2016 - DOWNLOAD_INFO=$( - "${JQ}" -n \ - --arg NAME "${ARTFIACT_NAME}" \ - --arg BUILD_NUMBER "${KEYMAN_VERSION}" \ - --arg DATE "${DATE}" \ - --arg PLATFORM "${PLATFORM}" \ - --arg KEYMAN_TIER "${KEYMAN_TIER}" \ - --arg FILENAME "${ARTIFACT_FILENAME}" \ - --arg ARTIFACT_TYPE "${ARTIFACT_TYPE}" \ - --arg HASH "${HASH}" \ - --arg BUILD_COUNTER "${KEYMAN_VERSION_PATCH}" \ - --arg SIZE "${SIZE}" \ - '{ - name: $NAME, version: $BUILD_NUMBER, date: $DATE, platform: $PLATFORM, - stability: $KEYMAN_TIER, file: $FILENAME, md5: $HASH, type: $ARTIFACT_TYPE, - build: $BUILD_COUNTER, size: $SIZE - }' - ) - echo "${DOWNLOAD_INFO}" | "${JQ}" . >> "${UPLOAD_DIR}/${ARTIFACT_FILENAME}.download_info" -}