You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ra...@apache.org on 2019/04/29 12:22:29 UTC

[sling-org-apache-sling-committer-cli] branch master updated: SLING-8380 - Make the tally command robust enough to handle mismatches between email subject and repository descriptions

This is an automated email from the ASF dual-hosted git repository.

radu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-committer-cli.git


The following commit(s) were added to refs/heads/master by this push:
     new 58a5cfe  SLING-8380 - Make the tally command robust enough to handle mismatches between email subject and repository descriptions
58a5cfe is described below

commit 58a5cfeaf4f40d98ae1f78947b18cab61686a1b7
Author: Radu Cotescu <co...@adobe.com>
AuthorDate: Mon Apr 29 14:19:41 2019 +0200

    SLING-8380 - Make the tally command robust enough to handle mismatches between email subject and repository descriptions
    
    * made lists.apache.org email thread parsing more robust
    * logged error in TallyVotesCommand if the VoteThreadFinder returned an empty emails list
---
 .../sling/cli/impl/mail/VoteThreadFinder.java      | 40 ++++++++------
 .../sling/cli/impl/release/TallyVotesCommand.java  | 64 +++++++++++-----------
 2 files changed, 56 insertions(+), 48 deletions(-)

diff --git a/src/main/java/org/apache/sling/cli/impl/mail/VoteThreadFinder.java b/src/main/java/org/apache/sling/cli/impl/mail/VoteThreadFinder.java
index f48baa1..a72255b 100644
--- a/src/main/java/org/apache/sling/cli/impl/mail/VoteThreadFinder.java
+++ b/src/main/java/org/apache/sling/cli/impl/mail/VoteThreadFinder.java
@@ -37,28 +37,36 @@ import com.google.gson.JsonParser;
 
 @Component(service = VoteThreadFinder.class)
 public class VoteThreadFinder {
-    
+
     public List<Email> findVoteThread(String releaseName) throws IOException {
-        try ( CloseableHttpClient client = HttpClients.createDefault() ) {
-            
+        try (CloseableHttpClient client = HttpClients.createDefault()) {
+            String threadSubject = "[VOTE] Release " + releaseName;
             URI uri = new URIBuilder("https://lists.apache.org/api/stats.lua")
-                .addParameter("domain", "sling.apache.org")
-                .addParameter("list", "dev")
-                .addParameter("d", "lte=1M")
-                .addParameter("q", "[VOTE] Release " + releaseName)
-                .build();
-            
+                    .addParameter("domain", "sling.apache.org")
+                    .addParameter("list", "dev")
+                    .addParameter("d", "lte=1M")
+                    .addParameter("q", threadSubject)
+                    .build();
+
             HttpGet get = new HttpGet(uri);
-            try ( CloseableHttpResponse response = client.execute(get)) {
-                try ( InputStream content = response.getEntity().getContent();
-                        InputStreamReader reader = new InputStreamReader(content)) {
-                    if ( response.getStatusLine().getStatusCode() != 200 )
+            try (CloseableHttpResponse response = client.execute(get)) {
+                try (InputStream content = response.getEntity().getContent();
+                     InputStreamReader reader = new InputStreamReader(content)) {
+                    if (response.getStatusLine().getStatusCode() != 200) {
                         throw new IOException("Status line : " + response.getStatusLine());
+                    }
                     JsonParser parser = new JsonParser();
-                    JsonArray emailsArray = parser.parse(reader).getAsJsonObject().get("emails").getAsJsonArray();
                     List<Email> emails = new ArrayList<>();
-                    for (JsonElement email : emailsArray) {
-                        emails.add(new Email(email.getAsJsonObject().get("id").getAsString()));
+                    JsonElement emailsJson = parser.parse(reader).getAsJsonObject().get("emails");
+                    if (emailsJson == null) {
+                        throw new IllegalStateException(String.format("Unable to correctly parse JSON from %s. Missing \"emails\" " +
+                                "property in the JSON response.", uri.toString()));
+                    }
+                    if (emailsJson.isJsonArray()) {
+                        JsonArray emailsArray = emailsJson.getAsJsonArray();
+                        for (JsonElement email : emailsArray) {
+                            emails.add(new Email(email.getAsJsonObject().get("id").getAsString()));
+                        }
                     }
                     return emails;
                 }
diff --git a/src/main/java/org/apache/sling/cli/impl/release/TallyVotesCommand.java b/src/main/java/org/apache/sling/cli/impl/release/TallyVotesCommand.java
index 93dbf0a..4526707 100644
--- a/src/main/java/org/apache/sling/cli/impl/release/TallyVotesCommand.java
+++ b/src/main/java/org/apache/sling/cli/impl/release/TallyVotesCommand.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.text.Collator;
 import java.util.Arrays;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Locale;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -77,47 +78,46 @@ public class TallyVotesCommand implements Command {
         try {
             
             StagingRepository repository = repoFinder.find(Integer.parseInt(target));
-            String releaseName = Release.fromString(repository.getDescription())
-                    .stream()
-                    .map(Release::getName)
-                    .collect(Collectors.joining(", "));
-            String releaseFullName = Release.fromString(repository.getDescription())
-                    .stream()
-                    .map(Release::getFullName)
-                    .collect(Collectors.joining(", "));
-
+            List<Release> releases = Release.fromString(repository.getDescription());
+            String releaseName = releases.stream().map(Release::getName).collect(Collectors.joining(", "));
+            String releaseFullName = releases.stream().map(Release::getFullName).collect(Collectors.joining(", "));
             Set<String> bindingVoters = new LinkedHashSet<>();
             Set<String> nonBindingVoters = new LinkedHashSet<>();
             Collator collator = Collator.getInstance(Locale.US);
             collator.setDecomposition(Collator.NO_DECOMPOSITION);
-            voteThreadFinder.findVoteThread(releaseName).stream().skip(1).filter(this::isPositiveVote).forEachOrdered(
-                    email -> {
-                        String from = email.getFrom().getAddress();
-                        String name = email.getFrom().getPersonal();
-                        Member m = membersFinder.findByNameOrEmail(name, from);
-                        if (m != null) {
-                            if (m.isPMCMember()) {
-                                bindingVoters.add(m.getName());
+            List<Email> emailThread = voteThreadFinder.findVoteThread(releaseName);
+            if (emailThread.isEmpty()) {
+                logger.error("Could not find a corresponding email voting thread for release \"{}\".", releaseName);
+            } else {
+                emailThread.stream().skip(1).filter(this::isPositiveVote).forEachOrdered(
+                        email -> {
+                            String from = email.getFrom().getAddress();
+                            String name = email.getFrom().getPersonal();
+                            Member m = membersFinder.findByNameOrEmail(name, from);
+                            if (m != null) {
+                                if (m.isPMCMember()) {
+                                    bindingVoters.add(m.getName());
+                                } else {
+                                    nonBindingVoters.add(m.getName());
+                                }
                             } else {
-                                nonBindingVoters.add(m.getName());
+                                nonBindingVoters.add(name);
                             }
-                        } else {
-                            nonBindingVoters.add(name);
                         }
-                    }
-            );
+                );
 
-            String email = EMAIL_TEMPLATE
-                .replace("##RELEASE_NAME##", releaseFullName)
-                .replace("##BINDING_VOTERS##", String.join(", ", bindingVoters))
-                .replace("##USER_NAME##", membersFinder.getCurrentMember().getName());
-            if (nonBindingVoters.isEmpty()) {
-                email = email.replace("##NON_BINDING_VOTERS##", "none");
-            } else {
-                email = email.replace("##NON_BINDING_VOTERS##", String.join(", ", nonBindingVoters));
-            }
+                String email = EMAIL_TEMPLATE
+                        .replace("##RELEASE_NAME##", releaseFullName)
+                        .replace("##BINDING_VOTERS##", String.join(", ", bindingVoters))
+                        .replace("##USER_NAME##", membersFinder.getCurrentMember().getName());
+                if (nonBindingVoters.isEmpty()) {
+                    email = email.replace("##NON_BINDING_VOTERS##", "none");
+                } else {
+                    email = email.replace("##NON_BINDING_VOTERS##", String.join(", ", nonBindingVoters));
+                }
 
-            logger.info(email);
+                logger.info(email);
+            }
             
         } catch (IOException e) {
             logger.warn("Command execution failed", e);