From b0590d5d204a5d9176df9c8103b7a677cc802e5f Mon Sep 17 00:00:00 2001 From: Florian Orendi Date: Sun, 7 Aug 2022 20:23:20 +0200 Subject: [PATCH 1/2] Deletes unused temporary folders --- .../visualization/code/SourceCodeFacade.java | 36 +++++++++++++++---- .../model/CoveragePluginSourceITest.java | 12 +++++-- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/plugin/src/main/java/io/jenkins/plugins/coverage/model/visualization/code/SourceCodeFacade.java b/plugin/src/main/java/io/jenkins/plugins/coverage/model/visualization/code/SourceCodeFacade.java index 9f1036e32..e61739c8b 100644 --- a/plugin/src/main/java/io/jenkins/plugins/coverage/model/visualization/code/SourceCodeFacade.java +++ b/plugin/src/main/java/io/jenkins/plugins/coverage/model/visualization/code/SourceCodeFacade.java @@ -21,6 +21,7 @@ import java.util.TreeSet; import java.util.stream.Collectors; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; @@ -385,10 +386,12 @@ else if (sourceDirectories.size() == 1) { try { FilePath outputFolder = workspace.child(directory); outputFolder.mkdirs(); + Path temporaryFolder = Files.createTempDirectory(directory); Charset charset = getCharset(); int count = paintedFiles.parallelStream() - .mapToInt(file -> paintSource(file, workspace, sourceDirectories, charset, log)) + .mapToInt( + file -> paintSource(file, workspace, temporaryFolder, sourceDirectories, charset, log)) .sum(); if (count == paintedFiles.size()) { @@ -402,6 +405,8 @@ else if (sourceDirectories.size() == 1) { FilePath zipFile = workspace.child(COVERAGE_SOURCES_ZIP); outputFolder.zip(zipFile); log.logInfo("-> zipping sources from folder '%s' as '%s'", outputFolder, zipFile); + + deleteFolder(temporaryFolder.toFile(), log); } catch (IOException exception) { log.logException(exception, @@ -425,23 +430,23 @@ private Set filterSourceDirectories(final File workspace, final Filtered permittedSourceDirectories, requestedSourceDirectories, log); } - private int paintSource(final PaintedNode fileNode, final FilePath workspace, + private int paintSource(final PaintedNode fileNode, final FilePath workspace, final Path temporaryFolder, final Set sourceSearchDirectories, final Charset sourceEncoding, final FilteredLog log) { String relativePathIdentifier = fileNode.getNode().getPath(); FilePath paintedFilesDirectory = workspace.child(directory); return findSourceFile(workspace, relativePathIdentifier, sourceSearchDirectories, log) .map(resolvedPath -> paint(fileNode.getPaint(), relativePathIdentifier, resolvedPath, - paintedFilesDirectory, - sourceEncoding, log)) + paintedFilesDirectory, temporaryFolder, sourceEncoding, log)) .orElse(0); } private int paint(final CoveragePaint paint, final String relativePathIdentifier, final FilePath resolvedPath, - final FilePath paintedFilesDirectory, final Charset charset, final FilteredLog log) { + final FilePath paintedFilesDirectory, final Path temporaryFolder, + final Charset charset, final FilteredLog log) { String sanitizedFileName = sanitizeFilename(relativePathIdentifier); FilePath zipOutputPath = paintedFilesDirectory.child(sanitizedFileName + ZIP_FILE_EXTENSION); try { - Path paintedFilesFolder = Files.createTempDirectory(directory); + Path paintedFilesFolder = Files.createTempDirectory(temporaryFolder, directory); Path fullSourcePath = paintedFilesFolder.resolve(sanitizedFileName); try (BufferedWriter output = Files.newBufferedWriter(fullSourcePath)) { List lines = Files.readAllLines(Paths.get(resolvedPath.getRemote()), charset); @@ -452,6 +457,7 @@ private int paint(final CoveragePaint paint, final String relativePathIdentifier paint.setTotalLines(lines.size()); } new FilePath(fullSourcePath.toFile()).zip(zipOutputPath); + FileUtils.deleteDirectory(paintedFilesFolder.toFile()); return 1; } catch (IOException | InterruptedException exception) { @@ -540,6 +546,24 @@ private Optional enforcePermissionFor(final FilePath absolutePath, fin return Optional.empty(); } + /** + * Deletes a folder. + * + * @param folder The directory to be deleted + * @param log The log + */ + private void deleteFolder(final File folder, final FilteredLog log) { + if (folder.isDirectory()) { + try { + FileUtils.deleteDirectory(folder); + } + catch (IOException e) { + log.logError("The folder '%s' could not be deleted", + folder.getAbsolutePath()); + } + } + } + private static class PaintedNode implements Serializable { private static final long serialVersionUID = -6044649044983631852L; diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePluginSourceITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePluginSourceITest.java index 74b51715f..8c12ec35b 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePluginSourceITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePluginSourceITest.java @@ -1,8 +1,10 @@ package io.jenkins.plugins.coverage.model; +import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.Collections; import java.util.Optional; @@ -115,14 +117,16 @@ private String createExternalSourceFolder() throws IOException { WorkflowJob job = createPipelineWithWorkspaceFiles(ACU_COBOL_PARSER_COVERAGE_REPORT); copyFileToWorkspace(job, SOURCE_FILE, checkoutDirectory + PACKAGE_PATH + "AcuCobolParser.java"); + File temporaryDirectory = Paths.get("target", "tmp").toFile(); + assertThat(temporaryDirectory.exists()).isTrue(); + assertThat(temporaryDirectory.isDirectory()).isTrue(); + File[] temporaryFiles = temporaryDirectory.listFiles(); + String sourceCodeRetention = "STORE_ALL_BUILD"; job.setDefinition(createPipelineWithSourceCode(sourceCodeRetention, sourceDirectory)); - Run firstBuild = buildSuccessfully(job); - assertThat(getConsoleLog(firstBuild)) .contains("-> finished painting successfully"); - verifySourceCodeInBuild(firstBuild, ACU_COBOL_PARSER); Run secondBuild = buildSuccessfully(job); @@ -142,6 +146,8 @@ private String createExternalSourceFolder() throws IOException { verifySourceCodeInBuild(secondBuild, NO_SOURCE_CODE); // should be still available verifySourceCodeInBuild(thirdBuild, NO_SOURCE_CODE); // should be still available + assertThat(temporaryDirectory.listFiles()).isEqualTo(temporaryFiles); + return firstBuild; } From 01d61863b2a129980047f7674f09cf22a04ac788 Mon Sep 17 00:00:00 2001 From: Florian Orendi Date: Tue, 9 Aug 2022 13:14:04 +0200 Subject: [PATCH 2/2] Dynamically get temporary directory of unit tests --- .../plugins/coverage/model/CoveragePluginSourceITest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePluginSourceITest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePluginSourceITest.java index 8c12ec35b..dbdee59b3 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePluginSourceITest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoveragePluginSourceITest.java @@ -4,7 +4,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.Collections; import java.util.Optional; @@ -117,7 +116,8 @@ private String createExternalSourceFolder() throws IOException { WorkflowJob job = createPipelineWithWorkspaceFiles(ACU_COBOL_PARSER_COVERAGE_REPORT); copyFileToWorkspace(job, SOURCE_FILE, checkoutDirectory + PACKAGE_PATH + "AcuCobolParser.java"); - File temporaryDirectory = Paths.get("target", "tmp").toFile(); + // get the temporary directory - used by unit tests - to verify its content + File temporaryDirectory = new File(System.getProperty("java.io.tmpdir")); assertThat(temporaryDirectory.exists()).isTrue(); assertThat(temporaryDirectory.isDirectory()).isTrue(); File[] temporaryFiles = temporaryDirectory.listFiles();