From 96c92c8df93f86d08bde3dd575e150c75ecf6bc7 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 14 May 2023 13:25:09 -0400 Subject: [PATCH] Add 'tags-only' support (for Track-Only) to GitHub (and Codeberg) --- lib/app_sources/codeberg.dart | 8 +++---- lib/app_sources/github.dart | 44 ++++++++++++++++++++++++++--------- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/lib/app_sources/codeberg.dart b/lib/app_sources/codeberg.dart index 5938ec2..8b1e3d3 100644 --- a/lib/app_sources/codeberg.dart +++ b/lib/app_sources/codeberg.dart @@ -56,10 +56,10 @@ class Codeberg extends AppSource { String standardUrl, Map additionalSettings, ) async { - return gh.getLatestAPKDetailsCommon( - 'https://$host/api/v1/repos${standardUrl.substring('https://$host'.length)}/releases?per_page=100', - standardUrl, - additionalSettings); + return await gh.getLatestAPKDetailsCommon2(standardUrl, additionalSettings, + (bool useTagUrl) async { + return 'https://$host/api/v1/repos${standardUrl.substring('https://$host'.length)}/${useTagUrl ? 'tags' : 'releases'}?per_page=100'; + }, null); } AppNames getAppNames(String standardUrl) { diff --git a/lib/app_sources/github.dart b/lib/app_sources/github.dart index c314d26..54c1242 100644 --- a/lib/app_sources/github.dart +++ b/lib/app_sources/github.dart @@ -143,15 +143,17 @@ class GitHub extends AppSource { } else if (b == null) { return 1; } else { - var stdFormats = findStandardFormatsForVersion(a['tag_name'], true) - .intersection(findStandardFormatsForVersion(b['tag_name'], true)); + var nameA = a['tag_name'] ?? a['name']; + var nameB = b['tag_name'] ?? b['name']; + var stdFormats = findStandardFormatsForVersion(nameA, true) + .intersection(findStandardFormatsForVersion(nameB, true)); if (stdFormats.isNotEmpty) { var reg = RegExp(stdFormats.first); - var matchA = reg.firstMatch(a['tag_name']); - var matchB = reg.firstMatch(b['tag_name']); + var matchA = reg.firstMatch(nameA); + var matchB = reg.firstMatch(nameB); return compareAlphaNumeric( - (a['tag_name'] as String).substring(matchA!.start, matchA.end), - (b['tag_name'] as String).substring(matchB!.start, matchB.end)); + (nameA as String).substring(matchA!.start, matchA.end), + (nameB as String).substring(matchB!.start, matchB.end)); } else { return getReleaseDateFromRelease(a)! .compareTo(getReleaseDateFromRelease(b)!); @@ -191,7 +193,7 @@ class GitHub extends AppSource { if (targetRelease == null) { throw NoReleasesError(); } - String? version = targetRelease['tag_name']; + String? version = targetRelease['tag_name'] ?? targetRelease['name']; DateTime? releaseDate = getReleaseDateFromRelease(targetRelease); if (version == null) { throw NoVersionError(); @@ -211,15 +213,35 @@ class GitHub extends AppSource { } } + getLatestAPKDetailsCommon2( + String standardUrl, + Map additionalSettings, + Future Function(bool) reqUrlGenerator, + dynamic Function(Response)? onHttpErrorCode) async { + try { + return await getLatestAPKDetailsCommon( + await reqUrlGenerator(false), standardUrl, additionalSettings, + onHttpErrorCode: onHttpErrorCode); + } catch (err) { + if (err is NoReleasesError && additionalSettings['trackOnly'] == true) { + return await getLatestAPKDetailsCommon( + await reqUrlGenerator(true), standardUrl, additionalSettings, + onHttpErrorCode: onHttpErrorCode); + } else { + rethrow; + } + } + } + @override Future getLatestAPKDetails( String standardUrl, Map additionalSettings, ) async { - return getLatestAPKDetailsCommon( - 'https://${await getCredentialPrefixIfAny()}api.$host/repos${standardUrl.substring('https://$host'.length)}/releases?per_page=100', - standardUrl, - additionalSettings, onHttpErrorCode: (Response res) { + return await getLatestAPKDetailsCommon2(standardUrl, additionalSettings, + (bool useTagUrl) async { + return 'https://${await getCredentialPrefixIfAny()}api.$host/repos${standardUrl.substring('https://$host'.length)}/${useTagUrl ? 'tags' : 'releases'}?per_page=100'; + }, (Response res) { rateLimitErrorCheck(res); }); }