Adapted version checker to new tag name

This commit is contained in:
Juan Gilsanz Polo 2023-05-28 03:08:25 +02:00
parent 15147bf16d
commit 6fcd03f899
6 changed files with 62 additions and 65 deletions

View file

@ -39,9 +39,10 @@ class _BaseState extends State<Base> with WidgetsBindingObserver {
WidgetsBinding.instance.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {
final appConfigProvider = Provider.of<AppConfigProvider>(context, listen: false); final appConfigProvider = Provider.of<AppConfigProvider>(context, listen: false);
final result = await checkAppUpdates( final result = await checkAppUpdates(
appVersion: appConfigProvider.getAppInfo!.version, currentBuildNumber: appConfigProvider.getAppInfo!.buildNumber,
installationSource: appConfigProvider.installationSource, installationSource: appConfigProvider.installationSource,
setUpdateAvailable: appConfigProvider.setAppUpdatesAvailable setUpdateAvailable: appConfigProvider.setAppUpdatesAvailable,
isBeta: appConfigProvider.getAppInfo!.version.contains('beta'),
); );
if (result != null && appConfigProvider.doNotRememberVersion != result.tagName) { if (result != null && appConfigProvider.doNotRememberVersion != result.tagName) {

View file

@ -3,19 +3,23 @@ import 'dart:io';
import 'package:adguard_home_manager/models/github_release.dart'; import 'package:adguard_home_manager/models/github_release.dart';
String? getAppUpdateDownloadLink(GitHubRelease gitHubRelease) { String? getAppUpdateDownloadLink(GitHubRelease gitHubRelease) {
if (Platform.isAndroid) { try {
return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('apk')).browserDownloadUrl; if (Platform.isAndroid) {
} return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('apk')).browserDownloadUrl;
else if (Platform.isMacOS) { }
return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('macOS')).browserDownloadUrl; // macOS package is a zip else if (Platform.isMacOS) {
} return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('macOS')).browserDownloadUrl;
else if (Platform.isWindows) { }
return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('exe')).browserDownloadUrl; else if (Platform.isWindows) {
} return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('exe')).browserDownloadUrl;
else if (Platform.isLinux) { }
return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('deb')).browserDownloadUrl; else if (Platform.isLinux) {
} return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('deb')).browserDownloadUrl;
else { }
else {
return null;
}
} catch (e) {
return null; return null;
} }
} }

View file

@ -7,17 +7,22 @@ import 'package:adguard_home_manager/models/github_release.dart';
import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/services/http_requests.dart';
Future<GitHubRelease?> checkAppUpdates({ Future<GitHubRelease?> checkAppUpdates({
required String appVersion, required String currentBuildNumber,
required void Function(GitHubRelease?) setUpdateAvailable, required void Function(GitHubRelease?) setUpdateAvailable,
required Source installationSource required Source installationSource,
required bool isBeta
}) async { }) async {
final result = await checkAppUpdatesGitHub(); final result = await checkAppUpdatesGitHub();
if (result['result'] == 'success') { if (result['result'] == 'success') {
final update = gitHubUpdateExists(appVersion, result['body']); final update = gitHubUpdateExists(
currentBuildNumber: currentBuildNumber,
gitHubReleases: result['body'],
isBeta: isBeta
);
if (update == true) { if (update == true) {
final release = appVersion.contains('beta') final release = isBeta == true
? result['body'].firstWhere((release) => release.prerelease == true) ? result['body'].firstWhere((release) => release.prerelease == true)
: result['body'].firstWhere((release) => release.prerelease == false); : result['body'].firstWhere((release) => release.prerelease == false);

View file

@ -149,52 +149,36 @@ bool serverVersionIsAhead({
} }
} }
bool gitHubUpdateExists(String appVersion, List<GitHubRelease> gitHubReleases) { bool gitHubUpdateExists({
if (appVersion.contains('beta')) { required String currentBuildNumber,
final gitHubVersion = gitHubReleases.firstWhere((release) => release.prerelease == true).tagName; required List<GitHubRelease> gitHubReleases,
required bool isBeta
}) {
final release = isBeta == true
? gitHubReleases.firstWhere((release) => release.prerelease == true)
: gitHubReleases.firstWhere((release) => release.prerelease == false);
final appBetaSplit = appVersion.split('-'); final versionNumberRegex = RegExp(r'\(\d+\)');
final gitHubBetaSplit = gitHubVersion.split('-'); final releaseNumberExtracted = versionNumberRegex.allMatches(release.tagName).first.group(0);
final List<int> appVersionSplit = List<int>.from(appBetaSplit[0].split('.').map((e) => int.parse(e))); if (releaseNumberExtracted != null) {
final int appBetaNumber = int.parse(appBetaSplit[1].split('.')[1]); final releaseNumber = releaseNumberExtracted.replaceAll(RegExp(r'\(|\)'), '');
try {
final List<int> gitHubVersionSplit = List<int>.from(gitHubBetaSplit[0].split('.').map((e) => int.parse(e))); final newReleaseParsed = int.parse(releaseNumber);
final int gitHubBetaNumber = int.parse(gitHubBetaSplit[1].split('.')[1]); final currentReleaseParsed = int.parse(currentBuildNumber);
if (newReleaseParsed > currentReleaseParsed) {
if (gitHubVersionSplit[0] > appVersionSplit[0]) { return true;
return true; }
} else {
else if (gitHubVersionSplit[0] == appVersionSplit[0] && gitHubVersionSplit[1] > appVersionSplit[1]) { return false;
return true; }
} } catch (e) {
else if (gitHubVersionSplit[0] == appVersionSplit[0] && gitHubVersionSplit[1] == appVersionSplit[1] && gitHubVersionSplit[2] > appVersionSplit[2]) { Sentry.captureMessage("Invalid release number. Current release: $currentBuildNumber. New release: $releaseNumber");
return true;
}
else if (gitHubVersionSplit[0] == appVersionSplit[0] && gitHubVersionSplit[1] == appVersionSplit[1] && gitHubVersionSplit[2] == appVersionSplit[2] && gitHubBetaNumber > appBetaNumber) {
return true;
}
else {
return false; return false;
} }
} }
else { else {
final gitHubVersion = gitHubReleases.firstWhere((release) => release.prerelease == false).tagName; Sentry.captureMessage("Invalid release number. Tagname: ${release.tagName}");
return false;
final List<int> appVersionSplit = List<int>.from(appVersion.split('.').map((e) => int.parse(e)));
final List<int> gitHubVersionSplit = List<int>.from(gitHubVersion.split('.').map((e) => int.parse(e)));
if (gitHubVersionSplit[0] > appVersionSplit[0]) {
return true;
}
else if (gitHubVersionSplit[0] == appVersionSplit[0] && gitHubVersionSplit[1] > appVersionSplit[1]) {
return true;
}
else if (gitHubVersionSplit[0] == appVersionSplit[0] && gitHubVersionSplit[1] == appVersionSplit[1] && gitHubVersionSplit[2] > appVersionSplit[2]) {
return true;
}
else {
return false;
}
} }
} }

View file

@ -57,9 +57,10 @@ class _GeneralSettingsState extends State<GeneralSettings> {
setState(() => appUpdatesStatus = AppUpdatesStatus.checking); setState(() => appUpdatesStatus = AppUpdatesStatus.checking);
final res = await checkAppUpdates( final res = await checkAppUpdates(
appVersion: appConfigProvider.getAppInfo!.version, currentBuildNumber: appConfigProvider.getAppInfo!.buildNumber,
setUpdateAvailable: appConfigProvider.setAppUpdatesAvailable, setUpdateAvailable: appConfigProvider.setAppUpdatesAvailable,
installationSource: appConfigProvider.installationSource installationSource: appConfigProvider.installationSource,
isBeta: appConfigProvider.getAppInfo!.version.contains('beta'),
); );
if (res != null) { if (res != null) {

View file

@ -60,7 +60,7 @@ class _UpdateModalState extends State<UpdateModal> {
), ),
const SizedBox(height: 10), const SizedBox(height: 10),
Text( Text(
"${AppLocalizations.of(context)!.newVersion}: ${widget.gitHubRelease.tagName}", "${AppLocalizations.of(context)!.newVersion}: ${widget.gitHubRelease.name.replaceAll('v', '')}",
style: TextStyle( style: TextStyle(
color: Theme.of(context).colorScheme.onSurfaceVariant color: Theme.of(context).colorScheme.onSurfaceVariant
), ),
@ -101,7 +101,9 @@ class _UpdateModalState extends State<UpdateModal> {
), ),
actions: [ actions: [
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: downloadLink != null
? MainAxisAlignment.spaceBetween
: MainAxisAlignment.end,
children: [ children: [
if (downloadLink != null) TextButton( if (downloadLink != null) TextButton(
onPressed: () { onPressed: () {