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 { @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" } } /** Returns the number of revisions up to the current commit */ abstract class GitRevCountSource implements ValueSource { @Inject abstract ExecOperations getExecOperations() @Override Integer obtain() { try { def output = new ByteArrayOutputStream() execOperations.exec { it.commandLine 'git', 'rev-list', '--first-parent', '--count', 'HEAD' it.standardOutput = output } return output.toString().trim().toInteger() } catch (GradleException ignore) { // Git executable unavailable, or we are not building in a git repo. Fall through: } return -1 } } ext.getGitSha = { providers.of(GitShaValueSource) {}.get() } ext.getGitRevCount = { providers.of(GitRevCountSource) {}.get() }