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);