You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

80 lines
2.9 KiB

/*
* Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers.
* Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file.
*/
package org.jetbrains.compose.internal.publishing
import de.undercouch.gradle.tasks.download.DownloadAction
import org.gradle.api.DefaultTask
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.jsoup.Jsoup
import java.net.URL
@Suppress("unused") // public api
abstract class DownloadFromSpaceMavenRepoTask : DefaultTask() {
@get:Internal
abstract val modulesToDownload: ListProperty<ModuleToUpload>
@get:Internal
abstract val spaceRepoUrl: Property<String>
@TaskAction
fun run() {
for (module in modulesToDownload.get()) {
downloadArtifactsFromComposeDev(module)
}
}
private fun downloadArtifactsFromComposeDev(module: ModuleToUpload) {
val groupUrl = module.groupId.replace(".", "/")
val filesListingDocument =
Jsoup.connect("${spaceRepoUrl.get()}/$groupUrl/${module.artifactId}/${module.version}/").get()
val downloadableFiles = HashMap<String, URL>()
for (a in filesListingDocument.select("#contents > a")) {
val href = a.attributes().get("href")
val lastPart = href.substringAfterLast("/", "")
// check if URL points to a file
if (lastPart.isNotEmpty() && lastPart.contains(".")) {
downloadableFiles[lastPart] = URL(href)
}
}
val destinationDir = module.localDir
if (destinationDir.isFile)
error("Destination dir is a file: $destinationDir")
else if (destinationDir.exists()) {
if (module.version.endsWith("-SNAPSHOT")) {
destinationDir.deleteRecursively()
} else {
// delete existing files, that are not downloadable
val existingFiles = (destinationDir.list() ?: emptyArray()).toSet()
for (existingFileName in existingFiles) {
if (existingFileName !in downloadableFiles) {
destinationDir.resolve(existingFileName).delete()
}
}
// don't re-download all files for non-snapshot version
val it = downloadableFiles.entries.iterator()
while (it.hasNext()) {
val (fileName, _) = it.next()
if (fileName in existingFiles) {
it.remove()
}
}
}
} else {
destinationDir.mkdirs()
}
DownloadAction(project, this).apply {
src(downloadableFiles.values)
dest(destinationDir)
}.execute()
}
}