Add gradle compatibility tests; fix compatibility with 5.0

This commit is contained in:
Tad Fisher
2019-04-01 11:22:46 -07:00
parent 932f690610
commit 23de1b99d0
16 changed files with 226 additions and 36 deletions

View File

@@ -0,0 +1,16 @@
plugins {
id 'java'
}
repositories {
jcenter()
}
dependencies {
implementation("com.squareup.okio:okio:2.2.2")
implementation("com.squareup.moshi:moshi:1.8.0")
}
task runGradleTest {
dependsOn 'nixGradleEnv'
}

View File

@@ -0,0 +1,16 @@
plugins {
java
}
repositories {
jcenter()
}
dependencies {
implementation("com.squareup.okio:okio:2.2.2")
implementation("com.squareup.moshi:moshi:1.8.0")
}
tasks.register("runGradleTest") {
dependsOn("nixGradleEnv")
}

View File

@@ -0,0 +1,69 @@
package org.nixos.gradle2nix
import org.gradle.api.file.Directory
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.RegularFile
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.util.GradleVersion
private fun versionAtLeast(version: String): Boolean =
GradleVersion.current() >= GradleVersion.version(version)
internal fun <T> Property<T>.conventionCompat(value: T): Property<T> {
return if (versionAtLeast("5.1")) {
convention(value)
} else {
apply { set(value) }
}
}
internal fun <T> Property<T>.conventionCompat(valueProvider: Provider<out T>): Property<T> {
return if (versionAtLeast("5.1")) {
convention(valueProvider)
} else {
apply { set(valueProvider) }
}
}
internal fun DirectoryProperty.conventionCompat(
value: Directory
): DirectoryProperty {
return if (versionAtLeast("5.1")) {
convention(value)
} else {
apply { set(value) }
}
}
internal fun DirectoryProperty.conventionCompat(
valueProvider: Provider<out Directory>
): DirectoryProperty {
return if (versionAtLeast("5.1")) {
convention(valueProvider)
} else {
apply { set(valueProvider) }
}
}
internal fun RegularFileProperty.conventionCompat(
value: RegularFile
): RegularFileProperty {
return if (versionAtLeast("5.1")) {
convention(value)
} else {
apply { set(value) }
}
}
internal fun RegularFileProperty.conventionCompat(
valueProvider: Provider<out RegularFile>
): RegularFileProperty {
return if (versionAtLeast("5.1")) {
convention(valueProvider)
} else {
apply { set(valueProvider) }
}
}

View File

@@ -2,13 +2,19 @@ package org.nixos.gradle2nix
import okio.buffer
import okio.source
import org.gradle.api.file.ProjectLayout
import org.gradle.api.model.ObjectFactory
import org.gradle.api.tasks.InputFile
import java.lang.IllegalStateException
import java.net.URI
import javax.inject.Inject
open class NixBuildscriptEnv : NixEnv() {
open class NixBuildscriptEnv @Inject constructor(
layout: ProjectLayout,
objects: ObjectFactory
): NixEnv(layout, objects) {
@InputFile
val pluginEnvFile = project.objects.fileProperty()
val pluginEnvFile = objects.fileProperty()
private val pluginEnv: BuildEnv by lazy {
pluginEnvFile.get().asFile.source().buffer().use { src ->
@@ -40,4 +46,4 @@ open class NixBuildscriptEnv : NixEnv() {
}
override fun filename(): String = "buildscript.json"
}
}

View File

@@ -1,31 +1,32 @@
package org.nixos.gradle2nix
import com.squareup.moshi.JsonClass
import com.squareup.moshi.Moshi
import okio.buffer
import okio.sink
import org.gradle.api.DefaultTask
import org.gradle.api.artifacts.repositories.ArtifactRepository
import org.gradle.api.artifacts.repositories.MavenArtifactRepository
import org.gradle.api.file.ProjectLayout
import org.gradle.api.model.ObjectFactory
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import java.net.URI
import javax.inject.Inject
abstract class NixEnv : DefaultTask() {
abstract class NixEnv(layout: ProjectLayout, objects: ObjectFactory): DefaultTask() {
abstract fun environment(): String
abstract fun repositories(): List<String>
abstract fun artifacts(): List<Artifact>
abstract fun filename(): String
@Internal
val outputDir = project.objects.directoryProperty()
.convention(project.layout.buildDirectory.dir("nix"))
val outputDir = objects.directoryProperty()
.conventionCompat(layout.buildDirectory.dir("nix"))
@OutputFile
val outputFile = project.objects.fileProperty()
.convention(outputDir.map { it.file(filename()) })
val outputFile = objects.fileProperty()
.conventionCompat(outputDir.map { it.file(filename()) })
@TaskAction
open fun run() {
@@ -70,4 +71,4 @@ internal fun ArtifactRepository.repositoryUrls(): Set<URI> {
is MavenArtifactRepository -> setOf(url) + artifactUrls
else -> emptySet()
}.filterNotTo(mutableSetOf()) { it.scheme == "file" }
}
}

View File

@@ -4,23 +4,27 @@ import com.squareup.moshi.JsonClass
import okio.buffer
import okio.sink
import org.gradle.api.DefaultTask
import org.gradle.api.model.ObjectFactory
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.property
import java.io.Serializable
import javax.inject.Inject
open class NixGradleDist : DefaultTask() {
open class NixGradleDist @Inject constructor(
objects: ObjectFactory
) : DefaultTask() {
@Input
internal val gradleDist = project.objects.property<GradleDist>()
internal val gradleDist = objects.property<GradleDist>()
@OutputDirectory
val outputDir = project.objects.directoryProperty()
val outputDir = objects.directoryProperty()
@OutputFile
val outputFile = project.objects.fileProperty()
.convention(outputDir.file("gradle-dist.json"))
val outputFile = objects.fileProperty()
.conventionCompat(outputDir.file("gradle-dist.json"))
@TaskAction
fun run() {
@@ -41,4 +45,4 @@ internal data class GradleDist(
val url: String,
val sha256: String,
val nativeVersion: String
) : Serializable
) : Serializable

View File

@@ -6,6 +6,7 @@ import okio.sink
import okio.source
import org.gradle.api.DefaultTask
import org.gradle.api.file.RegularFile
import org.gradle.api.model.ObjectFactory
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.Internal
@@ -13,18 +14,21 @@ import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.listProperty
import javax.inject.Inject
open class NixGradleEnv : DefaultTask() {
open class NixGradleEnv @Inject constructor(
objects: ObjectFactory
) : DefaultTask() {
@InputFiles
val inputEnvs = project.objects.fileCollection()
val inputEnvs = project.files()
@Internal
val outputDir = project.objects.directoryProperty()
val outputDir = objects.directoryProperty()
@OutputFile
val outputFile = project.objects.fileProperty()
.convention(outputDir.file("gradle-env.json"))
val outputFile = objects.fileProperty()
.conventionCompat(outputDir.file("gradle-env.json"))
@TaskAction
fun run() {

View File

@@ -1,8 +1,10 @@
package org.nixos.gradle2nix
import org.gradle.api.artifacts.ExternalModuleDependency
import org.gradle.api.file.ProjectLayout
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.VersionSelectorScheme
import org.gradle.api.internal.plugins.PluginImplementation
import org.gradle.api.model.ObjectFactory
import org.gradle.plugin.management.PluginRequest
import org.gradle.plugin.management.internal.PluginRequestInternal
import org.gradle.plugin.use.PluginId
@@ -15,10 +17,12 @@ import java.net.URI
import javax.inject.Inject
open class NixPluginEnv @Inject constructor(
layout: ProjectLayout,
objects: ObjectFactory,
private val pluginDependencyResolutionServices: PluginDependencyResolutionServices,
versionSelectorScheme: VersionSelectorScheme,
private val pluginRequests: Collection<PluginRequest>
) : NixEnv() {
) : NixEnv(layout, objects) {
private val repositories by lazy {
pluginDependencyResolutionServices.resolveRepositoryHandler
}
@@ -107,4 +111,4 @@ private class PluginContext : PluginResolveContext {
dependencies.add(dependencyNotation)
}
}
}
}

View File

@@ -1,13 +1,20 @@
package org.nixos.gradle2nix
import org.gradle.api.file.ProjectLayout
import org.gradle.api.model.ObjectFactory
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional
import org.gradle.kotlin.dsl.setProperty
import java.net.URI
import javax.inject.Inject
open class NixProjectEnv : NixEnv() {
open class NixProjectEnv @Inject constructor(
layout: ProjectLayout,
objects: ObjectFactory
) : NixEnv(layout, objects) {
@Input @Optional
val configurations = project.objects.setProperty<String>()
val configurations = objects.setProperty<String>().empty()
private val resolveConfigurations by lazy {
val configs = configurations.get()
@@ -38,4 +45,4 @@ open class NixProjectEnv : NixEnv() {
}
override fun filename(): String = "project.json"
}
}

View File

@@ -156,11 +156,11 @@ private class MavenPomResolver(
override fun addRepository(repository: Repository, replace: Boolean) {}
}
fun sha256(file: File): String {
private fun sha256(file: File): String {
val hashSource = HashingSource.sha256(file.source())
val hash: ByteString = hashSource.buffer().use { source ->
source.readAll(blackholeSink())
hashSource.hash
}
return hash.base64()
}
}