Skip to content

Commit 6b3cf19

Browse files
feat: add single command to obtain full commit info
1 parent ca2caa8 commit 6b3cf19

File tree

4 files changed

+84
-4
lines changed

4 files changed

+84
-4
lines changed

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/GitClient.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package datadog.trace.civisibility.git.tree;
22

3+
import datadog.trace.api.git.CommitInfo;
34
import datadog.trace.civisibility.diff.LineDiff;
45
import java.io.IOException;
56
import java.nio.file.Path;
@@ -62,6 +63,10 @@ String getCommitterEmail(String commit)
6263
@Nullable
6364
String getCommitterDate(String commit) throws IOException, TimeoutException, InterruptedException;
6465

66+
@Nonnull
67+
CommitInfo getCommitInfo(String commit)
68+
throws IOException, TimeoutException, InterruptedException;
69+
6570
@Nonnull
6671
List<String> getLatestCommits() throws IOException, TimeoutException, InterruptedException;
6772

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/NoOpGitClient.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package datadog.trace.civisibility.git.tree;
22

3+
import datadog.trace.api.git.CommitInfo;
34
import datadog.trace.civisibility.diff.LineDiff;
45
import java.nio.file.Path;
56
import java.util.Collection;
@@ -108,6 +109,12 @@ public String getCommitterDate(String commit) {
108109
return null;
109110
}
110111

112+
@Nonnull
113+
@Override
114+
public CommitInfo getCommitInfo(String commit) {
115+
return CommitInfo.NOOP;
116+
}
117+
111118
@Nonnull
112119
@Override
113120
public List<String> getLatestCommits() {

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/git/tree/ShellGitClient.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
import datadog.trace.api.civisibility.telemetry.CiVisibilityDistributionMetric;
77
import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector;
88
import datadog.trace.api.civisibility.telemetry.tag.Command;
9+
import datadog.trace.api.git.CommitInfo;
910
import datadog.trace.api.git.GitUtils;
11+
import datadog.trace.api.git.PersonInfo;
1012
import datadog.trace.civisibility.diff.LineDiff;
1113
import datadog.trace.civisibility.utils.ShellCommandExecutor;
1214
import datadog.trace.util.Strings;
@@ -43,6 +45,7 @@ public class ShellGitClient implements GitClient {
4345
Arrays.asList("release/", "hotfix/");
4446
private static final Pattern WHITESPACE_PATTERN = Pattern.compile("\\s+");
4547
private static final String ORIGIN = "origin";
48+
private static final Pattern COMMIT_INFO_SPLIT = Pattern.compile("\",\"");
4649

4750
private final CiVisibilityMetricCollector metricCollector;
4851
private final String repoRoot;
@@ -499,6 +502,49 @@ public String getCommitterDate(String commit)
499502
.trim());
500503
}
501504

505+
/**
506+
* Returns commit information for the provided commit
507+
*
508+
* @param commit Commit SHA or reference (HEAD, branch name, etc) to check
509+
* @return commit info (sha, author info, committer info, full message)
510+
* @throws IOException If an error was encountered while writing command input or reading output
511+
* @throws TimeoutException If timeout was reached while waiting for Git command to finish
512+
* @throws InterruptedException If current thread was interrupted while waiting for Git command to
513+
* finish
514+
*/
515+
@Nonnull
516+
@Override
517+
public CommitInfo getCommitInfo(String commit)
518+
throws IOException, InterruptedException, TimeoutException {
519+
if (GitUtils.isNotValidCommit(commit)) {
520+
return CommitInfo.NOOP;
521+
}
522+
return executeCommand(
523+
Command.OTHER,
524+
() -> {
525+
String info =
526+
commandExecutor
527+
.executeCommand(
528+
IOUtils::readFully,
529+
"git",
530+
"show",
531+
commit,
532+
"-s",
533+
"--format=%H\",\"%an\",\"%ae\",\"%aI\",\"%cn\",\"%ce\",\"%cI\",\"%B")
534+
.trim();
535+
String[] fields = COMMIT_INFO_SPLIT.split(info);
536+
if (fields.length < 8) {
537+
LOGGER.error("Could not parse commit info: {}", info);
538+
return CommitInfo.NOOP;
539+
}
540+
return new CommitInfo(
541+
fields[0],
542+
new PersonInfo(fields[1], fields[2], fields[3]),
543+
new PersonInfo(fields[4], fields[5], fields[6]),
544+
fields[7]);
545+
});
546+
}
547+
502548
/**
503549
* Returns SHAs of the latest commits in the current branch. Maximum number of commits and how far
504550
* into the past to look are configured when the client is created.

dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/git/tree/GitClientTest.groovy

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,10 @@ class GitClientTest extends Specification {
9494

9595
where:
9696
remoteSha | parentOnly | isShallow | numCommits
97-
GitClient.HEAD | false | false | 10
98-
null | false | false | 10
99-
GitClient.HEAD | true | true | 2
100-
null | true | true | 2
97+
GitClient.HEAD | false | false | 10
98+
null | false | false | 10
99+
GitClient.HEAD | true | true | 2
100+
null | true | true | 2
101101
}
102102

103103
def "test get git folder"() {
@@ -247,6 +247,28 @@ class GitClientTest extends Specification {
247247
authorDate == "2021-02-26T19:32:13+01:00"
248248
}
249249

250+
def "test get commit info"() {
251+
given:
252+
givenGitRepo()
253+
254+
when:
255+
def gitClient = givenGitClient()
256+
def commitInfo = gitClient.getCommitInfo(GitClient.HEAD)
257+
258+
then:
259+
commitInfo.sha == "5b6f3a6dab5972d73a56dff737bd08d995255c08"
260+
commitInfo.author.name == "Tony Redondo"
261+
commitInfo.author.email == "[email protected]"
262+
commitInfo.author.iso8601Date == "2021-02-26T19:32:13+01:00"
263+
commitInfo.committer.name == "GitHub"
264+
commitInfo.committer.email == "[email protected]"
265+
commitInfo.committer.iso8601Date == "2021-02-26T19:32:13+01:00"
266+
commitInfo.fullMessage == "Adding Git information to test spans (#1242)\n\n" +
267+
"* Initial basic GitInfo implementation.\r\n\r\n" +
268+
"* Adds Author, Committer and Message git parser.\r\n\r\n" +
269+
"* Changes based on the review."
270+
}
271+
250272
def "test get latest commits"() {
251273
given:
252274
givenGitRepo()

0 commit comments

Comments
 (0)