private void PrintScriptToPackage(RegistrySavesMatch match, RegistryPackageVersion updateToVersion) { Renderer.Write($"Script "); Renderer.Write(Controller.GetDisplayPath(match.Local.FullPath), ConsoleColor.Blue); Renderer.Write($" is "); Renderer.Write($"{match.Script.Name} v{match.Version.Version}", ConsoleColor.Cyan); Renderer.Write($" > "); if (updateToVersion == null) { Renderer.Write($"already up to date", ConsoleColor.DarkGray); Renderer.WriteLine(); } else { Renderer.Write($"new version available: v{updateToVersion.Version}", ConsoleColor.Magenta); Renderer.WriteLine(); Renderer.WriteLine($" Released {updateToVersion.Created.ToLocalTime().ToString("D")}: {updateToVersion.Notes ?? "No release notes"}"); } }
private async Task <LocalPackageInfo> TryInstallUpdate(RegistrySavesMatch match, UpgradeArguments args, IDictionary <RegistryPackageVersionContext, LocalPackageInfo> upgraded) { // No reason to upgrade since nothing uses it if (match.Local.Scenes == null || match.Local.Scenes.Count == 0) { if (args.Verbose) { PrintScriptToPackage(match, null, null); PrintScanErrors(args.Errors, match.Local); Renderer.WriteLine($" Skipping unused package", ConsoleColor.DarkGray); } return(null); } if (upgraded.ContainsKey(match.Remote)) { Renderer.WriteLine(" Handled in a previous upgrade"); return(upgraded[match.Remote]); } var latestCompatVersion = match.Remote.Package.GetLatestVersionCompatibleWith(match.Remote.Version.Version); var latestVersion = match.Remote.Package.GetLatestVersion(); var updateToVersion = args.Major ? (latestVersion.Version.Equals(match.Remote.Version.Version) ? null : latestVersion) : (latestCompatVersion.Version.Equals(match.Remote.Version.Version) ? null : latestCompatVersion); if (updateToVersion == null) { if (args.Verbose) { PrintScriptToPackage(match, null, null); PrintScanErrors(args.Errors, match.Local); Renderer.WriteLine($" No updates available", ConsoleColor.DarkGray); } return(null); } PrintScriptToPackage(match, updateToVersion, latestVersion); PrintScanErrors(args.Errors, match.Local); var info = await Controller.GetInstalledPackageInfoAsync(match.Remote.WithVersion(updateToVersion ?? match.Remote.Version)); if (info.Installed) { Renderer.WriteLine(" Already installed"); return(info); } if (!args.Force && !info.Installable) { Renderer.WriteLine(" This plugin cannot be installed automatically.", ConsoleColor.Yellow); Renderer.WriteLine($" You can instead download at {match.Remote.Version.DownloadUrl ?? match.Remote.Package.Homepage ?? match.Remote.Package.Repository ?? "(no download link provided)"}"); Renderer.WriteLine(" Files:"); PrintInstalledFiles(info, " "); return(null); } if (!args.Force && info.Corrupted) { Renderer.WriteLine(" Locally installed version does not match the registry.", ConsoleColor.Red); Renderer.WriteLine($" You can instead download at {match.Remote.Version.DownloadUrl ?? match.Remote.Package.Homepage ?? match.Remote.Package.Repository ?? "(no download link provided)"}"); Renderer.WriteLine(" Files:"); PrintInstalledFiles(info, " "); return(null); } if (args.Noop) { Renderer.WriteLine("skipping install because the --noop option was specified", ConsoleColor.Yellow); return(null); } Renderer.WriteLine($" Downloading... "); info = await Controller.InstallPackageAsync(info, args.Force); if (info.Installed) { Renderer.WriteLine($" Installed in {Controller.GetDisplayPath(info.PackageFolder)}:", ConsoleColor.Green); } if (!args.Force && !info.Installable) { Renderer.WriteLine(" This plugin could be installed automatically.", ConsoleColor.Yellow); Renderer.WriteLine($" You can instead download at {match.Remote.Version.DownloadUrl ?? match.Remote.Package.Homepage ?? match.Remote.Package.Repository ?? "(no download link provided)"}"); Renderer.WriteLine(" Files:"); PrintInstalledFiles(info, " "); return(null); } if (!args.Force && info.Corrupted) { Renderer.WriteLine(" The download files did not match the registry hash.", ConsoleColor.Red); Renderer.WriteLine($" You can instead download at {match.Remote.Version.DownloadUrl ?? match.Remote.Package.Homepage ?? match.Remote.Package.Repository ?? "(no download link provided)"}"); Renderer.WriteLine(" Files:"); PrintInstalledFiles(info, " "); return(null); } return(info); }
private async Task HandleOne(RegistrySavesMatch match, UpgradeArguments args) { var latestVersion = match.Script.GetLatestVersion(); var updateToVersion = latestVersion.Version.Equals(match.Version.Version) ? null : latestVersion; if (match.Local.Scenes == null || (match.Local.Scenes.Count == 0 && updateToVersion == null)) { if (args.Verbose) { PrintScriptToPackage(match, null); Renderer.WriteLine($" Skipping because no updates are available and no scenes are using it", ConsoleColor.Yellow); } return; } PrintScriptToPackage(match, updateToVersion); var info = await Controller.GetInstalledPackageInfoAsync(match.Script.Name, updateToVersion ?? match.Version); var statuses = info.DistinctStatuses(); if (statuses.Length != 1) { PrintCorruptedInstallInfo(info); if (!args.Force) { return; } } var status = statuses[0]; if (status == LocalPackageInfo.FileStatus.HashMismatch) { PrintCorruptedInstallInfo(info); if (!args.Force) { return; } } if (status == LocalPackageInfo.FileStatus.NotInstalled) { if (args.Get) { if (args.Noop) { Renderer.WriteLine(" Skipping install because the --noop option was specified", ConsoleColor.Yellow); } else if (!args.Force && latestVersion.Files.Where(f => f.Url == null && f.LocalPath != null).Any(f => !Controller.Exists(f.LocalPath))) { Renderer.WriteLine($" Cannot upgrade automatically because some companion files must be downloaded. Get them from: {match.Script.Homepage ?? match.Script.Repository ?? "(no link provided)"}", ConsoleColor.Yellow); return; } else { Renderer.Write($" Installing..."); info = await Controller.InstallPackageAsync(info, args.Force); Renderer.WriteLine($" Downloaded in {info.InstallFolder}:", ConsoleColor.Green); foreach (var file in info.Files) { Renderer.WriteLine($" - {Controller.GetRelativePath(file.Path, info.InstallFolder)}"); } } } else if (args.Verbose) { Renderer.WriteLine($" Skipping downloading to the party folder because this package is not installed (run again with --get to download it)", ConsoleColor.DarkYellow); } } else if (status != LocalPackageInfo.FileStatus.Installed) { throw new NotImplementedException($"Status {status} is not implemented"); } if (updateToVersion == null && !(args.Fix && !match.Local.FullPath.StartsWith(info.InstallFolder))) { return; } foreach (var scene in match.Local.Scenes) { string scenePath = Controller.GetDisplayPath(scene.FullPath); if (args.Noop) { Renderer.WriteLine($" Skipping scene {scenePath} because --noop option was specified", ConsoleColor.Yellow); continue; } Renderer.Write($" Updating scene "); Renderer.Write(scenePath, ConsoleColor.Blue); Renderer.Write($"..."); var changes = await Controller.UpdateScriptInSceneAsync(scene, match.Local, info); if (changes.Length > 0) { Renderer.WriteLine(" updated", ConsoleColor.Green); } else { Renderer.WriteLine(" already up to date", ConsoleColor.DarkGray); } if (args.Verbose) { using (Renderer.WithColor(ConsoleColor.DarkGray)) { foreach (var(before, after) in changes) { Renderer.WriteLine($" {before} > {after}"); } } } if (args.Clean && changes.Length > 0) { if (args.Noop) { Renderer.WriteLine(" Skipping cleanup because the --noop option was specified", ConsoleColor.Yellow); } else { Controller.Delete(match.Local.FullPath); } } } }
private async Task HandleOne(RegistrySavesMatch match, CleanArguments args) { if (match.Local.Scenes == null || match.Local.Scenes.Count == 0) { if (args.Verbose) { PrintScriptToPackage(match, null, null); PrintScanErrors(args.Errors, match.Local); Renderer.WriteLine($" Skipping because no scenes are using it", ConsoleColor.DarkGray); } return; } PrintScriptToPackage(match, null, null); PrintScanErrors(args.Errors, match.Local); var info = await Controller.GetInstalledPackageInfoAsync(match.Remote); if (info.Installed) { Renderer.WriteLine(" Already in the correct location", ConsoleColor.DarkGray); } else if (!info.Installable) { Renderer.WriteLine(" Skipped because the plugin is not installable."); return; } else { // TODO: It's already installed, we should just move the files Renderer.Write(" Script should bet at ", ConsoleColor.DarkGray); Renderer.Write(info.PackageFolder, ConsoleColor.DarkBlue); Renderer.WriteLine(". Installing..."); info = await Controller.InstallPackageAsync(info, true); if (!info.Installed) { Renderer.WriteLine($" Failed to install package:"); PrintInstalledFiles(info); return; } } foreach (var scene in match.Local.Scenes) { string scenePath = Controller.GetDisplayPath(scene.FullPath); if (args.Noop) { Renderer.WriteLine($" Skipping scene {scenePath} because --noop option was specified", ConsoleColor.Yellow); continue; } Renderer.Write($" Updating scene "); Renderer.Write(scenePath, ConsoleColor.Blue); Renderer.Write($"..."); var changes = await Controller.UpgradeSceneAsync(scene, match.Local, info); if (changes > 0) { Renderer.WriteLine(" updated", ConsoleColor.Green); } else { Renderer.WriteLine(" already up to date", ConsoleColor.DarkGray); } if (args.Verbose) { using (Renderer.WithColor(ConsoleColor.DarkGray)) { Renderer.WriteLine($" {changes} changes"); } } if (changes > 0) { if (args.Noop) { Renderer.WriteLine(" Skipping deleting old files because the --noop option was specified", ConsoleColor.Yellow); } else if (args.Filter == null) { Controller.Delete(match.Local.FullPath); } } } }