Module workDir is deleted when cleaning root module work dir when they are nested.
import java.util.Map;
import javax.annotation.CheckForNull;
import javax.annotation.concurrent.Immutable;
-import org.apache.commons.io.FileUtils;
import org.sonar.api.batch.bootstrap.ProjectDefinition;
import org.sonar.api.batch.fs.InputModule;
private static Path initWorkingDir(ProjectDefinition module) {
File workingDirAsFile = module.getWorkDir();
- try {
- FileUtils.forceMkdir(workingDirAsFile);
- } catch (Exception e) {
- throw new IllegalStateException("Fail to create working dir: " + workingDirAsFile.getAbsolutePath(), e);
- }
return workingDirAsFile.getAbsoluteFile().toPath().normalize();
}
addBatchExtensions();
ProjectLock lock = getComponentByType(ProjectLock.class);
lock.tryLock();
- getComponentByType(WorkDirectoryCleaner.class).execute();
+ getComponentByType(WorkDirectoriesInitializer.class).execute();
Settings settings = getComponentByType(Settings.class);
if (settings != null && settings.getBoolean(CoreProperties.PROFILING_LOG_PROPERTY)) {
add(PhasesSumUpTimeProfiler.class);
add(
props,
ProjectReactorBuilder.class,
- WorkDirectoryCleaner.class,
+ WorkDirectoriesInitializer.class,
new MutableProjectReactorProvider(),
ProjectBuildersExecutor.class,
ProjectLock.class,
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2017 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.scanner.scan;
+
+import java.io.IOException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Iterator;
+import org.sonar.api.batch.fs.internal.DefaultInputModule;
+import org.sonar.api.batch.fs.internal.InputModuleHierarchy;
+import org.sonar.core.util.FileUtils;
+import org.sonar.home.cache.DirectoryLock;
+
+/**
+ * Clean and create working directories of each module.
+ * Be careful that sub module work dir might be nested in parent working directory.
+ */
+public class WorkDirectoriesInitializer {
+
+ private InputModuleHierarchy moduleHierarchy;
+
+ public WorkDirectoriesInitializer(InputModuleHierarchy moduleHierarchy) {
+ this.moduleHierarchy = moduleHierarchy;
+ }
+
+ public void execute() {
+ cleanAllWorkingDirs(moduleHierarchy.root());
+ mkdirsAllWorkingDirs(moduleHierarchy.root());
+ }
+
+ private void cleanAllWorkingDirs(DefaultInputModule module) {
+ for (DefaultInputModule sub : moduleHierarchy.children(module)) {
+ cleanAllWorkingDirs(sub);
+ }
+ if (Files.exists(module.getWorkDir())) {
+ deleteAllRecursivelyExceptLockFile(module.getWorkDir());
+ }
+ }
+
+ private void mkdirsAllWorkingDirs(DefaultInputModule module) {
+ for (DefaultInputModule sub : moduleHierarchy.children(module)) {
+ mkdirsAllWorkingDirs(sub);
+ }
+ try {
+ Files.createDirectories(module.getWorkDir());
+ } catch (Exception e) {
+ throw new IllegalStateException("Fail to create working dir: " + module.getWorkDir(), e);
+ }
+ }
+
+ private static void deleteAllRecursivelyExceptLockFile(Path dirToDelete) {
+ try (DirectoryStream<Path> stream = list(dirToDelete)) {
+
+ Iterator<Path> it = stream.iterator();
+ while (it.hasNext()) {
+ FileUtils.deleteQuietly(it.next().toFile());
+ }
+ } catch (IOException e) {
+ throw new IllegalStateException("Failed to clean working directory: " + dirToDelete.toString(), e);
+ }
+ }
+
+ private static DirectoryStream<Path> list(Path dir) throws IOException {
+ return Files.newDirectoryStream(dir, entry -> !DirectoryLock.LOCK_FILE_NAME.equals(entry.getFileName().toString()));
+ }
+}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2017 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.scanner.scan;
-
-import java.io.IOException;
-import java.nio.file.DirectoryStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Iterator;
-import org.sonar.api.batch.fs.internal.InputModuleHierarchy;
-import org.sonar.core.util.FileUtils;
-import org.sonar.home.cache.DirectoryLock;
-
-public class WorkDirectoryCleaner {
- private final Path workDir;
-
- public WorkDirectoryCleaner(InputModuleHierarchy moduleHierarchy) {
- workDir = moduleHierarchy.root().getWorkDir();
- }
-
- public void execute() {
- if (!workDir.toFile().exists()) {
- return;
- }
-
- try (DirectoryStream<Path> stream = list()) {
-
- Iterator<Path> it = stream.iterator();
- while (it.hasNext()) {
- FileUtils.deleteQuietly(it.next().toFile());
- }
- } catch (IOException e) {
- throw new IllegalStateException("Failed to clean working directory: " + workDir.toString(), e);
- }
- }
-
- private DirectoryStream<Path> list() throws IOException {
- return Files.newDirectoryStream(workDir, entry -> !DirectoryLock.LOCK_FILE_NAME.equals(entry.getFileName().toString()));
- }
-}
--- /dev/null
+/*
+ * SonarQube
+ * Copyright (C) 2009-2017 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.scanner.scan;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.sonar.api.batch.fs.internal.DefaultInputModule;
+import org.sonar.api.batch.fs.internal.InputModuleHierarchy;
+import org.sonar.home.cache.DirectoryLock;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class WorkDirectoriesInitializerTest {
+ private WorkDirectoriesInitializer initializer;
+ @Rule
+ public TemporaryFolder temp = new TemporaryFolder();
+
+ private File rootWorkDir;
+ private File lock;
+ private InputModuleHierarchy hierarchy;
+ private DefaultInputModule root;
+
+ @Before
+ public void setUp() throws IOException {
+ rootWorkDir = temp.newFolder();
+ // create files to clean
+ new File(rootWorkDir, "foo.txt").createNewFile();
+ File newFolder = new File(rootWorkDir, "foo");
+ newFolder.mkdir();
+ File fileInFolder = new File(newFolder, "test");
+ fileInFolder.createNewFile();
+
+ lock = new File(rootWorkDir, DirectoryLock.LOCK_FILE_NAME);
+ lock.createNewFile();
+
+ hierarchy = mock(InputModuleHierarchy.class);
+ root = mock(DefaultInputModule.class);
+ when(hierarchy.root()).thenReturn(root);
+ when(root.getWorkDir()).thenReturn(rootWorkDir.toPath());
+
+ assertThat(rootWorkDir.list().length).isGreaterThan(1);
+ initializer = new WorkDirectoriesInitializer(hierarchy);
+ }
+
+ @Test
+ public void testNonExisting() {
+ temp.delete();
+ initializer.execute();
+ }
+
+ @Test
+ public void testClean() {
+ initializer.execute();
+
+ assertThat(rootWorkDir).exists();
+ assertThat(lock).exists();
+ assertThat(rootWorkDir.list()).containsOnly(DirectoryLock.LOCK_FILE_NAME);
+ }
+
+ @Test
+ public void cleaningRootModuleShouldNotDeleteChildrenWorkDir() throws IOException {
+ DefaultInputModule moduleA = mock(DefaultInputModule.class);
+ when(hierarchy.children(root)).thenReturn(Arrays.asList(moduleA));
+ File moduleAWorkdir = new File(rootWorkDir, "moduleA");
+ when(moduleA.getWorkDir()).thenReturn(moduleAWorkdir.toPath());
+ moduleAWorkdir.mkdir();
+ new File(moduleAWorkdir, "fooA.txt").createNewFile();
+
+ initializer.execute();
+
+ assertThat(rootWorkDir).exists();
+ assertThat(lock).exists();
+ assertThat(rootWorkDir.list()).containsOnly(DirectoryLock.LOCK_FILE_NAME, "moduleA");
+ assertThat(moduleAWorkdir).exists();
+ }
+
+}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2017 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.scanner.scan;
-
-import java.io.File;
-import java.io.IOException;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.sonar.api.batch.fs.internal.DefaultInputModule;
-import org.sonar.api.batch.fs.internal.InputModuleHierarchy;
-import org.sonar.home.cache.DirectoryLock;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class WorkDirectoryCleanerTest {
- private WorkDirectoryCleaner cleaner;
- @Rule
- public TemporaryFolder temp = new TemporaryFolder();
-
- @Before
- public void setUp() throws IOException {
- // create files to clean
- temp.newFile();
- File newFolder = temp.newFolder();
- File fileInFolder = new File(newFolder, "test");
- fileInFolder.createNewFile();
-
- File lock = new File(temp.getRoot(), DirectoryLock.LOCK_FILE_NAME);
- lock.createNewFile();
-
- // mock project
- InputModuleHierarchy hierarchy = mock(InputModuleHierarchy.class);
- DefaultInputModule root = mock(DefaultInputModule.class);
- when(hierarchy.root()).thenReturn(root);
- when(root.getWorkDir()).thenReturn(temp.getRoot().toPath());
-
- assertThat(temp.getRoot().list().length).isGreaterThan(1);
- cleaner = new WorkDirectoryCleaner(hierarchy);
- }
-
- @Test
- public void testNonExisting() {
- temp.delete();
- cleaner.execute();
- }
-
- @Test
- public void testClean() {
- File lock = new File(temp.getRoot(), DirectoryLock.LOCK_FILE_NAME);
- cleaner.execute();
-
- assertThat(temp.getRoot()).exists();
- assertThat(lock).exists();
- assertThat(temp.getRoot().list()).containsOnly(DirectoryLock.LOCK_FILE_NAME);
- }
-
-}