fix cleaners DirTrait warnings
This commit is contained in:
parent
53ed6f3cf3
commit
2fc1489a28
@ -19,7 +19,8 @@ use Dotclear\Plugin\Uninstaller\{
|
|||||||
CleanerDescriptor,
|
CleanerDescriptor,
|
||||||
CleanerParent,
|
CleanerParent,
|
||||||
TraitCleanerDir,
|
TraitCleanerDir,
|
||||||
ValueDescriptor
|
ValueDescriptor,
|
||||||
|
Helper\DirTrait
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -30,7 +31,7 @@ use Dotclear\Plugin\Uninstaller\{
|
|||||||
*/
|
*/
|
||||||
class Caches extends CleanerParent
|
class Caches extends CleanerParent
|
||||||
{
|
{
|
||||||
use TraitCleanerDir;
|
use DirTrait;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
@ -72,10 +73,10 @@ class Caches extends CleanerParent
|
|||||||
public function values(): array
|
public function values(): array
|
||||||
{
|
{
|
||||||
$res = [];
|
$res = [];
|
||||||
foreach (self::getDirs(DC_TPL_CACHE) as $dir) {
|
foreach (self::getDirs(DC_TPL_CACHE) as $path => $count) {
|
||||||
$res[] = new ValueDescriptor(
|
$res[] = new ValueDescriptor(
|
||||||
ns: $dir['key'],
|
ns: $path,
|
||||||
count: (int) $dir['value']
|
count: $count
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ use Dotclear\Plugin\Uninstaller\{
|
|||||||
CleanerDescriptor,
|
CleanerDescriptor,
|
||||||
CleanerParent,
|
CleanerParent,
|
||||||
ValueDescriptor,
|
ValueDescriptor,
|
||||||
TraitCleanerDir
|
Helper\DirTrait
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -29,7 +29,7 @@ use Dotclear\Plugin\Uninstaller\{
|
|||||||
*/
|
*/
|
||||||
class Plugins extends CleanerParent
|
class Plugins extends CleanerParent
|
||||||
{
|
{
|
||||||
use TraitCleanerDir;
|
use DirTrait;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
@ -57,14 +57,14 @@ class Plugins extends CleanerParent
|
|||||||
|
|
||||||
public function values(): array
|
public function values(): array
|
||||||
{
|
{
|
||||||
$dirs = self::getDirs(explode(PATH_SEPARATOR, DC_PLUGINS_ROOT));
|
$dirs = self::getDirs(DC_PLUGINS_ROOT);
|
||||||
sort($dirs);
|
sort($dirs);
|
||||||
|
|
||||||
$res = [];
|
$res = [];
|
||||||
foreach ($dirs as $dir) {
|
foreach ($dirs as $path => $count) {
|
||||||
$res[] = new ValueDescriptor(
|
$res[] = new ValueDescriptor(
|
||||||
ns: $dir['key'],
|
ns: $path,
|
||||||
count: (int) $dir['value']
|
count: $count
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,8 +74,7 @@ class Plugins extends CleanerParent
|
|||||||
public function execute(string $action, string $ns): bool
|
public function execute(string $action, string $ns): bool
|
||||||
{
|
{
|
||||||
if ($action == 'delete') {
|
if ($action == 'delete') {
|
||||||
$res = explode(PATH_SEPARATOR, DC_PLUGINS_ROOT);
|
self::delDir(DC_PLUGINS_ROOT, $ns, true);
|
||||||
self::delDir($res, $ns, true);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ use Dotclear\Plugin\Uninstaller\{
|
|||||||
CleanerDescriptor,
|
CleanerDescriptor,
|
||||||
CleanerParent,
|
CleanerParent,
|
||||||
ValueDescriptor,
|
ValueDescriptor,
|
||||||
TraitCleanerDir
|
Helper\DirTrait
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -30,7 +30,7 @@ use Dotclear\Plugin\Uninstaller\{
|
|||||||
*/
|
*/
|
||||||
class Themes extends CleanerParent
|
class Themes extends CleanerParent
|
||||||
{
|
{
|
||||||
use TraitCleanerDir;
|
use DirTrait;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
@ -66,10 +66,10 @@ class Themes extends CleanerParent
|
|||||||
sort($dirs);
|
sort($dirs);
|
||||||
|
|
||||||
$res = [];
|
$res = [];
|
||||||
foreach ($dirs as $dir) {
|
foreach ($dirs as $path => $count) {
|
||||||
$res[] = new ValueDescriptor(
|
$res[] = new ValueDescriptor(
|
||||||
ns: $dir['key'],
|
ns: $path,
|
||||||
count: (int) $dir['value']
|
count: $count
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ use Dotclear\Plugin\Uninstaller\{
|
|||||||
CleanerDescriptor,
|
CleanerDescriptor,
|
||||||
CleanerParent,
|
CleanerParent,
|
||||||
ValueDescriptor,
|
ValueDescriptor,
|
||||||
TraitCleanerDir
|
Helper\DirTrait
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -30,7 +30,7 @@ use Dotclear\Plugin\Uninstaller\{
|
|||||||
*/
|
*/
|
||||||
class Vars extends CleanerParent
|
class Vars extends CleanerParent
|
||||||
{
|
{
|
||||||
use TraitCleanerDir;
|
use DirTrait;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
@ -59,10 +59,10 @@ class Vars extends CleanerParent
|
|||||||
public function values(): array
|
public function values(): array
|
||||||
{
|
{
|
||||||
$res = [];
|
$res = [];
|
||||||
foreach (self::getDirs(DC_VAR) as $dir) {
|
foreach (self::getDirs(DC_VAR) as $path => $count) {
|
||||||
$res[] = new ValueDescriptor(
|
$res[] = new ValueDescriptor(
|
||||||
ns: $dir['key'],
|
ns: $path,
|
||||||
count: (int) $dir['value']
|
count: $count
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
*/
|
*/
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Dotclear\Plugin\Uninstaller;
|
namespace Dotclear\Plugin\Uninstaller\Helper;
|
||||||
|
|
||||||
use Dotclear\Helper\File\Files;
|
use Dotclear\Helper\File\Files;
|
||||||
use Dotclear\Helper\File\Path;
|
use Dotclear\Helper\File\Path;
|
||||||
@ -20,7 +20,7 @@ use Dotclear\Helper\File\Path;
|
|||||||
/**
|
/**
|
||||||
* Cleaner helper for files structure.
|
* Cleaner helper for files structure.
|
||||||
*/
|
*/
|
||||||
trait TraitCleanerDir
|
trait DirTrait
|
||||||
{
|
{
|
||||||
/** @var array<int,string> The excluded files */
|
/** @var array<int,string> The excluded files */
|
||||||
public const EXCLUDED = [
|
public const EXCLUDED = [
|
||||||
@ -37,46 +37,67 @@ trait TraitCleanerDir
|
|||||||
'_disabled',
|
'_disabled',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected static function getDirs(string|array $roots): array
|
/**
|
||||||
|
* Get path structure.
|
||||||
|
*
|
||||||
|
* @param string $paths The directories paths to scan
|
||||||
|
*
|
||||||
|
* @return array<string,int> The path structure
|
||||||
|
*/
|
||||||
|
protected static function getDirs(string $paths): array
|
||||||
{
|
{
|
||||||
if (!is_array($roots)) {
|
$paths = explode(PATH_SEPARATOR, $paths);
|
||||||
$roots = [$roots];
|
|
||||||
}
|
$stack = [];
|
||||||
$rs = [];
|
foreach ($paths as $path) {
|
||||||
$i = 0;
|
$dirs = Files::scanDir($path);
|
||||||
foreach ($roots as $root) {
|
|
||||||
$dirs = Files::scanDir($root);
|
|
||||||
foreach ($dirs as $k) {
|
foreach ($dirs as $k) {
|
||||||
if (in_array($k, self::EXCLUDED) || !is_dir($root . DIRECTORY_SEPARATOR . $k)) {
|
if (!is_string($k) || in_array($k, self::EXCLUDED) || !is_dir($path . DIRECTORY_SEPARATOR . $k)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$rs[$i]['key'] = $k;
|
$stack[$k] = count(self::scanDir($path . DIRECTORY_SEPARATOR . $k));
|
||||||
$rs[$i]['value'] = count(self::scanDir($root . DIRECTORY_SEPARATOR . $k));
|
|
||||||
$i++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $rs;
|
return $stack;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static function delDir(string|array $roots, string $folder, bool $delfolder = true): bool
|
/**
|
||||||
|
* Delete path structure.
|
||||||
|
*
|
||||||
|
* @param string $paths The directories paths to scan
|
||||||
|
* @param string $folder The folder in path
|
||||||
|
* @param bool $delete Also delete folder itself
|
||||||
|
*
|
||||||
|
* @return bool True on success
|
||||||
|
*/
|
||||||
|
protected static function delDir(string $paths, string $folder, bool $delete = true): bool
|
||||||
{
|
{
|
||||||
|
$paths = explode(PATH_SEPARATOR, $paths);
|
||||||
|
|
||||||
if (strpos($folder, DIRECTORY_SEPARATOR)) {
|
if (strpos($folder, DIRECTORY_SEPARATOR)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!is_array($roots)) {
|
|
||||||
$roots = [$roots];
|
foreach ($paths as $path) {
|
||||||
}
|
if (file_exists($path . DIRECTORY_SEPARATOR . $folder)) {
|
||||||
foreach ($roots as $root) {
|
return self::delTree($path . DIRECTORY_SEPARATOR . $folder, $delete);
|
||||||
if (file_exists($root . DIRECTORY_SEPARATOR . $folder)) {
|
|
||||||
return self::delTree($root . DIRECTORY_SEPARATOR . $folder, $delfolder);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static function scanDir(string $path, string $dir = '', array $res = []): array
|
/**
|
||||||
|
* Scan recursively a directory.
|
||||||
|
*
|
||||||
|
* @param string $path The directory path to scan
|
||||||
|
* @param string $dir The current directory
|
||||||
|
* @param array<int,string> $stack The paths stack
|
||||||
|
*
|
||||||
|
* @return array<int,string> The paths stack
|
||||||
|
*/
|
||||||
|
private static function scanDir(string $path, string $dir = '', array $stack = []): array
|
||||||
{
|
{
|
||||||
$path = Path::real($path);
|
$path = Path::real($path);
|
||||||
if ($path === false || !is_dir($path) || !is_readable($path)) {
|
if ($path === false || !is_dir($path) || !is_readable($path)) {
|
||||||
@ -89,35 +110,43 @@ trait TraitCleanerDir
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (is_dir($path . DIRECTORY_SEPARATOR . $file)) {
|
if (is_dir($path . DIRECTORY_SEPARATOR . $file)) {
|
||||||
$res[] = $file;
|
$stack[] = $file;
|
||||||
$res = self::scanDir($path . DIRECTORY_SEPARATOR . $file, $dir . DIRECTORY_SEPARATOR . $file, $res);
|
$stack = self::scanDir($path . DIRECTORY_SEPARATOR . $file, $dir . DIRECTORY_SEPARATOR . $file, $stack);
|
||||||
} else {
|
} else {
|
||||||
$res[] = empty($dir) ? $file : $dir . DIRECTORY_SEPARATOR . $file;
|
$stack[] = empty($dir) ? $file : $dir . DIRECTORY_SEPARATOR . $file;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $res;
|
return $stack;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static function delTree(string $dir, bool $delroot = true): bool
|
/**
|
||||||
|
* Delete path tree.
|
||||||
|
*
|
||||||
|
* @param string $path The directory path
|
||||||
|
* @param bool $delete Also delete the directory path
|
||||||
|
*
|
||||||
|
* @return bool True on success
|
||||||
|
*/
|
||||||
|
private static function delTree(string $path, bool $delete = true): bool
|
||||||
{
|
{
|
||||||
if (!is_dir($dir) || !is_readable($dir)) {
|
if (!is_dir($path) || !is_readable($path)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (substr($dir, -1) != DIRECTORY_SEPARATOR) {
|
if (substr($path, -1) != DIRECTORY_SEPARATOR) {
|
||||||
$dir .= DIRECTORY_SEPARATOR;
|
$path .= DIRECTORY_SEPARATOR;
|
||||||
}
|
}
|
||||||
if (($d = @dir($dir)) === false) {
|
if (($d = @dir($path)) === false) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
while (($entryname = $d->read()) !== false) {
|
while (($entryname = $d->read()) !== false) {
|
||||||
if ($entryname != '.' && $entryname != '..') {
|
if ($entryname != '.' && $entryname != '..') {
|
||||||
if (is_dir($dir . DIRECTORY_SEPARATOR . $entryname)) {
|
if (is_dir($path . DIRECTORY_SEPARATOR . $entryname)) {
|
||||||
if (!self::delTree($dir . DIRECTORY_SEPARATOR . $entryname)) {
|
if (!self::delTree($path . DIRECTORY_SEPARATOR . $entryname)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!@unlink($dir . DIRECTORY_SEPARATOR . $entryname)) {
|
if (!@unlink($path . DIRECTORY_SEPARATOR . $entryname)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -125,8 +154,8 @@ trait TraitCleanerDir
|
|||||||
}
|
}
|
||||||
$d->close();
|
$d->close();
|
||||||
|
|
||||||
if ($delroot) {
|
if ($delete) {
|
||||||
return @rmdir($dir);
|
return @rmdir($path);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
Reference in New Issue
Block a user