Use GitHub latest release for Podkop updates

This commit is contained in:
ushan0v
2026-05-27 02:57:28 +03:00
parent 87960c9c6c
commit 6db870ae97
3 changed files with 20 additions and 159 deletions
+6 -135
View File
@@ -144,15 +144,6 @@ function read_stdin() {
return data == null ? "" : data;
}
function read_json_file(path) {
try {
return json(fs.readfile(path));
}
catch (e) {
return null;
}
}
function read_stdin_json() {
try {
return json(read_stdin());
@@ -188,15 +179,6 @@ function asset_matches(name, kind, ext) {
return false;
}
function release_has_asset(release, kind, ext) {
if (type(release) != "object" || type(release.assets) != "array")
return false;
for (let asset in release.assets)
if (type(asset) == "object" && asset_matches(asset.name, kind, ext))
return true;
return false;
}
function github_message() {
let value = read_stdin_json();
if (value == null)
@@ -205,29 +187,6 @@ function github_message() {
print(as_string(value.message), "\n");
}
function release_tags(path, ext) {
for (let release in (read_json_file(path) || [])) {
if (type(release) != "object")
continue;
if (release.draft === true || release.prerelease === true)
continue;
if (!release_has_asset(release, "backend", ext) || !release_has_asset(release, "app", ext))
continue;
let tag = as_string(release.tag_name || "");
if (tag != "")
print(tag, "\n");
}
}
function release_by_tag(path, tag) {
for (let release in (read_json_file(path) || [])) {
if (type(release) == "object" && as_string(release.tag_name || "") == tag) {
print(sprintf("%J", release), "\n");
return;
}
}
}
function release_tag() {
let release = read_stdin_json();
if (type(release) == "object" && release.tag_name != null)
@@ -250,10 +209,6 @@ let mode = ARGV[0] || "";
if (mode == "github-message")
github_message();
else if (mode == "release-tags")
release_tags(ARGV[1], ARGV[2]);
else if (mode == "release-by-tag")
release_by_tag(ARGV[1], ARGV[2]);
else if (mode == "release-tag")
release_tag();
else if (mode == "release-asset-url")
@@ -519,66 +474,6 @@ version_ge() {
[ "$lhs_patch" -ge "$rhs_patch" ]
}
normalize_podkop_plus_release_version() {
printf '%s\n' "$1" | sed 's/^v//;s/-r\([0-9][0-9]*\)$/-\1/'
}
podkop_plus_release_version_parts() {
version="$(normalize_podkop_plus_release_version "$1")"
release=0
case "$version" in
*-*)
release="${version##*-}"
version="${version%-*}"
;;
*.*.*.*)
release="${version##*.}"
version="${version%.*}"
;;
esac
case "$version" in ''|*[!0-9.]*|.*|*.) return 1 ;; esac
case "$release" in ''|*[!0-9]*) return 1 ;; esac
old_ifs="$IFS"
IFS='.'
set -- $version
IFS="$old_ifs"
[ -n "$1" ] || return 1
case "$1" in *[!0-9]*) return 1 ;; esac
case "${2:-0}" in *[!0-9]*) return 1 ;; esac
case "${3:-0}" in *[!0-9]*) return 1 ;; esac
printf '%s %s %s %s\n' "$1" "${2:-0}" "${3:-0}" "$release"
}
podkop_plus_release_version_lt() {
lhs_parts="$(podkop_plus_release_version_parts "$1")" || return 1
rhs_parts="$(podkop_plus_release_version_parts "$2")" || return 1
set -- $lhs_parts
lhs_major="$1"
lhs_minor="$2"
lhs_patch="$3"
lhs_release="$4"
set -- $rhs_parts
rhs_major="$1"
rhs_minor="$2"
rhs_patch="$3"
rhs_release="$4"
[ "$lhs_major" -lt "$rhs_major" ] && return 0
[ "$lhs_major" -gt "$rhs_major" ] && return 1
[ "$lhs_minor" -lt "$rhs_minor" ] && return 0
[ "$lhs_minor" -gt "$rhs_minor" ] && return 1
[ "$lhs_patch" -lt "$rhs_patch" ] && return 0
[ "$lhs_patch" -gt "$rhs_patch" ] && return 1
[ "$lhs_release" -lt "$rhs_release" ]
}
extract_package_version() {
package_name="$1"
@@ -625,60 +520,36 @@ extract_package_version() {
esac
}
fetch_github_releases_json() {
fetch_github_latest_release_json() {
owner="$1"
repo="$2"
response=""
message=""
url="https://api.github.com/repos/${owner}/${repo}/releases?per_page=50"
url="https://api.github.com/repos/${owner}/${repo}/releases/latest"
response="$(http_get "$url" 2>/dev/null || true)"
[ -n "$response" ] || fail "Failed to query GitHub releases metadata for ${owner}/${repo}"
[ -n "$response" ] || fail "Failed to query GitHub latest release metadata for ${owner}/${repo}"
message="$(printf '%s' "$response" | install_json_ucode github-message 2>/dev/null)" ||
fail "GitHub returned an invalid response for ${owner}/${repo}"
fail "GitHub returned an invalid latest release response for ${owner}/${repo}"
case "$message" in
*"API rate limit"*|*"rate limit exceeded"*)
fail "GitHub API rate limit reached. Try again later."
;;
"Not Found")
fail "No published releases found for ${owner}/${repo}"
fail "No published latest release found for ${owner}/${repo}"
;;
esac
printf '%s' "$response"
}
select_latest_podkop_plus_release_json() {
asset_ext="$1"
releases_file=""
best_tag=""
tag=""
releases_file="$(mktemp)"
cat > "$releases_file"
for tag in $(install_json_ucode release-tags "$releases_file" "$asset_ext"); do
podkop_plus_release_version_parts "$tag" >/dev/null 2>&1 || continue
if [ -z "$best_tag" ] || podkop_plus_release_version_lt "$best_tag" "$tag"; then
best_tag="$tag"
fi
done
if [ -n "$best_tag" ]; then
install_json_ucode release-by-tag "$releases_file" "$best_tag" | sed -n '1p'
fi
rm -f "$releases_file"
}
resolve_podkop_plus_release() {
asset_ext="ipk"
[ "$PKG_IS_APK" -eq 1 ] && asset_ext="apk"
PODKOP_PLUS_RELEASE_JSON="$(fetch_github_releases_json "$REPO_OWNER" "$REPO_NAME" | select_latest_podkop_plus_release_json "$asset_ext")"
PODKOP_PLUS_RELEASE_JSON="$(fetch_github_latest_release_json "$REPO_OWNER" "$REPO_NAME")"
PODKOP_PLUS_RELEASE_TAG="$(printf '%s' "$PODKOP_PLUS_RELEASE_JSON" | install_json_ucode release-tag 2>/dev/null)"
[ -n "$PODKOP_PLUS_RELEASE_TAG" ] || fail "Failed to detect the Podkop Plus release tag"
+10 -21
View File
@@ -6774,30 +6774,19 @@ show_sing_box_version() {
}
fetch_latest_podkop_version() {
local releases_file tag best_tag
local owner repo response tag
command -v curl >/dev/null 2>&1 || return 1
owner="${PODKOP_RELEASE_REPO%%/*}"
repo="${PODKOP_RELEASE_REPO#*/}"
[ -n "$owner" ] || return 1
[ -n "$repo" ] || return 1
[ "$owner" != "$repo" ] || return 1
releases_file="$(mktemp)"
if curl --connect-timeout 2 -m 5 -fsSL "https://api.github.com/repos/$PODKOP_RELEASE_REPO/releases?per_page=50" > "$releases_file" 2>/dev/null; then
best_tag=""
for tag in $(json_utils_ucode github-release-tags "$releases_file" 2>/dev/null); do
is_podkop_release_version "$tag" || continue
response="$(updates_fetch_github_release_json "$owner" "$repo")" || return 1
tag="$(printf '%s' "$response" | json_utils_ucode object-get-default tag_name "" 2>/dev/null)"
if [ -z "$best_tag" ] || [ "$(podkop_release_version_compare "$best_tag" "$tag" 2>/dev/null)" -lt 0 ]; then
best_tag="$tag"
fi
done
rm -f "$releases_file"
[ -n "$best_tag" ] && echo "$best_tag"
return 0
fi
rm -f "$releases_file"
curl --connect-timeout 2 -m 5 -fsSL "https://api.github.com/repos/$PODKOP_RELEASE_REPO/releases/latest" 2>/dev/null |
sed -n 's/^[[:space:]]*"tag_name":[[:space:]]*"\([^"]*\)".*/\1/p' |
head -n 1
[ -n "$tag" ] || return 1
echo "$tag"
}
normalize_podkop_release_version() {
+4 -3
View File
@@ -951,7 +951,7 @@ updates_select_release_asset_url() {
updates_resolve_podkop_plus_release() {
local latest_version="$1"
local owner repo asset_ext response release_json
local owner repo asset_ext release_json release_tag
UPDATES_PODKOP_BACKEND_URL=""
UPDATES_PODKOP_BACKEND_NAME=""
@@ -969,9 +969,10 @@ updates_resolve_podkop_plus_release() {
asset_ext="ipk"
updates_is_apk && asset_ext="apk"
response="$(updates_fetch_github_releases_json "$owner" "$repo" 50)" || return 1
release_json="$(printf '%s' "$response" | json_utils_ucode release-by-tag "$latest_version" | sed -n '1p')"
release_json="$(updates_fetch_github_release_json "$owner" "$repo")" || return 1
[ -n "$release_json" ] || return 1
release_tag="$(printf '%s' "$release_json" | json_utils_ucode object-get-default tag_name "" 2>/dev/null)"
[ "$release_tag" = "$latest_version" ] || return 1
UPDATES_PODKOP_BACKEND_NAME="$(updates_select_release_asset_name "$release_json" "podkop-plus" "$asset_ext")"
UPDATES_PODKOP_APP_NAME="$(updates_select_release_asset_name "$release_json" "luci-app-podkop-plus" "$asset_ext")"