1
0
mirror of https://github.com/danog/file.git synced 2024-11-26 11:54:54 +01:00

recursive mkdir, fix #5

This commit is contained in:
Sergey Gelunenko 2016-09-28 13:39:24 +03:00
parent 6eeeeacab2
commit 76701d6918
6 changed files with 79 additions and 13 deletions

View File

@ -203,8 +203,8 @@ class BlockingDriver implements Driver {
/**
* {@inheritdoc}
*/
public function mkdir($path, $mode = 0644) {
return new Success((bool) @\mkdir($path, $mode));
public function mkdir($path, $mode = 0644, $recursive) {
return new Success((bool) @\mkdir($path, $mode, $recursive));
}
/**

View File

@ -129,9 +129,10 @@ interface Driver {
*
* @param string $path
* @param int $mode
* @param bool $recursive
* @return \Amp\Promise
*/
public function mkdir($path, $mode = 0644);
public function mkdir($path, $mode = 0644, $recursive);
/**
* Delete a directory

View File

@ -356,11 +356,39 @@ class EioDriver implements Driver {
/**
* {@inheritdoc}
*/
public function mkdir($path, $mode = 0644) {
public function mkdir($path, $mode = 0644, $recursive) {
\call_user_func($this->incrementor, 1);
$promisor = new Deferred;
$priority = \EIO_PRI_DEFAULT;
\eio_mkdir($path, $mode, $priority, [$this, "onGenericResult"], $promisor);
if ($recursive) {
$arrayPath = array_filter(explode(DIRECTORY_SEPARATOR, $path));
$tmpPath = "";
$callback = function() use (
&$callback, &$arrayPath, &$tmpPath, $mode, $priority, $promisor
) {
$tmpPath .= DIRECTORY_SEPARATOR . array_shift($arrayPath);
if (empty($arrayPath)) {
\eio_mkdir($tmpPath, $mode, $priority, [$this, "onGenericResult"], $promisor);
} else {
$this->isdir($tmpPath)->when(function ($error, $result) use (
$callback, $tmpPath, $mode, $priority
) {
if ($result) {
$callback();
} else {
\eio_mkdir($tmpPath, $mode, $priority, $callback);
}
});
}
};
$callback();
} else {
\eio_mkdir($path, $mode, $priority, [$this, "onGenericResult"], $promisor);
}
return $promisor->promise();
}

View File

@ -300,13 +300,44 @@ class UvDriver implements Driver {
/**
* {@inheritdoc}
*/
public function mkdir($path, $mode = 0644) {
public function mkdir($path, $mode = 0644, $recursive) {
$this->reactor->addRef();
$promisor = new Deferred;
\uv_fs_mkdir($this->loop, $path, $mode, function($fh) use ($promisor) {
$this->reactor->delRef();
$promisor->succeed((bool)$fh);
});
if ($recursive) {
$arrayPath = array_filter(explode(DIRECTORY_SEPARATOR, $path));
$tmpPath = "";
$callback = function() use (
&$callback, &$arrayPath, &$tmpPath, $mode, $promisor
) {
$tmpPath .= DIRECTORY_SEPARATOR . array_shift($arrayPath);
if (empty($arrayPath)) {
\uv_fs_mkdir($this->loop, $tmpPath, $mode, function($fh) use ($promisor) {
$this->reactor->delRef();
$promisor->succeed((bool)$fh);
});
} else {
$this->isdir($tmpPath)->when(function ($error, $result) use (
$callback, $tmpPath, $mode
) {
if ($result) {
$callback();
} else {
\uv_fs_mkdir($this->loop, $tmpPath, $mode, $callback);
}
});
}
};
$callback();
} else {
\uv_fs_mkdir($this->loop, $path, $mode, function($fh) use ($promisor) {
$this->reactor->delRef();
$promisor->succeed((bool)$fh);
});
}
return $promisor->promise();
}

View File

@ -197,10 +197,11 @@ function unlink($path) {
*
* @param string $path
* @param int $mode
* @param bool $recursive
* @return \Amp\Promise<null>
*/
function mkdir($path, $mode = 0644) {
return filesystem()->mkdir($path, $mode);
function mkdir($path, $mode = 0644, $recursive = false) {
return filesystem()->mkdir($path, $mode, $recursive);
}
/**

View File

@ -261,9 +261,14 @@ abstract class DriverTest extends \PHPUnit_Framework_TestCase {
$dir = "{$fixtureDir}/newdir";
yield file\mkdir($dir);
$stat = (yield file\stat($dir));
$this->assertNotNull(yield file\stat($dir));
yield file\rmdir($dir);
$this->assertNull(yield file\stat($dir));
$dir = "{$fixtureDir}/newdir/with/recursive/creation";
yield file\mkdir($dir, 0744, true);
$this->assertNotNull(yield file\stat($dir));
});
}