Skip to content

Commit 2bd6a91

Browse files
committed
Get branch name from env var (#74)
1 parent 3bcb219 commit 2bd6a91

File tree

3 files changed

+84
-43
lines changed

3 files changed

+84
-43
lines changed

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

+25-41
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,14 @@
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;
28-
2925
/**
3026
* Adds a standard set of useful tags, links and custom values to all build scans published.
3127
*/
@@ -281,44 +277,35 @@ private CaptureGitMetadataAction(ProviderFactory providers, CustomValueSearchLin
281277

282278
@Override
283279
public void execute(BuildScanExtension buildScan) {
284-
if (!isGitInstalled()) {
285-
return;
286-
}
287-
288-
String gitRepo = execAndGetStdOut("git", "config", "--get", "remote.origin.url");
289-
String gitCommitId = execAndGetStdOut("git", "rev-parse", "--verify", "HEAD");
290-
String gitCommitShortId = execAndGetStdOut("git", "rev-parse", "--short=8", "--verify", "HEAD");
291-
String gitBranchName = getGitBranchName(() -> execAndGetStdOut("git", "rev-parse", "--abbrev-ref", "HEAD"));
292-
String gitStatus = execAndGetStdOut("git", "status", "--porcelain");
293-
294-
if (isNotEmpty(gitRepo)) {
295-
buildScan.value("Git repository", redactUserInfo(gitRepo));
296-
}
297-
if (isNotEmpty(gitCommitId)) {
298-
buildScan.value("Git commit id", gitCommitId);
299-
}
300-
if (isNotEmpty(gitCommitShortId)) {
301-
customValueSearchLinker.addCustomValueAndSearchLink("Git commit id", "Git commit id short", gitCommitShortId);
302-
}
303-
if (isNotEmpty(gitBranchName)) {
304-
buildScan.tag(gitBranchName);
305-
buildScan.value("Git branch", gitBranchName);
306-
}
307-
if (isNotEmpty(gitStatus)) {
280+
GitMetadata.GitMetadataBuilder builder = new GitMetadata.GitMetadataBuilder(isGitInstalled());
281+
Optional<String> gitRepo = builder.fromCmd("git", "config", "--get", "remote.origin.url").build().resolve();
282+
Optional<String> gitCommitId = builder.fromCmd("git", "rev-parse", "--verify", "HEAD").build().resolve();
283+
Optional<String> gitCommitShortId = builder.fromCmd("git", "rev-parse", "--short=8", "--verify", "HEAD").build().resolve();
284+
Optional<String> gitStatus = builder.fromCmd( "git", "status", "--porcelain").build().resolve();
285+
Optional<String> gitBranchName = builder.fromCmd("git", "rev-parse", "--abbrev-ref", "HEAD").fromEnv(this::getGitBranchNameFromEnv).build().resolve();
286+
287+
gitRepo.ifPresent(s -> buildScan.value("Git repository", redactUserInfo(s)));
288+
gitCommitId.ifPresent(s -> buildScan.value("Git commit id", s));
289+
gitCommitShortId.ifPresent(s -> customValueSearchLinker.addCustomValueAndSearchLink("Git commit id", "Git commit id short", s));
290+
gitBranchName.ifPresent(s -> {
291+
buildScan.tag(s);
292+
buildScan.value("Git branch", s);
293+
});
294+
gitStatus.ifPresent(s -> {
308295
buildScan.tag("Dirty");
309-
buildScan.value("Git status", gitStatus);
310-
}
296+
buildScan.value("Git status", s);
297+
});
311298

312-
if (isNotEmpty(gitRepo) && isNotEmpty(gitCommitId)) {
313-
if (gitRepo.contains("github.com/") || gitRepo.contains("github.com:")) {
314-
Matcher matcher = Pattern.compile("(.*)github\\.com[/|:](.*)").matcher(gitRepo);
299+
if (gitRepo.isPresent() && gitCommitId.isPresent()) {
300+
if (gitRepo.get().contains("github.com/") || gitRepo.get().contains("github.com:")) {
301+
Matcher matcher = Pattern.compile("(.*)github\\.com[/|:](.*)").matcher(gitRepo.get());
315302
if (matcher.matches()) {
316303
String rawRepoPath = matcher.group(2);
317304
String repoPath = rawRepoPath.endsWith(".git") ? rawRepoPath.substring(0, rawRepoPath.length() - 4) : rawRepoPath;
318305
buildScan.link("Github source", "https://github.com/" + repoPath + "/tree/" + gitCommitId);
319306
}
320-
} else if (gitRepo.contains("gitlab.com/") || gitRepo.contains("gitlab.com:")) {
321-
Matcher matcher = Pattern.compile("(.*)gitlab\\.com[/|:](.*)").matcher(gitRepo);
307+
} else if (gitRepo.get().contains("gitlab.com/") || gitRepo.get().contains("gitlab.com:")) {
308+
Matcher matcher = Pattern.compile("(.*)gitlab\\.com[/|:](.*)").matcher(gitRepo.get());
322309
if (matcher.matches()) {
323310
String rawRepoPath = matcher.group(2);
324311
String repoPath = rawRepoPath.endsWith(".git") ? rawRepoPath.substring(0, rawRepoPath.length() - 4) : rawRepoPath;
@@ -332,14 +319,11 @@ private boolean isGitInstalled() {
332319
return execAndCheckSuccess("git", "--version");
333320
}
334321

335-
private String getGitBranchName(Supplier<String> gitCommand) {
322+
private Optional<String> getGitBranchNameFromEnv() {
336323
if (isJenkins() || isHudson()) {
337-
Optional<String> branch = Utils.envVariable("BRANCH_NAME", providers);
338-
if (branch.isPresent()) {
339-
return branch.get();
340-
}
324+
return Utils.envVariable("BRANCH_NAME", providers);
341325
}
342-
return gitCommand.get();
326+
return Optional.empty();
343327
}
344328

345329
private boolean isJenkins() {
+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.gradle;
2+
3+
import java.util.Optional;
4+
import java.util.function.Supplier;
5+
6+
import static com.gradle.Utils.execAndGetStdOut;
7+
8+
class GitMetadata {
9+
10+
private final String[] args;
11+
private final boolean isGitInstalled;
12+
private final Supplier<Optional<String>> fromEnv;
13+
14+
private GitMetadata(GitMetadataBuilder metadataBuilder) {
15+
this.args = metadataBuilder.args;
16+
this.isGitInstalled = metadataBuilder.isGitInstalled;
17+
this.fromEnv = metadataBuilder.fromEnv;
18+
}
19+
20+
Optional<String> resolve() {
21+
if (fromEnv != null) {
22+
return fromEnv.get();
23+
}
24+
if (isGitInstalled) {
25+
return execAndGetStdOut(args);
26+
}
27+
return Optional.empty();
28+
}
29+
30+
static class GitMetadataBuilder {
31+
private String[] args;
32+
private final boolean isGitInstalled;
33+
private Supplier<Optional<String>> fromEnv;
34+
35+
GitMetadataBuilder(boolean isGitInstalled) {
36+
this.isGitInstalled = isGitInstalled;
37+
}
38+
39+
GitMetadataBuilder fromCmd(String... args) {
40+
this.args = args;
41+
return this;
42+
}
43+
44+
GitMetadataBuilder fromEnv(Supplier<Optional<String>> fromEnv) {
45+
this.fromEnv = fromEnv;
46+
return this;
47+
}
48+
49+
GitMetadata build() {
50+
if (isGitInstalled && args == null) {
51+
throw new IllegalArgumentException("'args' should be set if 'isGitInstalled' is true");
52+
}
53+
return new GitMetadata(this);
54+
}
55+
}
56+
57+
}

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);

0 commit comments

Comments
 (0)