Skip to content

Commit 613472c

Browse files
committed
Report GitVersion failure as problem instead of console log bloat
Next step is to add a check to fail the build if the `CI` environment variable is true and Git Version failed to calculate the version number (opt-out).
1 parent fc11dfe commit 613472c

File tree

6 files changed

+66
-21
lines changed

6 files changed

+66
-21
lines changed

gitversion-gradle/src/main/groovy/net/minecraftforge/gitversion/gradle/GitVersionExtensionImpl.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import javax.inject.Inject
3030
@Inject
3131
GitVersionExtensionImpl(GitVersionPlugin plugin, ExtensionAware target, Directory projectDirectory) {
3232
this.gitversion = this.objects.property(Output)
33-
.value(GitVersionValueSource.of(plugin, projectDirectory))
33+
.value(GitVersionValueSource.of(objects.newInstance(GitVersionProblems), plugin, projectDirectory))
3434
.tap { disallowChanges(); finalizeValueOnRead() }
3535

3636
if (target instanceof Project)

gitversion-gradle/src/main/groovy/net/minecraftforge/gitversion/gradle/GitVersionExtensionInternal.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ record Info(
9797
String getCommit,
9898
String getAbbreviatedId
9999
) implements GitVersionExtension.Info {
100+
static final Info EMPTY = new Info("0.0", "0", "00000000", "master", "0000000000000000000000", "00000000");
101+
100102
@Override
101103
public String getBranch(boolean versionFriendly) {
102104
var branch = this.getBranch();
@@ -149,5 +151,15 @@ record Output(
149151
@Nullable String tagPrefix,
150152
List<String> filters,
151153
List<String> subprojectPaths
152-
) implements Serializable { }
154+
) implements Serializable {
155+
static final Output EMPTY = new Output(
156+
Info.EMPTY,
157+
null,
158+
null,
159+
null,
160+
null,
161+
null,
162+
List.of(),
163+
List.of());
164+
}
153165
}

gitversion-gradle/src/main/groovy/net/minecraftforge/gitversion/gradle/GitVersionPlugin.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.gradle.api.initialization.Settings;
1010
import org.gradle.api.logging.Logger;
1111
import org.gradle.api.logging.Logging;
12+
import org.gradle.api.model.ObjectFactory;
1213
import org.gradle.api.plugins.ExtensionAware;
1314
import org.gradle.api.provider.ProviderFactory;
1415

@@ -22,6 +23,7 @@ abstract class GitVersionPlugin extends EnhancedPlugin<ExtensionAware> {
2223
static final Logger LOGGER = Logging.getLogger(GitVersionPlugin.class);
2324

2425
// Used by GitVersionValueSource
26+
@Override protected abstract @Inject ObjectFactory getObjects();
2527
@Override protected abstract @Inject ProviderFactory getProviders();
2628

2729
@Inject

gitversion-gradle/src/main/groovy/net/minecraftforge/gitversion/gradle/GitVersionProblems.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,18 @@ abstract class GitVersionProblems extends EnhancedProblems {
1414
public GitVersionProblems() {
1515
super(GitVersionPlugin.NAME, GitVersionPlugin.DISPLAY_NAME);
1616
}
17+
18+
void reportGitVersionFailure(String errorOutput, Throwable failure) {
19+
report("git-version-failure", "Git Version failed to generate version info", spec -> spec
20+
.details("""
21+
Git Version failed to generate version information. Please address this issue before attempting to publish your project.
22+
Error Output:
23+
%s""".formatted(errorOutput.indent(2)))
24+
.withException(failure)
25+
.severity(Severity.ERROR)
26+
.solution("If you are not in a Git repository, ignore until you initialize it or do not use the Git Version Gradle plugin.")
27+
.solution("If your Git repository has no remote, add one.")
28+
.solution("If your Git repository has no tags, add one.")
29+
.solution(HELP_MESSAGE));
30+
}
1731
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package net.minecraftforge.gitversion.gradle;
2+
3+
record GitVersionValueResult(GitVersionExtensionInternal.Output output, String errorOutput, Throwable execFailure) { }

gitversion-gradle/src/main/groovy/net/minecraftforge/gitversion/gradle/GitVersionValueSource.groovy

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,16 @@ import net.minecraftforge.gitversion.gradle.common.GitVersionTools
1010
import org.gradle.api.file.ConfigurableFileCollection
1111
import org.gradle.api.file.Directory
1212
import org.gradle.api.file.DirectoryProperty
13-
import org.gradle.api.provider.Property
14-
import org.gradle.api.provider.Provider
15-
import org.gradle.api.provider.ProviderFactory
1613
import org.gradle.api.provider.ValueSource
1714
import org.gradle.api.provider.ValueSourceParameters
1815
import org.gradle.process.ExecOperations
1916
import org.gradle.process.JavaExecSpec
20-
import org.gradle.process.ProcessExecutionException
2117

2218
import javax.inject.Inject
2319
import java.nio.charset.StandardCharsets
2420

25-
import static net.minecraftforge.gitversion.gradle.GitVersionPlugin.LOGGER
26-
2721
@CompileStatic
28-
@PackageScope abstract class GitVersionValueSource implements ValueSource<String, Parameters> {
22+
@PackageScope abstract class GitVersionValueSource implements ValueSource<GitVersionValueResult, Parameters> {
2923
static interface Parameters extends ValueSourceParameters {
3024
ConfigurableFileCollection getClasspath()
3125

@@ -37,8 +31,8 @@ import static net.minecraftforge.gitversion.gradle.GitVersionPlugin.LOGGER
3731
@Inject
3832
GitVersionValueSource() {}
3933

40-
@PackageScope static Provider<GitVersionExtensionInternal.Output> of(GitVersionPlugin plugin, Directory projectDirectory) {
41-
plugin.getProviders().of(GitVersionValueSource) { spec ->
34+
@PackageScope static GitVersionExtensionInternal.Output of(GitVersionProblems problems, GitVersionPlugin plugin, Directory projectDirectory) {
35+
var result = plugin.getProviders().of(GitVersionValueSource) { spec ->
4236
spec.parameters { parameters ->
4337
parameters.classpath.from(plugin.getTool(GitVersionTools.GITVERSION).classpath)
4438
// NOTE: We are NOT manually setting the java launcher this time
@@ -47,20 +41,30 @@ import static net.minecraftforge.gitversion.gradle.GitVersionPlugin.LOGGER
4741

4842
parameters.projectPath.set(projectDirectory)
4943
}
50-
}.map { Util.fromJson(it, GitVersionExtensionInternal.Output) }
44+
}.get()
45+
46+
if (result.execFailure() !== null)
47+
problems.reportGitVersionFailure(result.errorOutput(), result.execFailure())
48+
49+
return result.output()
5150
}
5251

5352
@Override
54-
String obtain() {
53+
GitVersionValueResult obtain() {
5554
final parameters = this.parameters
56-
final output = new ByteArrayOutputStream()
55+
final stdOut = new ByteArrayOutputStream()
56+
final stdErr = new ByteArrayOutputStream()
57+
58+
GitVersionExtensionInternal.Output output
59+
String errorOutput
60+
Throwable execFailure
5761

5862
Closure javaExecSpec = { JavaExecSpec exec ->
5963
exec.classpath = parameters.classpath
6064
exec.mainClass.set(GitVersionTools.GITVERSION.mainClass)
6165

62-
exec.standardOutput = output
63-
exec.errorOutput = Util.toLog(LOGGER.&error)
66+
exec.standardOutput = stdOut
67+
exec.errorOutput = stdErr
6468

6569
exec.args(
6670
'--json',
@@ -70,19 +74,29 @@ import static net.minecraftforge.gitversion.gradle.GitVersionPlugin.LOGGER
7074

7175
try {
7276
this.execOperations.javaexec(javaExecSpec).rethrowFailure().assertNormalExitValue()
73-
} catch (ProcessExecutionException e) {
74-
output.reset()
77+
78+
output = Util.fromJson(stdOut.toString(StandardCharsets.UTF_8), GitVersionExtensionInternal.Output)
79+
errorOutput = stdErr.toString(StandardCharsets.UTF_8)
80+
execFailure = null
81+
} catch (Exception e) {
82+
stdOut.reset()
7583

7684
try {
7785
this.execOperations.javaexec(javaExecSpec.andThen { JavaExecSpec exec ->
7886
exec.args('--disable-strict')
87+
exec.errorOutput = new ByteArrayOutputStream()
7988
}).rethrowFailure().assertNormalExitValue()
80-
} catch (ProcessExecutionException suppressed) {
89+
90+
output = Util.fromJson(stdOut.toString(StandardCharsets.UTF_8), GitVersionExtensionInternal.Output)
91+
} catch (Exception suppressed) {
8192
e.addSuppressed(suppressed)
82-
throw e
93+
output = GitVersionExtensionInternal.Output.EMPTY
8394
}
95+
96+
errorOutput = stdErr.toString(StandardCharsets.UTF_8)
97+
execFailure = e
8498
}
8599

86-
output.toString(StandardCharsets.UTF_8)
100+
return new GitVersionValueResult(output, errorOutput, execFailure)
87101
}
88102
}

0 commit comments

Comments
 (0)