Add BuildInformation & a matching CrashCategory
This commit is contained in:
parent
8b15e8a84e
commit
47bb0f6cab
5 changed files with 630 additions and 1 deletions
|
@ -24,6 +24,7 @@ import de.staropensource.engine.base.exception.EngineInitializationFailureExcept
|
||||||
import de.staropensource.engine.base.utility.Environment
|
import de.staropensource.engine.base.utility.Environment
|
||||||
import de.staropensource.engine.base.utility.FileAccess
|
import de.staropensource.engine.base.utility.FileAccess
|
||||||
import de.staropensource.engine.base.logging.Logger
|
import de.staropensource.engine.base.logging.Logger
|
||||||
|
import de.staropensource.engine.base.utility.dnihbd.BuildInformation
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Primary class of the engine.
|
* Primary class of the engine.
|
||||||
|
@ -70,6 +71,16 @@ class Engine private constructor() {
|
||||||
*/
|
*/
|
||||||
var bootstrapping: Boolean? = null
|
var bootstrapping: Boolean? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains a [BuildInformation] instance
|
||||||
|
* providing information about the running
|
||||||
|
* engine build.
|
||||||
|
*
|
||||||
|
* @see BuildInformation
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var info: BuildInformation? = null
|
||||||
|
|
||||||
|
|
||||||
// -----> Initialization
|
// -----> Initialization
|
||||||
/**
|
/**
|
||||||
|
@ -136,6 +147,7 @@ class Engine private constructor() {
|
||||||
// Run initialization code
|
// Run initialization code
|
||||||
Environment.detect()
|
Environment.detect()
|
||||||
FileAccess.updateDefaultPaths()
|
FileAccess.updateDefaultPaths()
|
||||||
|
info = BuildInformation(loadPrefix = "sosengine-base")
|
||||||
|
|
||||||
state = State.INITIALIZED
|
state = State.INITIALIZED
|
||||||
} catch (exception: Exception) {
|
} catch (exception: Exception) {
|
||||||
|
@ -225,6 +237,7 @@ class Engine private constructor() {
|
||||||
Environment.unset()
|
Environment.unset()
|
||||||
FileAccess.deleteScheduled()
|
FileAccess.deleteScheduled()
|
||||||
FileAccess.unsetDefaultPaths()
|
FileAccess.unsetDefaultPaths()
|
||||||
|
info = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ import de.staropensource.engine.base.implementation.logging.crashcategory.InfoCr
|
||||||
import de.staropensource.engine.base.implementation.logging.formatbuilder.SOSLSv2FormatBuilder
|
import de.staropensource.engine.base.implementation.logging.formatbuilder.SOSLSv2FormatBuilder
|
||||||
import de.staropensource.engine.base.logging.Logger
|
import de.staropensource.engine.base.logging.Logger
|
||||||
import de.staropensource.engine.base.implementable.logging.LoggerThreadingHandler
|
import de.staropensource.engine.base.implementable.logging.LoggerThreadingHandler
|
||||||
|
import de.staropensource.engine.base.implementation.logging.crashcategory.EngineCrashCategory
|
||||||
import de.staropensource.engine.base.type.logging.ChannelSettings
|
import de.staropensource.engine.base.type.logging.ChannelSettings
|
||||||
import de.staropensource.engine.base.type.logging.Feature
|
import de.staropensource.engine.base.type.logging.Feature
|
||||||
import de.staropensource.engine.base.type.logging.Level
|
import de.staropensource.engine.base.type.logging.Level
|
||||||
|
@ -150,7 +151,8 @@ class EngineConfiguration private constructor() {
|
||||||
*/
|
*/
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
var logCrashCategories: LinkedHashSet<CrashCategory> = linkedSetOf(
|
var logCrashCategories: LinkedHashSet<CrashCategory> = linkedSetOf(
|
||||||
InfoCrashCategory.instance
|
InfoCrashCategory.instance,
|
||||||
|
EngineCrashCategory.instance
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* STAROPENSOURCE ENGINE SOURCE FILE
|
||||||
|
* Copyright (c) 2024 The StarOpenSource Engine Authors
|
||||||
|
* Licensed under the GNU Affero General Public License v3
|
||||||
|
* with an exception allowing classpath linking.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.staropensource.engine.base.implementation.logging.crashcategory
|
||||||
|
|
||||||
|
import de.staropensource.engine.base.implementable.logging.CrashCategory
|
||||||
|
import de.staropensource.engine.base.utility.dnihbd.BuildInformation
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [CrashCategory] implementation
|
||||||
|
* providing information about the engine.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
class EngineCrashCategory private constructor() : BuildInformation.BuildInformationCrashCategory() {
|
||||||
|
/**
|
||||||
|
* Companion object of [EngineCrashCategory].
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
companion object {
|
||||||
|
/**
|
||||||
|
* Global instance of [EngineCrashCategory].
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
@JvmStatic
|
||||||
|
val instance: EngineCrashCategory = EngineCrashCategory()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun check(): Boolean {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getName(): String {
|
||||||
|
return "sos!engine"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,528 @@
|
||||||
|
/*
|
||||||
|
* STAROPENSOURCE ENGINE SOURCE FILE
|
||||||
|
* Copyright (c) 2024 The StarOpenSource Engine Authors
|
||||||
|
* Licensed under the GNU Affero General Public License v3
|
||||||
|
* with an exception allowing classpath linking.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.staropensource.engine.base.utility.dnihbd
|
||||||
|
|
||||||
|
import de.staropensource.engine.base.Engine.Companion.info
|
||||||
|
import de.staropensource.engine.base.implementable.logging.CrashCategory
|
||||||
|
import de.staropensource.engine.base.type.Origin
|
||||||
|
import de.staropensource.engine.base.type.logging.Call
|
||||||
|
import de.staropensource.engine.base.type.logging.ChannelSettings
|
||||||
|
import de.staropensource.engine.base.type.versioning.VersionType
|
||||||
|
import de.staropensource.engine.base.utility.FileAccess
|
||||||
|
import de.staropensource.engine.base.utility.misc.StackTraceUtils
|
||||||
|
import kotlinx.datetime.Instant
|
||||||
|
import kotlinx.datetime.LocalDateTime
|
||||||
|
import kotlinx.datetime.TimeZone
|
||||||
|
import kotlinx.datetime.toLocalDateTime
|
||||||
|
import java.io.InputStreamReader
|
||||||
|
import java.io.Reader
|
||||||
|
import java.io.StringReader
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads the specified `-git.properties` and
|
||||||
|
* `-gradle.properties` files into memory,
|
||||||
|
* parses them and makes them available
|
||||||
|
* using properties.
|
||||||
|
*
|
||||||
|
* See the sos!engine documentation on how
|
||||||
|
* to use this class or you will get the
|
||||||
|
* `help what does this do i don't
|
||||||
|
* understand :neofox_woozy:` disease.
|
||||||
|
*
|
||||||
|
* @param loadPrefix prefix used for accessing the files
|
||||||
|
* @param loadLocation location used for accessing the files. Set to `null` to use the JAR's bundled resources.
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
// This method is not sorted like the usual order
|
||||||
|
// (companion objects, constants, properties,
|
||||||
|
// constructors and then methods) but instead like
|
||||||
|
// this: properties & getter methods, constructors,
|
||||||
|
// methods. This change was made for a better,
|
||||||
|
// less chaotic class source code layout.
|
||||||
|
@Suppress("unused")
|
||||||
|
open class BuildInformation
|
||||||
|
@Throws(RuntimeException::class)
|
||||||
|
constructor(val loadPrefix: String, val loadLocation: FileAccess? = null) {
|
||||||
|
// -----> Versioning
|
||||||
|
/**
|
||||||
|
* Returns the current version string.
|
||||||
|
*
|
||||||
|
* @param semver if to return the SemVer-compatible format instead
|
||||||
|
* @return current version string
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
fun versionString(semver: Boolean = false): String? =
|
||||||
|
try {
|
||||||
|
if (semver)
|
||||||
|
"${versionRelease}.${versionType.toUByte()}.${versionTyperelease}${if (versionFork.isEmpty()) "" else "-${versionFork}"}${if (versionCompanion.isEmpty()) "" else "+${versionCompanion}"}"
|
||||||
|
else
|
||||||
|
"v${versionRelease}-${versionType}${versionTyperelease}${if (versionFork.isEmpty()) "" else "-${versionFork}"}${if (versionCompanion.isEmpty()) "" else "+${versionCompanion}"}"
|
||||||
|
} catch (_: NullPointerException) {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The version codename of this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var versionCodename: String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The release number of this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var versionRelease: UInt
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The version type of this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var versionType: VersionType.V2
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The version typerelease of this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var versionTyperelease: UInt
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The fork version of this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var versionFork: String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The companion version of this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var versionCompanion: String
|
||||||
|
|
||||||
|
|
||||||
|
// -----> Languages
|
||||||
|
/**
|
||||||
|
* All languages and their versions
|
||||||
|
* this build was compiled against.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var languages: Map<String, String>
|
||||||
|
|
||||||
|
|
||||||
|
// -----> Dependencies
|
||||||
|
/**
|
||||||
|
* All dependencies and their versions
|
||||||
|
* this build was compiled against.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var dependencies: Map<String, String>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All test dependencies and their versions
|
||||||
|
* this build was tested against.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var testDependencies: Map<String, String>
|
||||||
|
|
||||||
|
|
||||||
|
// -----> Git
|
||||||
|
/**
|
||||||
|
* Whether the `-git.properties` is
|
||||||
|
* missing for this build and the
|
||||||
|
* values provided by this instance
|
||||||
|
* have been faked to avoid issues.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var gitFaked: Boolean
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether uncommitted changes have
|
||||||
|
* been compiled into this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var gitDirty: Boolean
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The branch name from which this
|
||||||
|
* build was compiled from.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var gitBranch: String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The hostname of the build computer
|
||||||
|
* which compiled this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var gitBuildHostname: String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The username of the build user
|
||||||
|
* which compiled this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var gitBuildUsername: String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The email address of the build user
|
||||||
|
* which compiled this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var gitBuildEmail: String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The total commit count at
|
||||||
|
* the time of compilation.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var gitCommits: UInt
|
||||||
|
|
||||||
|
// -----> Git (commit information)
|
||||||
|
/**
|
||||||
|
* The long commit identifier
|
||||||
|
* of this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var gitCommitIdentifierLong: String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The short commit identifier
|
||||||
|
* of this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var gitCommitIdentifierShort: String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The short commit message
|
||||||
|
* of this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var gitCommitMessageShort: String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The full commit message
|
||||||
|
* * of this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var gitCommitMessageFull: String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The time of the commit
|
||||||
|
* of this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var gitCommitTime: Instant
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The username of the commit
|
||||||
|
* author of this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var gitCommitAuthorUsername: String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The email address of the
|
||||||
|
* commit author of this build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
var gitCommitAuthorEmail: String
|
||||||
|
|
||||||
|
|
||||||
|
// -----> Constructors
|
||||||
|
init {
|
||||||
|
try {
|
||||||
|
var gitProperties: Properties? = Properties()
|
||||||
|
val gradleProperties: Properties = Properties()
|
||||||
|
val gradlePropertiesKeys: Array<String>
|
||||||
|
|
||||||
|
// Load properties
|
||||||
|
try {
|
||||||
|
StringReader(getFileContent("git")!!).use { gitProperties?.load(it) }
|
||||||
|
} catch (exception: NullPointerException) {
|
||||||
|
gitProperties = null
|
||||||
|
}
|
||||||
|
StringReader(getFileContent("gradle")!!).use { gradleProperties.load(it) }
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
gradlePropertiesKeys = (gradleProperties.keys as Set<String>).toTypedArray()
|
||||||
|
|
||||||
|
// Set properties
|
||||||
|
// -> Versioning
|
||||||
|
versionCodename = gradleProperties.getProperty("versionCodename")!!
|
||||||
|
versionRelease = gradleProperties.getProperty("versionRelease")!!.toUInt()
|
||||||
|
versionType = VersionType.V2.of(gradleProperties.getProperty("versionType")!!)!!
|
||||||
|
versionTyperelease = gradleProperties.getProperty("versionTyperelease")!!.toUInt()
|
||||||
|
versionFork = gradleProperties.getProperty("versionFork")!!
|
||||||
|
versionCompanion = gradleProperties.getProperty("versionCompanion")!!
|
||||||
|
|
||||||
|
// -> Languages
|
||||||
|
val languagesMutable: MutableMap<String, String> = mutableMapOf()
|
||||||
|
|
||||||
|
for (language: String in gradlePropertiesKeys.filter { key -> key.startsWith("language") })
|
||||||
|
languagesMutable.put(language.removePrefix("language").replaceFirstChar { it.uppercaseChar() }, gradleProperties.getProperty(language))
|
||||||
|
|
||||||
|
languages = languagesMutable.toMap()
|
||||||
|
|
||||||
|
// -> Dependencies
|
||||||
|
dependencies = resolveDependencies(gradleProperties, "dependency")
|
||||||
|
testDependencies = resolveDependencies(gradleProperties, "testDependency")
|
||||||
|
|
||||||
|
gitFaked = gitProperties == null
|
||||||
|
gitDirty = gitProperties?.getProperty("git.dirty").toBoolean()
|
||||||
|
gitBranch = gitProperties?.getProperty("git.branch") ?: "unknown"
|
||||||
|
gitBuildHostname = gitProperties?.getProperty("git.build.host") ?: "unknown"
|
||||||
|
gitBuildUsername = gitProperties?.getProperty("git.build.user.name") ?: "Unknown"
|
||||||
|
gitBuildEmail = gitProperties?.getProperty("git.build.user.email") ?: "unknown@example.org"
|
||||||
|
gitCommits = gitProperties?.getProperty("git.total.commit.count")?.toUInt() ?: 0u
|
||||||
|
gitCommitIdentifierLong = gitProperties?.getProperty("git.commit.id") ?: "0000000000000000000000000000000000000000"
|
||||||
|
gitCommitIdentifierShort = gitProperties?.getProperty("git.commit.id.abbrev") ?: "0000000"
|
||||||
|
gitCommitMessageFull = gitProperties?.getProperty("git.commit.message.full") ?: "-> The -git.properties file could not be loaded. Did you download a tarball?"
|
||||||
|
gitCommitMessageShort = gitProperties?.getProperty("git.commit.message.short") ?: "-> The -git.properties file could not be loaded. Did you download a tarball?"
|
||||||
|
gitCommitTime = Instant.parse(gitProperties?.getProperty("git.commit.time") ?: "")
|
||||||
|
gitCommitAuthorUsername = gitProperties?.getProperty("git.commit.user.name") ?: "unknown@example.org"
|
||||||
|
gitCommitAuthorEmail = gitProperties?.getProperty("git.commit.user.email") ?: "Unknown"
|
||||||
|
} catch (throwable: Throwable) {
|
||||||
|
throw RuntimeException("Unable to load build information", throwable)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -----> Utility methods
|
||||||
|
/**
|
||||||
|
* Returns the specified file content.
|
||||||
|
*
|
||||||
|
* @param file file to access
|
||||||
|
* @return file content or `null` if it doesn't exist
|
||||||
|
* @throws Throwable on error
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
@Throws(Throwable::class)
|
||||||
|
protected fun getFileContent(file: String): String? {
|
||||||
|
if (loadLocation == null) {
|
||||||
|
// Read from resources
|
||||||
|
val origin: Origin = StackTraceUtils.getMethodCaller(2u)
|
||||||
|
val reader: Reader
|
||||||
|
try {
|
||||||
|
reader = InputStreamReader(
|
||||||
|
Class
|
||||||
|
.forName("${origin.packageName}.${origin.className}")
|
||||||
|
.classLoader
|
||||||
|
.getResourceAsStream("${loadPrefix}-${file}.properties")!!
|
||||||
|
)
|
||||||
|
} catch (exception: NullPointerException) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
val output = reader.readText()
|
||||||
|
reader.close()
|
||||||
|
|
||||||
|
return output
|
||||||
|
} else
|
||||||
|
// Read from filesystem
|
||||||
|
return FileAccess("${loadLocation}/${loadPrefix}-${file}.properties")
|
||||||
|
.readString()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolves and returns a map of
|
||||||
|
* dependencies and their versions.
|
||||||
|
*
|
||||||
|
* @param properties properties containing all dependencies
|
||||||
|
* @param prefix prefix used for accessing the dependencies
|
||||||
|
* @return map of dependencies
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
private fun resolveDependencies(properties: Properties, prefix: String): Map<String, String> {
|
||||||
|
val map: MutableMap<String, String> = mutableMapOf()
|
||||||
|
var temp: String
|
||||||
|
var name: String
|
||||||
|
var identifier: String
|
||||||
|
var version: String
|
||||||
|
|
||||||
|
// Loop through all properties
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
for (property: String in properties.keys as Set<String>) {
|
||||||
|
// Only process properties which start with
|
||||||
|
// the specified prefix and end in "Identifier"
|
||||||
|
if (property.startsWith(prefix) && property.endsWith("Identifier")) {
|
||||||
|
temp = property.removeSuffix("Identifier")
|
||||||
|
name = temp.removePrefix(prefix).replace("_", " ")
|
||||||
|
identifier = properties.getProperty(property)
|
||||||
|
|
||||||
|
// Determine version
|
||||||
|
@Suppress("LoopWithTooManyJumpStatements")
|
||||||
|
while (true) {
|
||||||
|
// Stop if 'temp' is blank
|
||||||
|
if (temp.isBlank()) {
|
||||||
|
version = "?"
|
||||||
|
break
|
||||||
|
} else if (properties.getProperty("${temp}Version") != null) {
|
||||||
|
version = properties.getProperty("${temp}Version")
|
||||||
|
break
|
||||||
|
} else
|
||||||
|
try {
|
||||||
|
// Search for last capitalized letter
|
||||||
|
// and only keep everything before it
|
||||||
|
temp = temp.substring(0, temp.findLastAnyOf(
|
||||||
|
setOf(
|
||||||
|
"A", "B", "C", "D", "E", "F", "G",
|
||||||
|
"H", "I", "J", "K", "L", "M", "N",
|
||||||
|
"O", "P", "Q", "R", "S", "T", "U",
|
||||||
|
"V", "W", "X", "Y", "Z"
|
||||||
|
)
|
||||||
|
)!!.first - 1)
|
||||||
|
} catch (exception: NullPointerException) {
|
||||||
|
// Cancel if substring last capitalized
|
||||||
|
// character search fails
|
||||||
|
temp = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add to output map
|
||||||
|
map.put(name, "${identifier} v${version}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return map.toMap()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -----> Inner classes
|
||||||
|
/**
|
||||||
|
* A [CrashCategory] implementation providing
|
||||||
|
* details about your running build.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
abstract class BuildInformationCrashCategory : CrashCategory {
|
||||||
|
override fun execute(
|
||||||
|
call: Call,
|
||||||
|
channelSettings: ChannelSettings?,
|
||||||
|
throwable: Throwable?,
|
||||||
|
fatal: Boolean,
|
||||||
|
): LinkedHashMap<String, Any?> {
|
||||||
|
// Check if Engine.info is 'null'
|
||||||
|
if (info == null)
|
||||||
|
return linkedMapOf(
|
||||||
|
Pair("Not available", null)
|
||||||
|
)
|
||||||
|
|
||||||
|
val map: LinkedHashMap<String, Any?> = linkedMapOf()
|
||||||
|
|
||||||
|
// Add metadata
|
||||||
|
// -> Versioning
|
||||||
|
map.put("Version", "${info!!.versionString(semver = false)} \"${info!!.versionCodename}\"")
|
||||||
|
|
||||||
|
// -> Languages
|
||||||
|
if (!info!!.languages.isEmpty()) {
|
||||||
|
val languagesMap: LinkedHashMap<String, String> = linkedMapOf()
|
||||||
|
|
||||||
|
// Add all languages
|
||||||
|
for (language: String in info!!.languages.keys)
|
||||||
|
languagesMap.put(language, info!!.languages[language]!!)
|
||||||
|
|
||||||
|
// Add to output map
|
||||||
|
map.put("Languages", languagesMap)
|
||||||
|
}
|
||||||
|
|
||||||
|
// -> Dependencies
|
||||||
|
if (!info!!.dependencies.isEmpty()) {
|
||||||
|
val dependenciesMap: LinkedHashMap<String, String> = linkedMapOf()
|
||||||
|
|
||||||
|
// Add all dependencies
|
||||||
|
for (dependency: String in info!!.dependencies.keys)
|
||||||
|
dependenciesMap.put(dependency, info!!.dependencies[dependency]!!)
|
||||||
|
|
||||||
|
// Add to output map
|
||||||
|
map.put("Dependencies", dependenciesMap)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!info!!.testDependencies.isEmpty()) {
|
||||||
|
val testDependenciesMap: LinkedHashMap<String, String> = linkedMapOf()
|
||||||
|
|
||||||
|
// Add all test dependencies
|
||||||
|
for (testDependency: String in info!!.testDependencies.keys)
|
||||||
|
testDependenciesMap.put(testDependency, info!!.testDependencies[testDependency]!!)
|
||||||
|
|
||||||
|
// Add to output map
|
||||||
|
map.put("Test dependencies", testDependenciesMap)
|
||||||
|
}
|
||||||
|
|
||||||
|
// -> Git
|
||||||
|
if (info!!.gitFaked)
|
||||||
|
map.put("Git", "Unavailable")
|
||||||
|
else {
|
||||||
|
val gitMap: LinkedHashMap<String, Any> = linkedMapOf()
|
||||||
|
val gitCommitMap: LinkedHashMap<String, Any> = linkedMapOf()
|
||||||
|
val gitCommitAuthorMap: LinkedHashMap<String, String> = linkedMapOf()
|
||||||
|
val gitBuilderMap: LinkedHashMap<String, String> = linkedMapOf()
|
||||||
|
val gitCommitTime: LocalDateTime = info!!.gitCommitTime.toLocalDateTime(TimeZone.UTC)
|
||||||
|
|
||||||
|
// Add to 'gitCommitAuthorMap'
|
||||||
|
gitCommitAuthorMap.put("Username", info!!.gitCommitAuthorUsername)
|
||||||
|
gitCommitAuthorMap.put("Email address", info!!.gitCommitAuthorEmail)
|
||||||
|
|
||||||
|
// Add to 'gitCommitMap'
|
||||||
|
gitCommitMap.put("Identifier", "'${info!!.gitCommitIdentifierLong}'")
|
||||||
|
gitCommitMap.put("Message (short)", "'${info!!.gitCommitMessageShort}'")
|
||||||
|
gitCommitMap.put("Time", "${gitCommitTime.dayOfMonth}.${gitCommitTime.monthNumber}.${gitCommitTime.year} ${gitCommitTime.hour}:${gitCommitTime.minute}:${gitCommitTime.second} UTC")
|
||||||
|
gitCommitMap.put("Author", gitCommitAuthorMap)
|
||||||
|
|
||||||
|
// Add to 'gitCommitMap'
|
||||||
|
gitBuilderMap.put("Hostname", info!!.gitBuildHostname)
|
||||||
|
gitBuilderMap.put("Username", info!!.gitBuildUsername)
|
||||||
|
gitBuilderMap.put("Email address", info!!.gitBuildEmail)
|
||||||
|
|
||||||
|
// Add to 'gitMap'
|
||||||
|
gitMap.put("Dirty", if (info!!.gitDirty) "yes" else "no")
|
||||||
|
gitMap.put("Branch", info!!.gitBranch)
|
||||||
|
gitMap.put("Commit", gitCommitMap)
|
||||||
|
gitMap.put("Builder", gitBuilderMap)
|
||||||
|
|
||||||
|
// Add to output map
|
||||||
|
map.put("Git", gitMap)
|
||||||
|
}
|
||||||
|
|
||||||
|
return map
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* STAROPENSOURCE ENGINE SOURCE FILE
|
||||||
|
* Copyright (c) 2024 The StarOpenSource Engine Authors
|
||||||
|
* Licensed under the GNU Affero General Public License v3
|
||||||
|
* with an exception allowing classpath linking.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DNI, HBD. Short for Do Not
|
||||||
|
* Interact, Here Be Dragons.
|
||||||
|
*
|
||||||
|
* Only use the classes contained
|
||||||
|
* in this package if you really
|
||||||
|
* know what you are doing.
|
||||||
|
*
|
||||||
|
* @since v1-alpha10
|
||||||
|
*/
|
||||||
|
package de.staropensource.engine.base.utility.dnihbd
|
Loading…
Reference in a new issue