mirror of
https://github.com/kamilwylegala/cakephp2-php8.git
synced 2025-02-07 12:36:25 +00:00
Fixes #3240, Wrong permissions are set when baking a project.
Added Folder::tree() that will return an array of nested directories and files in each directory. Refactored Folder::chmod() to allow changing permission recursively on a directory structure git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@5666 3807eeeb-6ff5-0310-8944-8be069107fe0
This commit is contained in:
parent
653f9d7101
commit
7e42c6cf12
2 changed files with 92 additions and 43 deletions
|
@ -75,6 +75,20 @@ class Folder extends Object{
|
||||||
* @access private
|
* @access private
|
||||||
*/
|
*/
|
||||||
var $__errors = false;
|
var $__errors = false;
|
||||||
|
/**
|
||||||
|
* holds array of complete directory paths.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $__directories;
|
||||||
|
/**
|
||||||
|
* holds array of complete file paths.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $__files;
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*
|
*
|
||||||
|
@ -350,66 +364,101 @@ class Folder extends Object{
|
||||||
* Change the mode on a directory structure recursively.
|
* Change the mode on a directory structure recursively.
|
||||||
*
|
*
|
||||||
* @param string $pathname The directory structure to create
|
* @param string $pathname The directory structure to create
|
||||||
|
* @param int $mode octal value 0755
|
||||||
|
* @param boolean $recursive chmod recursively
|
||||||
|
* @param array $exceptions array of files, directories to skip
|
||||||
* @return bool Returns TRUE on success, FALSE on failure
|
* @return bool Returns TRUE on success, FALSE on failure
|
||||||
* @access public
|
* @access public
|
||||||
*/
|
*/
|
||||||
function chmod($path, $mode = false, $exceptions = false) {
|
function chmod($path, $mode = false, $recursive = true, $exceptions = array()) {
|
||||||
|
if (!$mode) {
|
||||||
|
$mode = $this->mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($recursive === false && is_dir($path)) {
|
||||||
|
if (chmod($path, intval($mode, 8))) {
|
||||||
|
$this->__messages[] = sprintf(__('%s changed to %s', true), $path, $mode);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
$this->__errors[] = sprintf(__('%s NOT changed to %s', true), $path, $mode);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_dir($path)) {
|
||||||
|
list($paths) = $this->tree($path);
|
||||||
|
|
||||||
|
foreach ($paths as $key => $fullpath) {
|
||||||
|
$check = explode(DS, $fullpath);
|
||||||
|
$count = count($check);
|
||||||
|
|
||||||
|
if (in_array($check[$count - 1], $exceptions)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (chmod($fullpath, intval($mode, 8))) {
|
||||||
|
$this->__messages[] = sprintf(__('%s changed to %s', true), $fullpath, $mode);
|
||||||
|
} else {
|
||||||
|
$this->__errors[] = sprintf(__('%s NOT changed to %s', true), $fullpath, $mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (empty($this->__errors)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns an array of nested directories and files in each directory
|
||||||
|
*
|
||||||
|
* @param string $path the directory path to build the tree from
|
||||||
|
* @return mixed array of nested directories and fiels in each directory
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function tree($path) {
|
||||||
|
$path = DS . trim($path, DS);
|
||||||
|
$this->__files = array();
|
||||||
|
$this->__directories = array($path);
|
||||||
|
$directories = array();
|
||||||
|
|
||||||
|
while (count($this->__directories)) {
|
||||||
|
$dir = array_pop($this->__directories);
|
||||||
|
$this->__tree($dir);
|
||||||
|
array_push($directories, $dir);
|
||||||
|
|
||||||
if (!$mode) {
|
|
||||||
$mode = $this->mode;
|
|
||||||
}
|
}
|
||||||
|
$return = array($directories, $this->__files);
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Private method to list directories and files in each directory
|
||||||
|
*
|
||||||
|
* @param string $path
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function __tree($path) {
|
||||||
if (is_dir($path)) {
|
if (is_dir($path)) {
|
||||||
return chmod($path, intval($mode, 8));
|
$dirHandle = @opendir($path);
|
||||||
}
|
|
||||||
|
|
||||||
$dir = opendir($path);
|
while (false !== ($item = @readdir($dirHandle))) {
|
||||||
if ($dir) {
|
if ($item != '.' && $item != '..') {
|
||||||
while (false !== ($n = readdir($dir))) {
|
$item = $path . DS . $item;
|
||||||
$item = false;
|
|
||||||
if (is_array($exceptions)) {
|
|
||||||
if (!in_array($n, $exceptions)) {
|
|
||||||
$item = $n;
|
|
||||||
}
|
|
||||||
} elseif ((!preg_match('#^\.+$#', $n) && $exceptions == false) || ($exceptions == true && !preg_match('#^\.(.*)$#', $n))) {
|
|
||||||
$item = $n;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($item) {
|
if (is_dir($item)) {
|
||||||
$fullpath = $this->addPathElement($path, $item);
|
array_push($this->__directories, $item);
|
||||||
if (!is_dir($fullpath)) {
|
|
||||||
if (chmod($fullpath, intval($mode, 8))) {
|
|
||||||
$this->__messages[] = sprintf(__('%s changed to %s', true), $fullpath, $mode);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
$this->__errors[] = sprintf(__('%s NOT changed to %s', true), $fullpath, $mode);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if ($this->chmod($fullpath, $mode)) {
|
array_push($this->__files, $item);
|
||||||
$this->__messages[] = sprintf(__('%s changed to %s', true), $fullpath, $mode);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
$this->__errors[] = sprintf(__('%s NOT changed to %s', true), $fullpath, $mode);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
closedir($dir);
|
closedir($dirHandle);
|
||||||
}
|
|
||||||
|
|
||||||
if (chmod($path, intval($mode, 8))) {
|
|
||||||
$this->__messages[] = sprintf(__('%s changed to %s', true), $path, $mode);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Create a directory structure recursively.
|
* Create a directory structure recursively.
|
||||||
*
|
*
|
||||||
* @param string $pathname The directory structure to create
|
* @param string $pathname The directory structure to create
|
||||||
|
* @param int $mode octal value 0755
|
||||||
* @return bool Returns TRUE on success, FALSE on failure
|
* @return bool Returns TRUE on success, FALSE on failure
|
||||||
* @access public
|
* @access public
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -104,7 +104,7 @@ class FolderTest extends UnitTestCase {
|
||||||
$this->assertTrue($result);
|
$this->assertTrue($result);
|
||||||
|
|
||||||
$copy = TMP . 'test_folder_copy';
|
$copy = TMP . 'test_folder_copy';
|
||||||
$result = $Folder->chmod($copy, 0755);
|
$result = $Folder->chmod($copy, 0755, false);
|
||||||
$this->assertTrue($result);
|
$this->assertTrue($result);
|
||||||
|
|
||||||
$result = $Folder->cd($copy);
|
$result = $Folder->cd($copy);
|
||||||
|
|
Loading…
Add table
Reference in a new issue