From 8decdad746cfe5d073090c6ca254f071035222c4 Mon Sep 17 00:00:00 2001 From: JFronny Date: Sun, 26 May 2024 10:58:34 +0200 Subject: [PATCH] fix(autoversion): try to avoid running git --- .../io/gitlab/jfronny/scripts/Environment.kt | 29 +++++++++++++++++ .../io/gitlab/jfronny/scripts/JGitExt.kt | 32 +++++++++++++++---- .../src/main/kotlin/jf.autoversion.gradle.kts | 6 +++- 3 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 convention/src/main/kotlin/io/gitlab/jfronny/scripts/Environment.kt diff --git a/convention/src/main/kotlin/io/gitlab/jfronny/scripts/Environment.kt b/convention/src/main/kotlin/io/gitlab/jfronny/scripts/Environment.kt new file mode 100644 index 0000000..2e18cf6 --- /dev/null +++ b/convention/src/main/kotlin/io/gitlab/jfronny/scripts/Environment.kt @@ -0,0 +1,29 @@ +package io.gitlab.jfronny.scripts + +import java.lang.reflect.Field +import java.util.* + +private val processEnvironmentClass: Class<*> = Class.forName("java.lang.ProcessEnvironment") +private val theEnvironmentField: Field = processEnvironmentClass.getDeclaredField("theEnvironment").apply { isAccessible = true } +private val theCaseInsensitiveEnvironmentField: Field = processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment").apply { isAccessible = true } + +@Throws(Exception::class) +fun setEnv(newenv: Map?) = try { + val env = theEnvironmentField.get(null) as MutableMap + env.clear() + env.putAll(newenv!!) + val cienv = theCaseInsensitiveEnvironmentField.get(null) as MutableMap + cienv.clear() + cienv.putAll(newenv) +} catch (e: NoSuchFieldException) { + val classes = Collections::class.java.declaredClasses + val env = System.getenv() + for (cl in classes) { + if ("java.util.Collections\$UnmodifiableMap" == cl.name) { + val field: Field = cl.getDeclaredField("m").apply { isAccessible = true } + val map = field.get(env) as MutableMap + map.clear() + map.putAll(newenv!!) + } + } +} diff --git a/convention/src/main/kotlin/io/gitlab/jfronny/scripts/JGitExt.kt b/convention/src/main/kotlin/io/gitlab/jfronny/scripts/JGitExt.kt index 76a2329..3806610 100644 --- a/convention/src/main/kotlin/io/gitlab/jfronny/scripts/JGitExt.kt +++ b/convention/src/main/kotlin/io/gitlab/jfronny/scripts/JGitExt.kt @@ -2,19 +2,39 @@ package io.gitlab.jfronny.scripts import org.eclipse.jgit.api.Git import org.eclipse.jgit.errors.IncorrectObjectTypeException -import org.eclipse.jgit.lib.AnyObjectId -import org.eclipse.jgit.lib.Constants -import org.eclipse.jgit.lib.ObjectId -import org.eclipse.jgit.lib.PersonIdent -import org.eclipse.jgit.lib.Ref -import org.eclipse.jgit.lib.Repository +import org.eclipse.jgit.lib.* import org.eclipse.jgit.revwalk.RevCommit import org.eclipse.jgit.revwalk.RevTag import org.eclipse.jgit.revwalk.RevWalk +import org.eclipse.jgit.storage.file.FileBasedConfig +import org.eclipse.jgit.util.FS +import org.eclipse.jgit.util.SystemReader import java.time.Instant import java.time.ZoneOffset import java.time.ZonedDateTime +fun initializeGit() { + val original = SystemReader.getInstance() + SystemReader.setInstance(object : SystemReader() { + override fun getHostname(): String = original.hostname + override fun getenv(key: String): String? = if (key == "PATH") null else original.getenv(key) + override fun getProperty(key: String?): String = original.getProperty(key) + override fun openUserConfig(parent: Config?, fs: FS?): FileBasedConfig = original.openUserConfig(parent, fs) + override fun openSystemConfig(parent: Config?, fs: FS?): FileBasedConfig = original.openSystemConfig(parent, fs) + override fun openJGitConfig(parent: Config?, fs: FS?): FileBasedConfig = original.openJGitConfig(parent, fs) + override fun getCurrentTime(): Long = original.currentTime + override fun getTimezone(`when`: Long): Int = original.getTimezone(`when`) + }) + // Stuff +// val backup = HashMap(System.getenv()) +// setEnv(mapOf()) +// try { + org.eclipse.jgit.util.FS.DETECTED.gitSystemConfig +// } finally { +// setEnv(backup) +// } +} + fun Git.log(since: AnyObjectId? = null, until: AnyObjectId? = null): List { var command = this.log() if (since != null) command = command.not(since) diff --git a/convention/src/main/kotlin/jf.autoversion.gradle.kts b/convention/src/main/kotlin/jf.autoversion.gradle.kts index ab28f29..b86c863 100644 --- a/convention/src/main/kotlin/jf.autoversion.gradle.kts +++ b/convention/src/main/kotlin/jf.autoversion.gradle.kts @@ -9,6 +9,7 @@ val isRelease = project.hasProperty("release") versionS = "0.0.0+nogit" versionType = VersionType.ALPHA if (File(projectDir, ".git").exists()) { + initializeGit() Git.open(projectDir).use { git -> versionS = "0.0.0+notag" val tags: List = git.getTags() @@ -48,7 +49,10 @@ if (File(projectDir, ".git").exists()) { changelogHtml += "
    \n" + log.joinToString("") { "
  • ${it.shortMessage}
  • \n" } + "
" } } -} else changelog = "No changelog" +} else { + changelog = "No changelog" + changelogHtml = "

No changelog

" +} if (!isRelease) { versionS = "$nextRelease-SNAPSHOT"