private void processAssigned(GithubEvent event) { if (config.hasUserMappings()) { GithubEvent.User ghUser = event.getAssignee(); String jiraUser = config.getJiraUser(ghUser.getLogin()); if (jiraUser != null) { // Get the current issue from JIRA String title = event.getIssue().getTitle(); Matcher m = jiraIssuePattern.matcher(title); if (m.find()) { JiraConnector conn = new JiraConnector(config); GetIssue get = new GetIssue.Builder().withIssueKey(m.group(1)).build(); try { JiraEvent.Issue issue = conn.execute(get); String jiraCurrentAssignee = issue.getAssignee(); if (event.getAction().equals(GITHUB_UNASSIGNED)) { if (jiraCurrentAssignee != null && jiraCurrentAssignee.equals(jiraUser)) { // Update Jira issue with no one assigned UpdateIssue update = new UpdateIssue.Builder() .withJiraIssueKey(m.group(1)) .withAssignee(UpdateIssue.NO_ASSIGNEE) .build(); conn.execute(update); } } else { if (jiraCurrentAssignee == null || !jiraCurrentAssignee.equals(jiraUser)) { UpdateIssue update = new UpdateIssue.Builder() .withJiraIssueKey(m.group(1)) .withAssignee(jiraUser) .build(); conn.execute(update); } } } catch (ExecutionException ex) { Logger.getLogger(GithubWebhook.class.getName()).log(Level.SEVERE, null, ex); } } } } }
private String processOpenedEvent(GithubEvent event) { JiraConnector conn = new JiraConnector(config); String jiraIssueKey = null; if (event.hasIssue()) { String title = event.getIssue().getTitle(); Matcher m = jiraIssuePattern.matcher(title); if (m.find()) { // Originated from JIRA, need to update JIRA with issue number and external link String githubIssueField = config.getJira().getGithubIssueNumberField(); jiraIssueKey = m.group(1); UpdateIssue update = new UpdateIssue.Builder() .withCustomField(githubIssueField, event.getIssue().getNumber()) .withJiraIssueKey(jiraIssueKey) .build(); try { conn.execute(update); createExternalLink(conn, jiraIssueKey, event); } catch (ExecutionException ex) { Logger.getLogger(GithubWebhook.class.getName()).log(Level.SEVERE, null, ex); } } else { // Originated in github. Create in JIRA and add external link String githubIssueField = config.getJira().getGithubIssueNumberField(); String jiraRepoField = config.getJira().getGithubRepoNameField(); ServiceConfig.Repository repo = config.getRepoForGithubName(event.getRepository().getName()); String jiraProjectKey = repo.getJiraProjectKey(); String jiraRepoName = repo.getJiraName(); int githubIssueNumber = event.getIssue().getNumber(); String body = event.getIssue().getBody() + "\n\n[Created in Github by " + event.getIssue().getUser().getLogin() + " ]"; /* * If we're mapping milestones to eipcs, have some * work to do here. */ String epicJiraKey = null; if (repo.mapEpicsToMilestones() && event.getIssue().hasMilestone()) { Milestone ms = event.getIssue().getMilestone(); String epicName = ms.getTitle(); // Of course, they can't make this easy. Querying custom fields // requires a format of cf[xxxx] rather than, you know, the field // name. m = extractCustomFieldNumber.matcher(config.getJira().getEpicNameField()); m.find(); String cfNumber = m.group(1); String jql = "project = " + jiraProjectKey + " and cf[" + cfNumber + "] = \"" + epicName + "\""; SearchIssues search = new SearchIssues.Builder().withJQL(jql).build(); try { List<JiraEvent.Issue> epicList = conn.execute(search); // Should only return one or zero. if (!epicList.isEmpty()) { JiraEvent.Issue epic = epicList.get(0); epicJiraKey = epic.getJiraIssueKey(); } } catch (ExecutionException ex) { Logger.getLogger(GithubWebhook.class.getName()).log(Level.SEVERE, null, ex); } } CreateIssue.Builder builder = new CreateIssue.Builder() .withProjectKey(jiraProjectKey) .withIssuetype("Task") .withSummary(event.getIssue().getTitle()) .withDescription(body) .withCustomField(githubIssueField, githubIssueNumber) .withCustomField(jiraRepoField, "value", jiraRepoName); // populate any custom fields from repo config for (ServiceConfig.Repository.JiraField field : repo.getJiraFields()) { if (field.getType().equals("object")) { builder.withCustomField(field.getName(), field.getKey(), field.getValue()); } else { builder.withCustomField(field.getName(), field.getValue()); } } if (epicJiraKey != null) { builder.withCustomField(config.getJira().getEpicLinkField(), epicJiraKey); } if (repo.labelVersions()) { List<String> fixVersions = new LinkedList<>(); List<String> affectsVersions = new LinkedList<>(); for (GithubEvent.Issue.Label label : event.getIssue().getLabels()) { m = extractFixedVersion.matcher(label.getName()); if (m.find()) { fixVersions.add(m.group(1)); } else { m = extractAffectsVersion.matcher(label.getName()); if (m.find()) { affectsVersions.add(m.group(1)); } } } builder.withAffectsVersions(affectsVersions).withFixVersions(fixVersions); } if (config.hasUserMappings() && event.getIssue().hasAssignee()) { String jiraAssignee = config.getJiraUser(event.getIssue().getAssignee().getLogin()); builder.withAssignee(jiraAssignee); } try { jiraIssueKey = conn.execute(builder.build()); createExternalLink(conn, jiraIssueKey, event); } catch (ExecutionException ex) { Logger.getLogger(GithubWebhook.class.getName()).log(Level.SEVERE, null, ex); } } } else if (event.hasPullRequest()) { linkPullRequestToIssue(conn, event); } return jiraIssueKey; }