Move Gradle build logic to a setup hook

This commit is contained in:
Tad Fisher
2024-06-13 15:21:58 -07:00
parent a4ef499401
commit b32bf21a6c
26 changed files with 768 additions and 470 deletions

View File

@@ -1,7 +1,8 @@
package org.nixos.gradle2nix
abstract class Gradle2NixPlugin : AbstractGradle2NixPlugin(
GradleCacheAccessFactoryBase,
DependencyExtractorApplierBase,
ResolveAllArtifactsApplierBase,
)
abstract class Gradle2NixPlugin :
AbstractGradle2NixPlugin(
GradleCacheAccessFactoryBase,
DependencyExtractorApplierBase,
ResolveAllArtifactsApplierBase,
)

View File

@@ -4,12 +4,12 @@ import org.gradle.api.internal.artifacts.ivyservice.ArtifactCachesProvider
import org.gradle.api.invocation.Gradle
object GradleCacheAccessFactoryBase : GradleCacheAccessFactory {
override fun create(gradle: Gradle): GradleCacheAccess {
return GradleCacheAccessBase(gradle)
}
override fun create(gradle: Gradle): GradleCacheAccess = GradleCacheAccessBase(gradle)
}
class GradleCacheAccessBase(gradle: Gradle) : GradleCacheAccess {
class GradleCacheAccessBase(
gradle: Gradle,
) : GradleCacheAccess {
private val artifactCachesProvider = gradle.service<ArtifactCachesProvider>()
override fun useCache(block: () -> Unit) {

View File

@@ -116,22 +116,27 @@ private fun cachedComponentId(file: File): DependencyCoordinates? {
val parts = file.invariantSeparatorsPath.split('/')
if (parts.size < 6) return null
if (parts[parts.size - 6] != "files-2.1") return null
return parts.dropLast(2).takeLast(3).joinToString(":").let(DefaultDependencyCoordinates::parse)
return parts
.dropLast(2)
.takeLast(3)
.joinToString(":")
.let(DefaultDependencyCoordinates::parse)
}
@OptIn(ExperimentalSerializationApi::class)
private fun parseFileMappings(file: File): Map<String, String>? =
try {
Json.decodeFromStream<JsonObject>(file.inputStream())
.jsonObject["variants"]?.jsonArray
Json
.decodeFromStream<JsonObject>(file.inputStream())
.jsonObject["variants"]
?.jsonArray
?.flatMap { it.jsonObject["files"]?.jsonArray ?: emptyList() }
?.map { it.jsonObject }
?.mapNotNull {
val name = it["name"]?.jsonPrimitive?.content ?: return@mapNotNull null
val url = it["url"]?.jsonPrimitive?.content ?: return@mapNotNull null
if (name != url) name to url else null
}
?.toMap()
}?.toMap()
?.takeUnless { it.isEmpty() }
} catch (e: Throwable) {
null

View File

@@ -17,11 +17,10 @@ class DependencySetModelBuilder(
override fun buildAll(
modelName: String,
project: Project,
): DependencySet {
return dependencyExtractor.buildDependencySet(
): DependencySet =
dependencyExtractor.buildDependencySet(
cacheAccess,
checksumService,
fileStoreAndIndexProvider,
)
}
}

View File

@@ -38,14 +38,15 @@ abstract class AbstractResolveAllArtifactsApplier : ResolveAllArtifactsApplier {
abstract class ResolveProjectDependenciesTask : DefaultTask() {
@Internal
protected fun getReportableConfigurations(): List<Configuration> {
return project.configurations.filter { (it as? DeprecatableConfiguration)?.canSafelyBeResolved() ?: true }
}
protected fun getReportableConfigurations(): List<Configuration> =
project.configurations.filter {
(it as? DeprecatableConfiguration)?.canSafelyBeResolved() ?: true
}
protected fun Configuration.artifactFiles(): FileCollection {
return incoming.artifactView { viewConfiguration ->
viewConfiguration.isLenient = true
viewConfiguration.componentFilter { it is ModuleComponentIdentifier }
}.files
}
protected fun Configuration.artifactFiles(): FileCollection =
incoming
.artifactView { viewConfiguration ->
viewConfiguration.isLenient = true
viewConfiguration.componentFilter { it is ModuleComponentIdentifier }
}.files
}

View File

@@ -18,12 +18,14 @@ object DependencyExtractorApplierG8 : DependencyExtractorApplier {
extractor: DependencyExtractor,
) {
val serviceProvider =
gradle.sharedServices.registerIfAbsent(
"nixDependencyExtractor",
DependencyExtractorService::class.java,
) {}.map { service ->
service.apply { this.extractor = extractor }
}
gradle.sharedServices
.registerIfAbsent(
"nixDependencyExtractor",
DependencyExtractorService::class.java,
) {}
.map { service ->
service.apply { this.extractor = extractor }
}
gradle.service<BuildEventListenerRegistryInternal>().onOperationCompletion(serviceProvider)
}
@@ -31,7 +33,9 @@ object DependencyExtractorApplierG8 : DependencyExtractorApplier {
@Suppress("UnstableApiUsage")
internal abstract class DependencyExtractorService :
BuildService<BuildServiceParameters.None>, BuildOperationListener, AutoCloseable {
BuildService<BuildServiceParameters.None>,
BuildOperationListener,
AutoCloseable {
var extractor: DependencyExtractor? = null
override fun started(

View File

@@ -23,13 +23,12 @@ abstract class ResolveProjectDependenciesTaskG8
) : ResolveProjectDependenciesTask() {
private val artifactFiles = Cached.of { artifactFiles() }
private fun artifactFiles(): FileCollection {
return objects.fileCollection().from(
private fun artifactFiles(): FileCollection =
objects.fileCollection().from(
getReportableConfigurations().map { configuration ->
configuration.artifactFiles()
},
)
}
@TaskAction
fun action() {

View File

@@ -1,7 +1,8 @@
package org.nixos.gradle2nix
abstract class Gradle2NixPlugin : AbstractGradle2NixPlugin(
GradleCacheAccessFactoryG80,
DependencyExtractorApplierG8,
ResolveAllArtifactsApplierG8,
)
abstract class Gradle2NixPlugin :
AbstractGradle2NixPlugin(
GradleCacheAccessFactoryG80,
DependencyExtractorApplierG8,
ResolveAllArtifactsApplierG8,
)

View File

@@ -4,12 +4,12 @@ import org.gradle.api.internal.artifacts.ivyservice.ArtifactCachesProvider
import org.gradle.api.invocation.Gradle
object GradleCacheAccessFactoryG80 : GradleCacheAccessFactory {
override fun create(gradle: Gradle): GradleCacheAccess {
return GradleCacheAccessG80(gradle)
}
override fun create(gradle: Gradle): GradleCacheAccess = GradleCacheAccessG80(gradle)
}
class GradleCacheAccessG80(gradle: Gradle) : GradleCacheAccess {
class GradleCacheAccessG80(
gradle: Gradle,
) : GradleCacheAccess {
private val artifactCachesProvider = gradle.service<ArtifactCachesProvider>()
override fun useCache(block: () -> Unit) {

View File

@@ -1,7 +1,8 @@
package org.nixos.gradle2nix
abstract class Gradle2NixPlugin : AbstractGradle2NixPlugin(
GradleCacheAccessFactoryG81,
DependencyExtractorApplierG8,
ResolveAllArtifactsApplierG8,
)
abstract class Gradle2NixPlugin :
AbstractGradle2NixPlugin(
GradleCacheAccessFactoryG81,
DependencyExtractorApplierG8,
ResolveAllArtifactsApplierG8,
)

View File

@@ -4,12 +4,12 @@ import org.gradle.api.internal.artifacts.ivyservice.ArtifactCachesProvider
import org.gradle.api.invocation.Gradle
object GradleCacheAccessFactoryG81 : GradleCacheAccessFactory {
override fun create(gradle: Gradle): GradleCacheAccess {
return GradleCacheAccessG81(gradle)
}
override fun create(gradle: Gradle): GradleCacheAccess = GradleCacheAccessG81(gradle)
}
class GradleCacheAccessG81(gradle: Gradle) : GradleCacheAccess {
class GradleCacheAccessG81(
gradle: Gradle,
) : GradleCacheAccess {
private val artifactCachesProvider = gradle.service<ArtifactCachesProvider>()
override fun useCache(block: () -> Unit) {