Skip to content

Commit

Permalink
Merge pull request #98 from mdenicki/feature/addingVersion
Browse files Browse the repository at this point in the history
* upstream/pr/98:
  JENKINS-19286: Possibility to add fix version to list instead of replacing whole list or specific version
  • Loading branch information
rantoniuk committed May 3, 2016
2 parents 1d1747f + 905d9f1 commit 2717244
Show file tree
Hide file tree
Showing 6 changed files with 152 additions and 5 deletions.
24 changes: 19 additions & 5 deletions src/main/java/hudson/plugins/jira/JiraIssueMigrator.java
Expand Up @@ -22,13 +22,15 @@ public class JiraIssueMigrator extends Notifier {
private String jiraRelease;
private String jiraReplaceVersion;
private String jiraQuery;
private boolean addRelease;

@DataBoundConstructor
public JiraIssueMigrator(String jiraProjectKey, String jiraRelease, String jiraQuery, String jiraReplaceVersion) {
public JiraIssueMigrator(String jiraProjectKey, String jiraRelease, String jiraQuery, String jiraReplaceVersion, boolean addRelease) {
this.jiraRelease = jiraRelease;
this.jiraProjectKey = jiraProjectKey;
this.jiraQuery = jiraQuery;
this.jiraReplaceVersion = jiraReplaceVersion;
this.addRelease = addRelease;
}

public String getJiraRelease() {
Expand Down Expand Up @@ -63,6 +65,10 @@ public void setJiraReplaceVersion(String jiraReplaceVersion) {
this.jiraReplaceVersion = jiraReplaceVersion;
}

public boolean isAddRelease() { return addRelease; }

public void setAddRelease(boolean addRelease) { this.addRelease = addRelease; }

@Override
public BuildStepDescriptor<Publisher> getDescriptor() {
return DESCRIPTOR;
Expand Down Expand Up @@ -96,12 +102,16 @@ public boolean perform(AbstractBuild<?, ?> build, Launcher launcher,
throw new IllegalArgumentException("JQL query is Empty");
}

JiraSite site = JiraSite.get(build.getProject());
JiraSite site = getJiraSiteForProject(build.getProject());

if (realReplace == null || realReplace.isEmpty()) {
site.migrateIssuesToFixVersion(realProjectKey, realRelease, realQuery);
if (addRelease == true) {
site.addFixVersionToIssue(realProjectKey, realRelease, realQuery);
} else {
site.replaceFixVersion(realProjectKey, realReplace, realRelease, realQuery);
if (realReplace == null || realReplace.isEmpty()) {
site.migrateIssuesToFixVersion(realProjectKey, realRelease, realQuery);
} else {
site.replaceFixVersion(realProjectKey, realReplace, realRelease, realQuery);
}
}
} catch (Exception e) {
e.printStackTrace(listener.fatalError(
Expand All @@ -113,6 +123,10 @@ public boolean perform(AbstractBuild<?, ?> build, Launcher launcher,
return true;
}

JiraSite getJiraSiteForProject(AbstractProject<?, ?> project) {
return JiraSite.get(project);
}

public BuildStepMonitor getRequiredMonitorService() {
return BuildStepMonitor.BUILD;
}
Expand Down
29 changes: 29 additions & 0 deletions src/main/java/hudson/plugins/jira/JiraSession.java
Expand Up @@ -251,6 +251,35 @@ public void replaceFixVersion(String projectKey, String fromVersion, String toVe
}
}

/**
* Adds the specified version to the fix version list of all issues matching the JQL.
*
* @param projectKey The JIRA Project
* @param version The version to add
* @param query The JQL Query
*/
public void addFixVersion(String projectKey, String version, String query) {

Version newVersion = getVersionByName(projectKey, version);
if (newVersion == null) {
return;
}

LOGGER.fine("Fetching issues with JQL:" + query);
List<Issue> issues = service.getIssuesFromJqlSearch(query, Integer.MAX_VALUE);
if (issues == null || issues.isEmpty()) {
return;
}
LOGGER.fine("Found issues: " + issues.size());

for (Issue issue : issues) {
LOGGER.fine("Adding version: " + newVersion.getName() + " to issue: " + issue.getKey());
List<Version> fixVersions = Lists.newArrayList(issue.getFixVersions());
fixVersions.add(newVersion);
service.updateIssue(issue.getKey(), fixVersions);
}
}

/**
* Progresses the issue's workflow by performing the specified action. The issue's new status is returned.
*
Expand Down
17 changes: 17 additions & 0 deletions src/main/java/hudson/plugins/jira/JiraSite.java
Expand Up @@ -632,6 +632,23 @@ public void migrateIssuesToFixVersion(String projectKey, String versionName, Str
session.migrateIssuesToFixVersion(projectKey, versionName, query);
}

/**
* Adds new fix version to issues matching the jql.
*
* @param projectKey
* @param versionName
* @param query
* @throws IOException
*/
public void addFixVersionToIssue(String projectKey, String versionName, String query) throws IOException {
JiraSession session = getSession();
if (session == null) {
return;
}

session.addFixVersion(projectKey, versionName, query);
}

/**
* Progresses all issues matching the JQL search, using the given workflow action. Optionally
* adds a comment to the issue(s) at the same time.
Expand Down
Expand Up @@ -2,6 +2,9 @@
<f:entry title="${%Target Jira Release}" field="jiraRelease">
<f:textbox/>
</f:entry>
<f:entry title="${%Add Target Release}" field="addRelease">
<f:checkbox />
</f:entry>
<f:entry title="${%Replace Jira Release}" field="jiraReplaceVersion">
<f:textbox/>
</f:entry>
Expand Down
@@ -0,0 +1,3 @@
<div>
<p>Add Jira Release instead of replace. If checked, Replace Jira Release field will be ignored.</p>
</div>
81 changes: 81 additions & 0 deletions src/test/java/hudson/plugins/jira/JiraIssueMigratorTest.java
@@ -0,0 +1,81 @@
package hudson.plugins.jira;

import hudson.EnvVars;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.BuildListener;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;

import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.*;

public class JiraIssueMigratorTest {

private static final String PROJECT_KEY = "PROJECT";
private static final String RELEASE = "release";
private static final String RELEASE_TO_REPLACE = "releaseToReplace";
private static final String QUERY = "query";
AbstractBuild build;
Launcher launcher;
BuildListener listener;
EnvVars envVars;
JiraSite jiraSite;
AbstractProject project;
JiraIssueMigrator jiraIssueMigrator;

@Before
public void prepareMocks() throws IOException, InterruptedException {
build = mock(AbstractBuild.class);
launcher = mock(Launcher.class);
listener = mock(BuildListener.class);
envVars = mock(EnvVars.class);
jiraSite = mock(JiraSite.class);
project = mock(AbstractProject.class);

when(build.getEnvironment(listener)).thenReturn(envVars);
when(envVars.expand(PROJECT_KEY)).thenReturn(PROJECT_KEY);
when(envVars.expand(RELEASE)).thenReturn(RELEASE);
when(envVars.expand(QUERY)).thenReturn(QUERY);
when(envVars.expand(RELEASE_TO_REPLACE)).thenReturn(RELEASE_TO_REPLACE);
when(envVars.expand(null)).thenReturn(null);
when(build.getProject()).thenReturn(project);
}

@Test
public void testAddingVersion() throws IOException {
boolean addRelease = true;
jiraIssueMigrator = spy(new JiraIssueMigrator(PROJECT_KEY, RELEASE, QUERY, null, addRelease));
doReturn(jiraSite).when(jiraIssueMigrator).getJiraSiteForProject(project);
boolean result = jiraIssueMigrator.perform(build, launcher, listener);
verify(jiraSite, never()).migrateIssuesToFixVersion(anyString(), anyString(), anyString());
verify(jiraSite, never()).replaceFixVersion(anyString(), anyString(), anyString(), anyString());
verify(jiraSite, times(1)).addFixVersionToIssue(PROJECT_KEY, RELEASE, QUERY);
assertTrue(result);
}

@Test
public void testMigratingToVersion() throws IOException {
jiraIssueMigrator = spy(new JiraIssueMigrator(PROJECT_KEY, RELEASE, QUERY, null, false));
doReturn(jiraSite).when(jiraIssueMigrator).getJiraSiteForProject(project);
boolean result = jiraIssueMigrator.perform(build, launcher, listener);
verify(jiraSite, never()).addFixVersionToIssue(anyString(), anyString(), anyString());
verify(jiraSite, never()).replaceFixVersion(anyString(), anyString(), anyString(), anyString());
verify(jiraSite, times(1)).migrateIssuesToFixVersion(PROJECT_KEY, RELEASE, QUERY);
assertTrue(result);
}

@Test
public void testReplacingVersion() throws IOException {
jiraIssueMigrator = spy(new JiraIssueMigrator(PROJECT_KEY, RELEASE, QUERY, RELEASE_TO_REPLACE, false));
doReturn(jiraSite).when(jiraIssueMigrator).getJiraSiteForProject(project);
boolean result = jiraIssueMigrator.perform(build, launcher, listener);
verify(jiraSite, never()).addFixVersionToIssue(anyString(), anyString(), anyString());
verify(jiraSite, never()).migrateIssuesToFixVersion(anyString(), anyString(), anyString());
verify(jiraSite, times(1)).replaceFixVersion(PROJECT_KEY, RELEASE_TO_REPLACE, RELEASE, QUERY);
assertTrue(result);
}
}

0 comments on commit 2717244

Please sign in to comment.