Skip to content

Commit

Permalink
Build process: Use call location independent paths for loading `versi…
Browse files Browse the repository at this point in the history
…on.properties`

See #1043
  • Loading branch information
d4rken committed May 28, 2024
1 parent e65ba3f commit ea1d7ea
Show file tree
Hide file tree
Showing 13 changed files with 132 additions and 73 deletions.
5 changes: 3 additions & 2 deletions app-common-io/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ plugins {
id("kotlin-android")
id("kotlin-kapt")
id("kotlin-parcelize")
id("projectConfig")
}

apply(plugin = "dagger.hilt.android.plugin")

android {
namespace = "${ProjectConfig.packageName}.common.io"
namespace = "${projectConfig.packageName}.common.io"

setupLibraryDefaults()
setupLibraryDefaults(projectConfig)

setupModuleBuildTypes()

Expand Down
5 changes: 3 additions & 2 deletions app-common-pkgs/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ plugins {
id("kotlin-android")
id("kotlin-kapt")
id("kotlin-parcelize")
id("projectConfig")
}

apply(plugin = "dagger.hilt.android.plugin")

android {
namespace = "${ProjectConfig.packageName}.common.pkgs"
namespace = "${projectConfig.packageName}.common.pkgs"

setupLibraryDefaults()
setupLibraryDefaults(projectConfig)

setupModuleBuildTypes()

Expand Down
5 changes: 3 additions & 2 deletions app-common-root/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ plugins {
id("kotlin-android")
id("kotlin-kapt")
id("kotlin-parcelize")
id("projectConfig")
}

apply(plugin = "dagger.hilt.android.plugin")

android {
namespace = "${ProjectConfig.packageName}.common.root"
namespace = "${projectConfig.packageName}.common.root"

setupLibraryDefaults()
setupLibraryDefaults(projectConfig)

setupModuleBuildTypes()

Expand Down
5 changes: 3 additions & 2 deletions app-common-shell/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ plugins {
id("kotlin-android")
id("kotlin-kapt")
id("kotlin-parcelize")
id("projectConfig")
}

apply(plugin = "dagger.hilt.android.plugin")

android {
namespace = "${ProjectConfig.packageName}.common.shell"
namespace = "${projectConfig.packageName}.common.shell"

setupLibraryDefaults()
setupLibraryDefaults(projectConfig)

setupModuleBuildTypes()

Expand Down
5 changes: 3 additions & 2 deletions app-common-shizuku/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ plugins {
id("kotlin-android")
id("kotlin-kapt")
id("kotlin-parcelize")
id("projectConfig")
}

apply(plugin = "dagger.hilt.android.plugin")

android {
namespace = "${ProjectConfig.packageName}.common.shizuku"
namespace = "${projectConfig.packageName}.common.shizuku"

setupLibraryDefaults()
setupLibraryDefaults(projectConfig)

setupModuleBuildTypes()

Expand Down
5 changes: 3 additions & 2 deletions app-common-test/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@ plugins {
id("org.jetbrains.kotlin.android")
id("kotlin-android")
id("kotlin-kapt")
id("projectConfig")
}

android {
namespace = "eu.darken.sdmse.common"
namespace = "${projectConfig.packageName}.common"

setupLibraryDefaults()
setupLibraryDefaults(projectConfig)

setupModuleBuildTypes()

Expand Down
5 changes: 3 additions & 2 deletions app-common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ plugins {
id("kotlin-android")
id("kotlin-kapt")
id("kotlin-parcelize")
id("projectConfig")
}

apply(plugin = "dagger.hilt.android.plugin")

android {
namespace = "${ProjectConfig.packageName}.common"
namespace = "${projectConfig.packageName}.common"

setupLibraryDefaults()
setupLibraryDefaults(projectConfig)

setupModuleBuildTypes()

Expand Down
23 changes: 12 additions & 11 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,35 +3,36 @@ plugins {
id("kotlin-android")
id("kotlin-kapt")
id("kotlin-parcelize")
id("projectConfig")
}
apply(plugin = "dagger.hilt.android.plugin")
apply(plugin = "androidx.navigation.safeargs.kotlin")

val commitHashProvider = providers.of(CommitHashValueSource::class) {}

android {
compileSdk = ProjectConfig.compileSdk
compileSdk = projectConfig.compileSdk

defaultConfig {
namespace = ProjectConfig.packageName
namespace = projectConfig.packageName

minSdk = ProjectConfig.minSdk
targetSdk = ProjectConfig.targetSdk
minSdk = projectConfig.minSdk
targetSdk = projectConfig.targetSdk

versionCode = ProjectConfig.Version.code
versionName = ProjectConfig.Version.name
versionCode = projectConfig.version.code.toInt()
versionName = projectConfig.version.name

testInstrumentationRunner = "eu.darken.sdmse.HiltTestRunner"

buildConfigField("String", "PACKAGENAME", "\"${ProjectConfig.packageName}\"")
buildConfigField("String", "PACKAGENAME", "\"${projectConfig.packageName}\"")
buildConfigField("String", "GITSHA", "\"${commitHashProvider.get()}\"")
buildConfigField("String", "VERSION_CODE", "\"${ProjectConfig.Version.code}\"")
buildConfigField("String", "VERSION_NAME", "\"${ProjectConfig.Version.name}\"")
buildConfigField("String", "VERSION_CODE", "\"${projectConfig.version.code}\"")
buildConfigField("String", "VERSION_NAME", "\"${projectConfig.version.name}\"")

}

signingConfigs {
val basePath = File(System.getProperty("user.home"), ".appconfig/${ProjectConfig.packageName}")
val basePath = File(System.getProperty("user.home"), ".appconfig/${projectConfig.packageName}")
create("releaseFoss") {
setupCredentials(File(basePath, "signing-foss.properties"))
}
Expand Down Expand Up @@ -95,7 +96,7 @@ android {
val variantName: String = variantOutputImpl.name

if (listOf("release", "beta").any { variantName.lowercase().contains(it) }) {
val outputFileName = ProjectConfig.packageName +
val outputFileName = projectConfig.packageName +
"-v${defaultConfig.versionName}-${defaultConfig.versionCode}" +
"-${variantName.uppercase()}-${commitHashProvider.get()}.apk"

Expand Down
4 changes: 4 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
plugins {
id("projectConfig")
}

buildscript {
repositories {
google()
Expand Down
9 changes: 9 additions & 0 deletions buildSrc/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,15 @@ plugins {
`java-library`
}

gradlePlugin {
plugins {
create("projectConfigPlugin") {
id = "projectConfig"
implementationClass = "ProjectConfigPlugin"
}
}
}

repositories {
google()
mavenCentral()
Expand Down
20 changes: 20 additions & 0 deletions buildSrc/src/main/java/CommitHashValueSource.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import org.gradle.api.provider.ValueSource
import org.gradle.api.provider.ValueSourceParameters
import org.gradle.process.ExecOperations
import java.io.ByteArrayOutputStream
import java.nio.charset.Charset
import javax.inject.Inject

abstract class CommitHashValueSource : ValueSource<String, ValueSourceParameters.None> {
@get:Inject
abstract val execOperations: ExecOperations

override fun obtain(): String {
val output = ByteArrayOutputStream()
execOperations.exec {
commandLine("git", "rev-parse", "--short", "HEAD")
standardOutput = output
}
return String(output.toByteArray(), Charset.defaultCharset()).trim()
}
}
56 changes: 56 additions & 0 deletions buildSrc/src/main/java/ProjectConfigPlugin.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import org.gradle.api.Plugin
import org.gradle.api.Project
import java.io.File
import java.io.FileInputStream
import java.util.Properties

open class ProjectConfig {
val packageName = "eu.darken.sdmse"
val minSdk = 26

val compileSdk = 34
val targetSdk = 34

lateinit var version: Version

override fun toString(): String {
return "ProjectConfig($packageName, min=$minSdk, compile=$compileSdk, target=$targetSdk, version=$version)"
}

fun init(project: Project) {
val versionProperties = Properties().apply {
val propsPath = File(project.rootDir, "version.properties")
println("Version: From $propsPath:")
load(FileInputStream(propsPath))
println("$this")
}
version = Version(
major = versionProperties.getProperty("project.versioning.major").toInt(),
minor = versionProperties.getProperty("project.versioning.minor").toInt(),
patch = versionProperties.getProperty("project.versioning.patch").toInt(),
build = versionProperties.getProperty("project.versioning.build").toInt(),
type = versionProperties.getProperty("project.versioning.type"),
)
}

data class Version(
val major: Int,
val minor: Int,
val patch: Int,
val build: Int,
val type: String,
) {
val name: String
get() = "${major}.${minor}.${patch}-$type${build}"
val code: Long
get() = major * 10000000 + minor * 100000 + patch * 1000 + build * 10L
}
}

class ProjectConfigPlugin : Plugin<Project> {
override fun apply(project: Project) {
val extension = project.extensions.create("projectConfig", ProjectConfig::class.java)
extension.init(project)
project.afterEvaluate { println("ProjectConfigPlugin loaded: $extension") }
}
}
Original file line number Diff line number Diff line change
@@ -1,62 +1,37 @@
import com.android.build.api.dsl.Packaging
import com.android.build.gradle.BaseExtension
import com.android.build.gradle.LibraryExtension
import org.gradle.api.Action
import org.gradle.api.JavaVersion
import org.gradle.api.provider.ValueSource
import org.gradle.api.provider.ValueSourceParameters
import org.gradle.api.Project
import org.gradle.api.tasks.testing.Test
import org.gradle.api.tasks.testing.TestDescriptor
import org.gradle.api.tasks.testing.TestListener
import org.gradle.api.tasks.testing.TestResult
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent
import org.gradle.process.ExecOperations
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.FileInputStream
import java.nio.charset.Charset
import java.util.*
import javax.inject.Inject

object ProjectConfig {
const val packageName = "eu.darken.sdmse"

const val minSdk = 26
const val compileSdk = 34
const val targetSdk = 34

object Version {
val versionProperties = Properties().apply {
load(FileInputStream(File("version.properties")))
}
val major = versionProperties.getProperty("project.versioning.major").toInt()
val minor = versionProperties.getProperty("project.versioning.minor").toInt()
val patch = versionProperties.getProperty("project.versioning.patch").toInt()
val build = versionProperties.getProperty("project.versioning.build").toInt()
val type = versionProperties.getProperty("project.versioning.type")

val name = "${major}.${minor}.${patch}-$type${build}"
val code = major * 10000000 + minor * 100000 + patch * 1000 + build * 10
}
}
import java.util.Properties

/**
* Configures the [kotlinOptions][org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions] extension.
*/
private fun LibraryExtension.kotlinOptions(configure: Action<KotlinJvmOptions>): Unit =
(this as org.gradle.api.plugins.ExtensionAware).extensions.configure("kotlinOptions", configure)

fun LibraryExtension.setupLibraryDefaults() {
compileSdk = ProjectConfig.compileSdk
fun LibraryExtension.setupLibraryDefaults(projectConfig: ProjectConfig) {
compileSdk = projectConfig.compileSdk

defaultConfig {
minSdk = ProjectConfig.minSdk
minSdk = projectConfig.minSdk
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
}

val Project.projectConfig: ProjectConfig
get() = extensions.findByType(ProjectConfig::class.java)!!

fun com.android.build.api.dsl.CommonExtension<
com.android.build.api.dsl.LibraryBuildFeatures,
com.android.build.api.dsl.LibraryBuildType,
Expand Down Expand Up @@ -91,7 +66,8 @@ fun BaseExtension.setupKotlinOptions() {
"-Xopt-in=kotlin.time.ExperimentalTime",
"-Xopt-in=kotlin.RequiresOptIn",
"-Xjvm-default=all",
"-XXLanguage:+DataObjects"
"-XXLanguage:+DataObjects",
"-Xcontext-receivers"
)
}
}
Expand Down Expand Up @@ -164,17 +140,3 @@ fun Test.setupTestLogging() {
})
}
}

abstract class CommitHashValueSource : ValueSource<String, ValueSourceParameters.None> {
@get:Inject
abstract val execOperations: ExecOperations

override fun obtain(): String {
val output = ByteArrayOutputStream()
execOperations.exec {
commandLine("git", "rev-parse", "--short", "HEAD")
standardOutput = output
}
return String(output.toByteArray(), Charset.defaultCharset()).trim()
}
}

0 comments on commit ea1d7ea

Please sign in to comment.