Skip to content

Commit b3c58e7

Browse files
committed
merged branch mylen/master (PR #6014)
This PR was squashed before being merged into the master branch (closes #6014). Commits ------- 2b13760 [Filesystem] [mirror] added "delete" option Discussion ---------- [Filesystem] [mirror] added "delete" option Bug fix: no Feature addition: yes Backwards compatibility break: no Symfony2 tests pass: yes Fixes the following tickets: Todo: - License of the code: MIT Documentation PR: symfony/symfony-docs#123 I added a "delete" option to the mirror function. If set to true, then files present in target dir and not in origin dir will be removed. Added also unit test for these feature. --------------------------------------------------------------------------- by pborreli at 2012-11-16T00:58:19Z Symfony2 code standard use lowercase `true` and `false` --------------------------------------------------------------------------- by mylen at 2012-11-16T20:25:19Z I have problem to believe that the last commit (merging two if together) was to blame for the segfault on travis... when I run the unit testing on my machine, I get: I'm using PHP 5.4.7 by the way... Time: 2 seconds, Memory: 3.25Mb OK, but incomplete or skipped tests! Tests: 80, Assertions: 106, Skipped: 14. --------------------------------------------------------------------------- by pborreli at 2012-11-16T20:38:40Z Can you fix end-of-lines ? --------------------------------------------------------------------------- by mylen at 2012-11-16T20:52:37Z I put UNIX line feed and UTF8 charset --------------------------------------------------------------------------- by mylen at 2012-11-16T20:53:59Z Sorry, I add to clone the symfony repo with github and did small editing using pspad, I forgot to setup charset and line feed...
2 parents fdb11be + 2b13760 commit b3c58e7

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

src/Symfony/Component/Filesystem/Filesystem.php

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -336,11 +336,30 @@ public function makePathRelative($endPath, $startPath)
336336
* Valid options are:
337337
* - $options['override'] Whether to override an existing file on copy or not (see copy())
338338
* - $options['copy_on_windows'] Whether to copy files instead of links on Windows (see symlink())
339+
* - $options['delete'] Default false Whether to delete files that are not in the source directory
339340
*
340341
* @throws IOException When file type is unknown
341342
*/
342343
public function mirror($originDir, $targetDir, \Traversable $iterator = null, $options = array())
343344
{
345+
$targetDir = rtrim($targetDir, '/\\');
346+
$originDir = rtrim($originDir, '/\\');
347+
348+
// Iterate in destination folder to remove obsolete entries
349+
if ($this->exists($targetDir) && isset($options['delete']) && $options['delete']) {
350+
$deleteIterator = $iterator;
351+
if (null === $deleteIterator) {
352+
$flags = \FilesystemIterator::SKIP_DOTS;
353+
$deleteIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($targetDir, $flags), \RecursiveIteratorIterator::CHILD_FIRST);
354+
}
355+
foreach ($deleteIterator as $file) {
356+
$origin = str_replace($targetDir, $originDir, $file->getPathname());
357+
if (!$this->exists($origin)) {
358+
$this->remove($file);
359+
}
360+
}
361+
}
362+
344363
$copyOnWindows = false;
345364
if (isset($options['copy_on_windows']) && !function_exists('symlink')) {
346365
$copyOnWindows = $options['copy_on_windows'];
@@ -351,9 +370,6 @@ public function mirror($originDir, $targetDir, \Traversable $iterator = null, $o
351370
$iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($originDir, $flags), \RecursiveIteratorIterator::SELF_FIRST);
352371
}
353372

354-
$targetDir = rtrim($targetDir, '/\\');
355-
$originDir = rtrim($originDir, '/\\');
356-
357373
foreach ($iterator as $file) {
358374
$target = str_replace($originDir, $targetDir, $file->getPathname());
359375

src/Symfony/Component/Filesystem/Tests/FilesystemTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,25 @@ public function testMirrorCopiesFilesAndDirectoriesRecursively()
798798
$this->assertTrue(is_dir($targetPath.'directory'));
799799
$this->assertFileEquals($file1, $targetPath.'directory'.DIRECTORY_SEPARATOR.'file1');
800800
$this->assertFileEquals($file2, $targetPath.'file2');
801+
802+
$this->filesystem->remove($file1);
803+
804+
$this->filesystem->mirror($sourcePath, $targetPath, null, array("delete" => FALSE));
805+
$this->assertTrue($this->filesystem->exists($targetPath.'directory'.DIRECTORY_SEPARATOR.'file1'));
806+
807+
$this->filesystem->mirror($sourcePath, $targetPath, null, array("delete" => TRUE));
808+
$this->assertFalse($this->filesystem->exists($targetPath.'directory'.DIRECTORY_SEPARATOR.'file1'));
809+
810+
file_put_contents($file1, 'FILE1');
811+
812+
$this->filesystem->mirror($sourcePath, $targetPath, null, array("delete" => TRUE));
813+
$this->assertTrue($this->filesystem->exists($targetPath.'directory'.DIRECTORY_SEPARATOR.'file1'));
814+
815+
$this->filesystem->remove($directory);
816+
$this->filesystem->mirror($sourcePath, $targetPath, null, array("delete" => TRUE));
817+
$this->assertFalse($this->filesystem->exists($targetPath.'directory'));
818+
$this->assertFalse($this->filesystem->exists($targetPath.'directory'.DIRECTORY_SEPARATOR.'file1'));
819+
801820
}
802821

803822
public function testMirrorCopiesLinks()

0 commit comments

Comments
 (0)