[Finder] Remove deprecated classes
This commit is contained in:
parent
111bdc5294
commit
0addf3d3e4
@ -1,240 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Adapter;
|
|
||||||
|
|
||||||
@trigger_error('The '.__NAMESPACE__.'\AbstractAdapter class is deprecated since version 2.8 and will be removed in 3.0. Use directly the Finder class instead.', E_USER_DEPRECATED);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interface for finder engine implementations.
|
|
||||||
*
|
|
||||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0. Use Finder instead.
|
|
||||||
*/
|
|
||||||
abstract class AbstractAdapter implements AdapterInterface
|
|
||||||
{
|
|
||||||
protected $followLinks = false;
|
|
||||||
protected $mode = 0;
|
|
||||||
protected $minDepth = 0;
|
|
||||||
protected $maxDepth = PHP_INT_MAX;
|
|
||||||
protected $exclude = array();
|
|
||||||
protected $names = array();
|
|
||||||
protected $notNames = array();
|
|
||||||
protected $contains = array();
|
|
||||||
protected $notContains = array();
|
|
||||||
protected $sizes = array();
|
|
||||||
protected $dates = array();
|
|
||||||
protected $filters = array();
|
|
||||||
protected $sort = false;
|
|
||||||
protected $paths = array();
|
|
||||||
protected $notPaths = array();
|
|
||||||
protected $ignoreUnreadableDirs = false;
|
|
||||||
|
|
||||||
private static $areSupported = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function isSupported()
|
|
||||||
{
|
|
||||||
$name = $this->getName();
|
|
||||||
|
|
||||||
if (!array_key_exists($name, self::$areSupported)) {
|
|
||||||
self::$areSupported[$name] = $this->canBeUsed();
|
|
||||||
}
|
|
||||||
|
|
||||||
return self::$areSupported[$name];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function setFollowLinks($followLinks)
|
|
||||||
{
|
|
||||||
$this->followLinks = $followLinks;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function setMode($mode)
|
|
||||||
{
|
|
||||||
$this->mode = $mode;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function setDepths(array $depths)
|
|
||||||
{
|
|
||||||
$this->minDepth = 0;
|
|
||||||
$this->maxDepth = PHP_INT_MAX;
|
|
||||||
|
|
||||||
foreach ($depths as $comparator) {
|
|
||||||
switch ($comparator->getOperator()) {
|
|
||||||
case '>':
|
|
||||||
$this->minDepth = $comparator->getTarget() + 1;
|
|
||||||
break;
|
|
||||||
case '>=':
|
|
||||||
$this->minDepth = $comparator->getTarget();
|
|
||||||
break;
|
|
||||||
case '<':
|
|
||||||
$this->maxDepth = $comparator->getTarget() - 1;
|
|
||||||
break;
|
|
||||||
case '<=':
|
|
||||||
$this->maxDepth = $comparator->getTarget();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
$this->minDepth = $this->maxDepth = $comparator->getTarget();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function setExclude(array $exclude)
|
|
||||||
{
|
|
||||||
$this->exclude = $exclude;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function setNames(array $names)
|
|
||||||
{
|
|
||||||
$this->names = $names;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function setNotNames(array $notNames)
|
|
||||||
{
|
|
||||||
$this->notNames = $notNames;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function setContains(array $contains)
|
|
||||||
{
|
|
||||||
$this->contains = $contains;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function setNotContains(array $notContains)
|
|
||||||
{
|
|
||||||
$this->notContains = $notContains;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function setSizes(array $sizes)
|
|
||||||
{
|
|
||||||
$this->sizes = $sizes;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function setDates(array $dates)
|
|
||||||
{
|
|
||||||
$this->dates = $dates;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function setFilters(array $filters)
|
|
||||||
{
|
|
||||||
$this->filters = $filters;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function setSort($sort)
|
|
||||||
{
|
|
||||||
$this->sort = $sort;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function setPath(array $paths)
|
|
||||||
{
|
|
||||||
$this->paths = $paths;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function setNotPath(array $notPaths)
|
|
||||||
{
|
|
||||||
$this->notPaths = $notPaths;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function ignoreUnreadableDirs($ignore = true)
|
|
||||||
{
|
|
||||||
$this->ignoreUnreadableDirs = (bool) $ignore;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether the adapter is supported in the current environment.
|
|
||||||
*
|
|
||||||
* This method should be implemented in all adapters. Do not implement
|
|
||||||
* isSupported in the adapters as the generic implementation provides a cache
|
|
||||||
* layer.
|
|
||||||
*
|
|
||||||
* @see isSupported()
|
|
||||||
*
|
|
||||||
* @return bool Whether the adapter is supported
|
|
||||||
*/
|
|
||||||
abstract protected function canBeUsed();
|
|
||||||
}
|
|
@ -1,331 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Adapter;
|
|
||||||
|
|
||||||
@trigger_error('The '.__NAMESPACE__.'\AbstractFindAdapter class is deprecated since version 2.8 and will be removed in 3.0. Use directly the Finder class instead.', E_USER_DEPRECATED);
|
|
||||||
|
|
||||||
use Symfony\Component\Finder\Exception\AccessDeniedException;
|
|
||||||
use Symfony\Component\Finder\Iterator;
|
|
||||||
use Symfony\Component\Finder\Shell\Shell;
|
|
||||||
use Symfony\Component\Finder\Expression\Expression;
|
|
||||||
use Symfony\Component\Finder\Shell\Command;
|
|
||||||
use Symfony\Component\Finder\Comparator\NumberComparator;
|
|
||||||
use Symfony\Component\Finder\Comparator\DateComparator;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shell engine implementation using GNU find command.
|
|
||||||
*
|
|
||||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0. Use Finder instead.
|
|
||||||
*/
|
|
||||||
abstract class AbstractFindAdapter extends AbstractAdapter
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var Shell
|
|
||||||
*/
|
|
||||||
protected $shell;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
$this->shell = new Shell();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function searchInDirectory($dir)
|
|
||||||
{
|
|
||||||
// having "/../" in path make find fail
|
|
||||||
$dir = realpath($dir);
|
|
||||||
|
|
||||||
// searching directories containing or not containing strings leads to no result
|
|
||||||
if (Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES === $this->mode && ($this->contains || $this->notContains)) {
|
|
||||||
return new Iterator\FilePathsIterator(array(), $dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
$command = Command::create();
|
|
||||||
$find = $this->buildFindCommand($command, $dir);
|
|
||||||
|
|
||||||
if ($this->followLinks) {
|
|
||||||
$find->add('-follow');
|
|
||||||
}
|
|
||||||
|
|
||||||
$find->add('-mindepth')->add($this->minDepth + 1);
|
|
||||||
|
|
||||||
if (PHP_INT_MAX !== $this->maxDepth) {
|
|
||||||
$find->add('-maxdepth')->add($this->maxDepth + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES === $this->mode) {
|
|
||||||
$find->add('-type d');
|
|
||||||
} elseif (Iterator\FileTypeFilterIterator::ONLY_FILES === $this->mode) {
|
|
||||||
$find->add('-type f');
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->buildNamesFiltering($find, $this->names);
|
|
||||||
$this->buildNamesFiltering($find, $this->notNames, true);
|
|
||||||
$this->buildPathsFiltering($find, $dir, $this->paths);
|
|
||||||
$this->buildPathsFiltering($find, $dir, $this->notPaths, true);
|
|
||||||
$this->buildSizesFiltering($find, $this->sizes);
|
|
||||||
$this->buildDatesFiltering($find, $this->dates);
|
|
||||||
|
|
||||||
$useGrep = $this->shell->testCommand('grep') && $this->shell->testCommand('xargs');
|
|
||||||
$useSort = is_int($this->sort) && $this->shell->testCommand('sort') && $this->shell->testCommand('cut');
|
|
||||||
|
|
||||||
if ($useGrep && ($this->contains || $this->notContains)) {
|
|
||||||
$grep = $command->ins('grep');
|
|
||||||
$this->buildContentFiltering($grep, $this->contains);
|
|
||||||
$this->buildContentFiltering($grep, $this->notContains, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($useSort) {
|
|
||||||
$this->buildSorting($command, $this->sort);
|
|
||||||
}
|
|
||||||
|
|
||||||
$command->setErrorHandler(
|
|
||||||
$this->ignoreUnreadableDirs
|
|
||||||
// If directory is unreadable and finder is set to ignore it, `stderr` is ignored.
|
|
||||||
? function ($stderr) { return; }
|
|
||||||
: function ($stderr) { throw new AccessDeniedException($stderr); }
|
|
||||||
);
|
|
||||||
|
|
||||||
$paths = $this->shell->testCommand('uniq') ? $command->add('| uniq')->execute() : array_unique($command->execute());
|
|
||||||
$iterator = new Iterator\FilePathsIterator($paths, $dir);
|
|
||||||
|
|
||||||
if ($this->exclude) {
|
|
||||||
$iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $this->exclude);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$useGrep && ($this->contains || $this->notContains)) {
|
|
||||||
$iterator = new Iterator\FilecontentFilterIterator($iterator, $this->contains, $this->notContains);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->filters) {
|
|
||||||
$iterator = new Iterator\CustomFilterIterator($iterator, $this->filters);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$useSort && $this->sort) {
|
|
||||||
$iteratorAggregate = new Iterator\SortableIterator($iterator, $this->sort);
|
|
||||||
$iterator = $iteratorAggregate->getIterator();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $iterator;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function canBeUsed()
|
|
||||||
{
|
|
||||||
return $this->shell->testCommand('find');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Command $command
|
|
||||||
* @param string $dir
|
|
||||||
*
|
|
||||||
* @return Command
|
|
||||||
*/
|
|
||||||
protected function buildFindCommand(Command $command, $dir)
|
|
||||||
{
|
|
||||||
return $command
|
|
||||||
->ins('find')
|
|
||||||
->add('find ')
|
|
||||||
->arg($dir)
|
|
||||||
->add('-noleaf'); // the -noleaf option is required for filesystems that don't follow the '.' and '..' conventions
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Command $command
|
|
||||||
* @param string[] $names
|
|
||||||
* @param bool $not
|
|
||||||
*/
|
|
||||||
private function buildNamesFiltering(Command $command, array $names, $not = false)
|
|
||||||
{
|
|
||||||
if (0 === count($names)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$command->add($not ? '-not' : null)->cmd('(');
|
|
||||||
|
|
||||||
foreach ($names as $i => $name) {
|
|
||||||
$expr = Expression::create($name);
|
|
||||||
|
|
||||||
// Find does not support expandable globs ("*.{a,b}" syntax).
|
|
||||||
if ($expr->isGlob() && $expr->getGlob()->isExpandable()) {
|
|
||||||
$expr = Expression::create($expr->getGlob()->toRegex(false));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fixes 'not search' and 'full path matching' regex problems.
|
|
||||||
// - Jokers '.' are replaced by [^/].
|
|
||||||
// - We add '[^/]*' before and after regex (if no ^|$ flags are present).
|
|
||||||
if ($expr->isRegex()) {
|
|
||||||
$regex = $expr->getRegex();
|
|
||||||
$regex->prepend($regex->hasStartFlag() ? '/' : '/[^/]*')
|
|
||||||
->setStartFlag(false)
|
|
||||||
->setStartJoker(true)
|
|
||||||
->replaceJokers('[^/]');
|
|
||||||
if (!$regex->hasEndFlag() || $regex->hasEndJoker()) {
|
|
||||||
$regex->setEndJoker(false)->append('[^/]*');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$command
|
|
||||||
->add($i > 0 ? '-or' : null)
|
|
||||||
->add($expr->isRegex()
|
|
||||||
? ($expr->isCaseSensitive() ? '-regex' : '-iregex')
|
|
||||||
: ($expr->isCaseSensitive() ? '-name' : '-iname')
|
|
||||||
)
|
|
||||||
->arg($expr->renderPattern());
|
|
||||||
}
|
|
||||||
|
|
||||||
$command->cmd(')');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Command $command
|
|
||||||
* @param string $dir
|
|
||||||
* @param string[] $paths
|
|
||||||
* @param bool $not
|
|
||||||
*/
|
|
||||||
private function buildPathsFiltering(Command $command, $dir, array $paths, $not = false)
|
|
||||||
{
|
|
||||||
if (0 === count($paths)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$command->add($not ? '-not' : null)->cmd('(');
|
|
||||||
|
|
||||||
foreach ($paths as $i => $path) {
|
|
||||||
$expr = Expression::create($path);
|
|
||||||
|
|
||||||
// Find does not support expandable globs ("*.{a,b}" syntax).
|
|
||||||
if ($expr->isGlob() && $expr->getGlob()->isExpandable()) {
|
|
||||||
$expr = Expression::create($expr->getGlob()->toRegex(false));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fixes 'not search' regex problems.
|
|
||||||
if ($expr->isRegex()) {
|
|
||||||
$regex = $expr->getRegex();
|
|
||||||
$regex->prepend($regex->hasStartFlag() ? preg_quote($dir).DIRECTORY_SEPARATOR : '.*')->setEndJoker(!$regex->hasEndFlag());
|
|
||||||
} else {
|
|
||||||
$expr->prepend('*')->append('*');
|
|
||||||
}
|
|
||||||
|
|
||||||
$command
|
|
||||||
->add($i > 0 ? '-or' : null)
|
|
||||||
->add($expr->isRegex()
|
|
||||||
? ($expr->isCaseSensitive() ? '-regex' : '-iregex')
|
|
||||||
: ($expr->isCaseSensitive() ? '-path' : '-ipath')
|
|
||||||
)
|
|
||||||
->arg($expr->renderPattern());
|
|
||||||
}
|
|
||||||
|
|
||||||
$command->cmd(')');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Command $command
|
|
||||||
* @param NumberComparator[] $sizes
|
|
||||||
*/
|
|
||||||
private function buildSizesFiltering(Command $command, array $sizes)
|
|
||||||
{
|
|
||||||
foreach ($sizes as $i => $size) {
|
|
||||||
$command->add($i > 0 ? '-and' : null);
|
|
||||||
|
|
||||||
switch ($size->getOperator()) {
|
|
||||||
case '<=':
|
|
||||||
$command->add('-size -'.($size->getTarget() + 1).'c');
|
|
||||||
break;
|
|
||||||
case '>=':
|
|
||||||
$command->add('-size +'.($size->getTarget() - 1).'c');
|
|
||||||
break;
|
|
||||||
case '>':
|
|
||||||
$command->add('-size +'.$size->getTarget().'c');
|
|
||||||
break;
|
|
||||||
case '!=':
|
|
||||||
$command->add('-size -'.$size->getTarget().'c');
|
|
||||||
$command->add('-size +'.$size->getTarget().'c');
|
|
||||||
break;
|
|
||||||
case '<':
|
|
||||||
default:
|
|
||||||
$command->add('-size -'.$size->getTarget().'c');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Command $command
|
|
||||||
* @param DateComparator[] $dates
|
|
||||||
*/
|
|
||||||
private function buildDatesFiltering(Command $command, array $dates)
|
|
||||||
{
|
|
||||||
foreach ($dates as $i => $date) {
|
|
||||||
$command->add($i > 0 ? '-and' : null);
|
|
||||||
|
|
||||||
$mins = (int) round((time() - $date->getTarget()) / 60);
|
|
||||||
|
|
||||||
if (0 > $mins) {
|
|
||||||
// mtime is in the future
|
|
||||||
$command->add(' -mmin -0');
|
|
||||||
// we will have no result so we don't need to continue
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ($date->getOperator()) {
|
|
||||||
case '<=':
|
|
||||||
$command->add('-mmin +'.($mins - 1));
|
|
||||||
break;
|
|
||||||
case '>=':
|
|
||||||
$command->add('-mmin -'.($mins + 1));
|
|
||||||
break;
|
|
||||||
case '>':
|
|
||||||
$command->add('-mmin -'.$mins);
|
|
||||||
break;
|
|
||||||
case '!=':
|
|
||||||
$command->add('-mmin +'.$mins.' -or -mmin -'.$mins);
|
|
||||||
break;
|
|
||||||
case '<':
|
|
||||||
default:
|
|
||||||
$command->add('-mmin +'.$mins);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Command $command
|
|
||||||
* @param string $sort
|
|
||||||
*
|
|
||||||
* @throws \InvalidArgumentException
|
|
||||||
*/
|
|
||||||
private function buildSorting(Command $command, $sort)
|
|
||||||
{
|
|
||||||
$this->buildFormatSorting($command, $sort);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Command $command
|
|
||||||
* @param string $sort
|
|
||||||
*/
|
|
||||||
abstract protected function buildFormatSorting(Command $command, $sort);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Command $command
|
|
||||||
* @param array $contains
|
|
||||||
* @param bool $not
|
|
||||||
*/
|
|
||||||
abstract protected function buildContentFiltering(Command $command, array $contains, $not = false);
|
|
||||||
}
|
|
@ -1,146 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Adapter;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0.
|
|
||||||
*/
|
|
||||||
interface AdapterInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param bool $followLinks
|
|
||||||
*
|
|
||||||
* @return AdapterInterface Current instance
|
|
||||||
*/
|
|
||||||
public function setFollowLinks($followLinks);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $mode
|
|
||||||
*
|
|
||||||
* @return AdapterInterface Current instance
|
|
||||||
*/
|
|
||||||
public function setMode($mode);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $exclude
|
|
||||||
*
|
|
||||||
* @return AdapterInterface Current instance
|
|
||||||
*/
|
|
||||||
public function setExclude(array $exclude);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $depths
|
|
||||||
*
|
|
||||||
* @return AdapterInterface Current instance
|
|
||||||
*/
|
|
||||||
public function setDepths(array $depths);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $names
|
|
||||||
*
|
|
||||||
* @return AdapterInterface Current instance
|
|
||||||
*/
|
|
||||||
public function setNames(array $names);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $notNames
|
|
||||||
*
|
|
||||||
* @return AdapterInterface Current instance
|
|
||||||
*/
|
|
||||||
public function setNotNames(array $notNames);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $contains
|
|
||||||
*
|
|
||||||
* @return AdapterInterface Current instance
|
|
||||||
*/
|
|
||||||
public function setContains(array $contains);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $notContains
|
|
||||||
*
|
|
||||||
* @return AdapterInterface Current instance
|
|
||||||
*/
|
|
||||||
public function setNotContains(array $notContains);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $sizes
|
|
||||||
*
|
|
||||||
* @return AdapterInterface Current instance
|
|
||||||
*/
|
|
||||||
public function setSizes(array $sizes);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $dates
|
|
||||||
*
|
|
||||||
* @return AdapterInterface Current instance
|
|
||||||
*/
|
|
||||||
public function setDates(array $dates);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $filters
|
|
||||||
*
|
|
||||||
* @return AdapterInterface Current instance
|
|
||||||
*/
|
|
||||||
public function setFilters(array $filters);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param \Closure|int $sort
|
|
||||||
*
|
|
||||||
* @return AdapterInterface Current instance
|
|
||||||
*/
|
|
||||||
public function setSort($sort);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $paths
|
|
||||||
*
|
|
||||||
* @return AdapterInterface Current instance
|
|
||||||
*/
|
|
||||||
public function setPath(array $paths);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $notPaths
|
|
||||||
*
|
|
||||||
* @return AdapterInterface Current instance
|
|
||||||
*/
|
|
||||||
public function setNotPath(array $notPaths);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param bool $ignore
|
|
||||||
*
|
|
||||||
* @return AdapterInterface Current instance
|
|
||||||
*/
|
|
||||||
public function ignoreUnreadableDirs($ignore = true);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $dir
|
|
||||||
*
|
|
||||||
* @return \Iterator Result iterator
|
|
||||||
*/
|
|
||||||
public function searchInDirectory($dir);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests adapter support for current platform.
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function isSupported();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns adapter name.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getName();
|
|
||||||
}
|
|
@ -1,107 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Adapter;
|
|
||||||
|
|
||||||
@trigger_error('The '.__NAMESPACE__.'\BsdFindAdapter class is deprecated since version 2.8 and will be removed in 3.0. Use directly the Finder class instead.', E_USER_DEPRECATED);
|
|
||||||
|
|
||||||
use Symfony\Component\Finder\Shell\Shell;
|
|
||||||
use Symfony\Component\Finder\Shell\Command;
|
|
||||||
use Symfony\Component\Finder\Iterator\SortableIterator;
|
|
||||||
use Symfony\Component\Finder\Expression\Expression;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shell engine implementation using BSD find command.
|
|
||||||
*
|
|
||||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0. Use Finder instead.
|
|
||||||
*/
|
|
||||||
class BsdFindAdapter extends AbstractFindAdapter
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function getName()
|
|
||||||
{
|
|
||||||
return 'bsd_find';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function canBeUsed()
|
|
||||||
{
|
|
||||||
return in_array($this->shell->getType(), array(Shell::TYPE_BSD, Shell::TYPE_DARWIN)) && parent::canBeUsed();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function buildFormatSorting(Command $command, $sort)
|
|
||||||
{
|
|
||||||
switch ($sort) {
|
|
||||||
case SortableIterator::SORT_BY_NAME:
|
|
||||||
$command->ins('sort')->add('| sort');
|
|
||||||
|
|
||||||
return;
|
|
||||||
case SortableIterator::SORT_BY_TYPE:
|
|
||||||
$format = '%HT';
|
|
||||||
break;
|
|
||||||
case SortableIterator::SORT_BY_ACCESSED_TIME:
|
|
||||||
$format = '%a';
|
|
||||||
break;
|
|
||||||
case SortableIterator::SORT_BY_CHANGED_TIME:
|
|
||||||
$format = '%c';
|
|
||||||
break;
|
|
||||||
case SortableIterator::SORT_BY_MODIFIED_TIME:
|
|
||||||
$format = '%m';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new \InvalidArgumentException(sprintf('Unknown sort options: %s.', $sort));
|
|
||||||
}
|
|
||||||
|
|
||||||
$command
|
|
||||||
->add('-print0 | xargs -0 stat -f')
|
|
||||||
->arg($format.'%t%N')
|
|
||||||
->add('| sort | cut -f 2');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function buildFindCommand(Command $command, $dir)
|
|
||||||
{
|
|
||||||
parent::buildFindCommand($command, $dir)->addAtIndex('-E', 1);
|
|
||||||
|
|
||||||
return $command;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function buildContentFiltering(Command $command, array $contains, $not = false)
|
|
||||||
{
|
|
||||||
foreach ($contains as $contain) {
|
|
||||||
$expr = Expression::create($contain);
|
|
||||||
|
|
||||||
// todo: avoid forking process for each $pattern by using multiple -e options
|
|
||||||
$command
|
|
||||||
->add('| grep -v \'^$\'')
|
|
||||||
->add('| xargs -I{} grep -I')
|
|
||||||
->add($expr->isCaseSensitive() ? null : '-i')
|
|
||||||
->add($not ? '-L' : '-l')
|
|
||||||
->add('-Ee')->arg($expr->renderPattern())
|
|
||||||
->add('{}')
|
|
||||||
;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,108 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Adapter;
|
|
||||||
|
|
||||||
@trigger_error('The '.__NAMESPACE__.'\GnuFindAdapter class is deprecated since version 2.8 and will be removed in 3.0. Use directly the Finder class instead.', E_USER_DEPRECATED);
|
|
||||||
|
|
||||||
use Symfony\Component\Finder\Shell\Shell;
|
|
||||||
use Symfony\Component\Finder\Shell\Command;
|
|
||||||
use Symfony\Component\Finder\Iterator\SortableIterator;
|
|
||||||
use Symfony\Component\Finder\Expression\Expression;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shell engine implementation using GNU find command.
|
|
||||||
*
|
|
||||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0. Use Finder instead.
|
|
||||||
*/
|
|
||||||
class GnuFindAdapter extends AbstractFindAdapter
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function getName()
|
|
||||||
{
|
|
||||||
return 'gnu_find';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function buildFormatSorting(Command $command, $sort)
|
|
||||||
{
|
|
||||||
switch ($sort) {
|
|
||||||
case SortableIterator::SORT_BY_NAME:
|
|
||||||
$command->ins('sort')->add('| sort');
|
|
||||||
|
|
||||||
return;
|
|
||||||
case SortableIterator::SORT_BY_TYPE:
|
|
||||||
$format = '%y';
|
|
||||||
break;
|
|
||||||
case SortableIterator::SORT_BY_ACCESSED_TIME:
|
|
||||||
$format = '%A@';
|
|
||||||
break;
|
|
||||||
case SortableIterator::SORT_BY_CHANGED_TIME:
|
|
||||||
$format = '%C@';
|
|
||||||
break;
|
|
||||||
case SortableIterator::SORT_BY_MODIFIED_TIME:
|
|
||||||
$format = '%T@';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new \InvalidArgumentException(sprintf('Unknown sort options: %s.', $sort));
|
|
||||||
}
|
|
||||||
|
|
||||||
$command
|
|
||||||
->get('find')
|
|
||||||
->add('-printf')
|
|
||||||
->arg($format.' %h/%f\\n')
|
|
||||||
->add('| sort | cut')
|
|
||||||
->arg('-d ')
|
|
||||||
->arg('-f2-')
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function canBeUsed()
|
|
||||||
{
|
|
||||||
return $this->shell->getType() === Shell::TYPE_UNIX && parent::canBeUsed();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function buildFindCommand(Command $command, $dir)
|
|
||||||
{
|
|
||||||
return parent::buildFindCommand($command, $dir)->add('-regextype posix-extended');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function buildContentFiltering(Command $command, array $contains, $not = false)
|
|
||||||
{
|
|
||||||
foreach ($contains as $contain) {
|
|
||||||
$expr = Expression::create($contain);
|
|
||||||
|
|
||||||
// todo: avoid forking process for each $pattern by using multiple -e options
|
|
||||||
$command
|
|
||||||
->add('| xargs -I{} -r grep -I')
|
|
||||||
->add($expr->isCaseSensitive() ? null : '-i')
|
|
||||||
->add($not ? '-L' : '-l')
|
|
||||||
->add('-Ee')->arg($expr->renderPattern())
|
|
||||||
->add('{}')
|
|
||||||
;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,101 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Adapter;
|
|
||||||
|
|
||||||
@trigger_error('The '.__NAMESPACE__.'\PhpAdapter class is deprecated since version 2.8 and will be removed in 3.0. Use directly the Finder class instead.', E_USER_DEPRECATED);
|
|
||||||
|
|
||||||
use Symfony\Component\Finder\Iterator;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PHP finder engine implementation.
|
|
||||||
*
|
|
||||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0. Use Finder instead.
|
|
||||||
*/
|
|
||||||
class PhpAdapter extends AbstractAdapter
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function searchInDirectory($dir)
|
|
||||||
{
|
|
||||||
$flags = \RecursiveDirectoryIterator::SKIP_DOTS;
|
|
||||||
|
|
||||||
if ($this->followLinks) {
|
|
||||||
$flags |= \RecursiveDirectoryIterator::FOLLOW_SYMLINKS;
|
|
||||||
}
|
|
||||||
|
|
||||||
$iterator = new Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs);
|
|
||||||
|
|
||||||
if ($this->exclude) {
|
|
||||||
$iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $this->exclude);
|
|
||||||
}
|
|
||||||
|
|
||||||
$iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST);
|
|
||||||
|
|
||||||
if ($this->minDepth > 0 || $this->maxDepth < PHP_INT_MAX) {
|
|
||||||
$iterator = new Iterator\DepthRangeFilterIterator($iterator, $this->minDepth, $this->maxDepth);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->mode) {
|
|
||||||
$iterator = new Iterator\FileTypeFilterIterator($iterator, $this->mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->names || $this->notNames) {
|
|
||||||
$iterator = new Iterator\FilenameFilterIterator($iterator, $this->names, $this->notNames);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->contains || $this->notContains) {
|
|
||||||
$iterator = new Iterator\FilecontentFilterIterator($iterator, $this->contains, $this->notContains);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->sizes) {
|
|
||||||
$iterator = new Iterator\SizeRangeFilterIterator($iterator, $this->sizes);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->dates) {
|
|
||||||
$iterator = new Iterator\DateRangeFilterIterator($iterator, $this->dates);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->filters) {
|
|
||||||
$iterator = new Iterator\CustomFilterIterator($iterator, $this->filters);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->paths || $this->notPaths) {
|
|
||||||
$iterator = new Iterator\PathFilterIterator($iterator, $this->paths, $this->notPaths);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->sort) {
|
|
||||||
$iteratorAggregate = new Iterator\SortableIterator($iterator, $this->sort);
|
|
||||||
$iterator = $iteratorAggregate->getIterator();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $iterator;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function getName()
|
|
||||||
{
|
|
||||||
return 'php';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
protected function canBeUsed()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +1,11 @@
|
|||||||
CHANGELOG
|
CHANGELOG
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
3.0.0
|
||||||
|
-----
|
||||||
|
|
||||||
|
* removed deprecated classes
|
||||||
|
|
||||||
2.8.0
|
2.8.0
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
@ -1,50 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Exception;
|
|
||||||
|
|
||||||
@trigger_error('The '.__NAMESPACE__.'\AdapterFailureException class is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
|
|
||||||
|
|
||||||
use Symfony\Component\Finder\Adapter\AdapterInterface;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Base exception for all adapter failures.
|
|
||||||
*
|
|
||||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0.
|
|
||||||
*/
|
|
||||||
class AdapterFailureException extends \RuntimeException implements ExceptionInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var \Symfony\Component\Finder\Adapter\AdapterInterface
|
|
||||||
*/
|
|
||||||
private $adapter;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param AdapterInterface $adapter
|
|
||||||
* @param string|null $message
|
|
||||||
* @param \Exception|null $previous
|
|
||||||
*/
|
|
||||||
public function __construct(AdapterInterface $adapter, $message = null, \Exception $previous = null)
|
|
||||||
{
|
|
||||||
$this->adapter = $adapter;
|
|
||||||
parent::__construct($message ?: 'Search failed with "'.$adapter->getName().'" adapter.', $previous);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function getAdapter()
|
|
||||||
{
|
|
||||||
return $this->adapter;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Exception;
|
|
||||||
|
|
||||||
@trigger_error('The '.__NAMESPACE__.'\OperationNotPermitedException class is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0.
|
|
||||||
*/
|
|
||||||
class OperationNotPermitedException extends AdapterFailureException
|
|
||||||
{
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Exception;
|
|
||||||
|
|
||||||
@trigger_error('The '.__NAMESPACE__.'\ShellCommandFailureException class is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
|
|
||||||
|
|
||||||
use Symfony\Component\Finder\Adapter\AdapterInterface;
|
|
||||||
use Symfony\Component\Finder\Shell\Command;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0.
|
|
||||||
*/
|
|
||||||
class ShellCommandFailureException extends AdapterFailureException
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var Command
|
|
||||||
*/
|
|
||||||
private $command;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param AdapterInterface $adapter
|
|
||||||
* @param Command $command
|
|
||||||
* @param \Exception|null $previous
|
|
||||||
*/
|
|
||||||
public function __construct(AdapterInterface $adapter, Command $command, \Exception $previous = null)
|
|
||||||
{
|
|
||||||
$this->command = $command;
|
|
||||||
parent::__construct($adapter, 'Shell command failed: "'.$command->join().'".', $previous);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Command
|
|
||||||
*/
|
|
||||||
public function getCommand()
|
|
||||||
{
|
|
||||||
return $this->command;
|
|
||||||
}
|
|
||||||
}
|
|
@ -62,7 +62,6 @@ class Finder implements \IteratorAggregate, \Countable
|
|||||||
private $iterators = array();
|
private $iterators = array();
|
||||||
private $contains = array();
|
private $contains = array();
|
||||||
private $notContains = array();
|
private $notContains = array();
|
||||||
private $adapters = null;
|
|
||||||
private $paths = array();
|
private $paths = array();
|
||||||
private $notPaths = array();
|
private $notPaths = array();
|
||||||
private $ignoreUnreadableDirs = false;
|
private $ignoreUnreadableDirs = false;
|
||||||
@ -89,110 +88,6 @@ class Finder implements \IteratorAggregate, \Countable
|
|||||||
return new static();
|
return new static();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a finder engine implementation.
|
|
||||||
*
|
|
||||||
* @param AdapterInterface $adapter An adapter instance
|
|
||||||
* @param int $priority Highest is selected first
|
|
||||||
*
|
|
||||||
* @return Finder The current Finder instance
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0.
|
|
||||||
*/
|
|
||||||
public function addAdapter(AdapterInterface $adapter, $priority = 0)
|
|
||||||
{
|
|
||||||
@trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
|
|
||||||
|
|
||||||
$this->initDefaultAdapters();
|
|
||||||
|
|
||||||
$this->adapters[$adapter->getName()] = array(
|
|
||||||
'adapter' => $adapter,
|
|
||||||
'priority' => $priority,
|
|
||||||
'selected' => false,
|
|
||||||
);
|
|
||||||
|
|
||||||
return $this->sortAdapters();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the selected adapter to the best one according to the current platform the code is run on.
|
|
||||||
*
|
|
||||||
* @return Finder The current Finder instance
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0.
|
|
||||||
*/
|
|
||||||
public function useBestAdapter()
|
|
||||||
{
|
|
||||||
@trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
|
|
||||||
|
|
||||||
$this->initDefaultAdapters();
|
|
||||||
|
|
||||||
$this->resetAdapterSelection();
|
|
||||||
|
|
||||||
return $this->sortAdapters();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Selects the adapter to use.
|
|
||||||
*
|
|
||||||
* @param string $name
|
|
||||||
*
|
|
||||||
* @throws \InvalidArgumentException
|
|
||||||
*
|
|
||||||
* @return Finder The current Finder instance
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0.
|
|
||||||
*/
|
|
||||||
public function setAdapter($name)
|
|
||||||
{
|
|
||||||
@trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
|
|
||||||
|
|
||||||
$this->initDefaultAdapters();
|
|
||||||
|
|
||||||
if (!isset($this->adapters[$name])) {
|
|
||||||
throw new \InvalidArgumentException(sprintf('Adapter "%s" does not exist.', $name));
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->resetAdapterSelection();
|
|
||||||
$this->adapters[$name]['selected'] = true;
|
|
||||||
|
|
||||||
return $this->sortAdapters();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes all adapters registered in the finder.
|
|
||||||
*
|
|
||||||
* @return Finder The current Finder instance
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0.
|
|
||||||
*/
|
|
||||||
public function removeAdapters()
|
|
||||||
{
|
|
||||||
@trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
|
|
||||||
|
|
||||||
$this->adapters = array();
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns registered adapters ordered by priority without extra information.
|
|
||||||
*
|
|
||||||
* @return AdapterInterface[]
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0.
|
|
||||||
*/
|
|
||||||
public function getAdapters()
|
|
||||||
{
|
|
||||||
@trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
|
|
||||||
|
|
||||||
$this->initDefaultAdapters();
|
|
||||||
|
|
||||||
return array_values(array_map(function (array $adapter) {
|
|
||||||
return $adapter['adapter'];
|
|
||||||
}, $this->adapters));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Restricts the matching to directories only.
|
* Restricts the matching to directories only.
|
||||||
*
|
*
|
||||||
@ -775,22 +670,6 @@ class Finder implements \IteratorAggregate, \Countable
|
|||||||
return iterator_count($this->getIterator());
|
return iterator_count($this->getIterator());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Finder The current Finder instance
|
|
||||||
*/
|
|
||||||
private function sortAdapters()
|
|
||||||
{
|
|
||||||
uasort($this->adapters, function (array $a, array $b) {
|
|
||||||
if ($a['selected'] || $b['selected']) {
|
|
||||||
return $a['selected'] ? -1 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $a['priority'] > $b['priority'] ? -1 : 1;
|
|
||||||
});
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $dir
|
* @param $dir
|
||||||
*
|
*
|
||||||
@ -806,19 +685,6 @@ class Finder implements \IteratorAggregate, \Countable
|
|||||||
$this->notPaths[] = '#(^|/)\..+(/|$)#';
|
$this->notPaths[] = '#(^|/)\..+(/|$)#';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->adapters) {
|
|
||||||
foreach ($this->adapters as $adapter) {
|
|
||||||
if ($adapter['adapter']->isSupported()) {
|
|
||||||
try {
|
|
||||||
return $this
|
|
||||||
->buildAdapter($adapter['adapter'])
|
|
||||||
->searchInDirectory($dir);
|
|
||||||
} catch (ExceptionInterface $e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$minDepth = 0;
|
$minDepth = 0;
|
||||||
$maxDepth = PHP_INT_MAX;
|
$maxDepth = PHP_INT_MAX;
|
||||||
|
|
||||||
@ -894,54 +760,4 @@ class Finder implements \IteratorAggregate, \Countable
|
|||||||
|
|
||||||
return $iterator;
|
return $iterator;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param AdapterInterface $adapter
|
|
||||||
*
|
|
||||||
* @return AdapterInterface
|
|
||||||
*/
|
|
||||||
private function buildAdapter(AdapterInterface $adapter)
|
|
||||||
{
|
|
||||||
return $adapter
|
|
||||||
->setFollowLinks($this->followLinks)
|
|
||||||
->setDepths($this->depths)
|
|
||||||
->setMode($this->mode)
|
|
||||||
->setExclude($this->exclude)
|
|
||||||
->setNames($this->names)
|
|
||||||
->setNotNames($this->notNames)
|
|
||||||
->setContains($this->contains)
|
|
||||||
->setNotContains($this->notContains)
|
|
||||||
->setSizes($this->sizes)
|
|
||||||
->setDates($this->dates)
|
|
||||||
->setFilters($this->filters)
|
|
||||||
->setSort($this->sort)
|
|
||||||
->setPath($this->paths)
|
|
||||||
->setNotPath($this->notPaths)
|
|
||||||
->ignoreUnreadableDirs($this->ignoreUnreadableDirs);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unselects all adapters.
|
|
||||||
*/
|
|
||||||
private function resetAdapterSelection()
|
|
||||||
{
|
|
||||||
$this->adapters = array_map(function (array $properties) {
|
|
||||||
$properties['selected'] = false;
|
|
||||||
|
|
||||||
return $properties;
|
|
||||||
}, $this->adapters);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function initDefaultAdapters()
|
|
||||||
{
|
|
||||||
if (null === $this->adapters) {
|
|
||||||
$this->adapters = array();
|
|
||||||
$this
|
|
||||||
->addAdapter(new GnuFindAdapter())
|
|
||||||
->addAdapter(new BsdFindAdapter())
|
|
||||||
->addAdapter(new PhpAdapter(), -50)
|
|
||||||
->setAdapter('php')
|
|
||||||
;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,135 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Iterator;
|
|
||||||
|
|
||||||
@trigger_error('The '.__NAMESPACE__.'\FilePathsIterator class is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
|
|
||||||
|
|
||||||
use Symfony\Component\Finder\SplFileInfo;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Iterate over shell command result.
|
|
||||||
*
|
|
||||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0.
|
|
||||||
*/
|
|
||||||
class FilePathsIterator extends \ArrayIterator
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $baseDir;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
private $baseDirLength;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $subPath;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $subPathname;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var SplFileInfo
|
|
||||||
*/
|
|
||||||
private $current;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $paths List of paths returned by shell command
|
|
||||||
* @param string $baseDir Base dir for relative path building
|
|
||||||
*/
|
|
||||||
public function __construct(array $paths, $baseDir)
|
|
||||||
{
|
|
||||||
$this->baseDir = $baseDir;
|
|
||||||
$this->baseDirLength = strlen($baseDir);
|
|
||||||
|
|
||||||
parent::__construct($paths);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $name
|
|
||||||
* @param array $arguments
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function __call($name, array $arguments)
|
|
||||||
{
|
|
||||||
return call_user_func_array(array($this->current(), $name), $arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return an instance of SplFileInfo with support for relative paths.
|
|
||||||
*
|
|
||||||
* @return SplFileInfo File information
|
|
||||||
*/
|
|
||||||
public function current()
|
|
||||||
{
|
|
||||||
return $this->current;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function key()
|
|
||||||
{
|
|
||||||
return $this->current->getPathname();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function next()
|
|
||||||
{
|
|
||||||
parent::next();
|
|
||||||
$this->buildProperties();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function rewind()
|
|
||||||
{
|
|
||||||
parent::rewind();
|
|
||||||
$this->buildProperties();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getSubPath()
|
|
||||||
{
|
|
||||||
return $this->subPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getSubPathname()
|
|
||||||
{
|
|
||||||
return $this->subPathname;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function buildProperties()
|
|
||||||
{
|
|
||||||
$absolutePath = parent::current();
|
|
||||||
|
|
||||||
if ($this->baseDir === substr($absolutePath, 0, $this->baseDirLength)) {
|
|
||||||
$this->subPathname = ltrim(substr($absolutePath, $this->baseDirLength), '/\\');
|
|
||||||
$dir = dirname($this->subPathname);
|
|
||||||
$this->subPath = '.' === $dir ? '' : $dir;
|
|
||||||
} else {
|
|
||||||
$this->subPath = $this->subPathname = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->current = new SplFileInfo(parent::current(), $this->subPath, $this->subPathname);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,298 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Shell;
|
|
||||||
|
|
||||||
@trigger_error('The '.__NAMESPACE__.'\Command class is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0.
|
|
||||||
*/
|
|
||||||
class Command
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var Command|null
|
|
||||||
*/
|
|
||||||
private $parent;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
private $bits = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
private $labels = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var \Closure|null
|
|
||||||
*/
|
|
||||||
private $errorHandler;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
*
|
|
||||||
* @param Command|null $parent Parent command
|
|
||||||
*/
|
|
||||||
public function __construct(Command $parent = null)
|
|
||||||
{
|
|
||||||
$this->parent = $parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns command as string.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
return $this->join();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new Command instance.
|
|
||||||
*
|
|
||||||
* @param Command|null $parent Parent command
|
|
||||||
*
|
|
||||||
* @return Command New Command instance
|
|
||||||
*/
|
|
||||||
public static function create(Command $parent = null)
|
|
||||||
{
|
|
||||||
return new self($parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Escapes special chars from input.
|
|
||||||
*
|
|
||||||
* @param string $input A string to escape
|
|
||||||
*
|
|
||||||
* @return string The escaped string
|
|
||||||
*/
|
|
||||||
public static function escape($input)
|
|
||||||
{
|
|
||||||
return escapeshellcmd($input);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Quotes input.
|
|
||||||
*
|
|
||||||
* @param string $input An argument string
|
|
||||||
*
|
|
||||||
* @return string The quoted string
|
|
||||||
*/
|
|
||||||
public static function quote($input)
|
|
||||||
{
|
|
||||||
return escapeshellarg($input);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appends a string or a Command instance.
|
|
||||||
*
|
|
||||||
* @param string|Command $bit
|
|
||||||
*
|
|
||||||
* @return Command The current Command instance
|
|
||||||
*/
|
|
||||||
public function add($bit)
|
|
||||||
{
|
|
||||||
$this->bits[] = $bit;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepends a string or a command instance.
|
|
||||||
*
|
|
||||||
* @param string|Command $bit
|
|
||||||
*
|
|
||||||
* @return Command The current Command instance
|
|
||||||
*/
|
|
||||||
public function top($bit)
|
|
||||||
{
|
|
||||||
array_unshift($this->bits, $bit);
|
|
||||||
|
|
||||||
foreach ($this->labels as $label => $index) {
|
|
||||||
$this->labels[$label] += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appends an argument, will be quoted.
|
|
||||||
*
|
|
||||||
* @param string $arg
|
|
||||||
*
|
|
||||||
* @return Command The current Command instance
|
|
||||||
*/
|
|
||||||
public function arg($arg)
|
|
||||||
{
|
|
||||||
$this->bits[] = self::quote($arg);
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Appends escaped special command chars.
|
|
||||||
*
|
|
||||||
* @param string $esc
|
|
||||||
*
|
|
||||||
* @return Command The current Command instance
|
|
||||||
*/
|
|
||||||
public function cmd($esc)
|
|
||||||
{
|
|
||||||
$this->bits[] = self::escape($esc);
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inserts a labeled command to feed later.
|
|
||||||
*
|
|
||||||
* @param string $label The unique label
|
|
||||||
*
|
|
||||||
* @return Command The current Command instance
|
|
||||||
*
|
|
||||||
* @throws \RuntimeException If label already exists
|
|
||||||
*/
|
|
||||||
public function ins($label)
|
|
||||||
{
|
|
||||||
if (isset($this->labels[$label])) {
|
|
||||||
throw new \RuntimeException(sprintf('Label "%s" already exists.', $label));
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->bits[] = self::create($this);
|
|
||||||
$this->labels[$label] = count($this->bits) - 1;
|
|
||||||
|
|
||||||
return $this->bits[$this->labels[$label]];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves a previously labeled command.
|
|
||||||
*
|
|
||||||
* @param string $label
|
|
||||||
*
|
|
||||||
* @return Command The labeled command
|
|
||||||
*
|
|
||||||
* @throws \RuntimeException
|
|
||||||
*/
|
|
||||||
public function get($label)
|
|
||||||
{
|
|
||||||
if (!isset($this->labels[$label])) {
|
|
||||||
throw new \RuntimeException(sprintf('Label "%s" does not exist.', $label));
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->bits[$this->labels[$label]];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns parent command (if any).
|
|
||||||
*
|
|
||||||
* @return Command Parent command
|
|
||||||
*
|
|
||||||
* @throws \RuntimeException If command has no parent
|
|
||||||
*/
|
|
||||||
public function end()
|
|
||||||
{
|
|
||||||
if (null === $this->parent) {
|
|
||||||
throw new \RuntimeException('Calling end on root command doesn\'t make sense.');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Counts bits stored in command.
|
|
||||||
*
|
|
||||||
* @return int The bits count
|
|
||||||
*/
|
|
||||||
public function length()
|
|
||||||
{
|
|
||||||
return count($this->bits);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param \Closure $errorHandler
|
|
||||||
*
|
|
||||||
* @return Command
|
|
||||||
*/
|
|
||||||
public function setErrorHandler(\Closure $errorHandler)
|
|
||||||
{
|
|
||||||
$this->errorHandler = $errorHandler;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return \Closure|null
|
|
||||||
*/
|
|
||||||
public function getErrorHandler()
|
|
||||||
{
|
|
||||||
return $this->errorHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Executes current command.
|
|
||||||
*
|
|
||||||
* @return array The command result
|
|
||||||
*
|
|
||||||
* @throws \RuntimeException
|
|
||||||
*/
|
|
||||||
public function execute()
|
|
||||||
{
|
|
||||||
if (null === $errorHandler = $this->errorHandler) {
|
|
||||||
exec($this->join(), $output);
|
|
||||||
} else {
|
|
||||||
$process = proc_open($this->join(), array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w')), $pipes);
|
|
||||||
$output = preg_split('~(\r\n|\r|\n)~', stream_get_contents($pipes[1]), -1, PREG_SPLIT_NO_EMPTY);
|
|
||||||
|
|
||||||
if ($error = stream_get_contents($pipes[2])) {
|
|
||||||
$errorHandler($error);
|
|
||||||
}
|
|
||||||
|
|
||||||
proc_close($process);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $output ?: array();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Joins bits.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function join()
|
|
||||||
{
|
|
||||||
return implode(' ', array_filter(
|
|
||||||
array_map(function ($bit) {
|
|
||||||
return $bit instanceof Command ? $bit->join() : ($bit ?: null);
|
|
||||||
}, $this->bits),
|
|
||||||
function ($bit) { return null !== $bit; }
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Insert a string or a Command instance before the bit at given position $index (index starts from 0).
|
|
||||||
*
|
|
||||||
* @param string|Command $bit
|
|
||||||
* @param int $index
|
|
||||||
*
|
|
||||||
* @return Command The current Command instance
|
|
||||||
*/
|
|
||||||
public function addAtIndex($bit, $index)
|
|
||||||
{
|
|
||||||
array_splice($this->bits, $index, 0, $bit instanceof self ? array($bit) : $bit);
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,101 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Shell;
|
|
||||||
|
|
||||||
@trigger_error('The '.__NAMESPACE__.'\Shell class is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
|
||||||
*
|
|
||||||
* @deprecated since 2.8, to be removed in 3.0.
|
|
||||||
*/
|
|
||||||
class Shell
|
|
||||||
{
|
|
||||||
const TYPE_UNIX = 1;
|
|
||||||
const TYPE_DARWIN = 2;
|
|
||||||
const TYPE_CYGWIN = 3;
|
|
||||||
const TYPE_WINDOWS = 4;
|
|
||||||
const TYPE_BSD = 5;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string|null
|
|
||||||
*/
|
|
||||||
private $type;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns guessed OS type.
|
|
||||||
*
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
public function getType()
|
|
||||||
{
|
|
||||||
if (null === $this->type) {
|
|
||||||
$this->type = $this->guessType();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->type;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests if a command is available.
|
|
||||||
*
|
|
||||||
* @param string $command
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function testCommand($command)
|
|
||||||
{
|
|
||||||
if (!function_exists('exec')) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// todo: find a better way (command could not be available)
|
|
||||||
$testCommand = 'which ';
|
|
||||||
if (self::TYPE_WINDOWS === $this->type) {
|
|
||||||
$testCommand = 'where ';
|
|
||||||
}
|
|
||||||
|
|
||||||
$command = escapeshellcmd($command);
|
|
||||||
|
|
||||||
exec($testCommand.$command, $output, $code);
|
|
||||||
|
|
||||||
return 0 === $code && count($output) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Guesses OS type.
|
|
||||||
*
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
private function guessType()
|
|
||||||
{
|
|
||||||
$os = strtolower(PHP_OS);
|
|
||||||
|
|
||||||
if (false !== strpos($os, 'cygwin')) {
|
|
||||||
return self::TYPE_CYGWIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (false !== strpos($os, 'darwin')) {
|
|
||||||
return self::TYPE_DARWIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (false !== strpos($os, 'bsd')) {
|
|
||||||
return self::TYPE_BSD;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 === strpos($os, 'win')) {
|
|
||||||
return self::TYPE_WINDOWS;
|
|
||||||
}
|
|
||||||
|
|
||||||
return self::TYPE_UNIX;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Tests;
|
|
||||||
|
|
||||||
use Symfony\Component\Finder\Adapter\BsdFindAdapter;
|
|
||||||
use Symfony\Component\Finder\Finder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @group legacy
|
|
||||||
*/
|
|
||||||
class BsdFinderTest extends FinderTest
|
|
||||||
{
|
|
||||||
protected function buildFinder()
|
|
||||||
{
|
|
||||||
$adapter = new BsdFindAdapter();
|
|
||||||
|
|
||||||
if (!$adapter->isSupported()) {
|
|
||||||
$this->markTestSkipped(get_class($adapter).' is not supported.');
|
|
||||||
}
|
|
||||||
|
|
||||||
return Finder::create()
|
|
||||||
->removeAdapters()
|
|
||||||
->addAdapter($adapter);
|
|
||||||
}
|
|
||||||
}
|
|
@ -245,10 +245,7 @@ class FinderTest extends Iterator\RealIteratorTestCase
|
|||||||
|
|
||||||
$expected = array(
|
$expected = array(
|
||||||
self::$tmpDir.DIRECTORY_SEPARATOR.'test.php',
|
self::$tmpDir.DIRECTORY_SEPARATOR.'test.php',
|
||||||
__DIR__.DIRECTORY_SEPARATOR.'BsdFinderTest.php',
|
|
||||||
__DIR__.DIRECTORY_SEPARATOR.'FinderTest.php',
|
__DIR__.DIRECTORY_SEPARATOR.'FinderTest.php',
|
||||||
__DIR__.DIRECTORY_SEPARATOR.'GnuFinderTest.php',
|
|
||||||
__DIR__.DIRECTORY_SEPARATOR.'PhpFinderTest.php',
|
|
||||||
__DIR__.DIRECTORY_SEPARATOR.'GlobTest.php',
|
__DIR__.DIRECTORY_SEPARATOR.'GlobTest.php',
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -532,47 +529,6 @@ class FinderTest extends Iterator\RealIteratorTestCase
|
|||||||
$this->assertIterator($this->toAbsoluteFixtures($expected), $finder);
|
$this->assertIterator($this->toAbsoluteFixtures($expected), $finder);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @group legacy
|
|
||||||
*/
|
|
||||||
public function testAdaptersOrdering()
|
|
||||||
{
|
|
||||||
$finder = Finder::create()
|
|
||||||
->removeAdapters()
|
|
||||||
->addAdapter(new FakeAdapter\NamedAdapter('a'), 0)
|
|
||||||
->addAdapter(new FakeAdapter\NamedAdapter('b'), -50)
|
|
||||||
->addAdapter(new FakeAdapter\NamedAdapter('c'), 50)
|
|
||||||
->addAdapter(new FakeAdapter\NamedAdapter('d'), -25)
|
|
||||||
->addAdapter(new FakeAdapter\NamedAdapter('e'), 25);
|
|
||||||
|
|
||||||
$this->assertEquals(
|
|
||||||
array('c', 'e', 'a', 'd', 'b'),
|
|
||||||
array_map(function (AdapterInterface $adapter) {
|
|
||||||
return $adapter->getName();
|
|
||||||
}, $finder->getAdapters())
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @group legacy
|
|
||||||
*/
|
|
||||||
public function testAdaptersChaining()
|
|
||||||
{
|
|
||||||
$iterator = new \ArrayIterator(array());
|
|
||||||
$filenames = $this->toAbsolute(array('foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto'));
|
|
||||||
foreach ($filenames as $file) {
|
|
||||||
$iterator->append(new \Symfony\Component\Finder\SplFileInfo($file, null, null));
|
|
||||||
}
|
|
||||||
|
|
||||||
$finder = Finder::create()
|
|
||||||
->removeAdapters()
|
|
||||||
->addAdapter(new FakeAdapter\UnsupportedAdapter(), 3)
|
|
||||||
->addAdapter(new FakeAdapter\FailingAdapter(), 2)
|
|
||||||
->addAdapter(new FakeAdapter\DummyAdapter($iterator), 1);
|
|
||||||
|
|
||||||
$this->assertIterator($filenames, $finder->in(sys_get_temp_dir())->getIterator());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getContainsTestData()
|
public function getContainsTestData()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
@ -610,24 +566,6 @@ class FinderTest extends Iterator\RealIteratorTestCase
|
|||||||
$this->assertIterator($this->toAbsoluteFixtures($expected), $finder);
|
$this->assertIterator($this->toAbsoluteFixtures($expected), $finder);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @group legacy
|
|
||||||
*/
|
|
||||||
public function testAdapterSelection()
|
|
||||||
{
|
|
||||||
// test that by default, PhpAdapter is selected
|
|
||||||
$adapters = Finder::create()->getAdapters();
|
|
||||||
$this->assertTrue($adapters[0] instanceof PhpAdapter);
|
|
||||||
|
|
||||||
// test another adapter selection
|
|
||||||
$adapters = Finder::create()->setAdapter('gnu_find')->getAdapters();
|
|
||||||
$this->assertTrue($adapters[0] instanceof GnuFindAdapter);
|
|
||||||
|
|
||||||
// test that useBestAdapter method removes selection
|
|
||||||
$adapters = Finder::create()->useBestAdapter()->getAdapters();
|
|
||||||
$this->assertFalse($adapters[0] instanceof PhpAdapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getTestPathData()
|
public function getTestPathData()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
|
@ -1,34 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Tests;
|
|
||||||
|
|
||||||
use Symfony\Component\Finder\Adapter\GnuFindAdapter;
|
|
||||||
use Symfony\Component\Finder\Finder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @group legacy
|
|
||||||
*/
|
|
||||||
class GnuFinderTest extends FinderTest
|
|
||||||
{
|
|
||||||
protected function buildFinder()
|
|
||||||
{
|
|
||||||
$adapter = new GnuFindAdapter();
|
|
||||||
|
|
||||||
if (!$adapter->isSupported()) {
|
|
||||||
$this->markTestSkipped(get_class($adapter).' is not supported.');
|
|
||||||
}
|
|
||||||
|
|
||||||
return Finder::create()
|
|
||||||
->removeAdapters()
|
|
||||||
->addAdapter($adapter);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,72 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Tests\Iterator;
|
|
||||||
|
|
||||||
use Symfony\Component\Finder\Iterator\FilePathsIterator;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @group legacy
|
|
||||||
*/
|
|
||||||
class FilePathsIteratorTest extends RealIteratorTestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @dataProvider getSubPathData
|
|
||||||
*/
|
|
||||||
public function testSubPath($baseDir, array $paths, array $subPaths, array $subPathnames)
|
|
||||||
{
|
|
||||||
$iterator = new FilePathsIterator($paths, $baseDir);
|
|
||||||
|
|
||||||
foreach ($iterator as $index => $file) {
|
|
||||||
$this->assertEquals($paths[$index], $file->getPathname());
|
|
||||||
$this->assertEquals($subPaths[$index], $iterator->getSubPath());
|
|
||||||
$this->assertEquals($subPathnames[$index], $iterator->getSubPathname());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getSubPathData()
|
|
||||||
{
|
|
||||||
$tmpDir = sys_get_temp_dir().'/symfony_finder';
|
|
||||||
|
|
||||||
return array(
|
|
||||||
array(
|
|
||||||
$tmpDir,
|
|
||||||
array(
|
|
||||||
// paths
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'.git' => $tmpDir.DIRECTORY_SEPARATOR.'.git',
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'test.py' => $tmpDir.DIRECTORY_SEPARATOR.'test.py',
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'foo' => $tmpDir.DIRECTORY_SEPARATOR.'foo',
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'bar.tmp' => $tmpDir.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'bar.tmp',
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'test.php' => $tmpDir.DIRECTORY_SEPARATOR.'test.php',
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'toto' => $tmpDir.DIRECTORY_SEPARATOR.'toto',
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
// subPaths
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'.git' => '',
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'test.py' => '',
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'foo' => '',
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'bar.tmp' => 'foo',
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'test.php' => '',
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'toto' => '',
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
// subPathnames
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'.git' => '.git',
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'test.py' => 'test.py',
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'foo' => 'foo',
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'foo'.DIRECTORY_SEPARATOR.'bar.tmp' => 'foo'.DIRECTORY_SEPARATOR.'bar.tmp',
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'test.php' => 'test.php',
|
|
||||||
$tmpDir.DIRECTORY_SEPARATOR.'toto' => 'toto',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Tests;
|
|
||||||
|
|
||||||
use Symfony\Component\Finder\Adapter\PhpAdapter;
|
|
||||||
use Symfony\Component\Finder\Finder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @group legacy
|
|
||||||
*/
|
|
||||||
class PhpFinderTest extends FinderTest
|
|
||||||
{
|
|
||||||
public function testImplementationsAreSynchronized()
|
|
||||||
{
|
|
||||||
$adapterReflector = new \ReflectionMethod('Symfony\Component\Finder\Adapter\PhpAdapter', 'searchInDirectory');
|
|
||||||
$finderReflector = new \ReflectionMethod('Symfony\Component\Finder\Finder', 'searchInDirectory');
|
|
||||||
|
|
||||||
$adapterSource = array_slice(file($adapterReflector->getFileName()), $adapterReflector->getStartLine() + 1, $adapterReflector->getEndLine() - $adapterReflector->getStartLine() - 1);
|
|
||||||
$adapterSource = implode('', $adapterSource);
|
|
||||||
$adapterSource = str_replace(array('$this->minDepth', '$this->maxDepth'), array('$minDepth', '$maxDepth'), $adapterSource);
|
|
||||||
|
|
||||||
$finderSource = array_slice(file($finderReflector->getFileName()), $finderReflector->getStartLine() + 1, $finderReflector->getEndLine() - $finderReflector->getStartLine() - 1);
|
|
||||||
$finderSource = implode('', $finderSource);
|
|
||||||
|
|
||||||
$this->assertStringEndsWith($adapterSource, $finderSource);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function buildFinder()
|
|
||||||
{
|
|
||||||
$adapter = new PhpAdapter();
|
|
||||||
|
|
||||||
return Finder::create()
|
|
||||||
->removeAdapters()
|
|
||||||
->addAdapter($adapter);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,165 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of the Symfony package.
|
|
||||||
*
|
|
||||||
* (c) Fabien Potencier <fabien@symfony.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Symfony\Component\Finder\Tests\Shell;
|
|
||||||
|
|
||||||
use Symfony\Component\Finder\Shell\Command;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @group legacy
|
|
||||||
*/
|
|
||||||
class CommandTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
public function testCreate()
|
|
||||||
{
|
|
||||||
$this->assertInstanceOf('Symfony\Component\Finder\Shell\Command', Command::create());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testAdd()
|
|
||||||
{
|
|
||||||
$cmd = Command::create()->add('--force');
|
|
||||||
$this->assertSame('--force', $cmd->join());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testAddAsFirst()
|
|
||||||
{
|
|
||||||
$cmd = Command::create()->add('--force');
|
|
||||||
|
|
||||||
$cmd->addAtIndex(Command::create()->add('-F'), 0);
|
|
||||||
$this->assertSame('-F --force', $cmd->join());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testAddAsLast()
|
|
||||||
{
|
|
||||||
$cmd = Command::create()->add('--force');
|
|
||||||
|
|
||||||
$cmd->addAtIndex(Command::create()->add('-F'), 1);
|
|
||||||
$this->assertSame('--force -F', $cmd->join());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testAddInBetween()
|
|
||||||
{
|
|
||||||
$cmd = Command::create()->add('--force');
|
|
||||||
$cmd->addAtIndex(Command::create()->add('-F'), 0);
|
|
||||||
|
|
||||||
$cmd->addAtIndex(Command::create()->add('-X'), 1);
|
|
||||||
$this->assertSame('-F -X --force', $cmd->join());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testCount()
|
|
||||||
{
|
|
||||||
$cmd = Command::create();
|
|
||||||
$this->assertSame(0, $cmd->length());
|
|
||||||
|
|
||||||
$cmd->add('--force');
|
|
||||||
$this->assertSame(1, $cmd->length());
|
|
||||||
|
|
||||||
$cmd->add('--run');
|
|
||||||
$this->assertSame(2, $cmd->length());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testTop()
|
|
||||||
{
|
|
||||||
$cmd = Command::create()->add('--force');
|
|
||||||
|
|
||||||
$cmd->top('--run');
|
|
||||||
$this->assertSame('--run --force', $cmd->join());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testTopLabeled()
|
|
||||||
{
|
|
||||||
$cmd = Command::create()->add('--force');
|
|
||||||
|
|
||||||
$cmd->top('--run');
|
|
||||||
$cmd->ins('--something');
|
|
||||||
$cmd->top('--something');
|
|
||||||
$this->assertSame('--something --run --force ', $cmd->join());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testArg()
|
|
||||||
{
|
|
||||||
$cmd = Command::create()->add('--force');
|
|
||||||
|
|
||||||
$cmd->arg('--run');
|
|
||||||
$this->assertSame('--force '.escapeshellarg('--run'), $cmd->join());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testCmd()
|
|
||||||
{
|
|
||||||
$cmd = Command::create()->add('--force');
|
|
||||||
|
|
||||||
$cmd->cmd('run');
|
|
||||||
$this->assertSame('--force run', $cmd->join());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testInsDuplicateLabelException()
|
|
||||||
{
|
|
||||||
$cmd = Command::create()->add('--force');
|
|
||||||
|
|
||||||
$cmd->ins('label');
|
|
||||||
$this->setExpectedException('RuntimeException');
|
|
||||||
$cmd->ins('label');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testEnd()
|
|
||||||
{
|
|
||||||
$parent = Command::create();
|
|
||||||
$cmd = Command::create($parent);
|
|
||||||
|
|
||||||
$this->assertSame($parent, $cmd->end());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testEndNoParentException()
|
|
||||||
{
|
|
||||||
$cmd = Command::create();
|
|
||||||
|
|
||||||
$this->setExpectedException('RuntimeException');
|
|
||||||
$cmd->end();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetMissingLabelException()
|
|
||||||
{
|
|
||||||
$cmd = Command::create();
|
|
||||||
|
|
||||||
$this->setExpectedException('RuntimeException');
|
|
||||||
$cmd->get('invalid');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testErrorHandler()
|
|
||||||
{
|
|
||||||
$cmd = Command::create();
|
|
||||||
$handler = function () { return 'error-handler'; };
|
|
||||||
$cmd->setErrorHandler($handler);
|
|
||||||
|
|
||||||
$this->assertSame($handler, $cmd->getErrorHandler());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testExecute()
|
|
||||||
{
|
|
||||||
$cmd = Command::create();
|
|
||||||
$cmd->add('php');
|
|
||||||
$cmd->add('--version');
|
|
||||||
$result = $cmd->execute();
|
|
||||||
|
|
||||||
$this->assertTrue(is_array($result));
|
|
||||||
$this->assertNotEmpty($result);
|
|
||||||
$this->assertRegexp('/PHP|HipHop/', $result[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testCastToString()
|
|
||||||
{
|
|
||||||
$cmd = Command::create();
|
|
||||||
$cmd->add('--force');
|
|
||||||
$cmd->add('--run');
|
|
||||||
|
|
||||||
$this->assertSame('--force --run', (string) $cmd);
|
|
||||||
}
|
|
||||||
}
|
|
Reference in New Issue
Block a user