From fc4236ee3f9fc44ffa3f05d9e74485c666b4be03 Mon Sep 17 00:00:00 2001 From: Calin Crisan Date: Sat, 11 Apr 2020 13:15:15 +0300 Subject: [PATCH] fwupdate: add support for indicating latest version --- board/common/overlay/sbin/fwupdate | 8 +++---- .../usr/libexec/list-versions-bitbucket | 23 ++++++++++++++++-- .../overlay/usr/libexec/list-versions-github | 21 ++++++++++++---- .../overlay/usr/libexec/list-versions-s3 | 24 +++++++++++++++++-- 4 files changed, 63 insertions(+), 13 deletions(-) diff --git a/board/common/overlay/sbin/fwupdate b/board/common/overlay/sbin/fwupdate index e40caac832..c41cfe1fa8 100755 --- a/board/common/overlay/sbin/fwupdate +++ b/board/common/overlay/sbin/fwupdate @@ -211,7 +211,7 @@ function show_versions() { show_json=$1 # the /usr/libexec/list-versions-* helpers return a table with the following format: - # |||| + # |||| versions=$(FW_USERNAME=${OS_FIRMWARE_USERNAME} FW_PASSWORD=${OS_FIRMWARE_PASSWORD} \ /usr/libexec/list-versions-${OS_FIRMWARE_METHOD} ${OS_FIRMWARE_REPO}) @@ -230,9 +230,9 @@ function show_versions() { if [[ "${show_json}" == "true" ]]; then echo "{\"version\": \"${varr[0]}\"," \ "\"url\": \"${varr[3]}\"," \ - "\"board\": \"${varr[2]}\"," \ - "\"prerelease\": ${varr[1]}," \ - "\"date\": \"${varr[4]}\"}" + "\"prerelease\": ${varr[1]:-false}," \ + "\"date\": \"${varr[4]}\"," \ + "\"latest\": ${varr[5]:-false}}" else echo ${varr[0]} fi diff --git a/board/common/overlay/usr/libexec/list-versions-bitbucket b/board/common/overlay/usr/libexec/list-versions-bitbucket index 6f1d7fb9f3..adf939912a 100755 --- a/board/common/overlay/usr/libexec/list-versions-bitbucket +++ b/board/common/overlay/usr/libexec/list-versions-bitbucket @@ -14,6 +14,26 @@ function check_prerelease() { fi } +function add_latest_flag() { + declare -A latest_stable_by_board + declare -A latest_prerelease_by_board + while read line; do + _IFS=${IFS} IFS="|" line_arr=(${line}) IFS=${_IFS} + latest="false" + prerelease=${line_arr[1]} + board=${line_arr[2]} + if [[ "${prerelease}" == "true" && -z "${latest_prerelease_by_board[${board}]}" ]]; then + latest="true" + latest_prerelease_by_board[${board}]="true" + elif [[ "${prerelease}" == "false" && -z "${latest_stable_by_board[${board}]}" ]]; then + latest="true" + latest_stable_by_board[${board}]="true" + fi + + echo "${line}|${latest}" + done +} + extensions=".img.gz .img.xz .img" opts="-s -S -f" test -n "${FW_USERNAME}" && opts+=" --user ${FW_USERNAME}:${FW_PASSWORD}" @@ -23,6 +43,5 @@ rtrimstr=$(for e in ${extensions}; do echo -n " | rtrimstr(\"${e}\")"; done) jq_expr=".values[] | [{a: .name | split(\"-\"), url: .links.self.href, date: .created_on | split(\"T\")[0]}] | map((.a[2] ${rtrimstr}), \"false\", .a[1], .url, .date) | join(\"|\")" -curl ${opts} ${url} | jq --raw-output "${jq_expr}" | while read line; do echo "${line}" | check_prerelease; done +curl ${opts} ${url} | jq --raw-output "${jq_expr}" | while read line; do echo "${line}" | check_prerelease | add_latest_flag; done exit ${PIPESTATUS[0]} - diff --git a/board/common/overlay/usr/libexec/list-versions-github b/board/common/overlay/usr/libexec/list-versions-github index 8ac8b0e356..85267e25e1 100755 --- a/board/common/overlay/usr/libexec/list-versions-github +++ b/board/common/overlay/usr/libexec/list-versions-github @@ -7,12 +7,23 @@ fi opts="-s -S -f" test -n "${FW_USERNAME}" && opts+=" --user ${FW_USERNAME}:${FW_PASSWORD}" -url=https://api.github.com/repos/$1/releases +releases_url=https://api.github.com/repos/$1/releases +latest_url=https://api.github.com/repos/$1/releases/latest +# Get release info via GitHub API +latest_version=$(curl ${opts} ${latest_url} | jq --raw-output ".name") +releases=$(curl ${opts} ${releases_url}) +test $? == 0 || exit 1 + +# Latest pre-release is the first one +latest_prerelease=$(jq --raw-output | '[.[] | select(.prerelease)] | first | .name' <<< ${releases}) + +# Format release lines jq_expr='.[] | {version: .name, prerelease: .prerelease | tostring} + (.assets[] | {name: .name | split("-")[1], url: .browser_download_url}) + - ({date: .created_at | split("T")[0]}) | flatten | join("|")' - -curl ${opts} ${url} | jq --raw-output "${jq_expr}" -exit ${PIPESTATUS[0]} + ({date: .created_at | split("T")[0]}) + + ({latest: (.name=="'${latest_version}'")}) + | flatten | join("|")' +jq --raw-output "${jq_expr}" <<< ${releases} +exit $? diff --git a/board/common/overlay/usr/libexec/list-versions-s3 b/board/common/overlay/usr/libexec/list-versions-s3 index b8801359e5..37eb905579 100755 --- a/board/common/overlay/usr/libexec/list-versions-s3 +++ b/board/common/overlay/usr/libexec/list-versions-s3 @@ -22,13 +22,33 @@ dates=$(echo "${xml_result}" | grep -oE '[^<]+<\/LastModified>' | dates=(${dates}) files=(${keys}) +function add_latest_flag() { + declare -A latest_stable_by_board + declare -A latest_prerelease_by_board + while read line; do + _IFS=${IFS} IFS="|" line_arr=(${line}) IFS=${_IFS} + latest="false" + prerelease=${line_arr[1]} + board=${line_arr[2]} + if [[ "${prerelease}" == "true" && -z "${latest_prerelease_by_board[${board}]}" ]]; then + latest="true" + latest_prerelease_by_board[${board}]="true" + elif [[ "${prerelease}" == "false" && -z "${latest_stable_by_board[${board}]}" ]]; then + latest="true" + latest_stable_by_board[${board}]="true" + fi + + echo "${line}|${latest}" + done +} + i=0 for file in ${files[*]}; do [[ "${file}" =~ ^${path}/(.+)/(.+)$ ]] || continue version="${BASH_REMATCH[1]}" fname="${BASH_REMATCH[2]}" - prerelease=false + if [[ "${version}" =~ ^.*[abc]\.?[0-9]+$ ]] || # e.g. 0.4.1b2, 0.4.1b.2, 0.4.1-b.2 [[ "${version}" =~ ^.*(alpha|beta|rc)\.?[0-9]+$ ]] || # e.g. 0.4.1beta2, 0.4.1beta.2, 0.4.1-beta.2 [[ "${version}" =~ ^(dev|nightly).*$ ]]; then # e.g. dev20180314, nightly20180314 @@ -42,4 +62,4 @@ for file in ${files[*]}; do echo "${version}|${prerelease}|${board}|${final_url}|${date}" i=$((i + 1)) -done | semver-sort -r -t '|' -k 1 +done | semver-sort -r -t '|' -k 1 | add_latest_flag