diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0158822..80049f8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-java@v5 with: - java-version: 17 + java-version: 25 distribution: 'temurin' - name: Check for changes run: ./gradlew spotlessCheck @@ -23,7 +23,7 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-java@v5 with: - java-version: 17 + java-version: 25 distribution: 'temurin' - name: Build run: ./gradlew build -PRunToolchainTests @@ -41,7 +41,7 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-java@v5 with: - java-version: 17 + java-version: 25 distribution: 'temurin' - name: Publish to maven local run: ./gradlew publishToMavenLocal @@ -55,7 +55,7 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-java@v5 with: - java-version: 17 + java-version: 25 distribution: 'temurin' - name: Publish to Maven Local if: ${{ !startsWith(github.ref, 'refs/tags/v') }} diff --git a/build.gradle b/build.gradle index c433d9c..ec11215 100644 --- a/build.gradle +++ b/build.gradle @@ -8,11 +8,11 @@ plugins { } group 'org.photonvision' -version '4.1.1-photon' -if (project.hasProperty('publishVersion')) { - version = project.publishVersion -} +apply from: "versioningHelper.gradle" + + +version = versionString repositories { mavenCentral() @@ -23,8 +23,8 @@ dependencies { } java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 } gradlePlugin { @@ -59,6 +59,10 @@ tasks.withType(JavaCompile) { options.deprecation = true } +tasks.named('processResources') { + from('versioningHelper.gradle') +} + tasks.named('pluginUnderTestMetadata') { pluginClasspath.from(tasks.named('jar')) dependsOn(tasks.named('jar')) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d4081da..dbc3ce4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/src/main/java/org/photonvision/tools/AssembleNativeResources.java b/src/main/java/org/photonvision/tools/AssembleNativeResources.java index 3e074fd..a681ad4 100644 --- a/src/main/java/org/photonvision/tools/AssembleNativeResources.java +++ b/src/main/java/org/photonvision/tools/AssembleNativeResources.java @@ -1,5 +1,47 @@ package org.photonvision.tools; -import org.gradle.api.tasks.Sync; +import javax.inject.Inject; +import org.gradle.api.DefaultTask; +import org.gradle.api.file.ConfigurableFileCollection; +import org.gradle.api.file.DirectoryProperty; +import org.gradle.api.model.ObjectFactory; +import org.gradle.api.tasks.InputFiles; +import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; +import org.gradle.api.tasks.TaskAction; +import org.gradle.work.DisableCachingByDefault; -public class AssembleNativeResources extends Sync {} +@DisableCachingByDefault(because = "Caching isn't necessary for copy tasks") +public class AssembleNativeResources extends DefaultTask { + private final ConfigurableFileCollection inputFiles; + private final DirectoryProperty outputDirectory; + + @Inject + public AssembleNativeResources() { + ObjectFactory factory = getProject().getObjects(); + inputFiles = getProject().files(); + outputDirectory = factory.directoryProperty(); + } + + @InputFiles + @PathSensitive(PathSensitivity.RELATIVE) + public ConfigurableFileCollection getInputFiles() { + return inputFiles; + } + + @OutputDirectory + public DirectoryProperty getOutputDirectory() { + return outputDirectory; + } + + @TaskAction + public void execute() { + getProject() + .sync( + copySpec -> { + copySpec.from(inputFiles); + copySpec.into(outputDirectory); + }); + } +} diff --git a/src/main/java/org/photonvision/tools/ExtractConfiguration.java b/src/main/java/org/photonvision/tools/ExtractConfiguration.java index b54f4de..d94519a 100644 --- a/src/main/java/org/photonvision/tools/ExtractConfiguration.java +++ b/src/main/java/org/photonvision/tools/ExtractConfiguration.java @@ -22,8 +22,12 @@ import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.OutputDirectory; import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.TaskAction; +import org.gradle.work.DisableCachingByDefault; +@DisableCachingByDefault(because = "Copying doesn't need caching") public class ExtractConfiguration extends DefaultTask { private final ArtifactViewAction viewAction = new ArtifactViewAction(); @@ -57,6 +61,7 @@ public DirectoryProperty getOutputDirectory() { } @InputFiles + @PathSensitive(PathSensitivity.RELATIVE) public ConfigurableFileCollection getConfigurationFiles() { return configurations; } diff --git a/src/main/java/org/photonvision/tools/FixupNativeResources.java b/src/main/java/org/photonvision/tools/FixupNativeResources.java index a3ea4a7..5bddd78 100644 --- a/src/main/java/org/photonvision/tools/FixupNativeResources.java +++ b/src/main/java/org/photonvision/tools/FixupNativeResources.java @@ -14,13 +14,18 @@ import org.gradle.api.model.ObjectFactory; import org.gradle.api.tasks.InputDirectory; import org.gradle.api.tasks.OutputDirectory; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.TaskAction; import org.gradle.internal.os.OperatingSystem; +import org.gradle.work.DisableCachingByDefault; +@DisableCachingByDefault(because = "Copying doesn't need caching") public class FixupNativeResources extends DefaultTask { private DirectoryProperty inputDirectory; private DirectoryProperty outputDirectory; + @PathSensitive(PathSensitivity.RELATIVE) @InputDirectory public DirectoryProperty getInputDirectory() { return inputDirectory; diff --git a/src/main/java/org/photonvision/tools/HashNativeResources.java b/src/main/java/org/photonvision/tools/HashNativeResources.java index 110f0e9..ff82d2d 100644 --- a/src/main/java/org/photonvision/tools/HashNativeResources.java +++ b/src/main/java/org/photonvision/tools/HashNativeResources.java @@ -25,8 +25,12 @@ import org.gradle.api.tasks.InputDirectory; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.TaskAction; +import org.gradle.work.DisableCachingByDefault; +@DisableCachingByDefault(because = "Hashing is fast and not worth caching") public class HashNativeResources extends DefaultTask { /** @@ -54,6 +58,7 @@ public record ResourceInformation( private final RegularFileProperty hashFile; private final RegularFileProperty versionsInput; + @PathSensitive(PathSensitivity.RELATIVE) @InputDirectory public DirectoryProperty getInputDirectory() { return inputDirectory; @@ -64,6 +69,7 @@ public RegularFileProperty getHashFile() { return hashFile; } + @PathSensitive(PathSensitivity.RELATIVE) @InputFile public RegularFileProperty getVersionsInput() { return versionsInput; diff --git a/src/main/java/org/photonvision/tools/UnzipTransform.java b/src/main/java/org/photonvision/tools/UnzipTransform.java index daa2e71..a837f63 100644 --- a/src/main/java/org/photonvision/tools/UnzipTransform.java +++ b/src/main/java/org/photonvision/tools/UnzipTransform.java @@ -13,6 +13,8 @@ import org.gradle.api.artifacts.transform.TransformParameters; import org.gradle.api.file.FileSystemLocation; import org.gradle.api.provider.Provider; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; import org.gradle.internal.UncheckedException; /** @@ -24,6 +26,7 @@ public interface UnzipTransform extends TransformAction getZippedFile(); diff --git a/src/main/java/org/photonvision/tools/WpilibTools.java b/src/main/java/org/photonvision/tools/WpilibTools.java index 0ecf7ba..18108e3 100644 --- a/src/main/java/org/photonvision/tools/WpilibTools.java +++ b/src/main/java/org/photonvision/tools/WpilibTools.java @@ -5,12 +5,18 @@ import static org.gradle.api.artifacts.type.ArtifactTypeDefinition.JAR_TYPE; import static org.gradle.api.artifacts.type.ArtifactTypeDefinition.ZIP_TYPE; +import java.net.URL; +import java.util.Map; import org.gradle.api.Plugin; import org.gradle.api.Project; public class WpilibTools implements Plugin { + private static final String VERSIONING_HELPER_RESOURCE = "versioningHelper.gradle"; + @Override public void apply(Project project) { + applyVersioningHelper(project); + project .getDependencies() .registerTransform( @@ -31,4 +37,15 @@ public void apply(Project project) { project.getExtensions().create("wpilibTools", WpilibToolsExtension.class, project); } + + private void applyVersioningHelper(Project project) { + URL helperScriptUrl = + WpilibTools.class.getClassLoader().getResource(VERSIONING_HELPER_RESOURCE); + if (helperScriptUrl == null) { + project.getLogger().warn("Unable to find {} in plugin resources", VERSIONING_HELPER_RESOURCE); + return; + } + + project.apply(Map.of("from", project.getResources().getText().fromUri(helperScriptUrl))); + } } diff --git a/src/main/java/org/photonvision/tools/WpilibToolsExtension.java b/src/main/java/org/photonvision/tools/WpilibToolsExtension.java index 7957704..2b30180 100644 --- a/src/main/java/org/photonvision/tools/WpilibToolsExtension.java +++ b/src/main/java/org/photonvision/tools/WpilibToolsExtension.java @@ -112,9 +112,11 @@ public NewTaskSet createExtractionTasks(Action configur "assembleNativeResources" + newConfig.taskPostfix, AssembleNativeResources.class); retSet.assemble.configure( c -> { - c.from(retSet.fixup.get()); - c.from(retSet.hash.get()); - c.into(newConfig.rootTaskFolder.dir("AssembledResources")); + c.dependsOn(retSet.fixup); + c.dependsOn(retSet.hash); + c.getInputFiles().from(retSet.fixup); + c.getInputFiles().from(retSet.hash); + c.getOutputDirectory().set(newConfig.rootTaskFolder.dir("AssembledResources")); }); return retSet; } diff --git a/versioningHelper.gradle b/versioningHelper.gradle new file mode 100644 index 0000000..4a91834 --- /dev/null +++ b/versioningHelper.gradle @@ -0,0 +1,42 @@ +import java.nio.file.Path +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter + +ext.getCurrentVersion = { + String tagIsh = "dev-unknown" + try { + tagIsh = providers.exec { + commandLine 'git', 'describe', '--tags', '--match=v*' + }.standardOutput.asText.get().trim().toLowerCase() + } catch (Exception ignored) { + tagIsh = "dev-unknown" + } + + // Dev tags: v2021.1.6-3-gf922466d + // We're specifically looking to capture the middle -3- + boolean isDev = tagIsh.matches(".*-[0-9]*-g[0-9a-f]*") + if (isDev && !tagIsh.startsWith("dev-")) tagIsh = "dev-" + tagIsh + println("Picked up version: " + tagIsh) + return tagIsh +} + +if (!ext.has("versionString")) { + ext.versionString = getCurrentVersion() +} + +ext.writePhotonVersionFile = {File versionFileIn, Path path, String version -> + println("Writing " + version + " to " + path.toAbsolutePath().toString()) + String date = DateTimeFormatter.ofPattern("yyyy-M-d hh:mm:ss").format(LocalDateTime.now()) + File versionFileOut = new File(path.toAbsolutePath().toString()) + versionFileOut.delete() + + def read = versionFileIn.text + .replace('${version}', version) + .replace('${date}', date) + .replace('${wpilibVersion}', wpilibVersion) + // Note that OpenCV is usually {VERSION}-{some suffix}, we just want the first bit + .replace('${opencvVersion}', openCVversion.split("-").first()) + if (!versionFileOut.parentFile.exists()) versionFileOut.parentFile.mkdirs() + if (!versionFileOut.exists()) versionFileOut.createNewFile() + versionFileOut.write(read) +}