performUpdate method
Perform a version update.
Implementation
Future<bool> performUpdate({
required String channelOrVersion,
bool forceReinstall = false,
}) async {
installState.value = 'downloading';
progress.value = 0;
try {
final version = await getLatestVersion(channelOrVersion);
latestVersion.value = version;
final dirs = _getBaseDirectories();
final stagingPath = p.join(dirs.staging, version);
final installPath = p.join(dirs.versions, version);
// Ensure directories exist
await Directory(dirs.versions).create(recursive: true);
await Directory(dirs.staging).create(recursive: true);
await Directory(dirs.locks).create(recursive: true);
await Directory(p.dirname(dirs.executable)).create(recursive: true);
// Check if already installed
final alreadyInstalled =
await _isPossibleNeomageBinary(installPath) && !forceReinstall;
if (!alreadyInstalled) {
installState.value = 'downloading';
progress.value = 25;
await downloadVersion(version, stagingPath);
installState.value = 'installing';
progress.value = 75;
await _installVersionFromBinary(stagingPath, installPath);
}
// Update symlink
progress.value = 90;
await _updateSymlink(dirs.executable, installPath);
progress.value = 100;
currentVersion.value = version;
installState.value = 'done';
return !alreadyInstalled;
} catch (e) {
errorMessage.value = e.toString();
installState.value = 'error';
return false;
}
}