public void Update(SinglePluginUpdateSettings plugin)
        {
            if (!plugin.Enable)
            {
                DebugWindow.LogMsg($"{plugin.Name?.Value}: Update disabled in settings!");
                return;
            }
            var sw = Stopwatch.StartNew();

            DebugWindow.LogDebug($"{plugin.Name?.Value}: Start update.");
            var repositoryPath = Path.Combine(SourceDirectory, plugin.Name?.Value);

            if (!Repository.IsValid(repositoryPath))
            {
                DebugWindow.LogMsg($"{plugin.Name?.Value}: No valid repository at: {repositoryPath}. Starting to clone...");
                try
                {
                    Clone(plugin.SourceUrl?.Value, repositoryPath);
                    sw.Stop();
                    DebugWindow.LogMsg($"{plugin.Name?.Value}: Clone successful in {sw.ElapsedMilliseconds} ms.", 5, Color.Green);
                    return;
                }
                catch (Exception e)
                {
                    DebugWindow.LogError($"{plugin.Name?.Value} -> Clone failed. Make sure the folder Plugins/Source/{plugin.Name?.Value} does not exist. Skipped!");
                    DebugWindow.LogDebug($"{plugin.Name?.Value} -> {e.Message}");
                    return;
                }
            }

            var repository = new Repository(repositoryPath);

            try
            {
                var status = Pull(repository);
                sw.Stop();
                if (status == MergeStatus.UpToDate)
                {
                    DebugWindow.LogMsg($"{plugin.Name?.Value}: Already up to date, checked in {sw.ElapsedMilliseconds} ms.");
                    return;
                }
                else if (status == MergeStatus.FastForward || status == MergeStatus.NonFastForward)
                {
                    DebugWindow.LogMsg($"{plugin.Name?.Value}: Update successful in {sw.ElapsedMilliseconds} ms.", 5, Color.Green);
                    return;
                }
                else
                {
                    throw new Exception(status.ToString());
                }
            }
            catch (Exception e)
            {
                DebugWindow.LogError($"{plugin.Name?.Value}: Update failed. Skipped!");
                DebugWindow.LogDebug($"{plugin.Name?.Value} -> {e.Message}");
            }
        }
Beispiel #2
0
        private List <PluginWrapper> UpdateSinglePlugin(
            SinglePluginUpdateSettings plugin,
            PluginSourceDownloader pluginSourceDownloader,
            PluginFilter pluginFilter,
            IPluginCompiler pluginCompiler,
            string rootDirectory,
            PluginLoader pluginLoader
            )
        {
            pluginSourceDownloader.Update(plugin);
            var sourcePluginDirectory   = new DirectoryInfo(Path.Combine(SourcePluginsDirectory, plugin.Name?.Value));
            var compiledPluginDirectory = new DirectoryInfo(Path.Combine(CompiledPluginsDirectory, plugin.Name?.Value));

            if (!pluginFilter.ShouldCompilePlugin(sourcePluginDirectory, compiledPluginDirectory))
            {
                return(null);
            }

            var dependencyTasks  = PluginCopyFiles.CopyDependencies(sourcePluginDirectory, compiledPluginDirectory);
            var settingsTasks    = PluginCopyFiles.CopySettings(sourcePluginDirectory, compiledPluginDirectory);
            var staticFilesTasks = PluginCopyFiles.CopyStaticFiles(sourcePluginDirectory, compiledPluginDirectory);

            /*var txtJsonFilesTask = PluginCopyFiles.CopyTxtAndJsonFromRoot(sourcePluginDirectory, compiledPluginDirectory);*/

            if (dependencyTasks != null)
            {
                Task.WaitAll(dependencyTasks.ToArray());
            }

            var csProjFiles = sourcePluginDirectory
                              .GetFiles("*.csproj", SearchOption.AllDirectories)
                              .Where(f => f.Extension == ".csproj");

            foreach (var csProjFile in csProjFiles)
            {
                pluginCompiler.CompilePlugin(
                    csProjFile,
                    compiledPluginDirectory.FullName,
                    new DirectoryInfo(rootDirectory)
                    );
            }


            if (settingsTasks != null)
            {
                Task.WaitAll(settingsTasks.ToArray());
            }
            if (staticFilesTasks != null)
            {
                Task.WaitAll(staticFilesTasks.ToArray());
            }
            /*txtJsonFilesTask.Wait();*/
            var pluginWrapper = pluginLoader.Load(compiledPluginDirectory);

            return(pluginWrapper);
        }
Beispiel #3
0
        public void Update(SinglePluginUpdateSettings plugin)
        {
            DebugWindow.LogMsg($"{plugin.Name?.Value} -> Update... started");

            var repository = CloneHelper(plugin);

            if (repository == null)
            {
                return;
            }

            PullHelper(plugin, repository);
            CheckOutHelper(plugin, repository);

            DebugWindow.LogMsg($"{plugin.Name?.Value} -> Update... done", 5, Color.Green);
        }
Beispiel #4
0
        private void PullHelper(SinglePluginUpdateSettings plugin, Repository repository)
        {
            try
            {
                DebugWindow.LogMsg($"{plugin.Name?.Value} -> Checkout master/main branch... started");
                var masterBranch = repository
                                   .Branches
                                   .Where(b => b.FriendlyName == "master" || b.FriendlyName == "main")
                                   .SingleOrDefault();

                if (masterBranch == null)
                {
                    DebugWindow.LogError($"{plugin.Name?.Value} -> master/main branch does not exist");
                    return;
                }

                Commands.Checkout(repository, masterBranch);
                DebugWindow.LogMsg($"{plugin.Name?.Value} -> Checkout master/main branch... done", 5, Color.Green);


                DebugWindow.LogMsg($"{plugin.Name?.Value} -> Pull... started");
                var status = Pull(repository);
                if (status == MergeStatus.UpToDate)
                {
                    DebugWindow.LogMsg($"{plugin.Name?.Value} -> Pull... done, already up to date", 5, Color.Green);
                    return;
                }
                else if (status == MergeStatus.FastForward || status == MergeStatus.NonFastForward)
                {
                    DebugWindow.LogMsg($"{plugin.Name?.Value} -> Pull... done", 5, Color.Green);
                    return;
                }
                else
                {
                    throw new Exception(status.ToString());
                }
            }
            catch (Exception e)
            {
                DebugWindow.LogError($"{plugin.Name?.Value} -> Pull... failed");
                DebugWindow.LogDebug($"{plugin.Name?.Value} -> {e.Message}");
            }
        }
Beispiel #5
0
 private void CheckOutHelper(SinglePluginUpdateSettings plugin, Repository repository)
 {
     plugin.CommitShaLatest = repository.Head.Tip.Sha;
     if (!plugin.Enable && plugin.CommitShaCurrentIsValid)
     {
         try
         {
             DebugWindow.LogMsg($"{plugin.Name?.Value} -> Check out commit {plugin.CommitShaCurrent?.Value}... started");
             Commands.Checkout(repository, plugin.CommitShaCurrent.Value);
             DebugWindow.LogMsg($"{plugin.Name?.Value} -> Check out commit {plugin.CommitShaCurrent?.Value}... done", 5, Color.Green);
         }
         catch (Exception e)
         {
             DebugWindow.LogError($"{plugin.Name?.Value} -> Check out commit {plugin.CommitShaCurrent?.Value}... failed");
             DebugWindow.LogDebug($"{plugin.Name?.Value} -> {e.Message}");
         }
     }
     plugin.CommitShaCurrent.Value = repository.Head.Tip.Sha;
 }
Beispiel #6
0
        private List <PluginWrapper> UpdateSinglePlugin(
            SinglePluginUpdateSettings plugin,
            PluginSourceDownloader pluginSourceDownloader,
            PluginFilter pluginFilter,
            PluginCompiler pluginCompiler,
            PluginLoader pluginLoader
            )
        {
            pluginSourceDownloader.Update(plugin);
            var sourcePluginDirectory   = new DirectoryInfo(Path.Combine(SourcePluginsDirectory, plugin.Name?.Value));
            var compiledPluginDirectory = new DirectoryInfo(Path.Combine(CompiledPluginsDirectory, plugin.Name?.Value));

            if (!pluginFilter.ShouldCompilePlugin(sourcePluginDirectory, compiledPluginDirectory))
            {
                return(null);
            }

            var dependencyTasks  = PluginCopyFiles.CopyDependencies(sourcePluginDirectory, compiledPluginDirectory);
            var settingsTasks    = PluginCopyFiles.CopySettings(sourcePluginDirectory, compiledPluginDirectory);
            var staticFilesTasks = PluginCopyFiles.CopyStaticFiles(sourcePluginDirectory, compiledPluginDirectory);

            /*var txtJsonFilesTask = PluginCopyFiles.CopyTxtAndJsonFromRoot(sourcePluginDirectory, compiledPluginDirectory);*/

            if (dependencyTasks != null)
            {
                Task.WaitAll(dependencyTasks.ToArray());
            }
            var assembly = pluginCompiler.CompilePlugin(sourcePluginDirectory, compiledPluginDirectory.FullName);

            if (settingsTasks != null)
            {
                Task.WaitAll(settingsTasks.ToArray());
            }
            if (staticFilesTasks != null)
            {
                Task.WaitAll(staticFilesTasks.ToArray());
            }
            /*txtJsonFilesTask.Wait();*/
            var pluginWrapper = pluginLoader.Load(compiledPluginDirectory, assembly);

            return(pluginWrapper);
        }
Beispiel #7
0
        private Repository CloneHelper(SinglePluginUpdateSettings plugin)
        {
            var repositoryPath = Path.Combine(SourceDirectory, plugin.Name?.Value);

            if (Repository.IsValid(repositoryPath))
            {
                return(new Repository(repositoryPath));
            }

            DebugWindow.LogMsg($"{plugin.Name?.Value} -> No valid repository at: {repositoryPath}. Clone from {plugin.SourceUrl?.Value}... started");
            try
            {
                Clone(plugin.SourceUrl?.Value, repositoryPath);
                DebugWindow.LogMsg($"{plugin.Name?.Value} -> Clone... done", 5, Color.Green);
                return(new Repository(repositoryPath));
            }
            catch (Exception e)
            {
                DebugWindow.LogError($"{plugin.Name?.Value} -> Clone... failed");
                DebugWindow.LogDebug($"{plugin.Name?.Value} -> {e.Message}");
                return(null);
            }
        }
Beispiel #8
0
        private List <PluginWrapper> UpdateSinglePlugin(
            SinglePluginUpdateSettings plugin,
            PluginSourceDownloader pluginSourceDownloader,
            PluginFilter pluginFilter,
            IPluginCompiler pluginCompiler,
            string rootDirectory,
            PluginLoader pluginLoader
            )
        {
            var sourcePluginDirectory   = new DirectoryInfo(Path.Combine(SourcePluginsDirectory, plugin.Name?.Value));
            var compiledPluginDirectory = new DirectoryInfo(Path.Combine(CompiledPluginsDirectory, plugin.Name?.Value));

            try
            {
                pluginSourceDownloader.Update(plugin);

                if (!pluginFilter.ShouldCompilePlugin(sourcePluginDirectory, compiledPluginDirectory))
                {
                    return(null);
                }

                var dependencyTasks         = PluginCopyFiles.CopyDependencies(sourcePluginDirectory, compiledPluginDirectory);
                var settingsTasks           = PluginCopyFiles.CopySettings(sourcePluginDirectory, compiledPluginDirectory);
                var staticFilesTasks        = PluginCopyFiles.CopyStaticFiles(sourcePluginDirectory, compiledPluginDirectory);
                var txtJsonFilesTask        = PluginCopyFiles.CopyTxtAndJsonFromRoot(sourcePluginDirectory, compiledPluginDirectory);
                var txtJsonDefaultFilesTask = PluginCopyFiles.CopyTxtAndJsonDefaultFiles(sourcePluginDirectory, compiledPluginDirectory);

                if (dependencyTasks != null)
                {
                    Task.WaitAll(dependencyTasks.ToArray());
                }

                var csProjFiles = sourcePluginDirectory
                                  .GetFiles("*.csproj", SearchOption.AllDirectories)
                                  .Where(f => f.Extension == ".csproj");
                foreach (var csProjFile in csProjFiles)
                {
                    pluginCompiler.CompilePlugin(
                        csProjFile,
                        compiledPluginDirectory.FullName,
                        new DirectoryInfo(rootDirectory)
                        );
                }

                var remainingTasks = new List <Task>();
                remainingTasks.AddRange(settingsTasks);
                remainingTasks.AddRange(staticFilesTasks);
                remainingTasks.AddRange(txtJsonFilesTask);
                remainingTasks.AddRange(txtJsonDefaultFilesTask);

                if (remainingTasks != null)
                {
                    Task.WaitAll(remainingTasks.ToArray());
                }
            }
            catch (Exception e)
            {
                DebugWindow.LogError($"PluginUpdater -> UpdateSinglePlugin \"{plugin.Name?.Value}\" failed.");
                DebugWindow.LogError($"PluginUpdater -> {e}");
            }

            var pluginWrapper = pluginLoader.Load(compiledPluginDirectory);

            return(pluginWrapper);
        }