[Filesystem] Fix Filesystem::chmod to apply umask properly
This commit is contained in:
parent
5c059aa121
commit
e7f129576e
@ -106,19 +106,14 @@ class Filesystem
|
||||
* Change mode for an array of files or directories.
|
||||
*
|
||||
* @param string|array|\Traversable $files A filename, an array of files, or a \Traversable instance to change mode
|
||||
* @param integer $mode The new mode
|
||||
* @param integer $mode The new mode (octal)
|
||||
* @param integer $umask The mode mask (octal)
|
||||
*/
|
||||
public function chmod($files, $mode, $umask = 0000)
|
||||
{
|
||||
$currentUmask = umask();
|
||||
umask($umask);
|
||||
|
||||
foreach ($this->toIterator($files) as $file) {
|
||||
chmod($file, $mode);
|
||||
chmod($file, $mode ^ $umask);
|
||||
}
|
||||
|
||||
umask($currentUmask);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -315,6 +315,8 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
public function testChmodChangesFileMode()
|
||||
{
|
||||
$this->markAsSkippedIfChmodIsMissing();
|
||||
|
||||
$file = $this->workspace.DIRECTORY_SEPARATOR.'file';
|
||||
touch($file);
|
||||
|
||||
@ -323,8 +325,21 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
|
||||
$this->assertEquals(753, $this->getFilePermisions($file));
|
||||
}
|
||||
|
||||
public function testChmodAppliesUmask()
|
||||
{
|
||||
$this->markAsSkippedIfChmodIsMissing();
|
||||
|
||||
$file = $this->workspace.DIRECTORY_SEPARATOR.'file';
|
||||
touch($file);
|
||||
|
||||
$this->filesystem->chmod($file, 0777, 0022);
|
||||
$this->assertEquals(755, $this->getFilePermisions($file));
|
||||
}
|
||||
|
||||
public function testChmodChangesModeOfArrayOfFiles()
|
||||
{
|
||||
$this->markAsSkippedIfChmodIsMissing();
|
||||
|
||||
$directory = $this->workspace.DIRECTORY_SEPARATOR.'directory';
|
||||
$file = $this->workspace.DIRECTORY_SEPARATOR.'file';
|
||||
$files = array($directory, $file);
|
||||
@ -340,6 +355,8 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
public function testChmodChangesModeOfTraversableFileObject()
|
||||
{
|
||||
$this->markAsSkippedIfChmodIsMissing();
|
||||
|
||||
$directory = $this->workspace.DIRECTORY_SEPARATOR.'directory';
|
||||
$file = $this->workspace.DIRECTORY_SEPARATOR.'file';
|
||||
$files = new \ArrayObject(array($directory, $file));
|
||||
@ -547,4 +564,11 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
|
||||
$this->markTestSkipped('symlink is not supported');
|
||||
}
|
||||
}
|
||||
|
||||
private function markAsSkippedIfChmodIsMissing()
|
||||
{
|
||||
if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
|
||||
$this->markTestSkipped('chmod is not supported on windows');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user