You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2019/04/23 11:48:37 UTC

[sling-org-apache-sling-committer-cli] 32/36: SLING-8337 - Create sub-command to manage the Jira update when promoting a release

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 <ro...@apache.org>
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 {