public BuildTriggeringPolicy getBuildTriggeringPolicy()

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));
      }
    };
  }