From 6b8690765eebe91fb1794f6acf7e51469aec4551 Mon Sep 17 00:00:00 2001 From: David Smiley Date: Tue, 18 Aug 2026 19:04:30 -0400 Subject: [PATCH 1/2] Gradle WrapperDownloader: move URL & sha into properties And don't bother checking if the wrapper jar is out-of-date. --- .github/actions/prepare-for-build/action.yml | 2 +- .../lucene/gradle/WrapperDownloader.java | 84 ++++--------------- gradle/wrapper/gradle-wrapper.jar.sha256 | 1 - gradle/wrapper/gradle-wrapper.properties | 5 ++ gradlew | 9 +- gradlew.bat | 14 +--- 6 files changed, 27 insertions(+), 88 deletions(-) delete mode 100644 gradle/wrapper/gradle-wrapper.jar.sha256 diff --git a/.github/actions/prepare-for-build/action.yml b/.github/actions/prepare-for-build/action.yml index be89237e5037..8de944a04d98 100644 --- a/.github/actions/prepare-for-build/action.yml +++ b/.github/actions/prepare-for-build/action.yml @@ -35,7 +35,7 @@ runs: uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: path: gradle/wrapper/gradle-wrapper.jar - key: gradle-wrapper-${{ hashFiles('gradle/wrapper/gradle-wrapper.jar.sha256') }} + key: gradle-wrapper-${{ hashFiles('gradle/wrapper/gradle-wrapper.properties') }} # This includes "smart" caching of gradle dependencies. - name: Set up Gradle 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 40de43f4f52b..21eb73c7cd03 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 @@ -28,17 +28,14 @@ import java.net.HttpURLConnection; import java.net.URI; import java.net.URL; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Locale; -import java.util.Objects; +import java.util.Properties; import java.util.concurrent.TimeUnit; -import java.util.logging.Logger; -import java.util.regex.Pattern; /** * Standalone class used to download the {@code gradle-wrapper.jar}. @@ -81,48 +78,6 @@ public static void checkVersion() { } public void run(Path destination) throws IOException, NoSuchAlgorithmException { - 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; - 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 wrapperProperties = destination.resolveSibling( destination.getFileName().toString().replace(".jar", ".properties")); @@ -130,21 +85,12 @@ public void run(Path destination) throws IOException, NoSuchAlgorithmException { throw new IOException("Wrapper property file not found: " + wrapperProperties); } - Pattern versionPattern = Pattern.compile("gradle-(?.+?)-bin.zip"); - String wrapperVersion = - Files.readAllLines(wrapperProperties, StandardCharsets.UTF_8).stream() - .map( - line -> { - var matcher = versionPattern.matcher(line); - if (matcher.find()) { - return matcher.group("version"); - } else { - return null; - } - }) - .filter(Objects::nonNull) - .findAny() - .orElseThrow(); + Properties properties = new Properties(); + try (InputStream in = Files.newInputStream(wrapperProperties)) { + properties.load(in); + } + String wrapperUrl = requireProperty(properties, wrapperProperties, "wrapperUrl"); + String expectedChecksum = requireProperty(properties, wrapperProperties, "wrapperSha256"); MessageDigest digest = MessageDigest.getInstance("SHA-256"); @@ -159,12 +105,7 @@ public void run(Path destination) throws IOException, NoSuchAlgorithmException { } } - URL url = - URI.create( - "https://raw.githubusercontent.com/gradle/gradle/v" - + wrapperVersion - + "/gradle/wrapper/gradle-wrapper.jar") - .toURL(); + URL url = URI.create(wrapperUrl).toURL(); System.err.println("Downloading gradle-wrapper.jar from " + url); // Zero-copy save the jar to a temp file @@ -242,6 +183,15 @@ public void run(Path destination) throws IOException, NoSuchAlgorithmException { } } + private static String requireProperty(Properties properties, Path source, String key) + throws IOException { + String value = properties.getProperty(key); + if (value == null || value.isBlank()) { + throw new IOException("Missing required property '" + key + "' in " + source); + } + return value.trim(); + } + @SuppressForbidden(reason = "Valid use of thread.sleep.") private static void sleep(long millis) throws InterruptedException { Thread.sleep(millis); diff --git a/gradle/wrapper/gradle-wrapper.jar.sha256 b/gradle/wrapper/gradle-wrapper.jar.sha256 deleted file mode 100644 index 01bf52d7082b..000000000000 --- a/gradle/wrapper/gradle-wrapper.jar.sha256 +++ /dev/null @@ -1 +0,0 @@ -497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7 *gradle-wrapper.jar diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a9db11550c62..2fcb598e00b1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -7,3 +7,8 @@ retryBackOffMs=500 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists + +# Read by Lucene's WrapperDownloader (not by the actual wrapper) to bootstrap gradle-wrapper.jar. +wrapperSha256=497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7 +wrapperUrl=https\://raw.githubusercontent.com/gradle/gradle/v9.6.1/gradle/wrapper/gradle-wrapper.jar +# To self download, try %> curl -Lo gradle/wrapper/gradle-wrapper.jar (from the repo root) diff --git a/gradlew b/gradlew index 88520aab1aeb..d0c59bbfe886 100755 --- a/gradlew +++ b/gradlew @@ -211,18 +211,13 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then fi DEFAULT_JVM_OPTS="$DEFAULT_JVM_OPTS \"-Djava.io.tmpdir=$GRADLE_TEMPDIR\"" -# LUCENE-9266: verify and download the gradle wrapper jar if we don't have one. +# LUCENE-9266: download the gradle wrapper jar if we don't have one. if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` fi GRADLE_WRAPPER_JAR="$APP_HOME/gradle/wrapper/gradle-wrapper.jar" -if "$darwin"; then - shasumcmd=shasum -else - shasumcmd=sha256sum -fi -if [ ! -e "$GRADLE_WRAPPER_JAR" ] || ! ( cd "$APP_HOME/gradle/wrapper" && "$shasumcmd" --status -c "${GRADLE_WRAPPER_JAR}.sha256" ); then +if [ ! -e "$GRADLE_WRAPPER_JAR" ]; 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 9a4928299a96..7a3d73764836 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -77,20 +77,10 @@ SET GRADLE_TEMPDIR=%DIRNAME%\.gradle\tmp IF NOT EXIST "%GRADLE_TEMPDIR%" MKDIR "%GRADLE_TEMPDIR%" 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. +@rem LUCENE-9266: download the gradle wrapper jar if we don't have one. set GRADLE_WRAPPER_JAR=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar -set GRADLE_WRAPPER_CHECKSUM=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar.sha256 -@rem Read the expected hash from .sha256 file -for /f "tokens=1 usebackq" %%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%" ( +IF NOT EXIST "%GRADLE_WRAPPER_JAR%" ( "%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 exitWithErrorLevel From 21f1588a2b33562e4b3f384c30115d578b27f208 Mon Sep 17 00:00:00 2001 From: David Smiley Date: Tue, 18 Aug 2026 23:55:33 -0400 Subject: [PATCH 2/2] UTF8 properties --- .../main/java/org/apache/lucene/gradle/WrapperDownloader.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 21eb73c7cd03..30f93a0beb20 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 @@ -21,6 +21,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.Reader; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -28,6 +29,7 @@ import java.net.HttpURLConnection; import java.net.URI; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -86,7 +88,7 @@ public void run(Path destination) throws IOException, NoSuchAlgorithmException { } Properties properties = new Properties(); - try (InputStream in = Files.newInputStream(wrapperProperties)) { + try (Reader in = Files.newBufferedReader(wrapperProperties, StandardCharsets.UTF_8)) { properties.load(in); } String wrapperUrl = requireProperty(properties, wrapperProperties, "wrapperUrl");