Unset DirectoryIterator in the FileBackend
authorumherirrender <umherirrender_de.wp@web.de>
Fri, 16 Nov 2012 20:47:01 +0000 (21:47 +0100)
committerAaron Schulz <aschulz@wikimedia.org>
Fri, 16 Nov 2012 20:55:22 +0000 (12:55 -0800)
This is necessory to close all handlers on the directory and than it is
possible to rmdir the directory without a 'permission denied' on a
windows machine.

Corresponding unit test failure:
1) FileBackendTest::testRecursiveClean
Dir mwstore://localtesting/unittest-cont1/e/a no longer exists
(FSFileBackend).
Failed asserting that true matches expected false.

Change-Id: Ide58c6d0ec101bf0ddcd6b7414c51075fc28825b

includes/filebackend/FileBackendStore.php
tests/phpunit/includes/filebackend/FileBackendTest.php

index 43e6cb3..0f435a3 100644 (file)
@@ -507,6 +507,7 @@ abstract class FileBackendStore extends FileBackend {
                                        $subDir = $params['dir'] . "/{$subDirRel}"; // full path
                                        $status->merge( $this->doClean( array( 'dir' => $subDir ) + $params ) );
                                }
+                               unset( $subDirsRel ); // free directory for rmdir() on Windows (for FS backends)
                        }
                }
 
index b6d44fd..add7066 100644 (file)
@@ -1289,6 +1289,8 @@ class FileBackendTest extends MediaWikiTestCase {
 
                $base = self::baseStorePath();
                $dirs = array(
+                       "$base/unittest-cont1",
+                       "$base/unittest-cont1/e",
                        "$base/unittest-cont1/e/a",
                        "$base/unittest-cont1/e/a/b",
                        "$base/unittest-cont1/e/a/b/c",
@@ -2022,6 +2024,8 @@ class FileBackendTest extends MediaWikiTestCase {
                        foreach ( $iter as $file ) {
                                $this->backend->quickDelete( array( 'src' => "$base/$container/$file" ) );
                        }
+                       // free the directory, to avoid Permission denied under windows on rmdir
+                       unset( $iter );
                }
                $this->backend->clean( array( 'dir' => "$base/$container", 'recursive' => 1 ) );
        }