This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to branch feature/SLING-8337 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-committer-cli.git
commit 9ea5eddcaf4bd9f1d0806a00470af11fe4757553 Author: Robert Munteanu <[email protected]> AuthorDate: Mon Apr 22 15:12:20 2019 +0300 SLING-8337 - Create sub-command to manage the Jira update when promoting a release WIP on creating Jira issues --- docker-env.sample | 3 ++ .../{VersionFinder.java => VersionClient.java} | 52 +++++++++++++++++++--- .../cli/impl/release/PrepareVoteEmailCommand.java | 4 +- .../sling/cli/impl/release/UpdateJiraCommand.java | 8 ++-- .../sling/cli/impl/jira/VersionFinderTest.java | 4 +- 5 files changed, 59 insertions(+), 12 deletions(-) diff --git a/docker-env.sample b/docker-env.sample index 7a2a892..12e39be 100644 --- a/docker-env.sample +++ b/docker-env.sample @@ -12,3 +12,6 @@ # ---------------------------------------------------------------------------------------- ASF_USERNAME=changeme ASF_PASSWORD=changeme + +JIRA_USERNAME=changeme +JIRA_PASSWORD=changeme \ No newline at end of file diff --git a/src/main/java/org/apache/sling/cli/impl/jira/VersionFinder.java b/src/main/java/org/apache/sling/cli/impl/jira/VersionClient.java similarity index 77% rename from src/main/java/org/apache/sling/cli/impl/jira/VersionFinder.java rename to src/main/java/org/apache/sling/cli/impl/jira/VersionClient.java index 2c2be18..6a4a770 100644 --- a/src/main/java/org/apache/sling/cli/impl/jira/VersionFinder.java +++ b/src/main/java/org/apache/sling/cli/impl/jira/VersionClient.java @@ -16,9 +16,11 @@ */ package org.apache.sling.cli.impl.jira; +import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.StringWriter; import java.lang.reflect.Type; import java.util.List; import java.util.Optional; @@ -27,6 +29,8 @@ import java.util.function.Predicate; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.sling.cli.impl.release.Release; @@ -34,12 +38,16 @@ import org.osgi.service.component.annotations.Component; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonWriter; /** * Access the ASF <em>Jira</em> instance and looks up project version data. */ -@Component(service = VersionFinder.class) -public class VersionFinder { +@Component(service = VersionClient.class) +public class VersionClient { + + private static final String JIRA_URL_PREFIX = "https://issues.apache.org/jira/rest/api/2/"; + private static final String CONTENT_TYPE_JSON = "application/json"; /** * Finds a Jira version which matches the specified release @@ -102,6 +110,40 @@ public class VersionFinder { return version; } + + public void create(String versionName) throws IOException { + StringWriter w = new StringWriter(); + try ( JsonWriter jw = new Gson().newJsonWriter(w) ) { + jw.beginObject(); + jw.name("name").value(versionName); + jw.name("project").value("SLING"); + jw.endObject(); + } + + HttpPost post = new HttpPost(JIRA_URL_PREFIX + "version"); + post.addHeader("Content-Type", CONTENT_TYPE_JSON); + post.addHeader("Accept", CONTENT_TYPE_JSON); + post.setEntity(new StringEntity(w.toString())); + + try (CloseableHttpClient client = HttpClients.createDefault() ) { + try (CloseableHttpResponse response = client.execute(post)) { + try (InputStream content = response.getEntity().getContent(); + InputStreamReader reader = new InputStreamReader(content)) { + + if (response.getStatusLine().getStatusCode() != 201) { + // TODO - try and parse JSON error message, fall back to status code + try ( BufferedReader bufferedReader = new BufferedReader(reader)) { + String line; + while ( (line = bufferedReader.readLine()) != null ) + System.out.println(line); + } + + throw new IOException("Status line : " + response.getStatusLine()); + } + } + } + } + } private Optional<Version> findVersion(Predicate<Version> matcher, CloseableHttpClient client) throws IOException { @@ -112,7 +154,7 @@ public class VersionFinder { return versions.stream() .filter( v -> v.getName().length() > 1) // avoid old '3' release .filter(matcher) - .sorted(VersionFinder::compare) + .sorted(VersionClient::compare) .findFirst(); }); } @@ -144,8 +186,8 @@ public class VersionFinder { } private HttpGet newGet(String suffix) { - HttpGet get = new HttpGet("https://issues.apache.org/jira/rest/api/2/" + suffix); - get.addHeader("Accept", "application/json"); + HttpGet get = new HttpGet(JIRA_URL_PREFIX + suffix); + get.addHeader("Accept", CONTENT_TYPE_JSON); return get; } diff --git a/src/main/java/org/apache/sling/cli/impl/release/PrepareVoteEmailCommand.java b/src/main/java/org/apache/sling/cli/impl/release/PrepareVoteEmailCommand.java index 8656362..dc20db0 100644 --- a/src/main/java/org/apache/sling/cli/impl/release/PrepareVoteEmailCommand.java +++ b/src/main/java/org/apache/sling/cli/impl/release/PrepareVoteEmailCommand.java @@ -22,7 +22,7 @@ import java.util.stream.Collectors; import org.apache.sling.cli.impl.Command; import org.apache.sling.cli.impl.jira.Version; -import org.apache.sling.cli.impl.jira.VersionFinder; +import org.apache.sling.cli.impl.jira.VersionClient; import org.apache.sling.cli.impl.nexus.StagingRepository; import org.apache.sling.cli.impl.nexus.StagingRepositoryFinder; import org.apache.sling.cli.impl.people.MembersFinder; @@ -80,7 +80,7 @@ public class PrepareVoteEmailCommand implements Command { private StagingRepositoryFinder repoFinder; @Reference - private VersionFinder versionFinder; + private VersionClient versionFinder; @Override public void execute(String target) { diff --git a/src/main/java/org/apache/sling/cli/impl/release/UpdateJiraCommand.java b/src/main/java/org/apache/sling/cli/impl/release/UpdateJiraCommand.java index 20d2acc..a636ee8 100644 --- a/src/main/java/org/apache/sling/cli/impl/release/UpdateJiraCommand.java +++ b/src/main/java/org/apache/sling/cli/impl/release/UpdateJiraCommand.java @@ -20,7 +20,7 @@ import java.io.IOException; import org.apache.sling.cli.impl.Command; import org.apache.sling.cli.impl.jira.Version; -import org.apache.sling.cli.impl.jira.VersionFinder; +import org.apache.sling.cli.impl.jira.VersionClient; import org.apache.sling.cli.impl.nexus.StagingRepository; import org.apache.sling.cli.impl.nexus.StagingRepositoryFinder; import org.osgi.service.component.annotations.Component; @@ -39,7 +39,7 @@ public class UpdateJiraCommand implements Command { private StagingRepositoryFinder repoFinder; @Reference - private VersionFinder versionFinder; + private VersionClient versionFinder; private final Logger logger = LoggerFactory.getLogger(getClass()); @@ -54,7 +54,9 @@ public class UpdateJiraCommand implements Command { logger.info("Found successor version {}", successorVersion); if ( successorVersion == null ) { Release next = release.next(); - logger.info("Would create version {}", next); + logger.info("Would create version {}", next.getName()); + versionFinder.create(next.getName()); + logger.info("Created version {}", next.getName()); } } diff --git a/src/test/java/org/apache/sling/cli/impl/jira/VersionFinderTest.java b/src/test/java/org/apache/sling/cli/impl/jira/VersionFinderTest.java index 04a97bd..6f11f6c 100644 --- a/src/test/java/org/apache/sling/cli/impl/jira/VersionFinderTest.java +++ b/src/test/java/org/apache/sling/cli/impl/jira/VersionFinderTest.java @@ -32,7 +32,7 @@ import org.junit.Test; public class VersionFinderTest { - private VersionFinder finder = new StubVersionFinder(); + private VersionClient finder = new StubVersionFinder(); @Test public void findMatchingVersion() { @@ -67,7 +67,7 @@ public class VersionFinderTest { assertThat("successor", successor, nullValue()); } - private static final class StubVersionFinder extends VersionFinder { + private static final class StubVersionFinder extends VersionClient { @Override protected <T> T doWithJiraVersions(CloseableHttpClient client, Function<InputStreamReader, T> parserCallback) throws IOException {
