public IRepository GetRepository(IRepositoryUrl repositoryUrl) { using (WebClient webClient = CreateWebClient()) { HtmlDocument htmlDocument = new HtmlDocument(); htmlDocument.LoadHtml(webClient.DownloadString(repositoryUrl.CodeUrl)); string defaultDownloadUrl = $"{GitHubUtilities.RootUrl}{repositoryUrl.Owner}/{repositoryUrl.RepositoryName}/archive/{(string.IsNullOrWhiteSpace(repositoryUrl.BranchName) ? "master" : repositoryUrl.BranchName)}.zip"; string downloadUrl = GitHubUtilities.RootUrl.TrimEnd('/') + htmlDocument.DocumentNode.SelectNodes(@"//a[contains(.,'Download ZIP')]").FirstOrDefault()?.GetAttributeValue("href", string.Empty); return(new Repository() { Url = repositoryUrl, DownloadUrl = downloadUrl.EndsWith("/") ? defaultDownloadUrl : downloadUrl, }); } }
public IEnumerable <IRelease> GetReleases(IRepositoryUrl repositoryUrl, int numberOfReleases) { string nextPageUrl = repositoryUrl.ReleasesUrl; List <IRelease> releases = new List <IRelease>(); using (WebClient webClient = CreateWebClient()) { HtmlDocument htmlDocument = new HtmlDocument(); while (releases.Count() < numberOfReleases) { htmlDocument.LoadHtml(webClient.DownloadString(repositoryUrl.ReleasesUrl)); IEnumerable <HtmlNode> releaseEntryNodes = htmlDocument.DocumentNode.SelectNodes(@"//div[@class='release-entry']"); if (releaseEntryNodes.Count() <= 0) { break; } releases.AddRange(releaseEntryNodes.Select(node => ParseReleaseEntry(node))); // Go the next page of releases. if (releases.Count() < numberOfReleases) { nextPageUrl = htmlDocument.DocumentNode.SelectNodes(@"//a[text()='Next']").FirstOrDefault()?.GetAttributeValue("href", string.Empty); if (string.IsNullOrWhiteSpace(nextPageUrl)) { break; } } } } return(releases.Take(numberOfReleases)); }
public static IRelease GetLatestRelease(this IGitHubClient gitHubClient, IRepositoryUrl repositoryUrl) { return(gitHubClient.GetReleases(repositoryUrl, 1).FirstOrDefault()); }