@Override public PullRequestStatus apply(GHPullRequest input) { int prID = GHUtils.prIdFrom(input.getDiffUrl().toString()); try { GHUser user = input.getUser(); return new PullRequestStatus(prID, input.getHead().getSha(), mergedSHA, input.getHead().getLabel(), input.getBase().getLabel(), input.getHtmlUrl().toString(), user.getName(), user.getEmail(), input.getBody(), input.getTitle()); } catch (IOException e) { throw new RuntimeException(e); } } };
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; }
public void mergePr(GHPullRequest pullRequest, String message) throws IOException { //match merge method to enum, case insensitive GHPullRequest.MergeMethod gitMergeMethod = Arrays.stream(GHPullRequest.MergeMethod.values()) .filter(e -> e.name().equalsIgnoreCase(mergeMethod)).findAny().orElse(GHPullRequest.MergeMethod.MERGE); pullRequest.merge(message,null,gitMergeMethod); if(deleteMergedBranches){ GitHubHelpers.deleteUpdateBotBranch(pullRequest.getRepository(),pullRequest.getHead().getRef()); } }
PullRequestAction(GHPullRequest pr) { number = pr.getNumber(); url = pr.getHtmlUrl(); title = pr.getTitle(); userLogin = pr.getUser().getLogin(); baseRef = pr.getBase().getRef(); }
userLogin = pr.getUser().getLogin(); number = pr.getNumber(); try { prUpdatedAt = pr.getUpdatedAt(); issueUpdatedAt = pr.getIssueUpdatedAt(); } catch (IOException e) { headSha = pr.getHead().getSha(); headRef = pr.getHead().getRef(); title = pr.getTitle(); baseRef = pr.getBase().getRef(); htmlUrl = pr.getHtmlUrl(); LOGGER.error("Can't get comments for PR: {}", pr.getNumber(), e); lastCommentCreatedAt = null; userEmail = execute(() -> pr.getUser().getEmail()); } catch (Exception e) { LOGGER.error("Can't get GitHub user email.", e); GHRepository remoteRepo = pr.getRepository(); state = pr.getState().toString(); body = pr.getBody();
context.info(LOG, configuration.colored(Configuration.COLOR_PENDING, "Created pull request " + pullRequest.getHtmlUrl())); pullRequest.comment(commandComment); addIssueClosedCommentIfRequired(context, pullRequest, true); pullRequest.setLabels(configuration.getGithubPullRequestLabel()); } else { context.setPullRequest(pullRequest); String oldTitle = pullRequest.getTitle(); if (Objects.equal(oldTitle, title)) { return; pullRequest.comment("[UpdateBot](https://github.com/fabric8io/updatebot) rebasing due to merge conflicts"); pullRequest.setTitle(title); pullRequest.comment(commandComment); GHCommitPointer head = pullRequest.getHead(); String remoteRef = head.getRef(); context.warn(LOG, "Failed to push branch " + localBranch + " to existing github branch " + remoteRef + " for " + pullRequest.getHtmlUrl()); context.info(LOG, "Updated PR " + pullRequest.getHtmlUrl());
private boolean checkCommit(GHPullRequest pr) { GHCommitPointer head = pr.getHead(); GHCommitPointer base = pr.getBase(); String headSha = head.getSha(); String baseSha = base.getSha(); if (StringUtils.equals(headSha, this.head) && StringUtils.equals(baseSha, this.base)) { return false; } LOGGER.log(Level.FINE, "New commit. Sha: Head[{0} => {1}] Base[{2} => {3}]", new Object[] {this.head, headSha, this.base, baseSha}); setHead(headSha); setBase(baseSha); if (accepted) { shouldRun = true; } return true; }
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); }
@Override public void observe(GHPullRequest pr) { int number = pr.getNumber(); pullRequestMetadataCache.put(number, new ObjectMetadataAction( pr.getTitle(), pr.getBody(), pr.getHtmlUrl().toExternalForm() GHUser user = pr.getUser(); try { if (users.containsKey(user.getLogin())) {
@CheckForNull public URL getGithubUrl(@Nullable InputComponent inputComponent, @Nullable Integer issueLine) { if (inputComponent instanceof InputPath) { String path = getPath((InputPath) inputComponent); URL url1 = ghRepo.getHtmlUrl(); try { return new URI(url1.getProtocol(), null, url1.getHost(), url1.getPort(), url1.getFile() + "/blob/" + pr.getHead().getSha() + "/" + path, null, issueLine != null ? ("L" + issueLine) : "").toURL(); } catch (MalformedURLException | URISyntaxException e) { LOG.error("Invalid URL", e); } } return null; }
@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; }
.append(localPR.getPrUpdatedAt(), remotePR.getUpdatedAt()).build() < 0; // by time .append(localPR.getIssueUpdatedAt(), remotePR.getIssueUpdatedAt()).build() < 0; boolean headUpd = !StringUtils.equals(localPR.getHeadSha(), remotePR.getHead().getSha()); // or head? boolean updated = prUpd || issueUpd || headUpd; remotePR.getNumber(), remotePR.getTitle(), e); return false;
private void deleteBranch(Run<?, ?> build, Launcher launcher, final TaskListener listener) { if (!getDeleteOnMerge()) { return; } String branchName = pr.getHead().getRef(); try { GHRepository repo = pr.getRepository(); GHRef ref = repo.getRef("heads/" + branchName); ref.delete(); listener.getLogger().println("Deleted branch " + branchName); } catch (IOException e) { listener.getLogger().println("Unable to delete branch " + branchName); e.printStackTrace(listener.getLogger()); } }
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 } } } }
Map<Boolean, Set<ChangeRequestCheckoutStrategy>> strategies = request.getPRStrategies(); PRs: for (final GHPullRequest pr : request.getPullRequests()) { int number = pr.getNumber(); boolean fork = !ghRepository.getOwner().equals(pr.getHead().getUser()); listener.getLogger().format("%n Checking pull request %s%n", HyperlinkNote.encodeTo(pr.getHtmlUrl().toString(), "#" + number)); if (strategies.get(fork).isEmpty()) { if (fork) {
@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; }
private GHPullRequest getPullRequestWithPullReqIdentifier(GHRepository parent) throws IOException { List<GHPullRequest> pullRequests; GHUser myself; try { pullRequests = parent.getPullRequests(GHIssueState.OPEN); myself = gitHubUtil.getMyself(); } catch (IOException e) { log.warn("Error occurred while retrieving pull requests for {}", parent.getFullName()); return null; } for (GHPullRequest pullRequest : pullRequests) { GHUser user = pullRequest.getHead().getUser(); if (myself.equals(user) && pullRequest.getBody().equals(Constants.PULL_REQ_ID)) { return pullRequest; } } return null; } }
@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 setPullRequest(GHPullRequest pr) { if (pr == null) { return; } synchronized (this) { this.pr = pr; try { if (updated == null) { setUpdated(pr.getCreatedAt()); } } catch (IOException e) { LOGGER.log(Level.WARNING, "Unable to get date for new PR", e); setUpdated(new Date()); } if (StringUtils.isEmpty(this.head)) { GHCommitPointer prHead = pr.getHead(); setHead(prHead.getSha()); } if (StringUtils.isEmpty(this.base)) { GHCommitPointer prBase = pr.getBase(); setBase(prBase.getSha()); } } }