예제 #1
0
        public IEnumerable <Metadata> Transform(Metadata metadata, TransformOptions opts)
        {
            if (metadata.Kref != null && metadata.Kref.Source == "github")
            {
                var json = metadata.Json();

                Log.InfoFormat("Executing GitHub transformation with {0}", metadata.Kref);
                Log.DebugFormat("Input metadata:{0}{1}", Environment.NewLine, json);

                var useSourceAchive = false;

                var githubMetadata = (JObject)json["x_netkan_github"];
                if (githubMetadata != null)
                {
                    var githubUseSourceArchive = (bool?)githubMetadata["use_source_archive"];

                    if (githubUseSourceArchive != null)
                    {
                        useSourceAchive = githubUseSourceArchive.Value;
                    }
                }

                var ghRef = new GithubRef(metadata.Kref, useSourceAchive, _matchPreleases);

                // Get the GitHub repository
                var ghRepo = _api.GetRepo(ghRef);
                if (ghRepo.Archived)
                {
                    Log.Warn("Repo is archived, consider freezing");
                }
                var versions = _api.GetAllReleases(ghRef);
                if (opts.SkipReleases.HasValue)
                {
                    versions = versions.Skip(opts.SkipReleases.Value);
                }
                if (opts.Releases.HasValue)
                {
                    versions = versions.Take(opts.Releases.Value);
                }
                bool returnedAny = false;
                foreach (GithubRelease rel in versions)
                {
                    returnedAny = true;
                    yield return(TransformOne(metadata, metadata.Json(), ghRef, ghRepo, rel));
                }
                if (!returnedAny)
                {
                    Log.WarnFormat("No releases found for {0}", ghRef.Repository);
                    yield return(metadata);
                }
            }
            else
            {
                yield return(metadata);
            }
        }
예제 #2
0
        public Metadata Transform(Metadata metadata)
        {
            if (metadata.Kref != null && metadata.Kref.Source == "github")
            {
                var json = metadata.Json();

                Log.InfoFormat("Executing GitHub transformation with {0}", metadata.Kref);
                Log.DebugFormat("Input metadata:{0}{1}", Environment.NewLine, json);

                var useSourceAchive = false;

                var githubMetadata = (JObject)json["x_netkan_github"];
                if (githubMetadata != null)
                {
                    var githubUseSourceArchive = (bool?)githubMetadata["use_source_archive"];

                    if (githubUseSourceArchive != null)
                    {
                        useSourceAchive = githubUseSourceArchive.Value;
                    }
                }

                var ghRef = new GithubRef(metadata.Kref, useSourceAchive, _matchPreleases);

                // Find the release on github and download.
                var ghRelease = _api.GetLatestRelease(ghRef);

                if (ghRelease != null)
                {
                    json.SafeAdd("version", ghRelease.Version.ToString());
                    json.SafeAdd("author", ghRelease.Author);
                    json.SafeAdd("download", Uri.EscapeUriString(ghRelease.Download.ToString()));

                    // Make sure resources exist.
                    if (json["resources"] == null)
                    {
                        json["resources"] = new JObject();
                    }

                    var resourcesJson = (JObject)json["resources"];
                    resourcesJson.SafeAdd("repository", GithubPage(ghRef.Repository));

                    Log.DebugFormat("Transformed metadata:{0}{1}", Environment.NewLine, json);

                    return(new Metadata(json));
                }
                else
                {
                    Log.WarnFormat("No releases found for {0}", ghRef.Repository);
                }
            }

            return(metadata);
        }
예제 #3
0
        public IEnumerable <Metadata> Transform(Metadata metadata)
        {
            if (metadata.Kref != null && metadata.Kref.Source == "github")
            {
                var json = metadata.Json();

                Log.InfoFormat("Executing GitHub transformation with {0}", metadata.Kref);
                Log.DebugFormat("Input metadata:{0}{1}", Environment.NewLine, json);

                var useSourceAchive = false;

                var githubMetadata = (JObject)json["x_netkan_github"];
                if (githubMetadata != null)
                {
                    var githubUseSourceArchive = (bool?)githubMetadata["use_source_archive"];

                    if (githubUseSourceArchive != null)
                    {
                        useSourceAchive = githubUseSourceArchive.Value;
                    }
                }

                var ghRef = new GithubRef(metadata.Kref, useSourceAchive, _matchPreleases);

                // Get the GitHub repository
                var ghRepo   = _api.GetRepo(ghRef);
                var versions = _api.GetAllReleases(ghRef);
                if (_releases.HasValue)
                {
                    versions = versions.Take(_releases.Value);
                }
                foreach (GithubRelease rel in versions)
                {
                    yield return(TransformOne(metadata, metadata.Json(), ghRef, ghRepo, rel));
                }
            }
            else
            {
                yield return(metadata);
            }
        }
예제 #4
0
        private Metadata TransformOne(Metadata metadata, JObject json, GithubRef ghRef, GithubRepo ghRepo, GithubRelease ghRelease)
        {
            // Make sure resources exist.
            if (json["resources"] == null)
            {
                json["resources"] = new JObject();
            }

            var resourcesJson = (JObject)json["resources"];

            if (!string.IsNullOrWhiteSpace(ghRepo.Description))
            {
                json.SafeAdd("abstract", ghRepo.Description);
            }

            // GitHub says NOASSERTION if it can't figure out the repo's license
            if (!string.IsNullOrWhiteSpace(ghRepo.License?.Id) &&
                ghRepo.License.Id != "NOASSERTION")
            {
                json.SafeAdd("license", ghRepo.License.Id);
            }

            if (!string.IsNullOrWhiteSpace(ghRepo.Homepage))
            {
                resourcesJson.SafeAdd("homepage", ghRepo.Homepage);
            }

            resourcesJson.SafeAdd("repository", ghRepo.HtmlUrl);

            if (ghRelease != null)
            {
                json.SafeAdd("version", ghRelease.Version.ToString());
                json.SafeAdd("author", ghRelease.Author);
                json.SafeAdd("download", ghRelease.Download.ToString());
                json.SafeAdd(Model.Metadata.UpdatedPropertyName, ghRelease.AssetUpdated);

                if (ghRef.Project.Contains("_"))
                {
                    json.SafeAdd("name", ghRef.Project.Replace("_", " "));
                }
                else if (ghRef.Project.Contains("-"))
                {
                    json.SafeAdd("name", ghRef.Project.Replace("-", " "));
                }
                else if (ghRef.Project.Contains("."))
                {
                    json.SafeAdd("name", ghRef.Project.Replace(".", " "));
                }
                else
                {
                    var repoName = ghRef.Project;
                    for (var i = 1; i < repoName.Length - 1; ++i)
                    {
                        if (char.IsLower(repoName[i - 1]) && char.IsUpper(repoName[i]) || repoName[i - 1] != ' ' && char.IsUpper(repoName[i]) && char.IsLower(repoName[i + 1]))
                        {
                            repoName = repoName.Insert(i, " ");
                        }
                    }

                    json.SafeAdd("name", repoName);
                }

                Log.DebugFormat("Transformed metadata:{0}{1}", Environment.NewLine, json);

                return(new Metadata(json));
            }
            else
            {
                Log.WarnFormat("No releases found for {0}", ghRef.Repository);
                return(metadata);
            }
        }
예제 #5
0
        public Metadata Transform(Metadata metadata)
        {
            if (metadata.Kref != null && metadata.Kref.Source == "github")
            {
                var json = metadata.Json();

                Log.InfoFormat("Executing GitHub transformation with {0}", metadata.Kref);
                Log.DebugFormat("Input metadata:{0}{1}", Environment.NewLine, json);

                var useSourceAchive = false;

                var githubMetadata = (JObject)json["x_netkan_github"];
                if (githubMetadata != null)
                {
                    var githubUseSourceArchive = (bool?)githubMetadata["use_source_archive"];

                    if (githubUseSourceArchive != null)
                    {
                        useSourceAchive = githubUseSourceArchive.Value;
                    }
                }

                var ghRef = new GithubRef(metadata.Kref, useSourceAchive, _matchPreleases);

                // Get the GitHub repository
                var ghRepo = _api.GetRepo(ghRef);
                // Get the GitHub release
                var ghRelease = _api.GetLatestRelease(ghRef);

                // Make sure resources exist.
                if (json["resources"] == null)
                {
                    json["resources"] = new JObject();
                }

                var resourcesJson = (JObject)json["resources"];

                if (!string.IsNullOrWhiteSpace(ghRepo.Description))
                {
                    json.SafeAdd("abstract", ghRepo.Description);
                }

                if (!string.IsNullOrWhiteSpace(ghRepo.Homepage))
                {
                    resourcesJson.SafeAdd("homepage", ghRepo.Homepage);
                }

                resourcesJson.SafeAdd("repository", ghRepo.HtmlUrl);

                if (ghRelease != null)
                {
                    json.SafeAdd("version", ghRelease.Version.ToString());
                    json.SafeAdd("author", ghRelease.Author);
                    json.SafeAdd("download", Uri.EscapeUriString(ghRelease.Download.ToString()));
                    json.SafeAdd(Model.Metadata.UpdatedPropertyName, ghRelease.AssetUpdated);

                    if (ghRef.Project.Contains("_"))
                    {
                        json.SafeAdd("name", ghRef.Project.Replace("_", " "));
                    }
                    else if (ghRef.Project.Contains("-"))
                    {
                        json.SafeAdd("name", ghRef.Project.Replace("-", " "));
                    }
                    else if (ghRef.Project.Contains("."))
                    {
                        json.SafeAdd("name", ghRef.Project.Replace(".", " "));
                    }
                    else
                    {
                        var repoName = ghRef.Project;
                        for (var i = 1; i < repoName.Length - 1; ++i)
                        {
                            if (char.IsLower(repoName[i - 1]) && char.IsUpper(repoName[i]) || repoName[i - 1] != ' ' && char.IsUpper(repoName[i]) && char.IsLower(repoName[i + 1]))
                            {
                                repoName = repoName.Insert(i, " ");
                            }
                        }

                        json.SafeAdd("name", repoName);
                    }

                    Log.DebugFormat("Transformed metadata:{0}{1}", Environment.NewLine, json);

                    return(new Metadata(json));
                }
                else
                {
                    Log.WarnFormat("No releases found for {0}", ghRef.Repository);
                }
            }

            return(metadata);
        }
예제 #6
0
        public IEnumerable <Metadata> Transform(Metadata metadata, TransformOptions opts)
        {
            if (metadata.Kref != null && metadata.Kref.Source == "github")
            {
                var json = metadata.Json();

                Log.InfoFormat("Executing GitHub transformation with {0}", metadata.Kref);
                Log.DebugFormat("Input metadata:{0}{1}", Environment.NewLine, json);

                var useSourceAchive = false;

                var githubMetadata = (JObject)json["x_netkan_github"];
                if (githubMetadata != null)
                {
                    var githubUseSourceArchive = (bool?)githubMetadata["use_source_archive"];

                    if (githubUseSourceArchive != null)
                    {
                        useSourceAchive = githubUseSourceArchive.Value;
                    }
                }

                var ghRef = new GithubRef(metadata.Kref, useSourceAchive, _matchPreleases);

                // Get the GitHub repository
                var ghRepo = _api.GetRepo(ghRef);
                if (ghRepo.Archived)
                {
                    Log.Warn("Repo is archived, consider freezing");
                }
                var releases = _api.GetAllReleases(ghRef);
                if (opts.SkipReleases.HasValue)
                {
                    releases = releases.Skip(opts.SkipReleases.Value);
                }
                if (opts.Releases.HasValue)
                {
                    releases = releases.Take(opts.Releases.Value);
                }
                bool returnedAny = false;
                foreach (GithubRelease rel in releases)
                {
                    if (ghRef.VersionFromAsset != null)
                    {
                        Log.DebugFormat("Found version_from_asset regex, inflating all assets");
                        foreach (var asset in rel.Assets)
                        {
                            var match = ghRef.VersionFromAsset.Match(asset.Name);
                            if (!match.Success)
                            {
                                continue;
                            }

                            var extractedVersion = match.Groups["version"];
                            if (!extractedVersion.Success)
                            {
                                throw new Exception("version_from_asset contains no 'version' capturing group");
                            }

                            returnedAny = true;
                            yield return(TransformOne(metadata, metadata.Json(), ghRef, ghRepo, rel, asset, extractedVersion.Value));
                        }
                    }
                    else
                    {
                        if (rel.Assets.Count > 1)
                        {
                            Log.WarnFormat("Multiple assets found for {0} {1} without `version_from_asset`",
                                           metadata.Identifier, rel.Tag);
                        }
                        returnedAny = true;
                        yield return(TransformOne(metadata, metadata.Json(), ghRef, ghRepo, rel, rel.Assets.FirstOrDefault(), rel.Tag.ToString()));
                    }
                }
                if (!returnedAny)
                {
                    if (ghRef.Filter != Constants.DefaultAssetMatchPattern)
                    {
                        Log.WarnFormat("No releases found for {0} with asset_match {1}", ghRef.Repository, ghRef.Filter);
                    }
                    else if (ghRef.VersionFromAsset != null)
                    {
                        Log.WarnFormat("No releases found for {0} with version_from_asset {1}", ghRef.Repository, ghRef.VersionFromAsset);
                    }
                    else
                    {
                        Log.WarnFormat("No releases found for {0}", ghRef.Repository);
                    }
                    yield return(metadata);
                }
            }
            else
            {
                yield return(metadata);
            }
        }
예제 #7
0
        private Metadata TransformOne(
            Metadata metadata, JObject json, GithubRef ghRef, GithubRepo ghRepo, GithubRelease ghRelease,
            GithubReleaseAsset ghAsset, String version
            )
        {
            if (!string.IsNullOrWhiteSpace(ghRepo.Description))
            {
                json.SafeAdd("abstract", ghRepo.Description);
            }

            // GitHub says NOASSERTION if it can't figure out the repo's license
            if (!string.IsNullOrWhiteSpace(ghRepo.License?.Id) &&
                ghRepo.License.Id != "NOASSERTION")
            {
                json.SafeAdd("license", ghRepo.License.Id);
            }

            // Make sure resources exist.
            if (json["resources"] == null)
            {
                json["resources"] = new JObject();
            }

            var resourcesJson = (JObject)json["resources"];

            if (!string.IsNullOrWhiteSpace(ghRepo.Homepage))
            {
                resourcesJson.SafeAdd("homepage", ghRepo.Homepage);
            }

            resourcesJson.SafeAdd("repository", ghRepo.HtmlUrl);
            if (ghRepo.HasIssues)
            {
                resourcesJson.SafeAdd("bugtracker", $"{ghRepo.HtmlUrl}/issues");
            }

            if (ghRelease != null)
            {
                json.SafeAdd("version", version);
                json.SafeAdd("author", () => getAuthors(ghRepo, ghRelease));
                json.Remove("$kref");
                json.SafeAdd("download", ghAsset.Download.ToString());
                json.SafeAdd(Metadata.UpdatedPropertyName, ghAsset.Updated);

                if (ghRef.Project.Contains("_"))
                {
                    json.SafeAdd("name", ghRef.Project.Replace("_", " "));
                }
                else if (ghRef.Project.Contains("-"))
                {
                    json.SafeAdd("name", ghRef.Project.Replace("-", " "));
                }
                else if (ghRef.Project.Contains("."))
                {
                    json.SafeAdd("name", ghRef.Project.Replace(".", " "));
                }
                else
                {
                    var repoName = ghRef.Project;
                    for (var i = 1; i < repoName.Length - 1; ++i)
                    {
                        if (char.IsLower(repoName[i - 1]) && char.IsUpper(repoName[i]) || repoName[i - 1] != ' ' && char.IsUpper(repoName[i]) && char.IsLower(repoName[i + 1]))
                        {
                            repoName = repoName.Insert(i, " ");
                        }
                    }

                    json.SafeAdd("name", repoName);
                }

                json.SafeMerge(
                    "x_netkan_version_pieces",
                    JObject.FromObject(new Dictionary <string, string> {
                    { "tag", ghRelease.Tag.ToString() }
                })
                    );

                Log.DebugFormat("Transformed metadata:{0}{1}", Environment.NewLine, json);

                return(new Metadata(json));
            }
            else
            {
                Log.WarnFormat("No releases found for {0}", ghRef.Repository);
                return(metadata);
            }
        }