Skip to content

Commit 36bf265

Browse files
committed
improve update-pinning
1 parent 892ad29 commit 36bf265

File tree

1 file changed

+57
-23
lines changed

1 file changed

+57
-23
lines changed

misc/tools.func

Lines changed: 57 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1944,61 +1944,95 @@ function setup_ffmpeg() {
19441944
check_for_gh_release() {
19451945
local app="$1"
19461946
local source="$2"
1947-
local pinned_version="${3:-}" # optional
1947+
local pinned_version="${3:-}" # optional
19481948
local current_file="$HOME/.${app,,}"
19491949

1950-
msg_info "Check for update: ${app}"
1950+
msg_info "Checking for update: ${app}"
19511951

1952-
# DNS check for GitHub
1952+
# DNS check
19531953
if ! getent hosts api.github.com >/dev/null 2>&1; then
19541954
msg_error "Network error: cannot resolve api.github.com"
19551955
return 1
19561956
fi
19571957

19581958
# jq check
19591959
if ! command -v jq &>/dev/null; then
1960-
$STD apt-get update -qq
1960+
$STD apt-get update -qq
19611961
$STD apt-get install -y jq || {
19621962
msg_error "Failed to install jq"
19631963
return 1
19641964
}
19651965
fi
19661966

1967-
# get latest release
1968-
local release
1969-
release=$(curl -fsSL "https://api.github.com/repos/${source}/releases/latest" |
1970-
jq -r '.tag_name' | sed 's/^v//')
1967+
# Fetch all releases (newest → oldest)
1968+
local releases
1969+
releases=$(curl -fsSL "https://api.github.com/repos/${source}/releases" |
1970+
jq -r '.[].tag_name' | sed 's/^v//')
19711971

1972-
if [[ -z "$release" ]]; then
1973-
msg_error "Unable to determine latest release for ${app}"
1972+
if [[ -z "$releases" ]]; then
1973+
msg_error "Unable to fetch releases for ${app}"
19741974
return 1
19751975
fi
19761976

1977-
local current=""
1977+
local latest current
1978+
latest=$(echo "$releases" | head -n1)
19781979
[[ -f "$current_file" ]] && current=$(<"$current_file")
19791980

1980-
# PINNED Releases
1981+
# helper: get index (lower index = newer)
1982+
get_index() {
1983+
local ver="$1"
1984+
echo "$releases" | nl -ba | grep -w "$ver" | awk '{print $1}'
1985+
}
1986+
1987+
# --- Pinning enabled ---
19811988
if [[ -n "$pinned_version" ]]; then
1982-
if [[ "$pinned_version" == "$release" ]]; then
1983-
msg_ok "${app} pinned to v${pinned_version} (no update needed)"
1989+
# Ensure pin exists upstream
1990+
if ! echo "$releases" | grep -qx "$pinned_version"; then
1991+
msg_error "Pinned version v${pinned_version} not found in upstream releases!"
19841992
return 1
1985-
else
1986-
if [[ "$current" == "$pinned_version" ]]; then
1987-
msg_ok "${app} pinned to v${pinned_version} (already installed, upstream v${release})"
1988-
return 1
1993+
fi
1994+
1995+
local pinned_index current_index
1996+
pinned_index=$(get_index "$pinned_version")
1997+
current_index=$(get_index "$current")
1998+
1999+
if [[ -z "$current" ]]; then
2000+
msg_info "${app} pinned to v${pinned_version}, no local version → install required"
2001+
CHECK_UPDATE_RELEASE="$pinned_version"
2002+
return 0
2003+
fi
2004+
2005+
if [[ "$current" == "$pinned_version" ]]; then
2006+
if [[ "$pinned_version" == "$latest" ]]; then
2007+
msg_ok "${app} pinned to v${pinned_version} (no update needed)"
2008+
else
2009+
msg_ok "${app} pinned to v${pinned_version} (already installed, upstream v${latest})"
19892010
fi
1990-
msg_info "${app} pinned to v${pinned_version} (upstream v${release}) → update/downgrade required"
2011+
return 1
2012+
fi
2013+
2014+
# Local older than pinned → update
2015+
if [[ -z "$current_index" ]] || [[ "$current_index" -gt "$pinned_index" ]]; then
2016+
msg_info "${app} pinned to v${pinned_version} (installed v${current:-none}) → update required"
2017+
CHECK_UPDATE_RELEASE="$pinned_version"
2018+
return 0
2019+
fi
2020+
2021+
# Local newer than pinned → downgrade
2022+
if [[ "$current_index" -lt "$pinned_index" ]]; then
2023+
msg_info "${app} pinned to v${pinned_version} (installed newer v${current}) → downgrade required"
19912024
CHECK_UPDATE_RELEASE="$pinned_version"
19922025
return 0
19932026
fi
19942027
fi
19952028

1996-
if [[ "$release" != "$current" ]] || [[ ! -f "$current_file" ]]; then
1997-
CHECK_UPDATE_RELEASE="$release"
1998-
msg_info "New release available: v${release} (current: v${current:-none})"
2029+
# --- No pin → compare against latest ---
2030+
if [[ "$current" != "$latest" ]] || [[ -z "$current" ]]; then
2031+
CHECK_UPDATE_RELEASE="$latest"
2032+
msg_info "New release available: v${latest} (current: v${current:-none})"
19992033
return 0
20002034
else
2001-
msg_ok "${app} is up to date (v${release})"
2035+
msg_ok "${app} is up to date (v${latest})"
20022036
return 1
20032037
fi
20042038
}

0 commit comments

Comments
 (0)