Skip to content

Commit 79a60e1

Browse files
🍒 9318 - Do not follow symlinks by default when building repository index (#9322)
1 parent d7684b9 commit 79a60e1

File tree

3 files changed

+24
-6
lines changed

3 files changed

+24
-6
lines changed

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/source/index/RepoIndexBuilder.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ private static final class RepoIndexingFileVisitor implements FileVisitor<Path>
104104
private final RepoIndexingStats indexingStats;
105105
private final Path repoRoot;
106106
private final AtomicInteger sourceRootCounter;
107+
private final boolean followSymlinks;
107108

108109
private RepoIndexingFileVisitor(
109110
Config config,
@@ -120,16 +121,23 @@ private RepoIndexingFileVisitor(
120121
packageTree = new PackageTree(config);
121122
indexingStats = new RepoIndexingStats();
122123
sourceRootCounter = new AtomicInteger();
124+
followSymlinks = config.isCiVisibilityRepoIndexFollowSymlinks();
123125
}
124126

125127
@Override
126128
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
127-
if (Files.isSymbolicLink(dir) && readSymbolicLink(dir).startsWith(repoRoot)) {
128-
// The path is a symlink that points inside the repo.
129-
// We'll visit the folder that it points to anyway,
130-
// moreover, we don't want two different results for one file
131-
// (one containing the symlink, the other - the actual folder).
132-
return FileVisitResult.SKIP_SUBTREE;
129+
if (Files.isSymbolicLink(dir)) {
130+
if (!followSymlinks) {
131+
// Configured to skip symlinks
132+
return FileVisitResult.SKIP_SUBTREE;
133+
}
134+
if (readSymbolicLink(dir).startsWith(repoRoot)) {
135+
// The path is a symlink that points inside the repo.
136+
// We'll visit the folder that it points to anyway,
137+
// moreover, we don't want two different results for one file
138+
// (one containing the symlink, the other - the actual folder).
139+
return FileVisitResult.SKIP_SUBTREE;
140+
}
133141
}
134142
return FileVisitResult.CONTINUE;
135143
}

dd-trace-api/src/main/java/datadog/trace/api/config/CiVisibilityConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ public final class CiVisibilityConfig {
4444
"civisibility.ciprovider.integration.enabled";
4545
public static final String CIVISIBILITY_REPO_INDEX_DUPLICATE_KEY_CHECK_ENABLED =
4646
"civisibility.repo.index.duplicate.key.check.enabled";
47+
public static final String CIVISIBILITY_REPO_INDEX_FOLLOW_SYMLINKS =
48+
"civisibility.repo.index.follow.symlinks";
4749
public static final String CIVISIBILITY_EXECUTION_SETTINGS_CACHE_SIZE =
4850
"civisibility.execution.settings.cache.size";
4951
public static final String CIVISIBILITY_JVM_INFO_CACHE_SIZE = "civisibility.jvm.info.cache.size";

internal-api/src/main/java/datadog/trace/api/Config.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@
254254
import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_REMOTE_ENV_VARS_PROVIDER_KEY;
255255
import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_REMOTE_ENV_VARS_PROVIDER_URL;
256256
import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_REPO_INDEX_DUPLICATE_KEY_CHECK_ENABLED;
257+
import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_REPO_INDEX_FOLLOW_SYMLINKS;
257258
import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_RESOURCE_FOLDER_NAMES;
258259
import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_RUM_FLUSH_WAIT_MILLIS;
259260
import static datadog.trace.api.config.CiVisibilityConfig.CIVISIBILITY_SCALATEST_FORK_MONITOR_ENABLED;
@@ -1001,6 +1002,7 @@ public static String getHostName() {
10011002
private final boolean ciVisibilityTestSkippingEnabled;
10021003
private final boolean ciVisibilityCiProviderIntegrationEnabled;
10031004
private final boolean ciVisibilityRepoIndexDuplicateKeyCheckEnabled;
1005+
private final boolean ciVisibilityRepoIndexFollowSymlinks;
10041006
private final int ciVisibilityExecutionSettingsCacheSize;
10051007
private final int ciVisibilityJvmInfoCacheSize;
10061008
private final int ciVisibilityCoverageRootPackagesLimit;
@@ -2261,6 +2263,8 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment())
22612263
configProvider.getBoolean(CIVISIBILITY_CIPROVIDER_INTEGRATION_ENABLED, true);
22622264
ciVisibilityRepoIndexDuplicateKeyCheckEnabled =
22632265
configProvider.getBoolean(CIVISIBILITY_REPO_INDEX_DUPLICATE_KEY_CHECK_ENABLED, true);
2266+
ciVisibilityRepoIndexFollowSymlinks =
2267+
configProvider.getBoolean(CIVISIBILITY_REPO_INDEX_FOLLOW_SYMLINKS, false);
22642268
ciVisibilityExecutionSettingsCacheSize =
22652269
configProvider.getInteger(CIVISIBILITY_EXECUTION_SETTINGS_CACHE_SIZE, 16);
22662270
ciVisibilityJvmInfoCacheSize = configProvider.getInteger(CIVISIBILITY_JVM_INFO_CACHE_SIZE, 8);
@@ -3822,6 +3826,10 @@ public boolean isCiVisibilityRepoIndexDuplicateKeyCheckEnabled() {
38223826
return ciVisibilityRepoIndexDuplicateKeyCheckEnabled;
38233827
}
38243828

3829+
public boolean isCiVisibilityRepoIndexFollowSymlinks() {
3830+
return ciVisibilityRepoIndexFollowSymlinks;
3831+
}
3832+
38253833
public int getCiVisibilityExecutionSettingsCacheSize() {
38263834
return ciVisibilityExecutionSettingsCacheSize;
38273835
}

0 commit comments

Comments
 (0)