You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by dw...@apache.org on 2025/05/04 21:00:44 UTC

(lucene) branch main updated: Always check gradle wrapper sha checksum and download if necessary (#14608)

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

dweiss pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/lucene.git


The following commit(s) were added to refs/heads/main by this push:
     new 73aca0c6d03 Always check gradle wrapper sha checksum and download if necessary (#14608)
73aca0c6d03 is described below

commit 73aca0c6d036c8be74c7f410f84e093b96494158
Author: Dawid Weiss <da...@carrotsearch.com>
AuthorDate: Sun May 4 23:00:37 2025 +0200

    Always check gradle wrapper sha checksum and download if necessary (#14608)
---
 .../apache/lucene/gradle/WrapperDownloader.java    | 43 ++++++++++++++++++++--
 gradle/wrapper/gradle-wrapper.jar.sha256           |  2 +-
 gradlew                                            |  2 +-
 gradlew.bat                                        | 20 ++++++++--
 4 files changed, 58 insertions(+), 9 deletions(-)

diff --git a/build-tools/build-infra/src/main/java/org/apache/lucene/gradle/WrapperDownloader.java b/build-tools/build-infra/src/main/java/org/apache/lucene/gradle/WrapperDownloader.java
index 0fa2e9584b8..8f3e5aeba20 100644
--- a/build-tools/build-infra/src/main/java/org/apache/lucene/gradle/WrapperDownloader.java
+++ b/build-tools/build-infra/src/main/java/org/apache/lucene/gradle/WrapperDownloader.java
@@ -35,7 +35,9 @@ import java.nio.file.Paths;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.Locale;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
+import java.util.logging.Logger;
 
 /**
  * Standalone class that can be used to download a gradle-wrapper.jar
@@ -66,12 +68,47 @@ public class WrapperDownloader {
   }
 
   public void run(Path destination) throws IOException, NoSuchAlgorithmException {
-    Path checksumPath =
-        destination.resolveSibling(destination.getFileName().toString() + ".sha256");
+    var expectedFileName = destination.getFileName().toString();
+    Path checksumPath = destination.resolveSibling(expectedFileName + ".sha256");
     if (!Files.exists(checksumPath)) {
       throw new IOException("Checksum file not found: " + checksumPath);
     }
-    String expectedChecksum = Files.readString(checksumPath, StandardCharsets.UTF_8).trim();
+
+    String expectedChecksum;
+    try (var lines = Files.lines(checksumPath, StandardCharsets.UTF_8)) {
+      expectedChecksum =
+          lines
+              .map(
+                  line -> {
+                    // "The default mode is to print a line with: checksum, a space,
+                    // a character indicating input mode  ('*' for binary, ' ' for text
+                    // or where binary is insignificant), and name for each FILE."
+                    var spaceIndex = line.indexOf(" ");
+                    if (spaceIndex != -1 && spaceIndex + 2 < line.length()) {
+                      var mode = line.charAt(spaceIndex + 1);
+                      String fileName = line.substring(spaceIndex + 2);
+                      if (mode == '*' && fileName.equals(expectedFileName)) {
+                        return line.substring(0, spaceIndex);
+                      }
+                    }
+
+                    Logger.getLogger(WrapperDownloader.class.getName())
+                        .warning(
+                            "Something is wrong with the checksum file. Regenerate with "
+                                + "'sha256sum -b gradle-wrapper.jar > gradle-wrapper.jar.sha256'");
+                    return null;
+                  })
+              .filter(Objects::nonNull)
+              .findFirst()
+              .orElse(null);
+
+      if (expectedChecksum == null) {
+        throw new IOException(
+            "The checksum file did not contain the expected checksum for '"
+                + expectedFileName
+                + "'?");
+      }
+    }
 
     Path versionPath =
         destination.resolveSibling(destination.getFileName().toString() + ".version");
diff --git a/gradle/wrapper/gradle-wrapper.jar.sha256 b/gradle/wrapper/gradle-wrapper.jar.sha256
index 30bde90fc90..bd9f4c67630 100644
--- a/gradle/wrapper/gradle-wrapper.jar.sha256
+++ b/gradle/wrapper/gradle-wrapper.jar.sha256
@@ -1 +1 @@
-7d3a4ac4de1c32b59bc6a4eb8ecb8e612ccd0cf1ae1e99f66902da64df296172
\ No newline at end of file
+7d3a4ac4de1c32b59bc6a4eb8ecb8e612ccd0cf1ae1e99f66902da64df296172 *gradle-wrapper.jar
diff --git a/gradlew b/gradlew
index 37f1028864b..1b3f68d9fa7 100755
--- a/gradlew
+++ b/gradlew
@@ -222,7 +222,7 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
 fi
 
 GRADLE_WRAPPER_JAR="$APP_HOME/gradle/wrapper/gradle-wrapper.jar"
-if [ ! -e "$GRADLE_WRAPPER_JAR" ]; then
+if ! ( cd $APP_HOME/gradle/wrapper && sha256sum --status -c ${GRADLE_WRAPPER_JAR}.sha256 ); then
     "$JAVACMD" $JAVA_OPTS "$APP_HOME/build-tools/build-infra/src/main/java/org/apache/lucene/gradle/WrapperDownloader.java" "$GRADLE_WRAPPER_JAR"
     WRAPPER_STATUS=$?
     if [ "$WRAPPER_STATUS" -eq 1 ]; then
diff --git a/gradlew.bat b/gradlew.bat
index 69177e49f98..34db8faf1db 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -81,10 +81,22 @@ SET DEFAULT_JVM_OPTS=%DEFAULT_JVM_OPTS% "-Djava.io.tmpdir=%GRADLE_TEMPDIR%"
 
 @rem LUCENE-9266: verify and download the gradle wrapper jar if we don't have one.
 set GRADLE_WRAPPER_JAR=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-IF NOT EXIST "%GRADLE_WRAPPER_JAR%" (
-    "%JAVA_EXE%" %JAVA_OPTS% "%APP_HOME%/build-tools/build-infra/src/main/java/org/apache/lucene/gradle/WrapperDownloader.java" "%GRADLE_WRAPPER_JAR%"
-    IF %ERRORLEVEL% EQU 1 goto failWithJvmMessage
-    IF %ERRORLEVEL% NEQ 0 goto fail
+set GRADLE_WRAPPER_CHECKSUM=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar.sha256
+
+@rem Read the expected hash from .sha256 file
+for /f "tokens=1" %%A in (%GRADLE_WRAPPER_CHECKSUM%) do (
+    set "EXPECTED=%%A"
+)
+@rem Get actual SHA-256 hash using certutil
+for /f "tokens=* delims=" %%H in ('certutil -hashfile "%GRADLE_WRAPPER_JAR%" SHA256 ^| findstr /R /B /I /X "[0-9a-f]*"') do (
+    set "ACTUAL=%%H"
+)
+
+if /i "%ACTUAL%" NEQ "%EXPECTED%" (
+  echo "Checking gradle shas."
+  "%JAVA_EXE%" -XX:TieredStopAtLevel=1 %JAVA_OPTS% "%APP_HOME%/build-tools/build-infra/src/main/java/org/apache/lucene/gradle/WrapperDownloader.java" "%GRADLE_WRAPPER_JAR%"
+  IF %ERRORLEVEL% EQU 1 goto failWithJvmMessage
+  IF %ERRORLEVEL% NEQ 0 goto fail
 )
 
 @rem Generate gradle.properties if they don't exist