Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 14 additions & 7 deletions lib/src/appcast.dart
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,10 @@ class Appcast {
bestItem = item;
} else {
try {
final itemVersion = Version.parse(item.versionString!);
final bestItemVersion = Version.parse(bestItem!.versionString!);
final itemVersion =
Version.parse(item.versionString!.split('+').first);
final bestItemVersion =
Version.parse(bestItem!.versionString!.split('+').first);
if (itemVersion > bestItemVersion) {
bestItem = item;
}
Expand Down Expand Up @@ -93,8 +95,10 @@ class Appcast {
bestItem = item;
} else {
try {
final itemVersion = Version.parse(item.versionString!);
final bestItemVersion = Version.parse(bestItem!.versionString!);
final itemVersion =
Version.parse(item.versionString!.split('+').first);
final bestItemVersion =
Version.parse(bestItem!.versionString!.split('+').first);
if (itemVersion > bestItemVersion) {
bestItem = item;
}
Expand Down Expand Up @@ -301,7 +305,8 @@ class AppcastItem {
if (supported) {
if (maximumSystemVersion != null) {
try {
final maxVersion = Version.parse(maximumSystemVersion!);
final maxVersion =
Version.parse(maximumSystemVersion!.split('+').first);
if (osVersion > maxVersion) {
supported = false;
}
Expand All @@ -311,7 +316,8 @@ class AppcastItem {
}
if (supported && minimumSystemVersion != null) {
try {
final minVersion = Version.parse(minimumSystemVersion!);
final minVersion =
Version.parse(minimumSystemVersion!.split('+').first);
if (osVersion < minVersion) {
supported = false;
}
Expand All @@ -323,7 +329,8 @@ class AppcastItem {
minimumUpdateVersion != null &&
currentAppVersion != null) {
try {
final minUpdateVersion = Version.parse(minimumUpdateVersion!);
final minUpdateVersion =
Version.parse(minimumUpdateVersion!.split('+').first);
if (currentAppVersion < minUpdateVersion) {
supported = false;
}
Expand Down
26 changes: 21 additions & 5 deletions lib/src/upgrade_store_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,12 @@ class UpgraderAppStore extends UpgraderStore {
final version = iTunes.version(response);
if (version != null) {
try {
appStoreVersion = Version.parse(version);
final normalized = version.split('+').first;
if (normalized != version && state.debugLogging) {
print(
"upgrader: version normalized: '$version' → '$normalized'");
}
appStoreVersion = Version.parse(normalized);
} catch (e) {
if (state.debugLogging) {
print(
Expand Down Expand Up @@ -105,7 +110,12 @@ class UpgraderPlayStore extends UpgraderStore {
final version = playStore.version(response);
if (version != null) {
try {
appStoreVersion = Version.parse(version);
final normalized = version.split('+').first;
if (normalized != version && state.debugLogging) {
print(
"upgrader: version normalized: '$version' → '$normalized'");
}
appStoreVersion = Version.parse(normalized);
} catch (e) {
if (state.debugLogging) {
print(
Expand All @@ -120,7 +130,7 @@ class UpgraderPlayStore extends UpgraderStore {
final mav = playStore.minAppVersion(response);
if (mav != null) {
try {
final minVersion = mav.toString();
final minVersion = mav.toString().split('+').first;
minAppVersion = Version.parse(minVersion);

if (state.debugLogging) {
Expand Down Expand Up @@ -227,7 +237,8 @@ class UpgraderAppcastStore extends UpgraderStore {

try {
if (criticalVersion.isNotEmpty &&
installedVersion < Version.parse(criticalVersion)) {
installedVersion <
Version.parse(criticalVersion.split('+').first)) {
isCriticalUpdate = true;
}
} catch (e) {
Expand All @@ -239,7 +250,12 @@ class UpgraderAppcastStore extends UpgraderStore {

if (bestItem.versionString != null) {
try {
appStoreVersion = Version.parse(bestItem.versionString!);
final normalized = bestItem.versionString!.split('+').first;
if (normalized != bestItem.versionString && state.debugLogging) {
print(
"upgrader: version normalized: '${bestItem.versionString}' → '$normalized'");
}
appStoreVersion = Version.parse(normalized);
} catch (e) {
if (state.debugLogging) {
print(
Expand Down
55 changes: 21 additions & 34 deletions lib/src/upgrader.dart
Original file line number Diff line number Diff line change
Expand Up @@ -262,13 +262,9 @@ class Upgrader with WidgetsBindingObserver {
}

// Determine the installed version of this app.
late Version installedVersion;
try {
installedVersion = Version.parse(state.packageInfo!.version);
} catch (e) {
if (state.debugLogging) {
print('upgrader: installedVersion exception: $e');
}
final installedVersion = parseVersion(
state.packageInfo!.version, 'installedVersion', state.debugLogging);
if (installedVersion == null) {
updateState(state.copyWithNull(versionInfo: null));
return null;
}
Expand Down Expand Up @@ -370,13 +366,10 @@ class Upgrader with WidgetsBindingObserver {
var rv = false;
final minVersion = state.minAppVersion ?? versionInfo?.minAppVersion;
if (minVersion != null && state.packageInfo != null) {
try {
final installedVersion = Version.parse(state.packageInfo!.version);
final installedVersion = parseVersion(
state.packageInfo!.version, 'installedVersion', state.debugLogging);
if (installedVersion != null) {
rv = installedVersion < minVersion;
} catch (e) {
if (state.debugLogging) {
print(e);
}
}
}
return rv;
Expand Down Expand Up @@ -424,10 +417,12 @@ class Upgrader with WidgetsBindingObserver {
}

try {
final installedVersion = Version.parse(state.packageInfo!.version);

final available = versionInfo!.appStoreVersion! > installedVersion;
_updateAvailable = available ? versionInfo?.appStoreVersion : null;
final installedVersion = parseVersion(
state.packageInfo!.version, 'installedVersion', state.debugLogging);
if (installedVersion != null) {
final available = versionInfo!.appStoreVersion! > installedVersion;
_updateAvailable = available ? versionInfo?.appStoreVersion : null;
}
} on Exception catch (e) {
if (state.debugLogging) {
print('upgrader: isUpdateAvailable: $e');
Expand Down Expand Up @@ -527,23 +522,13 @@ class Upgrader with WidgetsBindingObserver {
}
final versionAlerted = prefs.getString('lastVersionAlerted');
if (versionAlerted != null) {
try {
_lastVersionAlerted = Version.parse(versionAlerted);
} catch (e) {
if (state.debugLogging) {
print('upgrader: lastVersionAlerted exception: $e');
}
}
_lastVersionAlerted = parseVersion(
versionAlerted, 'lastVersionAlerted', state.debugLogging);
}
final ignoredVersion = prefs.getString('userIgnoredVersion');
if (ignoredVersion != null) {
try {
_userIgnoredVersion = Version.parse(ignoredVersion);
} catch (e) {
if (state.debugLogging) {
print('upgrader: userIgnoredVersion exception: $e');
}
}
_userIgnoredVersion =
parseVersion(ignoredVersion, 'userIgnoredVersion', state.debugLogging);
}

return true;
Expand Down Expand Up @@ -581,11 +566,13 @@ class Upgrader with WidgetsBindingObserver {
String? version, String name, bool debugLogging) {
if (version == null) return null;
try {
return Version.parse(version);
final normalized = version.split('+').first;
if (normalized != version && debugLogging) {
print("upgrader: version normalized: '$version' → '$normalized'");
}
return Version.parse(normalized);
} catch (e) {
// if (state.debugLogging) {
print('upgrader: _parseVersion $name exception: $e');
// }
return null;
}
}
Expand Down
69 changes: 69 additions & 0 deletions test/upgrader_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1375,6 +1375,75 @@ void main() {
verifyMessages(UpgraderMessages(code: 'vi'), 'vi');
verifyMessages(UpgraderMessages(code: 'zh'), 'zh');
}, skip: false);

test('parseVersion strips build metadata from version string', () {
final result = Upgrader.parseVersion('1.2.3+45', 'test', false);
expect(result, isNotNull);
expect(result, equals(Version.parse('1.2.3')));
expect(result! > Version.parse('1.2.3'), isFalse);
});

test('parseVersion leaves clean version string unchanged', () {
final result = Upgrader.parseVersion('1.2.3', 'test', false);
expect(result, isNotNull);
expect(result, equals(Version.parse('1.2.3')));
});

testWidgets(
'isUpdateAvailable returns false when installed version has build metadata matching store version',
(WidgetTester tester) async {
await tester.runAsync(() async {
final client = MockITunesSearchClient.setupMockClient();
final upgrader = Upgrader(
upgraderOS: MockUpgraderOS(ios: true),
client: client,
debugLogging: true,
);

upgrader.installPackageInfo(
packageInfo: PackageInfo(
appName: 'Upgrader',
packageName: 'com.larryaasen.upgrader',
version: '1.2.3+45',
buildNumber: '45'));

expect(await upgrader.initialize(), isTrue);

upgrader.updateState(upgrader.state.copyWith(
versionInfo: UpgraderVersionInfo(
appStoreVersion: Version.parse('1.2.3'))));

expect(upgrader.isUpdateAvailable(), isFalse);
});
});

testWidgets(
'isUpdateAvailable returns true when installed version with build metadata is genuinely older',
(WidgetTester tester) async {
await tester.runAsync(() async {
final client = MockITunesSearchClient.setupMockClient();
final upgrader = Upgrader(
upgraderOS: MockUpgraderOS(ios: true),
client: client,
debugLogging: true,
);

upgrader.installPackageInfo(
packageInfo: PackageInfo(
appName: 'Upgrader',
packageName: 'com.larryaasen.upgrader',
version: '1.2.2+99',
buildNumber: '99'));

expect(await upgrader.initialize(), isTrue);

upgrader.updateState(upgrader.state.copyWith(
versionInfo: UpgraderVersionInfo(
appStoreVersion: Version.parse('1.2.3'))));

expect(upgrader.isUpdateAvailable(), isTrue);
});
});
}

void verifyMessages(UpgraderMessages messages, String code) {
Expand Down
Loading