浏览代码

Previous attempt to fix git sha on non-git build broke git build. (#3322)

This uses unusual code provided by Mikhail Lopatkin of Gradle Inc:
https://github.com/gradle/gradle/issues/23914#issuecomment-1431909019
It wraps the git sha function in a "value source". This allows it to interact correctly with configuration caching.
Because the code is longer than before, it is now broken out into its own file getGitSha.gradle.
mcclure 1 年之前
父节点
当前提交
ab364712fe
共有 2 个文件被更改,包括 29 次插入12 次删除
  1. 2 12
      app/build.gradle
  2. 27 0
      app/getGitSha.gradle

+ 2 - 12
app/build.gradle

@@ -5,19 +5,9 @@ plugins {
     alias(libs.plugins.kotlin.parcelize)
 }
 
-// For constructing gitSha only
-def getGitSha = {
-    try {  // Try-catch is necessary for build to work on non-git distributions
-        providers.exec {
-            commandLine 'git', 'rev-parse', 'HEAD'
-            executionResult.rethrowFailure() // Without this, sometimes it just stops immediately instead of throwing
-        }.standardOutput.asText.get().trim()
-    } catch (Exception e) {
-        "unknown"
-    }
-}
+apply from: 'getGitSha.gradle'
 
-final def gitSha = getGitSha()
+final def gitSha = ext.getGitSha()
 
 // The app name
 final def APP_NAME = "Tusky"

+ 27 - 0
app/getGitSha.gradle

@@ -0,0 +1,27 @@
+import org.gradle.api.provider.ValueSourceParameters
+import javax.inject.Inject
+
+// Must wrap this in a ValueSource in order to get well-defined fail behavior without confusing Gradle on repeat builds.
+abstract class GitShaValueSource implements ValueSource<String, ValueSourceParameters.None> {
+    @Inject abstract ExecOperations getExecOperations()
+
+    @Override String obtain() {
+        try {
+            def output = new ByteArrayOutputStream()
+
+            execOperations.exec {
+                it.commandLine 'git', 'rev-parse', '--short=8', 'HEAD'
+                it.standardOutput = output
+            }
+            return output.toString().trim()
+        } catch (GradleException ignore) {
+            // Git executable unavailable, or we are not building in a git repo. Fall through:
+        }
+        return "unknown"
+    }
+}
+
+// Export closure
+ext.getGitSha = {
+    providers.of(GitShaValueSource) {}.get()
+}