@@ -1944,61 +1944,95 @@ function setup_ffmpeg() {
19441944check_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