Skip to content

Commit fc139f1

Browse files
committed
Get branch name from env var (#74)
1 parent 1035b44 commit fc139f1

File tree

5 files changed

+95
-51
lines changed

5 files changed

+95
-51
lines changed

build.gradle

+7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
plugins {
22
id 'java-gradle-plugin'
3+
id 'groovy'
34
id 'maven-publish'
45
id 'signing'
56
id 'com.gradle.plugin-publish' version '1.0.0'
@@ -16,6 +17,8 @@ repositories {
1617

1718
dependencies {
1819
compileOnly 'com.gradle:gradle-enterprise-gradle-plugin:3.10.3'
20+
testImplementation platform("org.spockframework:spock-bom:2.1-groovy-3.0")
21+
testImplementation "org.spockframework:spock-core"
1922
}
2023

2124
wrapperUpgrade {
@@ -32,6 +35,10 @@ java {
3235
}
3336
}
3437

38+
test {
39+
useJUnitPlatform()
40+
}
41+
3542
gradlePlugin {
3643
automatedPublishing = true
3744

src/main/java/com/gradle/CustomBuildScanEnhancements.java

+28-49
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,12 @@
1414
import java.util.Map;
1515
import java.util.Optional;
1616
import java.util.Properties;
17-
import java.util.function.Supplier;
1817
import java.util.regex.Matcher;
1918
import java.util.regex.Pattern;
2019
import java.util.stream.Stream;
2120

2221
import static com.gradle.Utils.appendIfMissing;
2322
import static com.gradle.Utils.execAndCheckSuccess;
24-
import static com.gradle.Utils.execAndGetStdOut;
25-
import static com.gradle.Utils.isNotEmpty;
2623
import static com.gradle.Utils.redactUserInfo;
2724
import static com.gradle.Utils.urlEncode;
2825

@@ -216,7 +213,7 @@ private void captureCiMetadata() {
216213
customValueSearchLinker.addCustomValueAndSearchLink("CI stage", value));
217214
}
218215

219-
if(isAzurePipelines()) {
216+
if (isAzurePipelines()) {
220217
Optional<String> azureServerUrl = envVariable("SYSTEM_TEAMFOUNDATIONCOLLECTIONURI");
221218
Optional<String> azureProject = envVariable("SYSTEM_TEAMPROJECT");
222219
Optional<String> buildId = envVariable("BUILD_BUILDID");
@@ -302,44 +299,35 @@ private CaptureGitMetadataAction(ProviderFactory providers, CustomValueSearchLin
302299

303300
@Override
304301
public void execute(BuildScanExtension buildScan) {
305-
if (!isGitInstalled()) {
306-
return;
307-
}
308-
309-
String gitRepo = execAndGetStdOut("git", "config", "--get", "remote.origin.url");
310-
String gitCommitId = execAndGetStdOut("git", "rev-parse", "--verify", "HEAD");
311-
String gitCommitShortId = execAndGetStdOut("git", "rev-parse", "--short=8", "--verify", "HEAD");
312-
String gitBranchName = getGitBranchName(() -> execAndGetStdOut("git", "rev-parse", "--abbrev-ref", "HEAD"));
313-
String gitStatus = execAndGetStdOut("git", "status", "--porcelain");
314-
315-
if (isNotEmpty(gitRepo)) {
316-
buildScan.value("Git repository", redactUserInfo(gitRepo));
317-
}
318-
if (isNotEmpty(gitCommitId)) {
319-
buildScan.value("Git commit id", gitCommitId);
320-
}
321-
if (isNotEmpty(gitCommitShortId)) {
322-
customValueSearchLinker.addCustomValueAndSearchLink("Git commit id", "Git commit id short", gitCommitShortId);
323-
}
324-
if (isNotEmpty(gitBranchName)) {
325-
buildScan.tag(gitBranchName);
326-
buildScan.value("Git branch", gitBranchName);
327-
}
328-
if (isNotEmpty(gitStatus)) {
302+
GitMetadataResolver gitMetadataResolver = new GitMetadataResolver(isGitInstalled());
303+
Optional<String> gitRepo = gitMetadataResolver.resolve(() -> Utils.execAndGetStdOut("git", "config", "--get", "remote.origin.url"));
304+
Optional<String> gitCommitId = gitMetadataResolver.resolve(() -> Utils.execAndGetStdOut("git", "rev-parse", "--verify", "HEAD"));
305+
Optional<String> gitCommitShortId = gitMetadataResolver.resolve(() -> Utils.execAndGetStdOut("git", "rev-parse", "--short=8", "--verify", "HEAD"));
306+
Optional<String> gitStatus = gitMetadataResolver.resolve(() -> Utils.execAndGetStdOut("git", "status", "--porcelain"));
307+
Optional<String> gitBranchName = gitMetadataResolver.resolve(this::getGitBranchNameFromEnv, () -> Utils.execAndGetStdOut("git", "rev-parse", "--abbrev-ref", "HEAD"));
308+
309+
gitRepo.ifPresent(s -> buildScan.value("Git repository", redactUserInfo(s)));
310+
gitCommitId.ifPresent(s -> buildScan.value("Git commit id", s));
311+
gitCommitShortId.ifPresent(s -> customValueSearchLinker.addCustomValueAndSearchLink("Git commit id", "Git commit id short", s));
312+
gitBranchName.ifPresent(s -> {
313+
buildScan.tag(s);
314+
buildScan.value("Git branch", s);
315+
});
316+
gitStatus.ifPresent(s -> {
329317
buildScan.tag("Dirty");
330-
buildScan.value("Git status", gitStatus);
331-
}
318+
buildScan.value("Git status", s);
319+
});
332320

333-
if (isNotEmpty(gitRepo) && isNotEmpty(gitCommitId)) {
334-
if (gitRepo.contains("github.com/") || gitRepo.contains("github.com:")) {
335-
Matcher matcher = Pattern.compile("(.*)github\\.com[/|:](.*)").matcher(gitRepo);
321+
if (gitRepo.isPresent() && gitCommitId.isPresent()) {
322+
if (gitRepo.get().contains("github.com/") || gitRepo.get().contains("github.com:")) {
323+
Matcher matcher = Pattern.compile("(.*)github\\.com[/|:](.*)").matcher(gitRepo.get());
336324
if (matcher.matches()) {
337325
String rawRepoPath = matcher.group(2);
338326
String repoPath = rawRepoPath.endsWith(".git") ? rawRepoPath.substring(0, rawRepoPath.length() - 4) : rawRepoPath;
339327
buildScan.link("Github source", "https://github.com/" + repoPath + "/tree/" + gitCommitId);
340328
}
341-
} else if (gitRepo.contains("gitlab.com/") || gitRepo.contains("gitlab.com:")) {
342-
Matcher matcher = Pattern.compile("(.*)gitlab\\.com[/|:](.*)").matcher(gitRepo);
329+
} else if (gitRepo.get().contains("gitlab.com/") || gitRepo.get().contains("gitlab.com:")) {
330+
Matcher matcher = Pattern.compile("(.*)gitlab\\.com[/|:](.*)").matcher(gitRepo.get());
343331
if (matcher.matches()) {
344332
String rawRepoPath = matcher.group(2);
345333
String repoPath = rawRepoPath.endsWith(".git") ? rawRepoPath.substring(0, rawRepoPath.length() - 4) : rawRepoPath;
@@ -353,24 +341,15 @@ private boolean isGitInstalled() {
353341
return execAndCheckSuccess("git", "--version");
354342
}
355343

356-
private String getGitBranchName(Supplier<String> gitCommand) {
344+
private Optional<String> getGitBranchNameFromEnv() {
357345
if (isJenkins() || isHudson()) {
358-
Optional<String> branch = Utils.envVariable("BRANCH_NAME", providers);
359-
if (branch.isPresent()) {
360-
return branch.get();
361-
}
346+
return Utils.envVariable("BRANCH_NAME", providers);
362347
} else if (isGitLab()) {
363-
Optional<String> branch = Utils.envVariable("CI_COMMIT_REF_NAME", providers);
364-
if (branch.isPresent()) {
365-
return branch.get();
366-
}
348+
return Utils.envVariable("CI_COMMIT_REF_NAME", providers);
367349
} else if (isAzurePipelines()) {
368-
Optional<String> branch = Utils.envVariable("BUILD_SOURCEBRANCH", providers);
369-
if (branch.isPresent()) {
370-
return branch.get();
371-
}
350+
return Utils.envVariable("BUILD_SOURCEBRANCH", providers);
372351
}
373-
return gitCommand.get();
352+
return Optional.empty();
374353
}
375354

376355
private boolean isJenkins() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.gradle;
2+
3+
import java.util.Optional;
4+
import java.util.function.Supplier;
5+
6+
class GitMetadataResolver {
7+
private final boolean isGitInstalled;
8+
9+
GitMetadataResolver(boolean isGitInstalled) {
10+
this.isGitInstalled = isGitInstalled;
11+
}
12+
13+
Optional<String> resolve(Supplier<Optional<String>> fromGit) {
14+
return resolve(null, fromGit);
15+
}
16+
17+
Optional<String> resolve(Supplier<Optional<String>> fromEnv, Supplier<Optional<String>> fromGit) {
18+
Optional<String> resolved = Optional.empty();
19+
if (fromEnv != null) {
20+
resolved = fromEnv.get().flatMap(str -> str.isEmpty() ? Optional.empty() : Optional.of(str));
21+
}
22+
if (isGitInstalled && fromGit != null && !resolved.isPresent()) {
23+
resolved = fromGit.get().flatMap(str -> str.isEmpty() ? Optional.empty() : Optional.of(str));
24+
}
25+
return resolved;
26+
}
27+
}

src/main/java/com/gradle/Utils.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ static boolean execAndCheckSuccess(String... args) {
162162
}
163163
}
164164

165-
static String execAndGetStdOut(String... args) {
165+
static Optional<String> execAndGetStdOut(String... args) {
166166
Runtime runtime = Runtime.getRuntime();
167167
Process process;
168168
try {
@@ -177,7 +177,7 @@ static String execAndGetStdOut(String... args) {
177177
String ignore = readFully(error);
178178

179179
boolean finished = process.waitFor(10, TimeUnit.SECONDS);
180-
return finished && process.exitValue() == 0 ? trimAtEnd(standardText) : null;
180+
return finished && process.exitValue() == 0 ? Optional.of(trimAtEnd(standardText)) : Optional.empty();
181181
}
182182
} catch (IOException | InterruptedException e) {
183183
throw new RuntimeException(e);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.gradle
2+
3+
import spock.lang.Specification
4+
5+
class GitMetadataResolverTest extends Specification {
6+
def "Resolve from #label"() {
7+
given:
8+
def resolver = new GitMetadataResolver(isGitInstalled)
9+
10+
when:
11+
def resolved = fromEnv ? resolver.resolve(fromEnv, fromGit) : resolver.resolve(fromGit)
12+
13+
then:
14+
resolved == expected
15+
16+
where:
17+
label | isGitInstalled | fromGit | fromEnv | expected
18+
'nothing' | true | null | null | Optional.empty()
19+
'nothing, no CLI' | false | null | null | Optional.empty()
20+
'git only' | true | (() -> Optional.of('fromGit')) | null | Optional.of('fromGit')
21+
'git only, no CLI' | false | (() -> Optional.of('whatever')) | null | Optional.empty()
22+
'git blank' | true | (() -> Optional.of('')) | null | Optional.empty()
23+
'env only' | true | null | (() -> Optional.of('fromEnv')) | Optional.of('fromEnv')
24+
'env, git' | true | (() -> Optional.of('fromGit')) | (() -> Optional.of('fromEnv')) | Optional.of('fromEnv')
25+
'env, git, no CLI' | false | (() -> Optional.of('whatever')) | (() -> Optional.of('fromEnv')) | Optional.of('fromEnv')
26+
'env empty, git' | true | (() -> Optional.of('fromGit')) | (() -> Optional.empty()) | Optional.of('fromGit')
27+
'env empty, git, no CLI' | false | (() -> Optional.of('whatever')) | (() -> Optional.empty()) | Optional.empty()
28+
'env blank, git' | true | (() -> Optional.of('fromGit')) | (() -> Optional.of('')) | Optional.of('fromGit')
29+
'env blank, git, no CLI' | false | (() -> Optional.of('whatever')) | (() -> Optional.of('')) | Optional.empty()
30+
}
31+
}

0 commit comments

Comments
 (0)