[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.
|
* 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 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)
|
* @param integer $umask The mode mask (octal)
|
||||||
*/
|
*/
|
||||||
public function chmod($files, $mode, $umask = 0000)
|
public function chmod($files, $mode, $umask = 0000)
|
||||||
{
|
{
|
||||||
$currentUmask = umask();
|
|
||||||
umask($umask);
|
|
||||||
|
|
||||||
foreach ($this->toIterator($files) as $file) {
|
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()
|
public function testChmodChangesFileMode()
|
||||||
{
|
{
|
||||||
|
$this->markAsSkippedIfChmodIsMissing();
|
||||||
|
|
||||||
$file = $this->workspace.DIRECTORY_SEPARATOR.'file';
|
$file = $this->workspace.DIRECTORY_SEPARATOR.'file';
|
||||||
touch($file);
|
touch($file);
|
||||||
|
|
||||||
@ -323,8 +325,21 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertEquals(753, $this->getFilePermisions($file));
|
$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()
|
public function testChmodChangesModeOfArrayOfFiles()
|
||||||
{
|
{
|
||||||
|
$this->markAsSkippedIfChmodIsMissing();
|
||||||
|
|
||||||
$directory = $this->workspace.DIRECTORY_SEPARATOR.'directory';
|
$directory = $this->workspace.DIRECTORY_SEPARATOR.'directory';
|
||||||
$file = $this->workspace.DIRECTORY_SEPARATOR.'file';
|
$file = $this->workspace.DIRECTORY_SEPARATOR.'file';
|
||||||
$files = array($directory, $file);
|
$files = array($directory, $file);
|
||||||
@ -340,6 +355,8 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testChmodChangesModeOfTraversableFileObject()
|
public function testChmodChangesModeOfTraversableFileObject()
|
||||||
{
|
{
|
||||||
|
$this->markAsSkippedIfChmodIsMissing();
|
||||||
|
|
||||||
$directory = $this->workspace.DIRECTORY_SEPARATOR.'directory';
|
$directory = $this->workspace.DIRECTORY_SEPARATOR.'directory';
|
||||||
$file = $this->workspace.DIRECTORY_SEPARATOR.'file';
|
$file = $this->workspace.DIRECTORY_SEPARATOR.'file';
|
||||||
$files = new \ArrayObject(array($directory, $file));
|
$files = new \ArrayObject(array($directory, $file));
|
||||||
@ -547,4 +564,11 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->markTestSkipped('symlink is not supported');
|
$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