예제 #1
0
        public void TestInstaller(string installCode, string installerCode)
        {
            var installScheme = GithubSchemeDecoder.DecodeShort(installCode);

            this.FetchInstallsRegistry();
            var install = Installs.FirstOrDefault(_ => _.RepositoryName == installScheme.Name && _.AuthorName == installScheme.Owner);

            if (install == null)
            {
                Logger.LogProblem("No install found matching: " + installCode);
                return;
            }

            var regex = new Regex("(?<type>[^\\.]*)\\.(?<method>[^\\.]*)");

            var mathc = regex.Match(installerCode);

            if (!mathc.Success)
            {
                Logger.LogProblem("Code should be in format: <InstallerType>.<Method>");
                return;
            }

            var typeName   = mathc.Groups["type"].Value;
            var methodName = mathc.Groups["method"].Value;

            var type =
                AppDomain.CurrentDomain.GetAssemblies()
                .Select(_ => _.GetType(typeName))
                .FirstOrDefault(_ => _ != null);

            if (type == null)
            {
                Logger.LogProblem("Installer type not found: " + typeName);
                return;
            }

            var method = type.GetMethod(methodName);

            if (method == null)
            {
                Logger.LogProblem("Method not found: " + methodName);
                return;
            }

            var result = false;

            var installer = (Installer)Activator.CreateInstance(type, new object[] { CliFrontend });

            result = (bool)method.Invoke(installer, new object[] { install });

            if (result)
            {
                Logger.Log("Install Test Finished");
            }
            else
            {
                Logger.Log("Install Not Finished");
            }
        }
예제 #2
0
파일: Core.cs 프로젝트: Siniana/Universum
        public void Update(string[] args)
        {
            if (args.Length > 1 && !string.IsNullOrEmpty(args[1]))
            {
                var installScheme = GithubSchemeDecoder.DecodeShort(args[1]);
                var install       = KoinoniaApplication.Instance.FetchInstallsRegistry().Installs.FirstOrDefault(_ => _.RepositoryName == installScheme.Name && _.AuthorName == installScheme.Owner);

                KoinoniaApplication.Instance.Update(install);
            }
        }
예제 #3
0
파일: Core.cs 프로젝트: Siniana/Universum
        public void Uninstall(string[] args)
        {
            var installScheme = GithubSchemeDecoder.DecodeShort(args[1]);
            var install       = KoinoniaApplication.Instance.FetchInstallsRegistry().Installs.FirstOrDefault(_ => _.RepositoryName == installScheme.Name && _.AuthorName == installScheme.Owner);

            if (install != null)
            {
                KoinoniaApplication.Instance.UninstallNode(install);
            }
        }
예제 #4
0
파일: Core.cs 프로젝트: Siniana/Universum
        public void ListDownloadables(string[] args)
        {
            var shc = GithubSchemeDecoder.DecodeShort(args[1]);

            var host = new DownloadablesHost()
            {
                AuthorName     = shc.Owner,
                RepositoryName = shc.Name
            };

            host.FetchDownloadables();

            foreach (var downloadable in host.Downloadables)
            {
                Terminal.Log(downloadable.ToString());
            }
        }
예제 #5
0
        public IEnumerable <GithubRepositoriesRegistryEntry> GetGithubRepositoriesRegistry(string url)
        {
            var jsonString = _commonWebRequestManager.GetText(url);
            var json       = JSON.Parse(jsonString).AsArray;


            foreach (var child in json.Childs)
            {
                var title = child["title"].AsString;
                var code  = child["code"];

                var s = GithubSchemeDecoder.DecodeShort(code);

                yield return(new GithubRepositoriesRegistryEntry()
                {
                    Title = title,
                    RepositoryName = s.Name,
                    AuthorName = s.Owner
                });
            }
        }
예제 #6
0
파일: Core.cs 프로젝트: Siniana/Universum
        public void Install(string[] args)
        {
            GithubRepositoryEntry dec = GithubSchemeDecoder.Decode(args[1]);

            Terminal.Log(string.Format("Will install {0} from {1} at {2}", dec.Name, dec.Owner, dec.Tag));

            var downloadableHost = new DownloadablesHost()
            {
                AuthorName     = dec.Owner,
                RepositoryName = dec.Name
            };

            Terminal.Log("Fetching downloadables...");

            downloadableHost.FetchDownloadables();

            Terminal.Log(string.Format("{0}/{1} contains {2} downloadable entries...", dec.Owner, dec.Name, downloadableHost.Downloadables.Count));


            Downloadable d = downloadableHost.Downloadables.FirstOrDefault();

            if (!string.IsNullOrEmpty(dec.Tag))
            {
                d = downloadableHost.Downloadables.FirstOrDefault(_ => _.Name == dec.Tag);
            }

            if (d == null)
            {
                throw new Exception("Downloadable Entry not found");
            }

            Terminal.Log(string.Format("Installing {0}/{1} @ {2} # {3}...", d.AuthorName, d.RepositoryName, d.Name, d.CommitSha));


            KoinoniaApplication.Instance.InstallNode(d);
        }
예제 #7
0
        private void AnalyzePackage(InstallPlanEntry entry)
        {
            _logger.Log("Checking dependencies in " + entry);

            if (entry.ConfigData.Dependencies.Any())
            {
                foreach (var dependency in entry.ConfigData.Dependencies)
                {
                    _logger.Log("   Processing " + dependency.Key + " @ " + dependency.Value);

                    var depData = GithubSchemeDecoder.DecodeShort(dependency.Key);

                    // See if this package is already planned to be installed
                    var depEntry = PlanInstall.FirstOrDefault(_ => depData.Owner == _.AuthorName && depData.Name == _.RepositoryName);

                    if (depEntry != null)
                    {
                        continue;                   //Already been processed
                    }
                    // See if we got this package registered
                    var host = _hostsRegistry.DownloadablesHosts.FirstOrDefault(_ => depData.Owner == _.AuthorName && depData.Name == _.RepositoryName);

                    // If not, create it locally
                    if (host == null)
                    {
                        host = new DownloadablesHost()
                        {
                            AuthorName = depData.Owner, RepositoryName = depData.Name,
                        };
                    }

                    if (_installsRegistry.Installs.Where(i => i.IsInstallOf(host)).Any())
                    {
                        _logger.Log(dependency.Key + " is already installed.");
                        continue;
                    }

                    host.FetchDownloadables();

                    var downloadable = host.Downloadables.FirstOrDefault();

                    //TODO: need version here

                    if (!string.IsNullOrEmpty(dependency.Value))
                    {
                        downloadable = host.Downloadables.FirstOrDefault(_ => _.Name == dependency.Value);
                    }

                    if (downloadable == null)
                    {
                        throw new Exception("No Downloadables found for " + host);
                    }

                    var newEntry = Add(downloadable);

                    AnalyzePackage(newEntry);
                }
            }
            else
            {
                _logger.Log("   Seeing no dependencies for " + entry);
            }
        }