Skip to content

Commit ea25b3b

Browse files
Ensure git repo is not shallow before calculating git diff
1 parent d55fe02 commit ea25b3b

File tree

5 files changed

+92
-45
lines changed

5 files changed

+92
-45
lines changed

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityRepoServices.java

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import datadog.trace.civisibility.git.tree.GitDataApi;
2424
import datadog.trace.civisibility.git.tree.GitDataUploader;
2525
import datadog.trace.civisibility.git.tree.GitDataUploaderImpl;
26+
import datadog.trace.civisibility.git.tree.GitRepoUnshallow;
2627
import datadog.trace.civisibility.ipc.ExecutionSettingsRequest;
2728
import datadog.trace.civisibility.ipc.ExecutionSettingsResponse;
2829
import datadog.trace.civisibility.ipc.SignalClient;
@@ -72,12 +73,16 @@ public class CiVisibilityRepoServices {
7273
moduleName = getModuleName(services.config, repoRoot, path);
7374
ciTags = new CITagsProvider().getCiTags(ciInfo, pullRequestInfo);
7475

76+
GitClient gitClient = services.gitClientFactory.create(repoRoot);
77+
GitRepoUnshallow gitRepoUnshallow = new GitRepoUnshallow(services.config, gitClient);
78+
7579
gitDataUploader =
7680
buildGitDataUploader(
7781
services.config,
7882
services.metricCollector,
7983
services.gitInfoProvider,
80-
services.gitClientFactory,
84+
gitClient,
85+
gitRepoUnshallow,
8186
services.backendApi,
8287
repoRoot);
8388
repoIndexProvider = services.repoIndexProviderFactory.create(repoRoot);
@@ -93,7 +98,8 @@ public class CiVisibilityRepoServices {
9398
services.config,
9499
services.metricCollector,
95100
services.backendApi,
96-
services.gitClientFactory,
101+
gitClient,
102+
gitRepoUnshallow,
97103
gitDataUploader,
98104
pullRequestInfo,
99105
repoRoot);
@@ -165,7 +171,8 @@ private static ExecutionSettingsFactory buildExecutionSettingsFactory(
165171
Config config,
166172
CiVisibilityMetricCollector metricCollector,
167173
BackendApi backendApi,
168-
GitClient.Factory gitClientFactory,
174+
GitClient gitClient,
175+
GitRepoUnshallow gitRepoUnshallow,
169176
GitDataUploader gitDataUploader,
170177
PullRequestInfo pullRequestInfo,
171178
String repoRoot) {
@@ -180,7 +187,13 @@ private static ExecutionSettingsFactory buildExecutionSettingsFactory(
180187

181188
ExecutionSettingsFactoryImpl factory =
182189
new ExecutionSettingsFactoryImpl(
183-
config, configurationApi, gitClientFactory, gitDataUploader, pullRequestInfo, repoRoot);
190+
config,
191+
configurationApi,
192+
gitClient,
193+
gitRepoUnshallow,
194+
gitDataUploader,
195+
pullRequestInfo,
196+
repoRoot);
184197
if (processHierarchy.isHeadless()) {
185198
return factory;
186199
} else {
@@ -192,7 +205,8 @@ private static GitDataUploader buildGitDataUploader(
192205
Config config,
193206
CiVisibilityMetricCollector metricCollector,
194207
GitInfoProvider gitInfoProvider,
195-
GitClient.Factory gitClientFactory,
208+
GitClient gitClient,
209+
GitRepoUnshallow gitRepoUnshallow,
196210
BackendApi backendApi,
197211
String repoRoot) {
198212
if (!config.isCiVisibilityGitUploadEnabled()) {
@@ -213,9 +227,15 @@ private static GitDataUploader buildGitDataUploader(
213227

214228
String remoteName = config.getCiVisibilityGitRemoteName();
215229
GitDataApi gitDataApi = new GitDataApi(backendApi, metricCollector);
216-
GitClient gitClient = gitClientFactory.create(repoRoot);
217230
return new GitDataUploaderImpl(
218-
config, metricCollector, gitDataApi, gitClient, gitInfoProvider, repoRoot, remoteName);
231+
config,
232+
metricCollector,
233+
gitDataApi,
234+
gitClient,
235+
gitRepoUnshallow,
236+
gitInfoProvider,
237+
repoRoot,
238+
remoteName);
219239
}
220240

221241
private static SourcePathResolver buildSourcePathResolver(

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettingsFactoryImpl.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import datadog.trace.civisibility.diff.FileDiff;
1313
import datadog.trace.civisibility.git.tree.GitClient;
1414
import datadog.trace.civisibility.git.tree.GitDataUploader;
15+
import datadog.trace.civisibility.git.tree.GitRepoUnshallow;
1516
import java.io.IOException;
1617
import java.nio.file.Path;
1718
import java.nio.file.Paths;
@@ -43,21 +44,24 @@ public class ExecutionSettingsFactoryImpl implements ExecutionSettingsFactory {
4344

4445
private final Config config;
4546
private final ConfigurationApi configurationApi;
46-
private final GitClient.Factory gitClientFactory;
47+
private final GitClient gitClient;
48+
private final GitRepoUnshallow gitRepoUnshallow;
4749
private final GitDataUploader gitDataUploader;
4850
private final PullRequestInfo pullRequestInfo;
4951
private final String repositoryRoot;
5052

5153
public ExecutionSettingsFactoryImpl(
5254
Config config,
5355
ConfigurationApi configurationApi,
54-
GitClient.Factory gitClientFactory,
56+
GitClient gitClient,
57+
GitRepoUnshallow gitRepoUnshallow,
5558
GitDataUploader gitDataUploader,
5659
PullRequestInfo pullRequestInfo,
5760
String repositoryRoot) {
5861
this.config = config;
5962
this.configurationApi = configurationApi;
60-
this.gitClientFactory = gitClientFactory;
63+
this.gitClient = gitClient;
64+
this.gitRepoUnshallow = gitRepoUnshallow;
6165
this.gitDataUploader = gitDataUploader;
6266
this.pullRequestInfo = pullRequestInfo;
6367
this.repositoryRoot = repositoryRoot;
@@ -310,7 +314,8 @@ private Diff getPullRequestDiff(
310314

311315
try {
312316
if (repositoryRoot != null && pullRequestInfo.isNotEmpty()) {
313-
GitClient gitClient = gitClientFactory.create(repositoryRoot);
317+
// ensure repo is not shallow before attempting to get git diff
318+
gitRepoUnshallow.unshallow();
314319
return gitClient.getGitDiff(
315320
pullRequestInfo.getPullRequestBaseBranchSha(), pullRequestInfo.getGitCommitHeadSha());
316321
}

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

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@
77
import datadog.trace.api.git.GitInfoProvider;
88
import datadog.trace.api.telemetry.LogCollector;
99
import datadog.trace.civisibility.utils.FileUtils;
10-
import datadog.trace.civisibility.utils.ShellCommandExecutor;
1110
import datadog.trace.util.AgentThreadFactory;
12-
import java.io.IOException;
1311
import java.nio.file.Files;
1412
import java.nio.file.Path;
1513
import java.util.ArrayList;
@@ -31,6 +29,7 @@ public class GitDataUploaderImpl implements GitDataUploader {
3129
private final CiVisibilityMetricCollector metricCollector;
3230
private final GitDataApi gitDataApi;
3331
private final GitClient gitClient;
32+
private final GitRepoUnshallow gitRepoUnshallow;
3433
private final GitInfoProvider gitInfoProvider;
3534
private final String repoRoot;
3635
private final String remoteName;
@@ -42,13 +41,15 @@ public GitDataUploaderImpl(
4241
CiVisibilityMetricCollector metricCollector,
4342
GitDataApi gitDataApi,
4443
GitClient gitClient,
44+
GitRepoUnshallow gitRepoUnshallow,
4545
GitInfoProvider gitInfoProvider,
4646
String repoRoot,
4747
String remoteName) {
4848
this.config = config;
4949
this.metricCollector = metricCollector;
5050
this.gitDataApi = gitDataApi;
5151
this.gitClient = gitClient;
52+
this.gitRepoUnshallow = gitRepoUnshallow;
5253
this.gitInfoProvider = gitInfoProvider;
5354
this.repoRoot = repoRoot;
5455
this.remoteName = remoteName;
@@ -89,10 +90,8 @@ private void uploadGitData() {
8990
try {
9091
LOGGER.debug("Starting git data upload, {}", gitClient);
9192

92-
if (config.isCiVisibilityGitUnshallowEnabled()
93-
&& !config.isCiVisibilityGitUnshallowDefer()
94-
&& gitClient.isShallow()) {
95-
unshallowRepository();
93+
if (!config.isCiVisibilityGitUnshallowDefer()) {
94+
gitRepoUnshallow.unshallow();
9695
}
9796

9897
GitInfo gitInfo = gitInfoProvider.getGitInfo(repoRoot);
@@ -113,10 +112,7 @@ private void uploadGitData() {
113112
return;
114113
}
115114

116-
if (config.isCiVisibilityGitUnshallowEnabled()
117-
&& config.isCiVisibilityGitUnshallowDefer()
118-
&& gitClient.isShallow()) {
119-
unshallowRepository();
115+
if (config.isCiVisibilityGitUnshallowDefer() && gitRepoUnshallow.unshallow()) {
120116
latestCommits = gitClient.getLatestCommits();
121117
commitsToSkip = gitDataApi.searchCommits(remoteUrl, latestCommits);
122118
}
@@ -184,29 +180,6 @@ private void removeShutdownHook() {
184180
}
185181
}
186182

187-
private void unshallowRepository() throws IOException, TimeoutException, InterruptedException {
188-
long unshallowStart = System.currentTimeMillis();
189-
try {
190-
gitClient.unshallow(GitClient.HEAD);
191-
return;
192-
} catch (ShellCommandExecutor.ShellCommandFailedException e) {
193-
LOGGER.debug(
194-
"Could not unshallow using HEAD - assuming HEAD points to a local commit that does not exist in the remote repo",
195-
e);
196-
}
197-
198-
try {
199-
String upstreamBranch = gitClient.getUpstreamBranchSha();
200-
gitClient.unshallow(upstreamBranch);
201-
} catch (ShellCommandExecutor.ShellCommandFailedException e) {
202-
LOGGER.debug(
203-
"Could not unshallow using upstream branch - assuming currently checked out local branch does not track any remote branch",
204-
e);
205-
gitClient.unshallow(null);
206-
}
207-
LOGGER.debug("Repository unshallowing took {} ms", System.currentTimeMillis() - unshallowStart);
208-
}
209-
210183
private void waitForUploadToFinish() {
211184
try {
212185
long uploadTimeoutMillis = config.getCiVisibilityGitUploadTimeoutMillis();
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package datadog.trace.civisibility.git.tree;
2+
3+
import datadog.trace.api.Config;
4+
import datadog.trace.civisibility.utils.ShellCommandExecutor;
5+
import java.io.IOException;
6+
import java.util.concurrent.TimeoutException;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
10+
public class GitRepoUnshallow {
11+
12+
private static final Logger LOGGER = LoggerFactory.getLogger(GitRepoUnshallow.class);
13+
14+
private final Config config;
15+
private final GitClient gitClient;
16+
17+
public GitRepoUnshallow(Config config, GitClient gitClient) {
18+
this.config = config;
19+
this.gitClient = gitClient;
20+
}
21+
22+
public boolean unshallow() throws IOException, InterruptedException, TimeoutException {
23+
if (!config.isCiVisibilityGitUnshallowEnabled() || !gitClient.isShallow()) {
24+
return false;
25+
}
26+
27+
long unshallowStart = System.currentTimeMillis();
28+
try {
29+
gitClient.unshallow(GitClient.HEAD);
30+
} catch (ShellCommandExecutor.ShellCommandFailedException e) {
31+
LOGGER.debug(
32+
"Could not unshallow using HEAD - assuming HEAD points to a local commit that does not exist in the remote repo",
33+
e);
34+
}
35+
36+
try {
37+
String upstreamBranch = gitClient.getUpstreamBranchSha();
38+
gitClient.unshallow(upstreamBranch);
39+
} catch (ShellCommandExecutor.ShellCommandFailedException e) {
40+
LOGGER.debug(
41+
"Could not unshallow using upstream branch - assuming currently checked out local branch does not track any remote branch",
42+
e);
43+
gitClient.unshallow(null);
44+
}
45+
LOGGER.debug("Repository unshallowing took {} ms", System.currentTimeMillis() - unshallowStart);
46+
return true;
47+
}
48+
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ class GitDataUploaderImplTest extends Specification {
4040
gitInfoProvider.getGitInfo(repoRoot) >> new GitInfo(repoUrl, null, null, null)
4141

4242
def gitClient = new GitClient(metricCollector, repoRoot, "25 years ago", 3, TIMEOUT_MILLIS)
43-
def uploader = new GitDataUploaderImpl(config, metricCollector, api, gitClient, gitInfoProvider, repoRoot, "origin")
43+
def unshallow = new GitRepoUnshallow(config, gitClient)
44+
def uploader = new GitDataUploaderImpl(config, metricCollector, api, gitClient, unshallow, gitInfoProvider, repoRoot, "origin")
4445

4546
when:
4647
def future = uploader.startOrObserveGitDataUpload()

0 commit comments

Comments
 (0)