diff --git a/src/main/java/org/pqca/scanning/go/GoScannerService.java b/src/main/java/org/pqca/scanning/go/GoScannerService.java index e19676e..84dca7e 100644 --- a/src/main/java/org/pqca/scanning/go/GoScannerService.java +++ b/src/main/java/org/pqca/scanning/go/GoScannerService.java @@ -24,6 +24,7 @@ import jakarta.annotation.Nullable; import java.io.File; import java.io.IOException; +import java.nio.file.Files; import java.util.ArrayList; import java.util.List; import org.apache.commons.io.FileUtils; @@ -38,7 +39,6 @@ import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.batch.sensor.internal.SensorContextTester; -import org.sonar.api.impl.utils.DefaultTempFolder; import org.sonar.api.rule.RuleKey; import org.sonar.go.converter.GoConverter; import org.sonar.go.plugin.GoChecks; @@ -65,10 +65,8 @@ public GoScannerService( int numberOfScannedLines = 0; int numberOfScannedFiles = 0; - File goTempFolder = new DefaultTempFolder(this.projectDirectory).newDir(); - - try { - GoConverter goConverter = new GoConverter(goTempFolder); + try (GoTempFolder goTempFolder = GoTempFolder.create()) { + GoConverter goConverter = new GoConverter(goTempFolder.file()); GoCheck visitor = new GoDetectionCollectionRule(this); GoChecks checks = new GoRuleChecks(visitor); final SensorContextTester sensorContext = SensorContextTester.create(projectDirectory); @@ -97,12 +95,8 @@ public GoScannerService( counter += 1; } LOGGER.info("Scanned {} go projects", index.size()); - } finally { - try { - FileUtils.deleteDirectory(goTempFolder); - } catch (IOException e) { - LOGGER.error("Failed to delete temp dir {}", goTempFolder); - } + } catch (IOException e) { + LOGGER.error("Failed to create temp dir for go scanner", e); } return new ScanResultDTO( @@ -113,6 +107,31 @@ public GoScannerService( this.getBOM().map(CBOM::new).orElse(null)); } + private static final class GoTempFolder implements AutoCloseable { + private final File directory; + + private GoTempFolder(File directory) { + this.directory = directory; + } + + private static GoTempFolder create() throws IOException { + return new GoTempFolder(Files.createTempDirectory("cbomkit-go-").toFile()); + } + + private File file() { + return this.directory; + } + + @Override + public void close() { + try { + FileUtils.deleteDirectory(this.directory); + } catch (IOException e) { + LOGGER.error("Failed to delete temp dir {}", this.directory, e); + } + } + } + private class GoRuleChecks extends GoChecks { private final List checks = new ArrayList<>(); diff --git a/src/test/java/org/pqca/scanning/GoScannerServiceTest.java b/src/test/java/org/pqca/scanning/GoScannerServiceTest.java index 7b72a67..c9610e4 100644 --- a/src/test/java/org/pqca/scanning/GoScannerServiceTest.java +++ b/src/test/java/org/pqca/scanning/GoScannerServiceTest.java @@ -22,7 +22,13 @@ import static org.assertj.core.api.Assertions.assertThat; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.junit.jupiter.api.Test; import org.pqca.errors.ClientDisconnected; import org.pqca.indexing.ProjectModule; @@ -33,9 +39,11 @@ class GoScannerServiceTest { @Test - void test() throws ClientDisconnected { + void test() throws ClientDisconnected, IOException { // indexing final File projectDirectory = new File("src/test/testdata/go/gocrypto"); + final Set projectDirectoryEntriesBeforeScan = + listRelativePaths(projectDirectory.toPath()); final GoIndexService goIndexService = new GoIndexService(projectDirectory); final List goModules = goIndexService.index(null); assertThat(goModules).hasSize(1); @@ -84,5 +92,16 @@ void test() throws ClientDisconnected { "src/test/testdata/go/gocrypto/GoCryptoPBKDF2TestFile.go", 15)) .isTrue(); + + assertThat(listRelativePaths(projectDirectory.toPath())) + .isEqualTo(projectDirectoryEntriesBeforeScan); + } + + private static Set listRelativePaths(Path projectDirectory) throws IOException { + try (Stream paths = Files.walk(projectDirectory)) { + return paths.map(projectDirectory::relativize) + .map(Path::toString) + .collect(Collectors.toSet()); + } } }