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 2023/03/31 16:48:36 UTC

[sling-org-apache-sling-committer-cli] 01/01: SLING-11816 - Transliterated project member names break the vote counting algorithm

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

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

commit 8cb5decec9d4403b7308c7f01218473067fd354b
Author: Radu Cotescu <ra...@apache.org>
AuthorDate: Fri Mar 31 18:46:47 2023 +0200

    SLING-11816 - Transliterated project member names break the vote counting algorithm
    
    * added support for transliterated names in the MembersFinder
---
 pom.xml                                                             | 6 ++++++
 src/main/features/app.json                                          | 3 +++
 src/main/java/org/apache/sling/cli/impl/people/MembersFinder.java   | 5 ++++-
 .../java/org/apache/sling/cli/impl/release/TallyVotesCommand.java   | 2 ++
 .../org/apache/sling/cli/impl/release/TallyVotesCommandTest.java    | 4 +++-
 5 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/pom.xml b/pom.xml
index 5576286..eeea3d1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -279,6 +279,12 @@
             <version>1.62</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>com.ibm.icu</groupId>
+            <artifactId>icu4j</artifactId>
+            <version>72.1</version>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
diff --git a/src/main/features/app.json b/src/main/features/app.json
index 9f1693b..f8fc1d9 100644
--- a/src/main/features/app.json
+++ b/src/main/features/app.json
@@ -91,6 +91,9 @@
         },
         {
             "id": "commons-io:commons-io:2.6"
+        },
+        {
+            "id": "com.ibm.icu:icu4j:72.1"
         }
     ]
 }
diff --git a/src/main/java/org/apache/sling/cli/impl/people/MembersFinder.java b/src/main/java/org/apache/sling/cli/impl/people/MembersFinder.java
index 86639bf..3962eaa 100644
--- a/src/main/java/org/apache/sling/cli/impl/people/MembersFinder.java
+++ b/src/main/java/org/apache/sling/cli/impl/people/MembersFinder.java
@@ -42,6 +42,7 @@ import org.slf4j.LoggerFactory;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
+import com.ibm.icu.text.Transliterator;
 
 @Component(service = MembersFinder.class)
 public class MembersFinder {
@@ -50,6 +51,7 @@ public class MembersFinder {
     private static final String PEOPLE_ENDPOINT = "https://whimsy.apache.org/public/public_ldap_people.json";
     private static final String PROJECTS_ENDPOINT = "https://whimsy.apache.org/public/public_ldap_projects.json";
     private static final int STALENESS_IN_HOURS = 3;
+    private static final Transliterator TRANSLITERATOR = Transliterator.getInstance("de-ASCII");
     private Set<Member> members = Collections.emptySet();
     private long lastCheck = 0;
 
@@ -120,7 +122,8 @@ public class MembersFinder {
         Collator collator = Collator.getInstance(Locale.US);
         collator.setDecomposition(Collator.NO_DECOMPOSITION);
         for (Member member : findMembers()) {
-            if (email.equals(member.getEmail()) || (name != null && collator.compare(name, member.getName()) == 0)) {
+            if (email.equals(member.getEmail()) || (name != null && collator.compare(TRANSLITERATOR.transliterate(name),
+                    TRANSLITERATOR.transliterate(member.getName())) == 0)) {
                 return member;
             }
         }
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 7463882..6a7120f 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
@@ -167,6 +167,8 @@ public class TallyVotesCommand implements Command {
                 } else {
                     LOGGER.info("Release {} does not have at least 3 binding votes.", releaseFullName);
                     LOGGER.info("Binding votes: {}.", bindingVoters.isEmpty() ? "none" : String.join(", ", bindingVoters));
+                    LOGGER.info("Non-binding votes: {}.", nonBindingVoters.isEmpty() ? "none" : String.join(", ",
+                            bindingVoters));
                     return CommandLine.ExitCode.USAGE;
                 }
             }
diff --git a/src/test/java/org/apache/sling/cli/impl/release/TallyVotesCommandTest.java b/src/test/java/org/apache/sling/cli/impl/release/TallyVotesCommandTest.java
index c96835c..d58e73d 100644
--- a/src/test/java/org/apache/sling/cli/impl/release/TallyVotesCommandTest.java
+++ b/src/test/java/org/apache/sling/cli/impl/release/TallyVotesCommandTest.java
@@ -93,6 +93,7 @@ public class TallyVotesCommandTest {
             add(mockEmail("charlie@apache.org", "Charlie"));
             add(mockEmail("daniel@apache.org", "Daniel"));
             add(mockEmail("johndoe@apache.org", "John Doe"));
+            add(mockEmail("jhoh228@googlemail.com.INVALID", "Jörg Hoh"));
         }};
         prepareExecution(mock(Mailer.class), thread);
         TallyVotesCommand tallyVotesCommand = spy(new TallyVotesCommand());
@@ -116,7 +117,7 @@ public class TallyVotesCommandTest {
                 "\n" +
                 "The vote has passed with the following result:\n" +
                 "\n" +
-                "+1 (binding): Alice, Bob, Charlie, John Doe\n" +
+                "+1 (binding): Alice, Bob, Charlie, John Doe, Joerg Hoh\n" +
                 "+1 (non-binding): Daniel\n" +
                 "\n" +
                 "I will copy this release to the Sling dist directory and\n" +
@@ -219,6 +220,7 @@ public class TallyVotesCommandTest {
             add(new Member("bob", "Bob", true));
             add(new Member("charlie", "Charlie", true));
             add(new Member("daniel", "Daniel", false));
+            add(new Member("joerghoh", "Joerg Hoh", true));
         }};
         Whitebox.setInternalState(membersFinder, "members", members);
         Whitebox.setInternalState(membersFinder, "lastCheck", System.currentTimeMillis());