From 1fd27e80291c56aaba58532fff3be8fd60bc531c Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Mon, 27 May 2024 17:00:18 +0530 Subject: [PATCH] build: allow the build to proceed if the directory is not a git repo --- build-info/build.gradle.kts | 5 +-- .../com/itsaky/androidide/build/config/CI.kt | 19 +++++++++- .../androidide/build/config/ProjectConfig.kt | 38 ++++++++++++------- .../itsaky/androidide/build/config/utils.kt | 1 - .../androidide/plugins/SigningConfigPlugin.kt | 10 ++--- settings.gradle.kts | 17 ++++++++- 6 files changed, 65 insertions(+), 25 deletions(-) diff --git a/build-info/build.gradle.kts b/build-info/build.gradle.kts index 277986970..7c64b317f 100644 --- a/build-info/build.gradle.kts +++ b/build-info/build.gradle.kts @@ -15,7 +15,6 @@ * along with AndroidIDE. If not, see . */ -import com.android.SdkConstants import com.itsaky.androidide.build.config.AGP_VERSION_MINIMUM import com.itsaky.androidide.build.config.BuildConfig import com.itsaky.androidide.build.config.CI @@ -65,8 +64,8 @@ tasks.create("generateBuildInfo") { "FDROID_BUILD_VERSION_CODE" to (FDroidConfig.fDroidVersionCode ?: -1).toString(), "CI_BUILD" to CI.isCiBuild.toString(), - "CI_GIT_BRANCH" to CI.branchName, - "CI_COMMIT_HASH" to CI.commitHash, + "CI_GIT_BRANCH" to if (CI.isGitRepo) CI.branchName else "NOT-A-GIT-REPO", + "CI_COMMIT_HASH" to if (CI.isGitRepo) CI.commitHash else "NOT-A-GIT-REPO", "REPO_HOST" to ProjectConfig.REPO_HOST, "REPO_OWNER" to ProjectConfig.REPO_OWNER, diff --git a/composite-builds/build-logic/common/src/main/java/com/itsaky/androidide/build/config/CI.kt b/composite-builds/build-logic/common/src/main/java/com/itsaky/androidide/build/config/CI.kt index af62ce518..4a703a1c2 100644 --- a/composite-builds/build-logic/common/src/main/java/com/itsaky/androidide/build/config/CI.kt +++ b/composite-builds/build-logic/common/src/main/java/com/itsaky/androidide/build/config/CI.kt @@ -43,14 +43,29 @@ object CI { /** The short commit hash. */ val commitHash by lazy { + check(isGitRepo) { + "This build is not a Git repository." + } val sha = System.getenv("GITHUB_SHA") ?: "HEAD" cmdOutput("git", "rev-parse", "--short", sha) } /** Name of the current branch. */ val branchName by lazy { - System.getenv("GITHUB_REF_NAME") ?: cmdOutput("git", "rev-parse", "--abbrev-ref", - "HEAD") // by default, 'main' + check(isGitRepo) { + "This build is not a Git repository." + } + System.getenv("GITHUB_REF_NAME") ?: cmdOutput( + "git", "rev-parse", "--abbrev-ref", + "HEAD" + ) // by default, 'main' + } + + /** + * Whether the current build is a Git repository. + */ + val isGitRepo by lazy { + cmdOutput("git", "rev-parse", "--is-inside-work-tree").trim() == "true" } /** Whether the current build is a CI build. */ diff --git a/composite-builds/build-logic/common/src/main/java/com/itsaky/androidide/build/config/ProjectConfig.kt b/composite-builds/build-logic/common/src/main/java/com/itsaky/androidide/build/config/ProjectConfig.kt index cc146f257..8bb644989 100644 --- a/composite-builds/build-logic/common/src/main/java/com/itsaky/androidide/build/config/ProjectConfig.kt +++ b/composite-builds/build-logic/common/src/main/java/com/itsaky/androidide/build/config/ProjectConfig.kt @@ -34,6 +34,7 @@ object ProjectConfig { const val PROJECT_SITE = "https://m.androidide.com" } +private var shouldPrintNotAGitRepoWarning = true private var shouldPrintVersionName = true /** @@ -41,8 +42,8 @@ private var shouldPrintVersionName = true */ val Project.isFDroidBuild: Boolean get() { - if (!com.itsaky.androidide.build.config.FDroidConfig.hasRead) { - com.itsaky.androidide.build.config.FDroidConfig.load(this) + if (!FDroidConfig.hasRead) { + FDroidConfig.load(this) } return com.itsaky.androidide.build.config.FDroidConfig.isFDroidBuild } @@ -50,23 +51,33 @@ val Project.isFDroidBuild: Boolean val Project.simpleVersionName: String get() { + if (!CI.isGitRepo) { + if (shouldPrintNotAGitRepoWarning) { + logger.warn("Unable to infer version name. The build is not running on a git repository.") + shouldPrintNotAGitRepoWarning = false + } + + return "1.0.0-beta" + } + val version = rootProject.version.toString() val regex = Regex("^v\\d+\\.?\\d+\\.?\\d+-\\w+") val simpleVersion = regex.find(version)?.value?.substring(1)?.also { - if (com.itsaky.androidide.build.config.shouldPrintVersionName) { + if (shouldPrintVersionName) { logger.warn("Simple version name is '$it' (from version $version)") - com.itsaky.androidide.build.config.shouldPrintVersionName = false + shouldPrintVersionName = false } } if (simpleVersion == null) { - if (com.itsaky.androidide.build.config.CI.isTestEnv) { + if (CI.isTestEnv) { return "1.0.0-beta" } throw IllegalStateException( - "Cannot extract simple version name. Invalid version string '$version'. Version names must be SEMVER with 'v' prefix") + "Cannot extract simple version name. Invalid version string '$version'. Version names must be SEMVER with 'v' prefix" + ) } return simpleVersion @@ -80,13 +91,14 @@ val Project.projectVersionCode: Int val regex = Regex("^\\d+\\.?\\d+\\.?\\d+") val versionCode = regex.find(version)?.value?.replace(".", "")?.toInt()?.also { - if (com.itsaky.androidide.build.config.shouldPrintVersionCode) { + if (shouldPrintVersionCode) { logger.warn("Version code is '$it' (from version ${version}).") - com.itsaky.androidide.build.config.shouldPrintVersionCode = false + shouldPrintVersionCode = false } } ?: throw IllegalStateException( - "Cannot extract version code. Invalid version string '$version'. Version names must be SEMVER with 'v' prefix") + "Cannot extract version code. Invalid version string '$version'. Version names must be SEMVER with 'v' prefix" + ) return versionCode } @@ -102,8 +114,8 @@ val Project.publishingVersion: String return publishing } - if (com.itsaky.androidide.build.config.CI.isCiBuild && com.itsaky.androidide.build.config.CI.branchName != "main") { - publishing += "-${com.itsaky.androidide.build.config.CI.commitHash}-SNAPSHOT" + if (CI.isCiBuild && CI.isGitRepo && CI.branchName != "main") { + publishing += "-${CI.commitHash}-SNAPSHOT" } return publishing @@ -118,11 +130,11 @@ val Project.publishingVersion: String */ val Project.downloadVersion: String get() { - return if (com.itsaky.androidide.build.config.CI.isCiBuild || isFDroidBuild) { + return if (CI.isCiBuild || isFDroidBuild) { publishingVersion } else { // sometimes, when working locally, Gradle fails to download the latest snapshot version // this may cause issues while initializing the project in AndroidIDE - com.itsaky.androidide.build.config.VersionUtils.getLatestSnapshotVersion("gradle-plugin") + VersionUtils.getLatestSnapshotVersion("gradle-plugin") } } diff --git a/composite-builds/build-logic/common/src/main/java/com/itsaky/androidide/build/config/utils.kt b/composite-builds/build-logic/common/src/main/java/com/itsaky/androidide/build/config/utils.kt index ebb1f1b36..9fdf9b57e 100644 --- a/composite-builds/build-logic/common/src/main/java/com/itsaky/androidide/build/config/utils.kt +++ b/composite-builds/build-logic/common/src/main/java/com/itsaky/androidide/build/config/utils.kt @@ -19,7 +19,6 @@ package com.itsaky.androidide.build.config import java.io.File -/** @author Akash Yadav */ private const val generatedWarning = "DO NOT EDIT - Automatically generated file" /** diff --git a/composite-builds/build-logic/plugins/src/main/java/com/itsaky/androidide/plugins/SigningConfigPlugin.kt b/composite-builds/build-logic/plugins/src/main/java/com/itsaky/androidide/plugins/SigningConfigPlugin.kt index 97a6db533..c69739c41 100644 --- a/composite-builds/build-logic/plugins/src/main/java/com/itsaky/androidide/plugins/SigningConfigPlugin.kt +++ b/composite-builds/build-logic/plugins/src/main/java/com/itsaky/androidide/plugins/SigningConfigPlugin.kt @@ -43,8 +43,11 @@ class SigningConfigPlugin : Plugin { return } - // Download the signing key - downloadSigningKey() + val signingKey = signingKey.get().asFile + if (!signingKey.exists()) { + logger.warn("Signing key not found. Debug signing will be used.") + return + } // Create and apply the signing config extensions.getByType(BaseExtension::class.java).let { extension -> @@ -53,8 +56,6 @@ class SigningConfigPlugin : Plugin { val storePass = getEnvOrProp(KEY_STORE_PASS) val keyPass = getEnvOrProp(KEY_PASS) - val signingKey = signingKey.get().asFile - if (alias != null && storePass != null && keyPass != null && signingKey.exists()) { val config = extension.signingConfigs.create("common") { storeFile = signingKey @@ -70,7 +71,6 @@ class SigningConfigPlugin : Plugin { logger.warn( "Signing info not configured. keystoreFile=$signingKey[exists=${signingKey.exists()}]" ) - null } } diff --git a/settings.gradle.kts b/settings.gradle.kts index c61874f29..1d8b86e44 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -84,6 +84,21 @@ buildscript { } } +val isGitRepo by lazy { + cmdOutput("git", "rev-parse", "--is-inside-work-tree").trim() == "true" +} + +private fun cmdOutput(vararg args: String): String { + return ProcessBuilder(*args) + .directory(File(".")) + .redirectErrorStream(true) + .start() + .inputStream + .bufferedReader() + .readText() + .trim() +} + FDroidConfig.load(rootDir) if (FDroidConfig.hasRead && FDroidConfig.isFDroidBuild) { @@ -95,7 +110,7 @@ if (FDroidConfig.hasRead && FDroidConfig.isFDroidBuild) { project.setProperty("version", simpleVersion) } -} else { +} else if(isGitRepo) { apply { plugin("com.mooltiverse.oss.nyx") }