in merge-pull-request-trigger-server/src/main/java/org/jetbrains/teamcity/MergePullRequestTrigger.java [43:101]
public BuildTriggeringPolicy getBuildTriggeringPolicy() {
return new PolledBuildTrigger() {
@Override
public void triggerBuild(@NotNull PolledTriggerContext ctx) throws BuildTriggerException {
SBuildType buildType = ctx.getBuildType();
CustomDataStorage storage = ctx.getCustomDataStorage();
Set<String> branchesToTrigger = new HashSet<String>();
for (VcsRootInstance root : buildType.getVcsRootInstances()) {
BranchSpec branchSpec = ((BuildTypeEx)buildType).getBranchSpec(root);
RepositoryState state = ((VcsRootInstanceEx)root).getLastUsedState();
for (Map.Entry<String, String> branchRevision : state.getBranchRevisions().entrySet()) {
String branch = branchRevision.getKey();
String currentRevision = branchRevision.getValue();
String prNum = getPrNum(branch);
if (prNum != null) {
String prevRevision = readSavedRevision(storage, root, branch);
if (!currentRevision.equals(prevRevision)) {
LOG.debug("Pull request revision updated, VCS root " + LogUtil.describe(root) + ", branch " + branch + ": " + prevRevision + " -> " + currentRevision);
String prMergeBranch = "refs/pull/" + prNum + "/merge";
String prMergeBranchRevision = state.getBranchRevisions().get(prMergeBranch);
if (prMergeBranchRevision != null) {
String logicalBranchName = branchSpec.getLogicalBranchName(prMergeBranch);
if (logicalBranchName != null) {
branchesToTrigger.add(logicalBranchName);
}
} else {
LOG.debug("Merge branch of pull request '" + branch + "' is not tracked by VCS root " + LogUtil.describe(root));
}
saveRevision(storage, root, branch, currentRevision);
}
}
}
}
for (String branch : branchesToTrigger) {
LOG.debug("Trigger merge pull-request build " + LogUtil.describe(buildType) + ", branch " + branch);
((BuildTypeEx)buildType).createBuildPromotion(branch).addToQueue("");
}
}
@Override
public void triggerActivated(@NotNull PolledTriggerContext ctx) throws BuildTriggerException {
SBuildType buildType = ctx.getBuildType();
CustomDataStorage storage = ctx.getCustomDataStorage();
for (VcsRootInstance root : buildType.getVcsRootInstances()) {
RepositoryState state = ((VcsRootInstanceEx)root).getLastUsedState();
for (Map.Entry<String, String> branchRevision : state.getBranchRevisions().entrySet()) {
String branch = branchRevision.getKey();
String currentRevision = branchRevision.getValue();
if (getPrNum(branch) != null) {
saveRevision(storage, root, branch, currentRevision);
}
}
}
LOG.debug("Trigger activated for " + LogUtil.describe(buildType));
}
};
}