@Override protected Integer applyNullSafe(@Nonnull GHPullRequest input) { return input.getNumber(); } }
@Override public boolean apply(GHPullRequest remotePR) { if (skipFirstRun) { logger.getLogger().println(String.format("Skipping first run for PR #%s", remotePR.getNumber())); return false; } return true; } }
@Override public boolean apply(GHPullRequest remotePR) { @CheckForNull GitHubPRPullRequest localPR = localRepo.getPulls().get(remotePR.getNumber()); if (!isUpdated(remotePR, localPR)) { // light check logger.getLogger().println(String.format("PR [#%s %s] not changed", remotePR.getNumber(), remotePR.getTitle())); return false; } return true; }
private void commentOnRequest(String comment) { try { trigger.getRepository().addComment(pr.getNumber(), comment); } catch (Exception e) { listener.getLogger().println("Failed to add comment"); e.printStackTrace(listener.getLogger()); } }
@Override public boolean apply(@Nullable GHPullRequest remotePR) { if (isNull(remotePR)) { return true; } @CheckForNull GitHubPRPullRequest localPR = localRepo.getPulls().get(remotePR.getNumber()); if (localPR != null && localPR.isInBadState()) { logger.error("local PR [#{} {}] is in bad state", remotePR.getNumber(), remotePR.getTitle()); return false; } return true; }
@Override public GHPullRequest apply(GHPullRequest remotePR) { if (remotePR.getState() == OPEN) { localRepo.getPulls().put(remotePR.getNumber(), new GitHubPRPullRequest(remotePR)); } else if (remotePR.getState() == CLOSED) { localRepo.getPulls().remove(remotePR.getNumber()); // don't store } return remotePR; } }
private void check(GHPullRequest pr) { int number = pr.getNumber(); try { GhprbPullRequest pull = getPullRequest(null, number); pull.check(pr, false); } catch (IOException e) { LOGGER.log(Level.SEVERE, "Unable to check pr: " + number, e); } try { this.save(); } catch (IOException e) { LOGGER.log(Level.SEVERE, "Unable to save repository!", e); } }
private GitHubPRCause toCause(GitHubPREvent event, GitHubPRDecisionContext context) { // null if local not existed before try { return context.checkEvent(event); } catch (IOException e) { LOGGER.warn("Can't check trigger event", e); listener.error("Can't check trigger event, so skipping PR #{}. {}", context.getRemotePR().getNumber(), e); return null; } }
private GhprbPullRequest getPullRequest(GHPullRequest ghpr, Integer number) throws IOException { if (number == null) { number = ghpr.getNumber(); } synchronized (this) { GhprbPullRequest pr = pullRequests.get(number); if (pr == null) { if (ghpr == null) { GHRepository repo = getGitHubRepo(); ghpr = repo.getPullRequest(number); } pr = new GhprbPullRequest(ghpr, trigger.getHelper(), this); pullRequests.put(number, pr); } return pr; } }
@Override public boolean apply(GHPullRequest remotePR) { if (!branchRestriction.isBranchBuildAllowed(remotePR)) { logger.info("Skipping [#{} {}] because of branch restriction", remotePR.getNumber(), remotePR.getTitle()); return false; } return true; } }
public static Boolean waitForPullRequestToHaveMergable(GHPullRequest pullRequest, long sleepMS, long maximumTimeMS) throws IOException { long end = System.currentTimeMillis() + maximumTimeMS; while (true) { Boolean mergeable = pullRequest.getMergeable(); if (mergeable == null) { GHRepository repository = pullRequest.getRepository(); int number = pullRequest.getNumber(); pullRequest = repository.getPullRequest(number); mergeable = pullRequest.getMergeable(); } if (mergeable != null) { return mergeable; } if (System.currentTimeMillis() > end) { return null; } try { Thread.sleep(sleepMS); } catch (InterruptedException e) { // ignore } } } }
public static boolean isMergeable(GHPullRequest pullRequest) throws IOException { boolean canMerge = false; Boolean mergeable = pullRequest.getMergeable(); GHPullRequest single = null; if (mergeable == null) { single = pullRequest.getRepository().getPullRequest(pullRequest.getNumber()); mergeable = single.getMergeable(); } if (mergeable == null) { LOG.warn("Mergeable flag is still null on pull request " + pullRequest.getHtmlUrl() + " assuming its still mergable. Probably a caching issue and this flag may appear again later"); return true; } if (mergeable != null && mergeable.booleanValue()) { canMerge = true; } return canMerge; }
@Override public GitHubPRCause check(@Nonnull GitHubPRDecisionContext prDecisionContext) throws IOException { TaskListener listener = prDecisionContext.getListener(); GHPullRequest remotePR = prDecisionContext.getRemotePR(); final PrintStream logger = listener.getLogger(); for (GHLabel ghLabel : remotePR.getRepository().getIssue(remotePR.getNumber()).getLabels()) { for (String labelPatternStr : label.getLabelsSet()) { Pattern labelPattern = Pattern.compile(labelPatternStr); if (labelPattern.matcher(ghLabel.getName()).matches()) { logger.println(DISPLAY_NAME + ": Pull request has label: " + labelPatternStr); LOGGER.info("Pull request has '{}' label.", labelPatternStr); return prDecisionContext.newCause("PR has label: " + labelPatternStr, isSkip()); } } } return null; }
public static boolean isMergeable(GHPullRequest pullRequest) throws IOException { boolean canMerge = false; Boolean mergeable = pullRequest.getMergeable(); GHPullRequest single = null; if (mergeable == null) { single = pullRequest.getRepository().getPullRequest(pullRequest.getNumber()); mergeable = single.getMergeable(); } if (mergeable == null) { LOG.warn("Mergeable flag is still null on pull request " + pullRequest.getHtmlUrl() + " assuming its still mergable. Probably a caching issue and this flag may appear again later"); return true; } if (mergeable != null && mergeable.booleanValue()) { canMerge = true; } return canMerge; }
@Override public GitHubPRCause check(@Nonnull GitHubPRDecisionContext prDecisionContext) throws IOException { TaskListener listener = prDecisionContext.getListener(); GHPullRequest remotePR = prDecisionContext.getRemotePR(); if (remotePR.getState().equals(GHIssueState.CLOSED)) { return null; // already closed, skip check? } GitHubPRCause cause = null; Collection<GHLabel> remoteLabels = remotePR.getRepository().getIssue(remotePR.getNumber()).getLabels(); Set<String> existingLabels = new HashSet<>(); for (GHLabel ghLabel : remoteLabels) { existingLabels.add(ghLabel.getName()); } existingLabels.retainAll(label.getLabelsSet()); if (existingLabels.isEmpty()) { final PrintStream logger = listener.getLogger(); LOG.debug("{}:{} not found", DISPLAY_NAME, label.getLabelsSet()); logger.println(DISPLAY_NAME + ": " + label.getLabelsSet() + " not found"); cause = prDecisionContext.newCause(label.getLabelsSet() + " labels not exist", isSkip()); } return cause; }
@Override public boolean apply(GHPullRequest remotePR) { if (!userRestriction.isWhitelisted(remotePR.getUser())) { listener.info("Skipping [#{} {}] because of user restriction (user - {})", remotePR.getNumber(), remotePR.getTitle(), remotePR.getUser()); return false; } return true; } }
@Override public GitHubPRCause check(@Nonnull GitHubPRDecisionContext prDecisionContext) throws IOException { TaskListener listener = prDecisionContext.getListener(); GHPullRequest remotePR = prDecisionContext.getRemotePR(); if (remotePR.getState().equals(GHIssueState.CLOSED)) { return null; // already closed, skip check? } GitHubPRCause cause = null; Collection<GHLabel> remoteLabels = remotePR.getRepository().getIssue(remotePR.getNumber()).getLabels(); Set<String> existingLabels = new HashSet<>(); for (GHLabel ghLabel : remoteLabels) { existingLabels.add(ghLabel.getName()); } if (existingLabels.containsAll(label.getLabelsSet())) { final PrintStream logger = listener.getLogger(); logger.println(DISPLAY_NAME + ": " + label.getLabelsSet() + " found"); cause = prDecisionContext.newCause(label.getLabelsSet() + " labels exist", isSkip()); } return cause; }
PullRequestAction(GHPullRequest pr) { number = pr.getNumber(); url = pr.getHtmlUrl(); title = pr.getTitle(); userLogin = pr.getUser().getLogin(); baseRef = pr.getBase().getRef(); }
PullRequestSCMHead(GHPullRequest pr, String name, boolean merge) { super(name); // the merge flag is encoded into the name, so safe to store here this.merge = merge; this.number = pr.getNumber(); this.target = new BranchSCMHead(pr.getBase().getRef()); // the source stuff is immutable for a pull request on github, so safe to store here GHRepository repository = pr.getHead().getRepository(); // may be null for deleted forks JENKINS-41246 this.sourceOwner = repository == null ? null : repository.getOwnerName(); this.sourceRepo = repository == null ? null : repository.getName(); this.sourceBranch = pr.getHead().getRef(); this.origin = pr.getRepository().getOwnerName().equalsIgnoreCase(sourceOwner) ? SCMHeadOrigin.DEFAULT : new SCMHeadOrigin.Fork(this.sourceOwner); }
private static StatusInfo createStatus(Configuration configuration, StatusInfo oldStatus) { GHRepository repository = null; GHIssue issue = oldStatus.getIssue(); if (issue != null) { repository = issue.getRepository(); try { issue = repository.getIssue(issue.getNumber()); } catch (IOException e) { configuration.warn(LOG, "Failed to lookup issue " + oldStatus.getIssueUrl() + ". " + e, e); } } GHPullRequest pullRequest = oldStatus.getPullRequest(); if (pullRequest != null) { if (repository == null) { repository = pullRequest.getRepository(); } try { pullRequest = repository.getPullRequest(pullRequest.getNumber()); } catch (IOException e) { configuration.warn(LOG, "Failed to lookup pull request " + oldStatus.getPullRequestUrl() + ". " + e, e); } } return new StatusInfo(oldStatus.getRepository(), oldStatus.getStatus(), issue, pullRequest); }