[Filesystem] Fix Filesystem::chmod to apply umask properly

This commit is contained in:
Jordi Boggiano 2012-04-19 13:35:44 +02:00
parent 5c059aa121
commit e7f129576e
2 changed files with 26 additions and 7 deletions

View File

@ -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);
}
/**

View File

@ -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');
}
}
}