public void cleanUp(File baseFolder, ConsoleOutputStreamConsumer consumer) { if (hasMaterialsWithNoDestinationFolder()) { return; } DirectoryCleaner cleaner = new DirectoryCleaner(baseFolder, consumer); cleaner.allowed(allowedFolders()); cleaner.clean(); }
private void allow(File allowedDir, List<File> allowedDirs) { allowed.add(allowedDir); File parentDir = allowedDir.getParentFile(); if (!parentDir.equals(baseFolder) && !allowed.contains(parentDir)) { if (!isContainedInOtherAllowedDirs(parentDir, allowedDirs)) { check(parentDir); } allow(parentDir, allowedDirs); } }
public void clean() { if (allowed.isEmpty()) { return; } cleanFolder(baseFolder); for (File dir : check) { cleanFolder(dir); } }
public void allowed(List<String> allowedFolders) { ArrayList<File> allowedDirs = convertToFiles(allowedFolders); for (File allowedDir : allowedDirs) { allowed(allowedDir, allowedDirs); } }
public void allowed(String... folders) { allowed(Arrays.asList(folders)); }
@Test public void shouldNotRemoveAnythingIfNoAllowedWasSet() { File allowedFolder = new File(baseFolder, "subfolder/allowed"); allowedFolder.mkdirs(); cleaner.clean(); assertThat(baseFolder.exists(), is(true)); assertThat(allowedFolder.exists(), is(true)); }
@Before public void createBaseDirectory() throws IOException { consumer = ProcessOutputStreamConsumer.inMemoryConsumer(); baseFolder = temporaryFolder.newFolder("directoryCleaner"); cleaner = new DirectoryCleaner(baseFolder, consumer); }
public void allowed(File allowedDir, List<File> allowedDirs) { try { if (!FileUtil.isSubdirectoryOf(baseFolder, allowedDir)) { throw new RuntimeException( "Cannot clean directory." + " Folder " + allowedDir.getAbsolutePath() + " is outside the base folder " + baseFolder); } } catch (IOException e) { throw new RuntimeException( "Cannot clean directory." + " Folder " + allowedDir.getAbsolutePath() + " is outside the base folder " + baseFolder); } allow(allowedDir, allowedDirs); }
@Test public void shouldNotProcessFilesOutsideTheBaseFolder() { try { cleaner.allowed("/../.."); Assert.fail("Should not allow file outside the baseDirectory"); } catch (Exception e) { assertThat( e.getMessage(), containsString("Folder " + new File(baseFolder, "/../..").getAbsolutePath() + " is outside the base folder")); } }
@Test public void shouldNotRemoveAllowedDirectoriesInSubfolder() { File allowedFolder = new File(baseFolder, "subfolder/allowed"); allowedFolder.mkdirs(); cleaner.allowed("subfolder/allowed"); cleaner.clean(); assertThat(baseFolder.exists(), is(true)); assertThat(allowedFolder.getParentFile().exists(), is(true)); assertThat(allowedFolder.exists(), is(true)); }
@Override public boolean execute(BuildCommand command, BuildSession buildSession) { File dir = buildSession.resolveRelativeDir(command.getWorkingDirectory(), command.getStringArg("path")); String[] allowed = command.getArrayArg("allowed"); if (allowed.length == 0) { try { FileUtils.cleanDirectory(dir); } catch (IOException e) { return false; } } else { DirectoryCleaner cleaner = new DirectoryCleaner(dir, buildSession.processOutputStreamConsumer()); cleaner.allowed(allowed); cleaner.clean(); } return true; } }
@Test public void shouldNotCleanSvnDestIfExternalIsEnabled() { File svnDest = new File(baseFolder, "test1"); File shouldExist = new File(svnDest, "shouldExist"); shouldExist.mkdirs(); File svnExternal = new File(baseFolder, "test1/external"); svnExternal.mkdirs(); cleaner.allowed("test1", "test1/subdir"); cleaner.clean(); assertThat(svnDest.exists(), is(true)); assertThat(shouldExist.exists(), is(true)); }
@Test public void shouldRemoveNotAllowedDirectoriesInSubfolder() { File allowedFolder = new File(baseFolder, "subfolder/allowed"); allowedFolder.mkdirs(); File notAllowedFolder = new File(baseFolder, "subfolder/notAllowed"); notAllowedFolder.mkdirs(); cleaner.allowed("subfolder/allowed"); cleaner.clean(); assertThat(baseFolder.exists(), is(true)); assertThat(allowedFolder.getParentFile().exists(), is(true)); assertThat(notAllowedFolder.exists(), is(false)); }
@Test public void shouldReportDeletingFiles() throws IOException { File allowedFolder = new File(baseFolder, "subfolder/allowed"); allowedFolder.mkdirs(); File notAllowedFolder = new File(baseFolder, "subfolder/notallowed"); notAllowedFolder.mkdirs(); cleaner.allowed("subfolder/allowed"); cleaner.clean(); assertThat(consumer.getStdOut(), containsString("Deleting folder " + notAllowedFolder.getPath())); assertThat(consumer.getStdOut(), containsString("Keeping folder " + allowedFolder.getPath())); } }
@Test public void shouldKeepMaterialFolderIfItContainsOtherMaterials() { File material1 = mkdirDir(baseFolder, "material1"); File dirOfMaterial1 = mkdirDir(material1, "dirOfMaterial1"); File material2 = mkdirDir(material1, "material2"); File oldMaterial3 = mkdirDir(baseFolder, "oldMaterial3"); cleaner.allowed("material1", "material1/material2"); cleaner.clean(); assertThat(material1.exists(), is(true)); assertThat(dirOfMaterial1.exists(), is(true)); assertThat(material2.exists(), is(true)); assertThat(oldMaterial3.exists(), is(false)); }