diff --git a/Octokit/Clients/IRepositoriesClient.cs b/Octokit/Clients/IRepositoriesClient.cs index 2989c610..89ae4187 100644 --- a/Octokit/Clients/IRepositoriesClient.cs +++ b/Octokit/Clients/IRepositoriesClient.cs @@ -264,5 +264,16 @@ namespace Octokit /// New values to update the repository with /// The updated Task Edit(string owner, string name, RepositoryUpdate update); + + /// + /// + /// + /// + /// + /// + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "base")] + Task Compare(string owner, string name, string @base, string head); } } diff --git a/Octokit/Clients/RepositoriesClient.cs b/Octokit/Clients/RepositoriesClient.cs index f46e65bd..2c44c10b 100644 --- a/Octokit/Clients/RepositoriesClient.cs +++ b/Octokit/Clients/RepositoriesClient.cs @@ -426,5 +426,22 @@ namespace Octokit return ApiConnection.Get(ApiUrls.RepoBranch(owner, repositoryName, branchName)); } + + /// + /// + /// + /// + /// + /// + /// + /// + public Task Compare(string owner, string name, string @base, string head) + { + Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); + Ensure.ArgumentNotNullOrEmptyString(name, "repositoryName"); + Ensure.ArgumentNotNullOrEmptyString(@base, "branchName"); + + return ApiConnection.Get(ApiUrls.RepoCompare(owner, name, @base, head)); + } } } diff --git a/Octokit/Helpers/ApiUrls.cs b/Octokit/Helpers/ApiUrls.cs index d334c34f..c422634c 100644 --- a/Octokit/Helpers/ApiUrls.cs +++ b/Octokit/Helpers/ApiUrls.cs @@ -1049,6 +1049,21 @@ namespace Octokit return "repos/{0}/{1}/tags".FormatUri(owner, name); } + /// + /// Returns the for comparing two commits. + /// + /// The owner of the repository + /// The name of the repository + /// The base commit + /// The head commit + /// + public static Uri RepoCompare(string owner, string repositoryName, string @base, string head) + { + var encodedBase = @base.UriEncode(); + var encodedHead = head.UriEncode(); + return "repos/{0}/{1}/compare/{2}...{3}".FormatUri(owner, repositoryName, encodedBase, encodedHead); + } + /// /// Returns the for a repository branch. /// diff --git a/Octokit/Helpers/StringExtensions.cs b/Octokit/Helpers/StringExtensions.cs index 7276d7af..cc8f1705 100644 --- a/Octokit/Helpers/StringExtensions.cs +++ b/Octokit/Helpers/StringExtensions.cs @@ -26,6 +26,11 @@ namespace Octokit return new Uri(string.Format(CultureInfo.InvariantCulture, pattern, args), UriKind.Relative); } + public static string UriEncode(this string input) + { + return System.Net.WebUtility.UrlEncode(input); + } + static readonly Regex _optionalQueryStringRegex = new Regex("\\{\\?([^}]+)\\}"); public static Uri ExpandUriTemplate(this string template, object values) { diff --git a/Octokit/Models/Response/CompareResult.cs b/Octokit/Models/Response/CompareResult.cs new file mode 100644 index 00000000..65e834ac --- /dev/null +++ b/Octokit/Models/Response/CompareResult.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; + +namespace Octokit +{ + public class CompareResult + { + public string Url { get; set; } + public string HtmlUrl { get; set; } + public string PermalinkUrl { get; set; } + public string DiffUrl { get; set; } + public string PatchUrl { get; set; } + public Commit BaseCommit { get; set; } + public string Status { get; set; } + public int AheadBy { get; set; } + public int BehindBy { get; set; } + public int TotalCommits { get; set; } + public IReadOnlyCollection Commits { get; set; } + } +} diff --git a/Octokit/Octokit-Mono.csproj b/Octokit/Octokit-Mono.csproj index 9fbca9f5..cd62c96c 100644 --- a/Octokit/Octokit-Mono.csproj +++ b/Octokit/Octokit-Mono.csproj @@ -310,6 +310,7 @@ + \ No newline at end of file diff --git a/Octokit/Octokit-MonoAndroid.csproj b/Octokit/Octokit-MonoAndroid.csproj index cb66cd52..c1630543 100644 --- a/Octokit/Octokit-MonoAndroid.csproj +++ b/Octokit/Octokit-MonoAndroid.csproj @@ -321,6 +321,7 @@ + \ No newline at end of file diff --git a/Octokit/Octokit-Monotouch.csproj b/Octokit/Octokit-Monotouch.csproj index 5a1d9522..603a097f 100644 --- a/Octokit/Octokit-Monotouch.csproj +++ b/Octokit/Octokit-Monotouch.csproj @@ -316,6 +316,7 @@ + \ No newline at end of file diff --git a/Octokit/Octokit-netcore45.csproj b/Octokit/Octokit-netcore45.csproj index aba7eb5d..14929305 100644 --- a/Octokit/Octokit-netcore45.csproj +++ b/Octokit/Octokit-netcore45.csproj @@ -308,6 +308,7 @@ + diff --git a/Octokit/Octokit.csproj b/Octokit/Octokit.csproj index 51c1de2d..076d7c93 100644 --- a/Octokit/Octokit.csproj +++ b/Octokit/Octokit.csproj @@ -64,6 +64,7 @@ +