Skip to content

Commit 294dbe6

Browse files
authored
Merge pull request #505 from evoToBetter/master
[JENKINS-55342] Add hashtags support in Jenkins building parameters
2 parents 34dd473 + eccef61 commit 294dbe6

24 files changed

+957
-106
lines changed

docs/README.adoc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ contents should follow this syntax:
144144
----
145145
p=some/project
146146
b^**/master/*
147+
t~.*
148+
h~.*
147149
f~.*\.txt
148150
p=some/other/project
149151
b^**
@@ -153,6 +155,8 @@ Explanation:
153155

154156
p for project +
155157
b for branch +
158+
t for topic +
159+
h for hashtags +
156160
f for file +
157161
= for plain syntax +
158162
^ for ANT style syntax +

src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritDynamicUrlProcessor.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.CompareType;
2929
import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.FilePath;
3030
import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.GerritProject;
31+
import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Hashtag;
3132
import com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.data.Topic;
3233

3334
import org.kohsuke.accmod.Restricted;
@@ -63,6 +64,7 @@ public final class GerritDynamicUrlProcessor {
6364
private static final String SHORTNAME_PROJECT = "p";
6465
private static final String SHORTNAME_BRANCH = "b";
6566
private static final String SHORTNAME_TOPIC = "t";
67+
private static final String SHORTNAME_HASHTAG = "h";
6668
private static final String SHORTNAME_FILE = "f";
6769
private static final String SHORTNAME_FORBIDDEN_FILE = "o";
6870
private static final int SOCKET_READ_TIMEOUT = 10000;
@@ -89,6 +91,7 @@ private static Pattern buildLinePattern() {
8991
+ SHORTNAME_PROJECT
9092
+ "|" + SHORTNAME_BRANCH
9193
+ "|" + SHORTNAME_TOPIC
94+
+ "|" + SHORTNAME_HASHTAG
9295
+ "|" + SHORTNAME_FILE
9396
+ "|" + SHORTNAME_FORBIDDEN_FILE
9497
+ ")";
@@ -141,6 +144,7 @@ private static List<GerritProject> readAndParseTriggerConfig(BufferedReader read
141144
List<GerritProject> dynamicGerritProjects = new ArrayList<GerritProject>();
142145
List<Branch> branches = null;
143146
List<Topic> topics = null;
147+
List<Hashtag> hashtags = null;
144148
List<FilePath> filePaths = null;
145149
List<FilePath> forbiddenFilePaths = null;
146150
GerritProject dynamicGerritProject = null;
@@ -192,9 +196,11 @@ private static List<GerritProject> readAndParseTriggerConfig(BufferedReader read
192196

193197
branches = new ArrayList<Branch>();
194198
topics = new ArrayList<Topic>();
199+
hashtags = new ArrayList<>();
195200
filePaths = new ArrayList<FilePath>();
196201
forbiddenFilePaths = new ArrayList<FilePath>();
197-
dynamicGerritProject = new GerritProject(type, text, branches, topics, filePaths, forbiddenFilePaths, false);
202+
dynamicGerritProject = new GerritProject(type, text, branches, topics,
203+
filePaths, forbiddenFilePaths, false);
198204
} else if (SHORTNAME_BRANCH.equals(item)) { // Branch
199205
if (branches == null) {
200206
throw new ParseException("Line " + lineNr + ": attempt to use 'Branch' before 'Project'", lineNr);
@@ -223,6 +229,13 @@ private static List<GerritProject> readAndParseTriggerConfig(BufferedReader read
223229
FilePath filePath = new FilePath(type, text);
224230
forbiddenFilePaths.add(filePath);
225231
dynamicGerritProject.setForbiddenFilePaths(forbiddenFilePaths);
232+
} else if (SHORTNAME_HASHTAG.equals(item)) {
233+
if (hashtags == null) {
234+
throw new ParseException("Line " + lineNr + ": attempt to use 'hashtag' before 'Project'", lineNr);
235+
}
236+
Hashtag hashtag = new Hashtag(type, text);
237+
hashtags.add(hashtag);
238+
dynamicGerritProject.setHashtags(hashtags);
226239
}
227240
}
228241

src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritTrigger.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -953,12 +953,12 @@ private boolean isChangeInteresting(Change change, GerritProject project, Gerrit
953953
|| (project.getForbiddenFilePaths() != null && project.getForbiddenFilePaths().size() > 0));
954954

955955
if (isFileTriggerEnabled() && containsFilePathsOrForbiddenFilePaths) {
956-
if (project.isInteresting(change.getProject(), change.getBranch(), change.getTopic(),
956+
if (project.isInteresting(change,
957957
() -> change.getFiles(gerritQueryHandler))) {
958958
shouldTrigger = true;
959959
}
960960
} else {
961-
if (project.isInteresting(change.getProject(), change.getBranch(), change.getTopic())) {
961+
if (project.isInteresting(change)) {
962962
shouldTrigger = true;
963963
}
964964
}
@@ -1167,9 +1167,10 @@ public boolean isInteresting(GerritTriggeredEvent event) {
11671167
}
11681168
} else if (event instanceof RefUpdated) {
11691169
RefUpdated refUpdated = (RefUpdated)event;
1170-
if (p.isInteresting(refUpdated.getRefUpdate().getProject(),
1171-
refUpdated.getRefUpdate().getRefName(),
1172-
null)) {
1170+
Change change = new Change();
1171+
change.setProject(refUpdated.getRefUpdate().getProject());
1172+
change.setBranch(refUpdated.getRefUpdate().getRefName());
1173+
if (p.isInteresting(change)) {
11731174
logger.trace("According to {} the event is interesting; event: {}", p, event);
11741175
return true;
11751176
}

src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/GerritTriggerParameters.java

Lines changed: 84 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import com.sonymobile.tools.gerrit.gerritevents.dto.events.ChangeRestored;
4141
import com.sonymobile.tools.gerrit.gerritevents.dto.events.CommentAdded;
4242
import com.sonymobile.tools.gerrit.gerritevents.dto.events.GerritTriggeredEvent;
43+
import com.sonymobile.tools.gerrit.gerritevents.dto.events.HashtagsChanged;
4344
import com.sonymobile.tools.gerrit.gerritevents.dto.events.RefUpdated;
4445
import com.sonymobile.tools.gerrit.gerritevents.dto.events.TopicChanged;
4546
import hudson.model.Job;
@@ -58,6 +59,7 @@
5859
import java.util.List;
5960
import java.util.Set;
6061
import java.util.TreeSet;
62+
import java.util.stream.Collectors;
6163

6264
/**
6365
* The parameters to add to a build.
@@ -253,7 +255,19 @@ public enum GerritTriggerParameters {
253255
/**
254256
* Updated approvals.
255257
*/
256-
GERRIT_EVENT_UPDATED_APPROVALS;
258+
GERRIT_EVENT_UPDATED_APPROVALS,
259+
/**
260+
* Hashtags posted to Gerrit in a change based event.
261+
*/
262+
GERRIT_HASHTAGS,
263+
/**
264+
* Hashtags removed to Gerrit in a hashtags-changed event.
265+
*/
266+
GERRIT_REMOVED_HASHTAGS,
267+
/**
268+
* Hashtags added to Gerrit in a hashtags-changed event.
269+
*/
270+
GERRIT_ADDED_HASHTAGS;
257271

258272
private static final Logger logger = LoggerFactory.getLogger(GerritTriggerParameters.class);
259273

@@ -408,6 +422,65 @@ public static void setOrCreateParameters(GerritTriggeredEvent gerritEvent, Job p
408422
parameters, String.valueOf(((java.lang.Object)gerritEvent).hashCode()), escapeQuotes);
409423
if (gerritEvent instanceof ChangeBasedEvent) {
410424
ChangeBasedEvent event = (ChangeBasedEvent)gerritEvent;
425+
setOrCreateParametersForChangeBasedEvent(event, parameters, escapeQuotes, nameAndEmailParameterMode,
426+
changeSubjectMode, project, commitMessageMode, commentTextMode);
427+
} else if (gerritEvent instanceof RefUpdated) {
428+
RefUpdated event = (RefUpdated)gerritEvent;
429+
GERRIT_REFNAME.setOrCreateStringParameterValue(
430+
parameters, event.getRefUpdate().getRefName(), escapeQuotes);
431+
GERRIT_PROJECT.setOrCreateStringParameterValue(
432+
parameters, event.getRefUpdate().getProject(), escapeQuotes);
433+
GERRIT_OLDREV.setOrCreateStringParameterValue(
434+
parameters, event.getRefUpdate().getOldRev(), escapeQuotes);
435+
GERRIT_NEWREV.setOrCreateStringParameterValue(
436+
parameters, event.getRefUpdate().getNewRev(), escapeQuotes);
437+
}
438+
Account account = gerritEvent.getAccount();
439+
if (account != null) {
440+
nameAndEmailParameterMode.setOrCreateParameterValue(GERRIT_EVENT_ACCOUNT, parameters,
441+
getNameAndEmail(account), ParameterMode.PlainMode.STRING, escapeQuotes);
442+
GERRIT_EVENT_ACCOUNT_NAME.setOrCreateStringParameterValue(
443+
parameters, getName(account), escapeQuotes);
444+
GERRIT_EVENT_ACCOUNT_EMAIL.setOrCreateStringParameterValue(
445+
parameters, getEmail(account), escapeQuotes);
446+
}
447+
Provider provider = gerritEvent.getProvider();
448+
if (provider != null) {
449+
GERRIT_NAME.setOrCreateStringParameterValue(
450+
parameters, provider.getName(), escapeQuotes);
451+
GERRIT_HOST.setOrCreateStringParameterValue(
452+
parameters, provider.getHost(), escapeQuotes);
453+
GERRIT_PORT.setOrCreateStringParameterValue(
454+
parameters, provider.getPort(), escapeQuotes);
455+
GERRIT_SCHEME.setOrCreateStringParameterValue(
456+
parameters, provider.getScheme(), escapeQuotes);
457+
GERRIT_VERSION.setOrCreateStringParameterValue(
458+
parameters, provider.getVersion(), escapeQuotes);
459+
}
460+
}
461+
462+
/**
463+
* To avoid setOrCreateParameters too long,
464+
* move change based event related function to separate method.
465+
* Set or Create parameters for change based event.
466+
*
467+
* @param event ChangeBasedEvent
468+
* @param parameters jenkins job parameters
469+
* @param escapeQuotes do escape quotes or not
470+
* @param nameAndEmailParameterMode mode for name and email
471+
* @param changeSubjectMode mode for change subject
472+
* @param project jenkins job
473+
* @param commitMessageMode mode for commit message
474+
* @param commentTextMode mode for comment text
475+
*/
476+
private static void setOrCreateParametersForChangeBasedEvent(ChangeBasedEvent event,
477+
List<ParameterValue> parameters,
478+
boolean escapeQuotes,
479+
ParameterMode nameAndEmailParameterMode,
480+
ParameterMode changeSubjectMode,
481+
Job project,
482+
ParameterMode commitMessageMode,
483+
ParameterMode commentTextMode) {
411484
GERRIT_CHANGE_WIP_STATE.setOrCreateStringParameterValue(
412485
parameters, String.valueOf(event.getChange().isWip()), escapeQuotes);
413486
GERRIT_CHANGE_PRIVATE_STATE.setOrCreateStringParameterValue(
@@ -420,6 +493,8 @@ public static void setOrCreateParameters(GerritTriggeredEvent gerritEvent, Job p
420493
parameters, event.getChange().getNumber(), escapeQuotes);
421494
GERRIT_CHANGE_ID.setOrCreateStringParameterValue(
422495
parameters, event.getChange().getId(), escapeQuotes);
496+
GERRIT_HASHTAGS.setOrCreateStringParameterValue(
497+
parameters, String.join(",", event.getChange().getHashtags()), escapeQuotes);
423498
String pNumber = null;
424499
if (null != event.getPatchSet()) {
425500
pNumber = event.getPatchSet().getNumber();
@@ -498,40 +573,15 @@ public static void setOrCreateParameters(GerritTriggeredEvent gerritEvent, Job p
498573
parameters, comment, ParameterMode.PlainMode.TEXT, escapeQuotes);
499574
}
500575
GERRIT_EVENT_UPDATED_APPROVALS.setOrCreateStringParameterValue(parameters,
501-
getUpdatedApprovals((CommentAdded)event), false);
576+
getUpdatedApprovals((CommentAdded)event), false);
502577
}
503-
} else if (gerritEvent instanceof RefUpdated) {
504-
RefUpdated event = (RefUpdated)gerritEvent;
505-
GERRIT_REFNAME.setOrCreateStringParameterValue(
506-
parameters, event.getRefUpdate().getRefName(), escapeQuotes);
507-
GERRIT_PROJECT.setOrCreateStringParameterValue(
508-
parameters, event.getRefUpdate().getProject(), escapeQuotes);
509-
GERRIT_OLDREV.setOrCreateStringParameterValue(
510-
parameters, event.getRefUpdate().getOldRev(), escapeQuotes);
511-
GERRIT_NEWREV.setOrCreateStringParameterValue(
512-
parameters, event.getRefUpdate().getNewRev(), escapeQuotes);
513-
}
514-
Account account = gerritEvent.getAccount();
515-
if (account != null) {
516-
nameAndEmailParameterMode.setOrCreateParameterValue(GERRIT_EVENT_ACCOUNT, parameters,
517-
getNameAndEmail(account), ParameterMode.PlainMode.STRING, escapeQuotes);
518-
GERRIT_EVENT_ACCOUNT_NAME.setOrCreateStringParameterValue(
519-
parameters, getName(account), escapeQuotes);
520-
GERRIT_EVENT_ACCOUNT_EMAIL.setOrCreateStringParameterValue(
521-
parameters, getEmail(account), escapeQuotes);
522-
}
523-
Provider provider = gerritEvent.getProvider();
524-
if (provider != null) {
525-
GERRIT_NAME.setOrCreateStringParameterValue(
526-
parameters, provider.getName(), escapeQuotes);
527-
GERRIT_HOST.setOrCreateStringParameterValue(
528-
parameters, provider.getHost(), escapeQuotes);
529-
GERRIT_PORT.setOrCreateStringParameterValue(
530-
parameters, provider.getPort(), escapeQuotes);
531-
GERRIT_SCHEME.setOrCreateStringParameterValue(
532-
parameters, provider.getScheme(), escapeQuotes);
533-
GERRIT_VERSION.setOrCreateStringParameterValue(
534-
parameters, provider.getVersion(), escapeQuotes);
578+
if (event instanceof HashtagsChanged) {
579+
String addedHashtags = ((HashtagsChanged)event).getAddedHashtags().stream()
580+
.collect(Collectors.joining(","));
581+
String removedHashtags = ((HashtagsChanged)event).getRemovedHashtags().stream()
582+
.collect(Collectors.joining(","));
583+
GERRIT_ADDED_HASHTAGS.setOrCreateStringParameterValue(parameters, addedHashtags, escapeQuotes);
584+
GERRIT_REMOVED_HASHTAGS.setOrCreateStringParameterValue(parameters, removedHashtags, escapeQuotes);
535585
}
536586
}
537587

src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/hudsontrigger/data/GerritProject.java

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,12 @@
4242
import jenkins.model.Jenkins;
4343
import org.kohsuke.stapler.AncestorInPath;
4444
import org.kohsuke.stapler.DataBoundConstructor;
45+
import org.kohsuke.stapler.DataBoundSetter;
4546
import org.kohsuke.stapler.QueryParameter;
4647

4748
import com.sonyericsson.hudson.plugins.gerrit.trigger.GerritServer;
4849
import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl;
50+
import com.sonymobile.tools.gerrit.gerritevents.dto.attr.Change;
4951

5052
/**
5153
* Base settings for one matcher rule of a Gerrit project.
@@ -64,6 +66,7 @@ public class GerritProject implements Describable<GerritProject> {
6466
private List<Branch> branches;
6567
private List<FilePath> filePaths;
6668
private List<Topic> topics;
69+
private List<Hashtag> hashtags;
6770
private List<FilePath> forbiddenFilePaths;
6871
private boolean disableStrictForbiddenFileVerification;
6972

@@ -199,6 +202,23 @@ public void setTopics(List<Topic> topics) {
199202
this.topics = topics;
200203
}
201204

205+
/**
206+
*
207+
* @return the hashtags-rules
208+
*/
209+
public List<Hashtag> getHashtags() {
210+
return hashtags;
211+
}
212+
213+
/**
214+
* The list of the hashtags-rules.
215+
* @param hashtags the hashtags-rules
216+
*/
217+
@DataBoundSetter
218+
public void setHashtags(List<Hashtag> hashtags) {
219+
this.hashtags = hashtags;
220+
}
221+
202222
/**
203223
* The list of the forbidden file-path rules.
204224
* @return the forbidden file-path rules.
@@ -223,6 +243,7 @@ public void setForbiddenFilePaths(List<FilePath> forbiddenFilePaths) {
223243
* @param files a closure which returns the list of files in the change.
224244
* @return true is the rules match.
225245
*/
246+
@Deprecated
226247
public boolean isInteresting(String project, String branch, String topic, Supplier<List<String>> files) {
227248
if (isInteresting(project, branch, topic)) {
228249
return isInterestingFile(files.get());
@@ -237,11 +258,38 @@ public boolean isInteresting(String project, String branch, String topic, Suppli
237258
* @param topic the topic.
238259
* @return true is the rules match.
239260
*/
261+
@Deprecated
240262
public boolean isInteresting(String project, String branch, String topic) {
241-
if (compareType.matches(pattern, project)) {
263+
Change change = new Change();
264+
change.setProject(project);
265+
change.setBranch(branch);
266+
change.setTopic(topic);
267+
return isInteresting(change);
268+
}
269+
270+
/**
271+
* Compares the project, branch and files to see if the rules specified is a match.
272+
* @param change gerrit change info.
273+
* @param files a closure which returns the list of files in the change.
274+
* @return true is the rules match.
275+
*/
276+
public boolean isInteresting(Change change, Supplier<List<String>> files) {
277+
if (isInteresting(change)) {
278+
return isInterestingFile(files.get());
279+
}
280+
return false;
281+
}
282+
283+
/**
284+
* Compares the project and branch to see if the rules specified is a match.
285+
* @param change gerrit change info.
286+
* @return true is the rules match.
287+
*/
288+
public boolean isInteresting(Change change) {
289+
if (compareType.matches(pattern, change.getProject())) {
242290
for (Branch b : branches) {
243-
if (b.isInteresting(branch)) {
244-
return isInterestingTopic(topic);
291+
if (b.isInteresting(change.getBranch())) {
292+
return isInterestingTopic(change.getTopic()) && isInterestingHashtags(change.getHashtags());
245293
}
246294
}
247295
}
@@ -266,6 +314,19 @@ private boolean isInterestingTopic(String topic) {
266314
return true;
267315
}
268316

317+
/**
318+
* Compare tags to see if the rules specified is a match.
319+
*
320+
* @param tags the tags in change.
321+
* @return true if the rules match or no rules.
322+
*/
323+
private boolean isInterestingHashtags(List<String> tags) {
324+
if (this.hashtags != null && this.hashtags.size() > 0) {
325+
return this.hashtags.stream().anyMatch(h-> h.isInteresting(tags));
326+
}
327+
return true;
328+
}
329+
269330
/**
270331
* Compare files to see if the rules specified is a match.
271332
*

0 commit comments

Comments
 (0)