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.
72 lines
2.5 KiB
72 lines
2.5 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. |
|
*/ |
|
|
|
import io.ktor.client.* |
|
import io.ktor.client.request.* |
|
import kotlinx.coroutines.flow.Flow |
|
import kotlinx.coroutines.flow.collect |
|
import kotlinx.coroutines.flow.filter |
|
import kotlinx.coroutines.flow.flow |
|
import kotlinx.coroutines.flow.map |
|
import kotlinx.coroutines.runBlocking |
|
import org.gradle.api.Project |
|
|
|
private const val libsRepo = "https://maven.pkg.jetbrains.space/public/p/compose/dev/org/jetbrains/compose/" |
|
private val exceptions = listOf( |
|
"desktop:desktop", |
|
"compose-full", |
|
"compose-gradle-plugin" |
|
) |
|
|
|
fun Project.printAllAndroidxReplacements() = runBlocking { |
|
val version = BuildProperties.composeVersion(project) |
|
HttpClient().use { client -> |
|
client |
|
.allRecursiveFolders(libsRepo) |
|
.map { it.removePrefix(libsRepo).removeSuffix("/") } |
|
.filter { it.endsWith(version) } |
|
.map { it.removeSuffix(version).removeSuffix("/") } |
|
.map { it.replace("/", ":") } |
|
.filter { !it.endsWith("-android") } |
|
.filter { !it.endsWith("-android-debug") } |
|
.filter { !it.endsWith("-android-release") } |
|
.filter { !it.endsWith("-metadata") } |
|
.filter { !it.endsWith("-desktop") } |
|
.filter { !it.contains("-jvm") } |
|
.filter { !exceptions.contains(it) } |
|
.collect { |
|
require(isMavenCoordsValid(it)) { |
|
"module name isn't valid: $it" |
|
} |
|
println("it.replaceAndroidx(\"androidx.compose.$it\", \"org.jetbrains.compose.$it\")") |
|
} |
|
} |
|
} |
|
|
|
private fun isMavenCoordsValid(coords: String) = coords.count { it == ':' } == 1 |
|
|
|
private fun HttpClient.allRecursiveFolders( |
|
url: String |
|
): Flow<String> = flow { |
|
require(url.endsWith("/")) |
|
val response = get<String>(url) |
|
val folders = parseFolders(response) |
|
for (folder in folders) { |
|
emit("$url$folder/") |
|
} |
|
for (folder in folders.filter(String::isMavenPart)) { |
|
allRecursiveFolders("$url$folder/").collect(::emit) |
|
} |
|
} |
|
|
|
private fun parseFolders( |
|
htmlResponse: String |
|
): Sequence<String> = Regex("title=\"(.*?)\"") |
|
.findAll(htmlResponse) |
|
.map { it.groupValues[1] } |
|
.filter { it.endsWith("/") && it != "../" } |
|
.map { it.removeSuffix("/") } |
|
|
|
private fun String.isMavenPart() = all { it.isLetterOrDigit() || it == '-' } |