public int RunCommand(CKAN.KSP ksp, object raw_options) { UpgradeOptions options = (UpgradeOptions)raw_options; if (options.ckan_file != null) { options.modules.Add(LoadCkanFromFile(ksp, options.ckan_file).identifier); } if (options.modules.Count == 0 && !options.upgrade_all) { // What? No files specified? User.RaiseMessage("Usage: ckan upgrade Mod [Mod2, ...]"); User.RaiseMessage(" or ckan upgrade --all"); User.RaiseMessage(" or ckan upgrade ckan"); return(Exit.BADOPT); } if (!options.upgrade_all && options.modules[0] == "ckan") { User.RaiseMessage("Querying the latest CKAN version"); var latestVersion = AutoUpdate.FetchLatestCkanVersion(); var currentVersion = new Version(Meta.Version()); if (latestVersion.IsGreaterThan(currentVersion)) { User.RaiseMessage("New CKAN version available - " + latestVersion); var releaseNotes = AutoUpdate.FetchLatestCkanVersionReleaseNotes(); User.RaiseMessage(releaseNotes); User.RaiseMessage("\n"); if (User.RaiseYesNoDialog("Proceed with install?")) { User.RaiseMessage("Upgrading CKAN, please wait.."); AutoUpdate.StartUpdateProcess(false); } } else { User.RaiseMessage("You already have the latest version."); } return(Exit.OK); } User.RaiseMessage("\nUpgrading modules...\n"); try { if (options.upgrade_all) { var installed = new Dictionary <string, Version>(ksp.Registry.Installed()); var to_upgrade = new List <CkanModule>(); foreach (KeyValuePair <string, Version> mod in installed) { Version current_version = mod.Value; if ((current_version is ProvidesVersion) || (current_version is DllVersion)) { continue; } else { try { // Check if upgrades are available CkanModule latest = ksp.Registry.LatestAvailable(mod.Key, ksp.Version()); // This may be an unindexed mod. If so, // skip rather than crash. See KSP-CKAN/CKAN#841. if (latest == null) { continue; } if (latest.version.IsGreaterThan(mod.Value)) { // Upgradable log.InfoFormat("New version {0} found for {1}", latest.version, latest.identifier); to_upgrade.Add(latest); } } catch (ModuleNotFoundKraken) { log.InfoFormat("{0} is installed, but no longer in the registry", mod.Key); } } } ModuleInstaller.GetInstance(ksp, User).Upgrade(to_upgrade, new NetAsyncDownloader(User)); } else { // TODO: These instances all need to go. ModuleInstaller.GetInstance(ksp, User).Upgrade(options.modules, new NetAsyncDownloader(User)); } } catch (ModuleNotFoundKraken kraken) { User.RaiseMessage("Module {0} not found", kraken.module); return(Exit.ERROR); } User.RaiseMessage("\nDone!\n"); return(Exit.OK); }