Skip to content

Commit 385bbf0

Browse files
committed
create new pathset converter
1 parent d58a61c commit 385bbf0

File tree

12 files changed

+278
-78
lines changed

12 files changed

+278
-78
lines changed

.run/Application - 1.run.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<env name="FLOWCI_SERVER_PORT" value="8080" />
1515
<env name="FLOWCI_TEMPLATES" value="https://raw.githubusercontent.com/FlowCI/templates/develop/templates.json" />
1616
<env name="FLOWCI_AGENT_IMAGE" value="flowci/agent:dev" />
17-
<env name="FLOWCI_SERVER_URL" value="http://192.168.31.110:8080" />
17+
<env name="FLOWCI_SERVER_URL" value="http://192.168.31.173:8080" />
1818
</envs>
1919
<method v="2">
2020
<option name="Make" enabled="true" />

core/src/main/java/com/flowci/core/common/domain/GitSource.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,6 @@ public enum GitSource {
2727
GOGS,
2828

2929
GITEE,
30+
31+
GERRIT
3032
}

core/src/main/java/com/flowci/core/githook/controller/GithookController.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,21 @@ public class GithookController {
6262
@Autowired
6363
private TriggerConverter giteeConverter;
6464

65+
@Autowired
66+
private TriggerConverter gerritConverter;
67+
6568
@Autowired
6669
private SpringEventManager eventManager;
6770

68-
private final Map<GitSource, TriggerConverter> converterMap = new HashMap<>(3);
71+
private final Map<GitSource, TriggerConverter> converterMap = new HashMap<>(5);
6972

7073
@PostConstruct
7174
public void createMapping() {
7275
converterMap.put(GitSource.GITHUB, gitHubConverter);
7376
converterMap.put(GitSource.GITLAB, gitLabConverter);
7477
converterMap.put(GitSource.GOGS, gogsConverter);
7578
converterMap.put(GitSource.GITEE, giteeConverter);
79+
converterMap.put(GitSource.GERRIT, gerritConverter);
7680
}
7781

7882
/**
@@ -134,6 +138,15 @@ private GitSourceWithEvent findGitSourceByHeader(HttpServletRequest request) {
134138
return obj;
135139
}
136140

141+
// gerrit
142+
String gerritUrl = request.getHeader(GerritConverter.Header);
143+
// TODO: verify gerrit url
144+
if (StringHelper.hasValue(gerritUrl)) {
145+
obj.source = GitSource.GERRIT;
146+
obj.event = GerritConverter.AllEvent;
147+
return obj;
148+
}
149+
137150
throw new ArgumentException("Unsupported git event");
138151
}
139152

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
package com.flowci.core.githook.converter;
2+
3+
import com.flowci.core.common.domain.GitSource;
4+
import com.flowci.core.githook.domain.GitPatchSetTrigger;
5+
import com.flowci.core.githook.domain.GitTrigger;
6+
import com.flowci.core.githook.domain.GitTriggerable;
7+
import com.flowci.core.githook.domain.GitUser;
8+
import com.flowci.util.StringHelper;
9+
import com.google.common.collect.ImmutableMap;
10+
import lombok.extern.log4j.Log4j2;
11+
import org.springframework.stereotype.Component;
12+
13+
import java.io.IOException;
14+
import java.io.InputStream;
15+
import java.util.Map;
16+
import java.util.Objects;
17+
import java.util.function.Function;
18+
19+
@Log4j2
20+
@Component("gerritConverter")
21+
public class GerritConverter extends TriggerConverter {
22+
23+
public static final String Header = "x-origin-url";
24+
public static final String AllEvent = "all";
25+
26+
private static final String EventPathsetCreated = "patchset-created";
27+
private static final String EventRefUpdated = "ref-updated";
28+
private static final String EventChangeMerged = "change-merged";
29+
30+
private final Map<String, Function<InputStream, GitTrigger>> mapping =
31+
ImmutableMap.<String, Function<InputStream, GitTrigger>>builder()
32+
.put(AllEvent, new AllEventsConverter())
33+
.build();
34+
35+
@Override
36+
GitSource getGitSource() {
37+
return GitSource.GERRIT;
38+
}
39+
40+
@Override
41+
Map<String, Function<InputStream, GitTrigger>> getMapping() {
42+
return mapping;
43+
}
44+
45+
private class AllEventsConverter implements Function<InputStream, GitTrigger> {
46+
47+
@Override
48+
public GitTrigger apply(InputStream inputStream) {
49+
try {
50+
String payload = StringHelper.toString(inputStream);
51+
Event event = objectMapper.readValue(payload, Event.class);
52+
53+
if (Objects.equals(EventPathsetCreated, event.type)) {
54+
PatchSetCreateEvent pce = objectMapper.readValue(payload, PatchSetCreateEvent.class);
55+
return pce.toTrigger();
56+
}
57+
58+
log.warn("Unsupported gerrit event {}", event.type);
59+
} catch (IOException e) {
60+
log.warn("Unable to parse gerrit payload");
61+
}
62+
63+
return null;
64+
}
65+
}
66+
67+
/**
68+
* Basic event type
69+
* "type": "ref-updated",
70+
* "eventCreatedOn": 1642345678
71+
*/
72+
private static class Event {
73+
74+
public String type;
75+
}
76+
77+
private static class PatchSetCreateEvent implements GitTriggerable {
78+
79+
public PathSet pathSet;
80+
81+
public Change change;
82+
83+
@Override
84+
public GitTrigger toTrigger() {
85+
GitPatchSetTrigger t = new GitPatchSetTrigger();
86+
t.setSource(GitSource.GERRIT);
87+
t.setEvent(GitTrigger.GitEvent.PATCHSET_UPDATE);
88+
89+
t.setSubject(change.subject);
90+
t.setMessage(change.commitMessage);
91+
t.setProject(change.project);
92+
t.setBranch(change.branch);
93+
t.setChangeId(change.id);
94+
t.setChangeNumber(change.number);
95+
t.setChangeUrl(change.url);
96+
97+
t.setPatchNumber(pathSet.number);
98+
t.setPatchUrl(change.url + "/" + pathSet.number);
99+
t.setRevision(pathSet.revision);
100+
t.setRef(pathSet.ref);
101+
t.setCreatedOn(pathSet.createdOn);
102+
t.setAuthor(pathSet.author.toGitUser());
103+
t.setSizeInsertions(pathSet.sizeInsertions);
104+
t.setSizeDeletions(pathSet.sizeDeletions);
105+
106+
return t;
107+
}
108+
}
109+
110+
private static class PathSet {
111+
112+
public Integer number;
113+
114+
public String revision;
115+
116+
public String ref;
117+
118+
public Author uploader;
119+
120+
public Author author;
121+
122+
public String createdOn;
123+
124+
public Integer sizeInsertions;
125+
126+
public Integer sizeDeletions;
127+
}
128+
129+
public static class Change {
130+
131+
public String project;
132+
133+
public String branch;
134+
135+
public String id;
136+
137+
public Integer number;
138+
139+
public String subject;
140+
141+
public String url;
142+
143+
public String commitMessage;
144+
}
145+
146+
private static class Author {
147+
148+
public String name;
149+
150+
public String email;
151+
152+
public String username;
153+
154+
public GitUser toGitUser() {
155+
var user = new GitUser();
156+
user.setName(name);
157+
user.setEmail(email);
158+
user.setUsername(username);
159+
return user;
160+
}
161+
}
162+
}

core/src/main/java/com/flowci/core/githook/converter/GiteeConverter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ public class GiteeConverter extends TriggerConverter {
5252

5353
private final Map<String, Function<InputStream, GitTrigger>> mapping =
5454
ImmutableMap.<String, Function<InputStream, GitTrigger>>builder()
55-
.put(Ping, new EventConverter<>("Ping", GiteeConverter.PingEvent.class))
55+
.put(Ping, new EventConverter<>("Ping", PingEvent.class))
5656
.put(Push, new EventConverter<>("Push", PushTagEvent.class))
5757
.put(Tag, new EventConverter<>("Tag", PushTagEvent.class))
58-
.put(PR, new EventConverter<>("PR", GiteeConverter.PrEvent.class))
58+
.put(PR, new EventConverter<>("PR", PrEvent.class))
5959
.build();
6060

6161
@Override

core/src/main/java/com/flowci/core/githook/converter/TriggerConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
public abstract class TriggerConverter {
3939

4040
@Autowired
41-
private ObjectMapper objectMapper;
41+
protected ObjectMapper objectMapper;
4242

4343
public Optional<GitTrigger> convert(String event, InputStream body) {
4444
try {
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.flowci.core.githook.domain;
2+
3+
import com.flowci.util.StringHelper;
4+
import lombok.Getter;
5+
import lombok.Setter;
6+
7+
/**
8+
* Git trigger to handle gerrit patchset-created event
9+
*/
10+
@Getter
11+
@Setter
12+
public class GitPatchSetTrigger extends GitTrigger {
13+
14+
private String subject;
15+
16+
private String message; // commit message
17+
18+
private String project;
19+
20+
private String branch;
21+
22+
private String changeId;
23+
24+
private Integer changeNumber;
25+
26+
private String changeUrl;
27+
28+
private Integer patchNumber;
29+
30+
private String patchUrl;
31+
32+
private String revision;
33+
34+
private String ref;
35+
36+
private String createdOn;
37+
38+
private Integer sizeInsertions;
39+
40+
private Integer sizeDeletions;
41+
42+
private GitUser author;
43+
44+
@Override
45+
public boolean isSkip() {
46+
return StringHelper.hasValue(message) && message.contains(SkipMessage);
47+
}
48+
49+
@Override
50+
public String getId() {
51+
return buildId(project, branch, changeId, String.valueOf(patchNumber));
52+
}
53+
54+
@Override
55+
public boolean equals(Object o) {
56+
return super.equals(o);
57+
}
58+
}

core/src/main/java/com/flowci/core/githook/domain/GitPrTrigger.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -90,22 +90,6 @@ public String getId() {
9090
return buildId(getSource().name(), getEvent().name(), getNumber());
9191
}
9292

93-
@Override
94-
public boolean equals(Object o) {
95-
if (this == o) return true;
96-
if (o == null || getClass() != o.getClass()) return false;
97-
98-
GitPrTrigger t = (GitPrTrigger) o;
99-
return Objects.equals(getSource(), t.getSource())
100-
&& Objects.equals(getEvent(), t.getEvent())
101-
&& Objects.equals(getNumber(), t.getNumber());
102-
}
103-
104-
@Override
105-
public int hashCode() {
106-
return Objects.hash(getSource(), getEvent(), getNumber());
107-
}
108-
10993
@Getter
11094
@Setter
11195
public static class Source {

core/src/main/java/com/flowci/core/githook/domain/GitPushTrigger.java

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -83,22 +83,4 @@ public boolean isSkip() {
8383
public String getId() {
8484
return buildId(getSource().name(), getEvent().name(), repoId, ref, commits.get(0).getId());
8585
}
86-
87-
@Override
88-
public boolean equals(Object o) {
89-
if (this == o) return true;
90-
if (o == null || getClass() != o.getClass()) return false;
91-
92-
GitPushTrigger t = (GitPushTrigger) o;
93-
return Objects.equals(getSource(), t.getSource())
94-
&& Objects.equals(getEvent(), t.getEvent())
95-
&& Objects.equals(repoId, t.getRepoId())
96-
&& Objects.equals(ref, t.getRef())
97-
&& Objects.equals(commits.get(0), t.getCommits().get(0));
98-
}
99-
100-
@Override
101-
public int hashCode() {
102-
return Objects.hash(getSource(), getEvent(), repoId, ref, commits.get(0).hashCode());
103-
}
10486
}

core/src/main/java/com/flowci/core/githook/domain/GitTagTrigger.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,4 @@ public boolean isSkip() {
2323
public String getId() {
2424
return buildId(getSource().name(), getEvent().name(), getRepoId(), getRef());
2525
}
26-
27-
@Override
28-
public boolean equals(Object o) {
29-
if (this == o) return true;
30-
if (o == null || getClass() != o.getClass()) return false;
31-
32-
GitTagTrigger t = (GitTagTrigger) o;
33-
return Objects.equals(getSource(), t.getSource())
34-
&& Objects.equals(getEvent(), t.getEvent())
35-
&& Objects.equals(getRepoId(), t.getRepoId())
36-
&& Objects.equals(getRef(), t.getRef());
37-
}
38-
39-
@Override
40-
public int hashCode() {
41-
return Objects.hash(getSource(), getEvent(), getRepoId(), getRef());
42-
}
4326
}

0 commit comments

Comments
 (0)