performUpdate method

Future<bool> performUpdate({
  1. required String channelOrVersion,
  2. bool forceReinstall = false,
})

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;
  }
}