Skip to content

Commit ef5eeda

Browse files
authored
Extened CreatePullRequest features (#146)
* Added check for existing PR * Use PullRequest class for object * Added body as optional input
1 parent 51ae167 commit ef5eeda

File tree

10 files changed

+112
-10
lines changed

10 files changed

+112
-10
lines changed

src/main/java/com/gitee/jenkins/gitee/api/GiteeClient.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.gitee.jenkins.gitee.api;
22

3+
import java.util.List;
4+
35
import com.gitee.jenkins.gitee.api.model.*;
46

57
public interface GiteeClient {
@@ -11,6 +13,8 @@ public interface GiteeClient {
1113

1214
User getCurrentUser();
1315

14-
void createPullRequest(String owner, String repo, String title, String base, String head);
16+
void createPullRequest(PullRequest pr);
17+
18+
List<PullRequest> getPullRequest(PullRequest pr);
1519

1620
}
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.gitee.jenkins.gitee.api.impl;
22

33

4+
import java.util.List;
5+
46
import com.gitee.jenkins.gitee.api.model.*;
57

68

@@ -9,6 +11,7 @@ interface GiteeApiProxy {
911
void createPullRequestNote(String owner, String repo, Integer pullRequestId, String body);
1012
void headCurrentUser();
1113
void acceptPullRequest(String owner, String repo, Integer pullRequestId);
12-
void createPullRequest(String owner, String repo, String title, String base, String head);
14+
void createPullRequest(String owner, String repo, String title, String base, String head, String body);
15+
List<PullRequest> getPullRequest(String owner, String repo, String base, String head);
1316
User getCurrentUser();
1417
}

src/main/java/com/gitee/jenkins/gitee/api/impl/GiteeV5ApiProxy.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.gitee.jenkins.gitee.api.impl;
22

3+
import java.util.List;
4+
35
import com.gitee.jenkins.gitee.api.model.*;
46
import jakarta.ws.rs.*;
57
import jakarta.ws.rs.core.MediaType;
@@ -38,7 +40,17 @@ void createPullRequest(@PathParam("ownerPath") String ownerPath,
3840
@PathParam("repoPath") String repoPath,
3941
@FormParam("title") String title,
4042
@FormParam("base") String base,
41-
@FormParam("head") String head);
43+
@FormParam("head") String head,
44+
@FormParam("body") String body);
45+
46+
@GET
47+
@Produces(MediaType.APPLICATION_JSON)
48+
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
49+
@Path("/repos/{ownerPath}/{repoPath}/pulls")
50+
List<PullRequest> getPullRequest(@PathParam("ownerPath") String ownerPath,
51+
@PathParam("repoPath") String repoPath,
52+
@QueryParam("base") String base,
53+
@QueryParam("head") String head);
4254

4355
@HEAD
4456
@Produces(MediaType.APPLICATION_JSON)

src/main/java/com/gitee/jenkins/gitee/api/impl/ResteasyGiteeClient.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.gitee.jenkins.gitee.api.impl;
22

33

4+
import java.util.List;
5+
46
import com.gitee.jenkins.gitee.api.GiteeClient;
57
import com.gitee.jenkins.gitee.api.model.*;
68
import com.google.common.base.Function;
@@ -35,8 +37,13 @@ public void createPullRequestNote(PullRequest mr, String body) {
3537
}
3638

3739
@Override
38-
public void createPullRequest(String owner, String repo, String title, String base, String head) {
39-
api.createPullRequest(owner, repo, title, base, head);
40+
public void createPullRequest(PullRequest pr) {
41+
api.createPullRequest(pr.getRepoOwner(), pr.getRepoPath(), pr.getTitle(), pr.getTargetBranch(), pr.getSourceBranch(), pr.getDescription());
42+
}
43+
44+
@Override
45+
public List<PullRequest> getPullRequest(PullRequest pr) {
46+
return api.getPullRequest(pr.getRepoOwner(), pr.getRepoPath(), pr.getTargetBranch(), pr.getSourceBranch());
4047
}
4148

4249
@Override

src/main/java/com/gitee/jenkins/publisher/GiteeCreatePullRequestPublisher.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import org.kohsuke.stapler.DataBoundSetter;
1010

1111
import com.gitee.jenkins.gitee.api.GiteeClient;
12+
import com.gitee.jenkins.gitee.api.model.PullRequest;
13+
import com.gitee.jenkins.gitee.api.model.builder.generated.PullRequestBuilder;
1214
import com.gitee.jenkins.util.LoggerUtil;
1315

1416
import edu.umd.cs.findbugs.annotations.NonNull;
@@ -35,6 +37,7 @@ public class GiteeCreatePullRequestPublisher extends Notifier implements MatrixA
3537
private String title;
3638
private String base;
3739
private String head;
40+
private String body;
3841
private boolean addDatetime;
3942

4043
@DataBoundConstructor
@@ -69,6 +72,10 @@ public boolean getAddDatetime() {
6972
return addDatetime;
7073
}
7174

75+
public String getBody() {
76+
return body;
77+
}
78+
7279
@DataBoundSetter
7380
public void setRepo(String repo) {
7481
this.repo = repo;
@@ -99,6 +106,11 @@ public void setAddDatetime(boolean addDatetime) {
99106
this.addDatetime = addDatetime;
100107
}
101108

109+
@DataBoundSetter
110+
public void setBody(String body) {
111+
this.body = body;
112+
}
113+
102114
@Override
103115
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener)
104116
throws InterruptedException, IOException {
@@ -115,7 +127,25 @@ public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListen
115127
}
116128

117129
if (build.getResult() == Result.SUCCESS) {
118-
client.createPullRequest(owner, repo, pullRequestTitle, base, head);
130+
PullRequest pr = PullRequestBuilder.pullRequest()
131+
.withRepoOwner(owner)
132+
.withRepoPath(repo)
133+
.withTitle(pullRequestTitle)
134+
.withSourceBranch(head)
135+
.withTargetBranch(base)
136+
.withDescription(body)
137+
.build();
138+
139+
if (!client.getPullRequest(pr).isEmpty()) {
140+
LOGGER.log(Level.INFO, "Pull request {0} -> {1} already exists", LoggerUtil.toArray(head, base));
141+
if (launcher != null) {
142+
launcher.getListener().getLogger().println("Pull request {0} -> {1} already exists");
143+
}
144+
145+
return true;
146+
}
147+
148+
client.createPullRequest(pr);
119149
LOGGER.log(Level.INFO, "Pull request {0} generated, {1} -> {2}", LoggerUtil.toArray(title, head, base));
120150
}
121151

src/main/resources/com/gitee/jenkins/publisher/GiteeCreatePullRequestPublisher/config.jelly

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,7 @@
1919
<f:entry title="${%Source.branch}" field="head">
2020
<f:textbox name="head" field="head"/>
2121
</f:entry>
22+
<f:entry title="${%body}" field="body">
23+
<f:textbox name="body" field="body"/>
24+
</f:entry>
2225
</j:jelly>

src/main/resources/com/gitee/jenkins/publisher/GiteeCreatePullRequestPublisher/config.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ Owner.name=Owner name
33
Title.of.pull.request=Title of pull request
44
Add.datetime=Add datetime (keep unique)
55
Target.branch=Target branch
6-
Source.branch=Source branch
6+
Source.branch=Source branch
7+
body=Description

src/main/resources/com/gitee/jenkins/publisher/GiteeCreatePullRequestPublisher/config_zh_CN.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ Owner.name=\u6240\u6709\u8005\u59d3\u540d
33
Title.of.pull.request=Pull Request \u6807\u9898
44
Add.datetime=\u6dfb\u52a0\u65e5\u671f\u65f6\u95f4\u0028\u4fdd\u6301\u552f\u4e00\u0029
55
Target.branch=\u76ee\u6807\u5206\u652f
6-
Source.branch=\u6e90\u5206\u652f
6+
Source.branch=\u6e90\u5206\u652f
7+
body=\u63cf\u8ff0

src/test/java/com/gitee/jenkins/publisher/GiteeCreatePullRequestPublisherTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import org.mockserver.client.MockServerClient;
2121
import org.mockserver.junit.jupiter.MockServerExtension;
2222
import org.mockserver.model.HttpRequest;
23+
import org.mockserver.model.MediaType;
24+
import org.mockserver.verify.VerificationTimes;
2325

2426
import hudson.model.BuildListener;
2527
import hudson.model.Result;
@@ -58,6 +60,9 @@ void matrixAggregatable() throws Exception {
5860
@Test
5961
void success() throws InterruptedException, IOException {
6062
HttpRequest createPullRequestStatus = prepareCreatePullRequest("v5");
63+
HttpRequest getPullRequest = prepareGetPullRequest("v5");
64+
mockServerClient.when(getPullRequest)
65+
.respond(response().withStatusCode(200).withBody("[]").withContentType(MediaType.APPLICATION_JSON));
6166
mockServerClient.when(createPullRequestStatus).respond(response().withStatusCode(200));
6267

6368
GiteeCreatePullRequestPublisher p = new GiteeCreatePullRequestPublisher();
@@ -71,6 +76,29 @@ void success() throws InterruptedException, IOException {
7176
mockServerClient.verify(createPullRequestStatus);
7277
}
7378

79+
@Test
80+
void pullRequestExists() throws InterruptedException, IOException {
81+
HttpRequest createPullRequestStatus = prepareCreatePullRequest("v5");
82+
mockServerClient.when(createPullRequestStatus).respond(response().withStatusCode(200));
83+
84+
HttpRequest getPullRequest = prepareGetPullRequest("v5");
85+
86+
GiteeCreatePullRequestPublisher p = new GiteeCreatePullRequestPublisher();
87+
p.setRepo(REPO_PATH);
88+
p.setOwner(OWNER_PATH);
89+
p.setBase("base");
90+
p.setHead("head");
91+
p.setTitle("title");
92+
93+
mockServerClient.when(getPullRequest)
94+
.respond(response().withStatusCode(200).withBody(
95+
String.format("[{ \"base\":\"%s\", \"head\":\"%s\" }]", p.getBase(), p.getHead()))
96+
.withContentType(MediaType.APPLICATION_JSON));
97+
98+
p.perform(mockSimpleBuild(GITEE_CONNECTION_V5, Result.SUCCESS), null, listener);
99+
mockServerClient.verify(createPullRequestStatus, VerificationTimes.never());
100+
}
101+
74102
@Test
75103
void failed() throws InterruptedException, IOException {
76104
GiteeCreatePullRequestPublisher p = new GiteeCreatePullRequestPublisher();
@@ -91,4 +119,11 @@ private HttpRequest prepareCreatePullRequest(String apiLevel) {
91119
.withHeader("PRIVATE-TOKEN", "secret");
92120
}
93121

122+
private HttpRequest prepareGetPullRequest(String apiLevel) {
123+
return request()
124+
.withPath(String.format("/gitee/api/%s/repos/%s/%s/pulls", apiLevel, OWNER_PATH, REPO_PATH))
125+
.withMethod("GET")
126+
.withHeader("PRIVATE-TOKEN", "secret");
127+
}
128+
94129
}

src/test/java/com/gitee/jenkins/trigger/handler/pull/PullRequestHookTriggerHandlerImplTest.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import hudson.util.OneShotEvent;
3737
import java.io.File;
3838
import java.util.Arrays;
39+
import java.util.List;
3940
import java.util.concurrent.atomic.AtomicReference;
4041
import org.eclipse.jgit.api.Git;
4142
import org.eclipse.jgit.lib.Constants;
@@ -997,8 +998,13 @@ public User getCurrentUser() {
997998
}
998999

9991000
@Override
1000-
public void createPullRequest(String owner, String repo, String title, String base, String head) {
1001-
throw new UnsupportedOperationException("Unimplemented method 'createPullRequest'");
1001+
public void createPullRequest(PullRequest pr) {
1002+
throw new UnsupportedOperationException("Unimplemented method 'createPullRequest'");
1003+
}
1004+
1005+
@Override
1006+
public List<PullRequest> getPullRequest(PullRequest pr) {
1007+
throw new UnsupportedOperationException("Unimplemented method 'createPullRequest'");
10021008
}
10031009
}
10041010

0 commit comments

Comments
 (0)