diff --git a/Octokit.Tests.Integration/Clients/MergingClientTests.cs b/Octokit.Tests.Integration/Clients/MergingClientTests.cs
new file mode 100644
index 00000000..a5d9d258
--- /dev/null
+++ b/Octokit.Tests.Integration/Clients/MergingClientTests.cs
@@ -0,0 +1,65 @@
+using System;
+using System.Threading.Tasks;
+using Octokit;
+using Octokit.Tests.Integration;
+using Xunit;
+
+public class MergingClientTests : IDisposable
+{
+ readonly IGitHubClient _client;
+ readonly Repository _repository;
+ readonly string _owner;
+ readonly IMergingClient _fixture;
+ readonly ICommitsClient _commitsClient;
+
+ public MergingClientTests()
+ {
+ _client = new GitHubClient(new ProductHeaderValue("OctokitTests"))
+ {
+ Credentials = Helper.Credentials
+ };
+
+ var repoName = Helper.MakeNameWithTimestamp("public-repo");
+ _fixture = _client.GitDatabase.Merging;
+ _commitsClient = _client.GitDatabase.Commit;
+ _repository = _client.Repository.Create(new NewRepository { Name = repoName, AutoInit = true }).Result;
+ _owner = _repository.Owner.Login;
+ }
+
+ [IntegrationTest]
+ public async Task CanCreateMerge()
+ {
+ var blob = new NewBlob
+ {
+ Content = "Hello World!",
+ Encoding = EncodingType.Utf8
+ };
+ var blobResult = await _client.GitDatabase.Blob.Create(_owner, _repository.Name, blob);
+
+ var newTree = new NewTree();
+ newTree.Tree.Add(new NewTreeItem
+ {
+ Type = TreeType.Blob,
+ Mode = FileMode.File,
+ Path = "README.md",
+ Sha = blobResult.Sha
+ });
+
+ var treeResult = await _client.GitDatabase.Tree.Create(_owner, _repository.Name, newTree);
+
+ var newCommit = new NewCommit("test-commit", treeResult.Sha);
+
+ var commit = await _commitsClient.Create(_owner, _repository.Name, newCommit);
+ Assert.NotNull(commit);
+
+ var newMerge = new NewMerge("master", commit.Sha, "merge commit to master from integrationtests");
+
+ var merge = await _fixture.Create(_owner, _repository.Name, newMerge);
+ Assert.NotNull(merge);
+ }
+
+ public void Dispose()
+ {
+ Helper.DeleteRepo(_repository);
+ }
+}
diff --git a/Octokit.Tests.Integration/Octokit.Tests.Integration.csproj b/Octokit.Tests.Integration/Octokit.Tests.Integration.csproj
index 2c11df59..ba5c7c37 100644
--- a/Octokit.Tests.Integration/Octokit.Tests.Integration.csproj
+++ b/Octokit.Tests.Integration/Octokit.Tests.Integration.csproj
@@ -63,6 +63,7 @@
+
diff --git a/Octokit.Tests/Clients/MargeClientTests.cs b/Octokit.Tests/Clients/MargeClientTests.cs
new file mode 100644
index 00000000..4cac3deb
--- /dev/null
+++ b/Octokit.Tests/Clients/MargeClientTests.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using NSubstitute;
+using Octokit.Tests.Helpers;
+using Xunit;
+
+namespace Octokit.Tests.Clients
+{
+ public class MargeClientTests
+ {
+ public class TheCreateMethod
+ {
+ [Fact]
+ public void PostsToTheCorrectUrl()
+ {
+ var connection = Substitute.For();
+ var client = new MergingClient(connection);
+
+ var newMerge = new NewMerge("baseBranch", "shaToMerge", "some mergingMessage");
+ client.Create("owner", "repo", newMerge);
+
+ connection.Received().Post(Arg.Is(u => u.ToString() == "repos/owner/repo/git/merges"),
+ Arg.Is(nm => nm.Base == "baseBranch"
+ && nm.Head == "shaToMerge"
+ && nm.CommitMessage == "some mergingMessage"));
+ }
+
+ [Fact]
+ public async Task EnsuresNonNullArguments()
+ {
+ var client = new MergingClient(Substitute.For());
+
+ var newMerge = new NewMerge("baseBranch", "shaToMerge", "some mergingMessage");
+ await AssertEx.Throws(async () => await client.Create(null, "name", newMerge));
+ await AssertEx.Throws(async () => await client.Create("owner", null, newMerge));
+ await AssertEx.Throws(async () => await client.Create("owner", "name", null));
+ await AssertEx.Throws(async () => await client.Create("", "name", newMerge));
+ await AssertEx.Throws(async () => await client.Create("owner", "", newMerge));
+ await AssertEx.Throws(async () => await client.Create("owner", "", null));
+ }
+ }
+
+ public class TheCtor
+ {
+ [Fact]
+ public void EnsuresArgument()
+ {
+ Assert.Throws(() => new CommitsClient(null));
+ }
+ }
+ }
+}
diff --git a/Octokit/Clients/GitDatabaseClient.cs b/Octokit/Clients/GitDatabaseClient.cs
index 4265df77..fe1be7c8 100644
--- a/Octokit/Clients/GitDatabaseClient.cs
+++ b/Octokit/Clients/GitDatabaseClient.cs
@@ -19,6 +19,7 @@
Tree = new TreesClient(apiConnection);
Tag = new TagsClient(apiConnection);
Commit = new CommitsClient(apiConnection);
+ Merging = new MergingClient(apiConnection);
Reference = new ReferencesClient(apiConnection);
}
@@ -26,6 +27,7 @@
public ITreesClient Tree { get; private set; }
public ITagsClient Tag { get; private set; }
public ICommitsClient Commit { get; private set; }
+ public IMergingClient Merging { get; private set; }
public IReferencesClient Reference { get; private set; }
}
}
\ No newline at end of file
diff --git a/Octokit/Clients/IGitDatabaseClient.cs b/Octokit/Clients/IGitDatabaseClient.cs
index 328fde5f..0ff1306d 100644
--- a/Octokit/Clients/IGitDatabaseClient.cs
+++ b/Octokit/Clients/IGitDatabaseClient.cs
@@ -12,6 +12,7 @@
ITagsClient Tag { get; }
ITreesClient Tree { get; }
ICommitsClient Commit { get; }
+ IMergingClient Merging { get; }
IReferencesClient Reference { get; }
}
}
\ No newline at end of file
diff --git a/Octokit/Helpers/ApiUrls.cs b/Octokit/Helpers/ApiUrls.cs
index 7a980458..0927bba3 100644
--- a/Octokit/Helpers/ApiUrls.cs
+++ b/Octokit/Helpers/ApiUrls.cs
@@ -799,7 +799,7 @@ namespace Octokit
///
public static Uri CreateMerge(string owner, string name)
{
- return "repos/{0}/{1}/git/merges".FormatUri(owner, name);
+ return "repos/{0}/{1}/merges".FormatUri(owner, name);
}
///
diff --git a/Octokit/Models/Response/Merge.cs b/Octokit/Models/Response/Merge.cs
new file mode 100644
index 00000000..91a150b5
--- /dev/null
+++ b/Octokit/Models/Response/Merge.cs
@@ -0,0 +1,16 @@
+using System.Collections.Generic;
+using System.Diagnostics;
+
+namespace Octokit
+{
+ [DebuggerDisplay("{DebuggerDisplay,nq}")]
+ public class Merge : GitReference
+ {
+ public string Message { get; set; }
+ public Signature Author { get; set; }
+ public Signature Committer { get; set; }
+ public GitReference Tree { get; set; }
+ public IEnumerable Parents { get; set; }
+ public int CommentCount { get; set; }
+ }
+}
\ No newline at end of file