Ejemplo n.º 1
0
 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"}");
     }
 }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 4
0
        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);
                    }
                }
            }
        }