https://www.mediawiki.org/wiki/Special:Code/MediaWiki/106399
Revision: 106399
Author: aaron
Date: 2011-12-16 00:10:05 +0000 (Fri, 16 Dec 2011)
Log Message:
-----------
* Made getFileList() return null on some failures.
* Revived FSFileIterator but as a RecursiveDirectoryIterator wrapper. This can
catch errors that occur to avoid annoying exceptions.
* Other random cleanups.
Modified Paths:
--------------
branches/FileBackend/phase3/includes/filerepo/backend/FSFileBackend.php
branches/FileBackend/phase3/includes/filerepo/backend/FileBackend.php
branches/FileBackend/phase3/includes/filerepo/backend/FileOp.php
branches/FileBackend/phase3/tests/phpunit/includes/filerepo/FileBackendTest.php
Modified:
branches/FileBackend/phase3/includes/filerepo/backend/FSFileBackend.php
===================================================================
--- branches/FileBackend/phase3/includes/filerepo/backend/FSFileBackend.php
2011-12-16 00:02:22 UTC (rev 106398)
+++ branches/FileBackend/phase3/includes/filerepo/backend/FSFileBackend.php
2011-12-16 00:10:05 UTC (rev 106399)
@@ -438,14 +438,21 @@
function getFileList( array $params ) {
list( $c, $dir ) = $this->resolveStoragePath( $params['dir'] );
if ( $dir === null ) { // invalid storage path
- return array(); // empty result
+ return null;
}
- try {
- $iter = new RecursiveIteratorIterator( new
RecursiveDirectoryIterator( $dir ) );
- } catch ( UnexpectedValueException $e ) {
- $iter = array(); // dir does not exist?
+ wfSuppressWarnings();
+ $exists = is_dir( $dir );
+ wfRestoreWarnings();
+ if ( !$exists ) {
+ return array(); // nothing under this dir
}
- return $iter;
+ wfSuppressWarnings();
+ $readable = is_readable( $dir );
+ wfRestoreWarnings();
+ if ( !$readable ) {
+ return null; // bad permissions?
+ }
+ return new FSFileIterator( $dir );
}
function getLocalReference( array $params ) {
@@ -499,3 +506,53 @@
return $ok;
}
}
+
+/**
+ * Wrapper around RecursiveDirectoryIterator that catches
+ * exception or does any custom behavoir that we may want.
+ */
+class FSFileIterator implements Iterator {
+ /** @var RecursiveIteratorIterator */
+ protected $iter;
+
+ /**
+ * Get an FSFileIterator from a file system directory
+ *
+ * @param $dir string
+ */
+ public function __construct( $dir ) {
+ try {
+ $this->iter = new RecursiveIteratorIterator( new
RecursiveDirectoryIterator( $dir ) );
+ } catch ( UnexpectedValueException $e ) {
+ $this->iter = null; // bad permissions? deleted?
+ }
+ }
+
+ public function current() {
+ return $this->iter->current();
+ }
+
+ public function key() {
+ return $this->iter->key();
+ }
+
+ public function next() {
+ try {
+ $this->iter->next();
+ } catch ( UnexpectedValueException $e ) {
+ $this->iter = null;
+ }
+ }
+
+ public function rewind() {
+ try {
+ $this->iter->rewind();
+ } catch ( UnexpectedValueException $e ) {
+ $this->iter = null;
+ }
+ }
+
+ public function valid() {
+ return $this->iter && $this->iter->valid();
+ }
+}
Modified: branches/FileBackend/phase3/includes/filerepo/backend/FileBackend.php
===================================================================
--- branches/FileBackend/phase3/includes/filerepo/backend/FileBackend.php
2011-12-16 00:02:22 UTC (rev 106398)
+++ branches/FileBackend/phase3/includes/filerepo/backend/FileBackend.php
2011-12-16 00:10:05 UTC (rev 106399)
@@ -263,7 +263,7 @@
* $params include:
* dir : storage path directory
*
- * @return Iterator|Array
+ * @return Traversable|Array|null Returns null on failure
*/
abstract public function getFileList( array $params );
Modified: branches/FileBackend/phase3/includes/filerepo/backend/FileOp.php
===================================================================
--- branches/FileBackend/phase3/includes/filerepo/backend/FileOp.php
2011-12-16 00:02:22 UTC (rev 106398)
+++ branches/FileBackend/phase3/includes/filerepo/backend/FileOp.php
2011-12-16 00:10:05 UTC (rev 106399)
@@ -59,7 +59,7 @@
* @param $performOps Array List of FileOp operations
* @return Status
*/
- public static function attemptBatch( array $performOps ) {
+ final public static function attemptBatch( array $performOps ) {
$status = Status::newGood();
$predicates = FileOp::newPredicates(); // account for previous
op in prechecks
Modified:
branches/FileBackend/phase3/tests/phpunit/includes/filerepo/FileBackendTest.php
===================================================================
---
branches/FileBackend/phase3/tests/phpunit/includes/filerepo/FileBackendTest.php
2011-12-16 00:02:22 UTC (rev 106398)
+++
branches/FileBackend/phase3/tests/phpunit/includes/filerepo/FileBackendTest.php
2011-12-16 00:10:05 UTC (rev 106399)
@@ -352,6 +352,7 @@
"$base/cont1/subdir2/subdir/test4.txt",
"$base/cont1/subdir2/subdir/test5.txt",
"$base/cont1/subdir2/subdir/sub/test0.txt",
+ "$base/cont1/subdir2/subdir/sub/120-px-file.txt",
);
$this->pathsToPrune = array_merge( $this->pathsToPrune, $files
);
@@ -378,6 +379,7 @@
"subdir2/subdir/test4.txt",
"subdir2/subdir/test5.txt",
"subdir2/subdir/sub/test0.txt",
+ "subdir2/subdir/sub/120-px-file.txt",
);
$expected = sort( $expected );
@@ -398,6 +400,13 @@
}
$this->assertEquals( $expected, sort( $list ), "Correct file
listing." );
+
+ foreach ( $files as $file ) {
+ $this->backend->delete( array( 'src' => "$base/$files"
) );
+ }
+
+ $iter = $this->backend->getFileList( array( 'dir' =>
"$base/cont1/not/exists" ) );
+ foreach ( $iter as $iter ) {} // no errors
}
function tearDown() {
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs