Skip to content

Commit a1960ef

Browse files
saber-wangjetersen
andauthored
add get commit statuses (#128)
Co-authored-by: Joseph Petersen <josephp90@gmail.com>
1 parent 761401e commit a1960ef

File tree

7 files changed

+169
-5
lines changed

7 files changed

+169
-5
lines changed

src/GitLabApiClient/CommitsClient.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ public sealed class CommitsClient
1515
private readonly GitLabHttpFacade _httpFacade;
1616
private readonly CommitQueryBuilder _commitQueryBuilder;
1717
private readonly CommitRefsQueryBuilder _commitRefsQueryBuilder;
18+
private readonly CommitStatusesQueryBuilder _commitStatusesQueryBuilder;
1819

19-
internal CommitsClient(GitLabHttpFacade httpFacade, CommitQueryBuilder commitQueryBuilder, CommitRefsQueryBuilder commitRefsQueryBuilder)
20+
internal CommitsClient(GitLabHttpFacade httpFacade, CommitQueryBuilder commitQueryBuilder, CommitRefsQueryBuilder commitRefsQueryBuilder, CommitStatusesQueryBuilder commitStatusesQueryBuilder)
2021
{
2122
_httpFacade = httpFacade;
2223
_commitQueryBuilder = commitQueryBuilder;
2324
_commitRefsQueryBuilder = commitRefsQueryBuilder;
25+
_commitStatusesQueryBuilder = commitStatusesQueryBuilder;
2426
}
2527

2628
/// <summary>
@@ -74,5 +76,21 @@ public async Task<IList<Diff>> GetDiffsAsync(ProjectId projectId, string sha)
7476
string url = $"projects/{projectId}/repository/commits/{sha}/diff";
7577
return await _httpFacade.GetPagedList<Diff>(url);
7678
}
79+
80+
/// <summary>
81+
/// Retrieve a list of statuses in this commit
82+
/// </summary>
83+
/// <param name="projectId">The ID, path or <see cref="Project"/> of the project.</param>
84+
/// <param name="options">Query Options <see cref="CommitStatusesQueryOptions"/>.</param>
85+
/// <param name="sha">The commit hash</param>
86+
/// <returns></returns>
87+
public async Task<IList<CommitStatuses>> GetStatusesAsync(ProjectId projectId, string sha, Action<CommitStatusesQueryOptions> options = null)
88+
{
89+
var queryOptions = new CommitStatusesQueryOptions();
90+
options?.Invoke(queryOptions);
91+
92+
string url = _commitStatusesQueryBuilder.Build($"projects/{projectId}/repository/commits/{sha}/statuses", queryOptions);
93+
return await _httpFacade.GetPagedList<CommitStatuses>(url);
94+
}
7795
}
7896
}

src/GitLabApiClient/GitLabClient.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public GitLabClient(string hostUrl, string authenticationToken = "")
5050
var tagQueryBuilder = new TagQueryBuilder();
5151
var commitQueryBuilder = new CommitQueryBuilder();
5252
var commitRefsQueryBuilder = new CommitRefsQueryBuilder();
53+
var commitStatusesQueryBuilder = new CommitStatusesQueryBuilder();
5354
var pipelineQueryBuilder = new PipelineQueryBuilder();
5455
var treeQueryBuilder = new TreeQueryBuilder();
5556
var jobQueryBuilder = new JobQueryBuilder();
@@ -64,7 +65,7 @@ public GitLabClient(string hostUrl, string authenticationToken = "")
6465
Releases = new ReleaseClient(_httpFacade, releaseQueryBuilder);
6566
Tags = new TagClient(_httpFacade, tagQueryBuilder);
6667
Webhooks = new WebhookClient(_httpFacade);
67-
Commits = new CommitsClient(_httpFacade, commitQueryBuilder, commitRefsQueryBuilder);
68+
Commits = new CommitsClient(_httpFacade, commitQueryBuilder, commitRefsQueryBuilder, commitStatusesQueryBuilder);
6869
Markdown = new MarkdownClient(_httpFacade);
6970
Pipelines = new PipelineClient(_httpFacade, pipelineQueryBuilder, jobQueryBuilder);
7071
Trees = new TreesClient(_httpFacade, treeQueryBuilder);
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using GitLabApiClient.Internal.Utilities;
2+
using GitLabApiClient.Models.Commits.Requests;
3+
4+
namespace GitLabApiClient.Internal.Queries
5+
{
6+
internal class CommitStatusesQueryBuilder : QueryBuilder<CommitStatusesQueryOptions>
7+
{
8+
protected override void BuildCore(CommitStatusesQueryOptions options)
9+
{
10+
if (!string.IsNullOrEmpty(options.Ref))
11+
Add("ref", options.Ref);
12+
13+
if (options.Name.IsNotNullOrEmpty())
14+
Add("name", options.Name);
15+
16+
if (options.Stage.IsNotNullOrEmpty())
17+
Add("stage", options.Stage);
18+
19+
if (options.All.HasValue)
20+
Add("all", options.All.Value);
21+
22+
}
23+
}
24+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace GitLabApiClient.Models.Commits.Requests
6+
{
7+
public sealed class CommitStatusesQueryOptions
8+
{
9+
public string Ref { get; set; }
10+
11+
public string Stage { get; set; }
12+
13+
public string Name { get; set; }
14+
15+
public bool? All { get; set; }
16+
17+
internal CommitStatusesQueryOptions()
18+
{
19+
}
20+
}
21+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using GitLabApiClient.Models.Releases.Responses;
5+
using Newtonsoft.Json;
6+
7+
namespace GitLabApiClient.Models.Commits.Responses
8+
{
9+
public sealed class CommitStatuses
10+
{
11+
[JsonProperty("id")]
12+
public string Id { get; set; }
13+
[JsonProperty("sha")]
14+
public string Sha { get; set; }
15+
[JsonProperty("ref")]
16+
public string Ref { get; set; }
17+
[JsonProperty("status")]
18+
public string Status { get; set; }
19+
[JsonProperty("name")]
20+
public string Name { get; set; }
21+
[JsonProperty("target_url")]
22+
public string Target_url { get; set; }
23+
[JsonProperty("description")]
24+
public string Description { get; set; }
25+
[JsonProperty("created_at")]
26+
public DateTime Created_at { get; set; }
27+
[JsonProperty("started_at")]
28+
public DateTime Started_at { get; set; }
29+
[JsonProperty("finished_at")]
30+
public DateTime Finished_at { get; set; }
31+
[JsonProperty("allow_failure")]
32+
public bool Allow_failure { get; set; }
33+
[JsonProperty("coverage")]
34+
public float Coverage { get; set; }
35+
[JsonProperty("author")]
36+
public Author Author { get; set; }
37+
38+
}
39+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System;
2+
using Newtonsoft.Json;
3+
4+
namespace GitLabApiClient.Models.Commits.Responses
5+
{
6+
public sealed class Author
7+
{
8+
[JsonProperty("id")]
9+
public int Id { get; set; }
10+
11+
[JsonProperty("state")]
12+
public string State { get; set; }
13+
14+
[JsonProperty("avatar_url")]
15+
public string AvatarUrl { get; set; }
16+
17+
[JsonProperty("name")]
18+
public string Name { get; set; }
19+
20+
[JsonProperty("created_at")]
21+
public DateTime CreatedAt { get; set; }
22+
23+
[JsonProperty("username")]
24+
public string Username { get; set; }
25+
26+
[JsonProperty("web_url")]
27+
public string WebUrl { get; set; }
28+
}
29+
}

test/GitLabApiClient.Test/CommitsClientTest.cs

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public async void GetCommitBySha()
3030
using (var client = new HttpClient(handler) { BaseAddress = new Uri(gitlabServer) })
3131
{
3232
var gitlabHttpFacade = new GitLabHttpFacade(new RequestsJsonSerializer(), client);
33-
var commitsClient = new CommitsClient(gitlabHttpFacade, new CommitQueryBuilder(), new CommitRefsQueryBuilder());
33+
var commitsClient = new CommitsClient(gitlabHttpFacade, new CommitQueryBuilder(), new CommitRefsQueryBuilder(), new CommitStatusesQueryBuilder());
3434

3535
var commitFromClient = await commitsClient.GetAsync(projectId, sha);
3636
commitFromClient.Id.Should().BeEquivalentTo(sha);
@@ -52,7 +52,7 @@ public async void GetCommitsByRefName()
5252
using (var client = new HttpClient(handler) { BaseAddress = new Uri(gitlabServer) })
5353
{
5454
var gitlabHttpFacade = new GitLabHttpFacade(new RequestsJsonSerializer(), client);
55-
var commitsClient = new CommitsClient(gitlabHttpFacade, new CommitQueryBuilder(), new CommitRefsQueryBuilder());
55+
var commitsClient = new CommitsClient(gitlabHttpFacade, new CommitQueryBuilder(), new CommitRefsQueryBuilder(), new CommitStatusesQueryBuilder());
5656

5757
var commitsFromClient = await commitsClient.GetAsync(projectId, o => o.RefName = refName);
5858
commitsFromClient[0].Id.Should().BeEquivalentTo("id1");
@@ -76,7 +76,7 @@ public async void GetDiffsForCommit()
7676
using (var client = new HttpClient(handler) { BaseAddress = new Uri(gitlabServer) })
7777
{
7878
var gitlabHttpFacade = new GitLabHttpFacade(new RequestsJsonSerializer(), client);
79-
var commitsClient = new CommitsClient(gitlabHttpFacade, new CommitQueryBuilder(), new CommitRefsQueryBuilder());
79+
var commitsClient = new CommitsClient(gitlabHttpFacade, new CommitQueryBuilder(), new CommitRefsQueryBuilder(), new CommitStatusesQueryBuilder());
8080

8181
var diffsFromClient = await commitsClient.GetDiffsAsync(projectId, sha);
8282
diffsFromClient[0].DiffText.Should().BeEquivalentTo("diff1");
@@ -99,5 +99,37 @@ public async void GetDiffsForCommit()
9999

100100
}
101101
}
102+
103+
[Fact]
104+
public async void GetStatusesForCommit()
105+
{
106+
string gitlabServer = "http://fake-gitlab.com/";
107+
string projectId = "id";
108+
string sha = "6104942438c14ec7bd21c6cd5bd995272b3faff6";
109+
string Name = "name1";
110+
string url = $"/projects/id/repository/commits/{sha}/statuses?name={Name}&per_page=100&page=1";
111+
112+
var handler = A.Fake<MockHandler>(opt => opt.CallsBaseMethods());
113+
A.CallTo(() => handler.SendAsync(HttpMethod.Get, url))
114+
.ReturnsLazily(() => HttpResponseMessageProducer.Success(
115+
$"[ {{\"id\":1,\"sha\":\"{sha}\",\"ref \":\"\",\"status\":\"success\",\"name\":\"name1\",\"target_url\":\"target_url1\",\"description\":\"success\",\"created_at\":\"2020-04-08T11:57:49.136+05:30\",\"started_at\":\"2020-04-08T11:58:00.362+05:30\",\"finished_at\":\"2020-04-08T11:58:06.121+05:30\",\"allow_failure\":false,\"coverage\":null,\"author\":{{\"id\":1,\"name\":\"name\",\"username\":\"username\",\"state\":\"active\",\"avatar_url\":\"avatar_url1\",\"web_url\":\"web_url1\"}} }},{{\"id\":2,\"sha\":\"{sha}\",\"ref \":\"\",\"status\":\"success\",\"name\":\"name2\",\"target_url\":\"target_url2\",\"description\":\"success\",\"created_at\":\"2020-04-08T11:57:49.136+05:30\",\"started_at\":\"2020-04-08T11:58:00.362+05:30\",\"finished_at\":\"2020-04-08T11:58:06.121+05:30\",\"allow_failure\":false,\"coverage\":null,\"author\":{{\"id\":2,\"name\":\"name2\",\"username\":\"username2\",\"state\":\"activ2\",\"avatar_url2\":\"avatar_url2\",\"web_url\":\"web_url2\"}} }}]"));
116+
using (var client = new HttpClient(handler) { BaseAddress = new Uri(gitlabServer) })
117+
{
118+
var gitlabHttpFacade = new GitLabHttpFacade(new RequestsJsonSerializer(), client);
119+
var commitsClient = new CommitsClient(gitlabHttpFacade, new CommitQueryBuilder(), new CommitRefsQueryBuilder(), new CommitStatusesQueryBuilder());
120+
121+
var statusesFromClient = await commitsClient.GetStatusesAsync(projectId, sha, o => o.Name = Name);
122+
statusesFromClient[0].Status.Should().BeEquivalentTo("success");
123+
statusesFromClient[0].Name.Should().BeEquivalentTo("name1");
124+
statusesFromClient[0].Target_url.Should().BeEquivalentTo("target_url1");
125+
statusesFromClient[0].Id.Should().BeEquivalentTo("1");
126+
127+
statusesFromClient[1].Status.Should().BeEquivalentTo("success");
128+
statusesFromClient[1].Name.Should().BeEquivalentTo("name2");
129+
statusesFromClient[1].Target_url.Should().BeEquivalentTo("target_url2");
130+
statusesFromClient[1].Id.Should().BeEquivalentTo("2");
131+
132+
}
133+
}
102134
}
103135
}

0 commit comments

Comments
 (0)