Skip to content

Commit 5221729

Browse files
authored
Ksp phase 1 (#125)
* version catalog plugins * cleanup * Prepare for ksp support * bump includer version * Docs and refactoring * bump the includer version for plugins
1 parent f27f1a2 commit 5221729

File tree

12 files changed

+100
-88
lines changed

12 files changed

+100
-88
lines changed

application/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ buildscript {
22
androidProjectConfiguration(
33
project = project,
44
minSdk = 21,
5-
targetSdk = 31,
6-
compileSdk = 31,
5+
targetSdk = 33,
6+
compileSdk = 33,
77
agpVersion = "7.4.2",
88
dataBinding = true,
99
extraPlugins = listOf(

application/feature/characters/favorite/impl/build.gradle.kts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,12 @@ impl(
99
androidx.recyclerview,
1010
androidx.swiperefreshlayout,
1111
androidx.paging,
12-
androidx.room,
1312
google.material,
1413
google.dagger,
1514
jakewharton.timber,
1615
kotlinx.coroutines_core,
1716
viewbinding.viewpropertydelegate
18-
) + deps(
17+
) + deps(libs.bundles.room) + deps(
1918
target(":feature:characters:core:api"),
2019
target(":feature:characters:favorite:api"),
2120
target(":feature:characters:favorite:viewbinding"),
@@ -30,4 +29,4 @@ impl(
3029
target(":common:extensions:android-util"),
3130
target(":common:recyclerview:widget")
3231
)
33-
)
32+
)

application/gradle.properties

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ android.enableJetifier=false
2020
# Kotlin code style for this project: "official" or "obsolete":
2121
kotlin.code.style=official
2222
org.gradle.caching=true
23-
# TODO Return configureondemand on true after fix https://github.com/formatools/forma/issues/50
24-
org.gradle.configureondemand=false
23+
org.gradle.configureondemand=true
2524
org.gradle.vfs.watch=false
2625
org.gradle.unsafe.configuration-cache=true
2726
org.gradle.unsafe.configuration-cache-problems=warn

application/settings.gradle.kts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,26 @@ plugins {
1616

1717
rootProject.name = "application"
1818

19-
val filteredTokens = listOf("com", "io", "net", "org")
19+
val filteredTokens = listOf("com", "io", "net", "org", "gradle")
2020
val coilVersion = "2.1.0"
21+
val sqliteVersion = "2.2.0"
22+
val roomVersion = "2.5.1"
2123

2224
dependencyResolutionManagement {
2325
versionCatalogs {
2426
create("libs") {
2527
addLibrary("com.jakewharton.timber:timber:4.7.1")
26-
addBundle("coil", "io.coil-kt:coil:$coilVersion", "io.coil-kt:coil-base:$coilVersion")
27-
addPlugin( "tools.forma.demo:dependencies:0.0.1")
28+
addBundle(name = "coil", "io.coil-kt:coil:$coilVersion", "io.coil-kt:coil-base:$coilVersion")
29+
addBundle(
30+
name = "room",
31+
"androidx.sqlite:sqlite:$sqliteVersion",
32+
"androidx.sqlite:sqlite-framework:$sqliteVersion",
33+
"androidx.room:room-runtime:$roomVersion",
34+
"androidx.room:room-ktx:$roomVersion",
35+
"androidx.room:room-common:$roomVersion",
36+
)
37+
addPlugin("tools.forma.demo:dependencies:0.0.1")
38+
addPlugin("com.google.devtools.ksp:symbol-processing-gradle-plugin:1.8.10-1.0.9", "androidx.room:room-compiler:$roomVersion")
2839
}
2940
}
3041
}

build-dependencies/dependencies/src/main/kotlin/Androidx.kt

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -296,17 +296,4 @@ object androidx {
296296
navigation_ui_ktx,
297297
navigation_common_ktx
298298
)
299-
300-
private val sqlite = deps(
301-
"androidx.sqlite:sqlite:${versions.androidx.sqlite}".dep,
302-
"androidx.sqlite:sqlite-framework:${versions.androidx.sqlite}".dep
303-
)
304-
305-
val room = deps(
306-
"androidx.room:room-runtime:${versions.androidx.room}".dep,
307-
"androidx.room:room-ktx:${versions.androidx.room}".dep,
308-
"androidx.room:room-common:${versions.androidx.room}".dep,
309-
"androidx.room:room-compiler:${versions.androidx.room}".kapt,
310-
sqlite
311-
)
312299
}

includer/Changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# 0.1.3 Minor patch release
2+
3+
- Prevent traversing nested projects
4+
15
# 0.1.2 Minor patch release
26

37
- Skip include for folders with non `.kts` settings files

includer/Readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ Remove all your `include` declarations from your `settings.gradle.kts` file and
88

99
```kotlin
1010
plugins {
11-
id("tools.forma.includer") version "0.1.1"
11+
id("tools.forma.includer") version "0.1.3"
1212
}
1313
```

includer/plugin/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ plugins {
55
id("org.jetbrains.kotlin.jvm") version embeddedKotlinVersion
66
}
77

8-
version = "0.1.2"
8+
version = "0.1.3"
99
group = "tools.forma"
1010

1111
repositories {
Lines changed: 74 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,103 @@
11
package tools.forma.includer
22

3+
import java.io.File
4+
import kotlin.system.measureTimeMillis
5+
import kotlinx.coroutines.Dispatchers
6+
import kotlinx.coroutines.async
7+
import kotlinx.coroutines.awaitAll
38
import kotlinx.coroutines.coroutineScope
49
import kotlinx.coroutines.runBlocking
5-
import kotlinx.coroutines.*
610
import org.gradle.api.Plugin
711
import org.gradle.api.initialization.Settings
812
import org.gradle.api.logging.LogLevel
13+
import org.gradle.api.logging.Logger
914
import org.gradle.api.logging.Logging
10-
import java.io.File
11-
import kotlin.system.measureTimeMillis
1215

13-
val logger = Logging.getLogger(IncluderPlugin::class.java)
16+
val logger: Logger = Logging.getLogger(IncluderPlugin::class.java)
1417

1518
/**
16-
* Once applied Includer will detect nested projects and automatically include it into the rootProject
19+
* Once applied, Includer will search for nested projects and automatically includes them in the
20+
* build.
1721
*/
1822
class IncluderPlugin : Plugin<Settings> {
1923
override fun apply(settings: Settings) {
2024
includeSubprojects(settings)
2125
}
26+
}
2227

23-
private fun includeSubprojects(settings: Settings) {
24-
measureTimeMillis {
25-
runBlocking {
26-
findGradleKtsFiles(settings.rootDir, settings.rootDir)
27-
.forEach {
28-
val moduleDir = it.parentFile
29-
val relativePath = settings.rootDir.toPath().relativize(moduleDir.toPath()).toString()
30-
val moduleName = ":" + relativePath.replace(File.separator, "-")
31-
32-
settings.include(moduleName)
28+
private fun includeSubprojects(settings: Settings) {
29+
val measuredTime = measureTimeMillis {
30+
runBlocking { findGradleKtsFiles(settings.rootDir, settings.rootDir) }
31+
.forEach { buildFile ->
32+
val moduleDir = buildFile.parentFile
33+
val relativePath =
34+
settings.rootDir.toPath().relativize(moduleDir.toPath()).toString()
35+
// Avoid using `:` as separator for module names as it is used by gradle to
36+
// mark
37+
// intermittent nested projects, which created automatically. This behavior
38+
// leads to increased configuration time
39+
val moduleName = ":" + relativePath.replace(File.separator, "-")
3340

34-
val project = settings.findProject(moduleName)!!
35-
project.projectDir = moduleDir
36-
project.buildFileName = it.name
41+
settings.include(moduleName)
3742

38-
}
43+
val project = settings.findProject(moduleName)!!
44+
project.projectDir = moduleDir
45+
project.buildFileName = buildFile.name
3946
}
40-
}.let { logger.log(LogLevel.INFO, "Loaded in $it ms") }
4147
}
48+
logger.log(LogLevel.INFO, "Loaded in $measuredTime ms")
49+
}
4250

43-
private suspend fun findGradleKtsFiles(
44-
rootDir: File,
45-
currentDir: File,
46-
ignoredFilenames: List<String> = listOf("settings.gradle.kts", "settings.gradle"),
47-
ignoredFolders: List<String> = listOf("build", "src", "buildSrc")
48-
): List<File> = coroutineScope {
51+
/**
52+
* Recursively finds all gradle files in the given directory, excluding the hidden files, given
53+
* filenames and folders.
54+
*
55+
* Ignores nested projects if the current directory contains a file from the `projectMarkerFiles`
56+
* list.
57+
*
58+
* @param rootDir root directory of the project
59+
* @param currentDir current directory to search
60+
* @param ignoredFilenames list of filenames to ignore
61+
* @param ignoredFolders list of folder names to ignore
62+
* @param projectMarkerFiles filenames that indicate that the directory as a gradle project
63+
*/
64+
private suspend fun findGradleKtsFiles(
65+
rootDir: File,
66+
currentDir: File,
67+
ignoredFilenames: List<String> = emptyList(),
68+
ignoredFolders: List<String> = listOf("build", "src", "buildSrc"),
69+
projectMarkerFiles: List<String> = listOf("settings.gradle.kts", "settings.gradle"),
70+
): List<File> = coroutineScope {
71+
val children = currentDir.listFiles() ?: emptyArray()
4972

50-
val children = currentDir.listFiles() ?: emptyArray()
73+
val (dirs, files) = children.partition { it.isDirectory }
5174

52-
val (dirs, files) = children.partition { it.isDirectory }
75+
val gradleKtsFiles =
76+
if (currentDir == rootDir) {
77+
// Root project's build.gradle(.kts) always included implicitly
78+
emptyList()
79+
} else {
80+
files
81+
// gradle files may have name that is different from `build.gradle(.kts)` so we
82+
// include files which follows `*.gradle(.kts)` pattern
83+
.filter { it.name.endsWith(".gradle.kts") || it.name.endsWith(".gradle") }
84+
.filterNot { it.isHidden || it.name in ignoredFilenames }
85+
}
5386

54-
val gradleKtsFiles = if (currentDir == rootDir) emptyList() else files
55-
.filter { it.name.endsWith(".gradle.kts") || it.name.endsWith(".gradle") }
56-
.filterNot { it.isHidden || it.name in ignoredFilenames }
87+
val skipNestedProject = currentDir != rootDir && files.any { it.name in projectMarkerFiles }
5788

58-
val dirJobs = dirs
59-
.filterNot { it.isHidden || it.name in ignoredFolders }
60-
.map { dir ->
61-
async(Dispatchers.IO) {
62-
findGradleKtsFiles(rootDir, dir, ignoredFilenames, ignoredFolders)
89+
if (skipNestedProject) {
90+
gradleKtsFiles
91+
} else {
92+
gradleKtsFiles +
93+
dirs
94+
.filterNot { it.isHidden || it.name in ignoredFolders }
95+
.map { dir ->
96+
async(Dispatchers.IO) {
97+
findGradleKtsFiles(rootDir, dir, ignoredFilenames, ignoredFolders)
98+
}
6399
}
64-
}
65-
66-
val nestedGradleKtsFiles = dirJobs.awaitAll().flatten()
67-
68-
gradleKtsFiles + nestedGradleKtsFiles
100+
.awaitAll()
101+
.flatten()
69102
}
70103
}

plugins/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import com.gradle.publish.PublishPlugin
2-
import java.util.Properties
32

43
plugins {
54
`kotlin-dsl`

0 commit comments

Comments
 (0)