Essai au propre
This commit is contained in:
240
vendor/symfony/finder/Adapter/AbstractAdapter.php
vendored
240
vendor/symfony/finder/Adapter/AbstractAdapter.php
vendored
@@ -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 Symfony 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,325 +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 Symfony 2.8 and will be removed in 3.0. Use directly the Finder class instead.', E_USER_DEPRECATED);
|
||||
|
||||
use Symfony\Component\Finder\Comparator\DateComparator;
|
||||
use Symfony\Component\Finder\Comparator\NumberComparator;
|
||||
use Symfony\Component\Finder\Exception\AccessDeniedException;
|
||||
use Symfony\Component\Finder\Expression\Expression;
|
||||
use Symfony\Component\Finder\Iterator;
|
||||
use Symfony\Component\Finder\Shell\Command;
|
||||
use Symfony\Component\Finder\Shell\Shell;
|
||||
|
||||
/**
|
||||
* 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
|
||||
{
|
||||
protected $shell;
|
||||
|
||||
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) { }
|
||||
: 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);
|
||||
}
|
||||
124
vendor/symfony/finder/Adapter/AdapterInterface.php
vendored
124
vendor/symfony/finder/Adapter/AdapterInterface.php
vendored
@@ -1,124 +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 $this
|
||||
*/
|
||||
public function setFollowLinks($followLinks);
|
||||
|
||||
/**
|
||||
* @param int $mode
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setMode($mode);
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
public function setExclude(array $exclude);
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
public function setDepths(array $depths);
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
public function setNames(array $names);
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
public function setNotNames(array $notNames);
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
public function setContains(array $contains);
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
public function setNotContains(array $notContains);
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
public function setSizes(array $sizes);
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
public function setDates(array $dates);
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
public function setFilters(array $filters);
|
||||
|
||||
/**
|
||||
* @param \Closure|int $sort
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setSort($sort);
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
public function setPath(array $paths);
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
public function setNotPath(array $notPaths);
|
||||
|
||||
/**
|
||||
* @param bool $ignore
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
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();
|
||||
}
|
||||
107
vendor/symfony/finder/Adapter/BsdFindAdapter.php
vendored
107
vendor/symfony/finder/Adapter/BsdFindAdapter.php
vendored
@@ -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 Symfony 2.8 and will be removed in 3.0. Use directly the Finder class instead.', E_USER_DEPRECATED);
|
||||
|
||||
use Symfony\Component\Finder\Expression\Expression;
|
||||
use Symfony\Component\Finder\Iterator\SortableIterator;
|
||||
use Symfony\Component\Finder\Shell\Command;
|
||||
use Symfony\Component\Finder\Shell\Shell;
|
||||
|
||||
/**
|
||||
* 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('{}')
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
108
vendor/symfony/finder/Adapter/GnuFindAdapter.php
vendored
108
vendor/symfony/finder/Adapter/GnuFindAdapter.php
vendored
@@ -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 Symfony 2.8 and will be removed in 3.0. Use directly the Finder class instead.', E_USER_DEPRECATED);
|
||||
|
||||
use Symfony\Component\Finder\Expression\Expression;
|
||||
use Symfony\Component\Finder\Iterator\SortableIterator;
|
||||
use Symfony\Component\Finder\Shell\Command;
|
||||
use Symfony\Component\Finder\Shell\Shell;
|
||||
|
||||
/**
|
||||
* 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 Shell::TYPE_UNIX === $this->shell->getType() && 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('{}')
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
101
vendor/symfony/finder/Adapter/PhpAdapter.php
vendored
101
vendor/symfony/finder/Adapter/PhpAdapter.php
vendored
@@ -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 Symfony 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,47 +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 Symfony 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
|
||||
{
|
||||
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 Symfony 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,41 +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 Symfony 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
|
||||
{
|
||||
private $command;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
148
vendor/symfony/finder/Expression/Expression.php
vendored
148
vendor/symfony/finder/Expression/Expression.php
vendored
@@ -1,148 +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\Expression;
|
||||
|
||||
@trigger_error('The '.__NAMESPACE__.'\Expression class is deprecated since Symfony 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class Expression implements ValueInterface
|
||||
{
|
||||
const TYPE_REGEX = 1;
|
||||
const TYPE_GLOB = 2;
|
||||
|
||||
/**
|
||||
* @var ValueInterface
|
||||
*/
|
||||
private $value;
|
||||
|
||||
/**
|
||||
* @param string $expr
|
||||
*
|
||||
* @return self
|
||||
*/
|
||||
public static function create($expr)
|
||||
{
|
||||
return new self($expr);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $expr
|
||||
*/
|
||||
public function __construct($expr)
|
||||
{
|
||||
try {
|
||||
$this->value = Regex::create($expr);
|
||||
} catch (\InvalidArgumentException $e) {
|
||||
$this->value = new Glob($expr);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return $this->render();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render()
|
||||
{
|
||||
return $this->value->render();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function renderPattern()
|
||||
{
|
||||
return $this->value->renderPattern();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isCaseSensitive()
|
||||
{
|
||||
return $this->value->isCaseSensitive();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return $this->value->getType();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function prepend($expr)
|
||||
{
|
||||
$this->value->prepend($expr);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function append($expr)
|
||||
{
|
||||
$this->value->append($expr);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isRegex()
|
||||
{
|
||||
return self::TYPE_REGEX === $this->value->getType();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isGlob()
|
||||
{
|
||||
return self::TYPE_GLOB === $this->value->getType();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Glob
|
||||
*
|
||||
* @throws \LogicException
|
||||
*/
|
||||
public function getGlob()
|
||||
{
|
||||
if (self::TYPE_GLOB !== $this->value->getType()) {
|
||||
throw new \LogicException('Regex can\'t be transformed to glob.');
|
||||
}
|
||||
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Regex
|
||||
*/
|
||||
public function getRegex()
|
||||
{
|
||||
return self::TYPE_REGEX === $this->value->getType() ? $this->value : $this->value->toRegex();
|
||||
}
|
||||
}
|
||||
108
vendor/symfony/finder/Expression/Glob.php
vendored
108
vendor/symfony/finder/Expression/Glob.php
vendored
@@ -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\Expression;
|
||||
|
||||
@trigger_error('The '.__NAMESPACE__.'\Glob class is deprecated since Symfony 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
|
||||
|
||||
use Symfony\Component\Finder\Glob as FinderGlob;
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class Glob implements ValueInterface
|
||||
{
|
||||
private $pattern;
|
||||
|
||||
/**
|
||||
* @param string $pattern
|
||||
*/
|
||||
public function __construct($pattern)
|
||||
{
|
||||
$this->pattern = $pattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render()
|
||||
{
|
||||
return $this->pattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function renderPattern()
|
||||
{
|
||||
return $this->pattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return Expression::TYPE_GLOB;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function isCaseSensitive()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function prepend($expr)
|
||||
{
|
||||
$this->pattern = $expr.$this->pattern;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function append($expr)
|
||||
{
|
||||
$this->pattern .= $expr;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if glob is expandable ("*.{a,b}" syntax).
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isExpandable()
|
||||
{
|
||||
return false !== strpos($this->pattern, '{')
|
||||
&& false !== strpos($this->pattern, '}');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $strictLeadingDot
|
||||
* @param bool $strictWildcardSlash
|
||||
*
|
||||
* @return Regex
|
||||
*/
|
||||
public function toRegex($strictLeadingDot = true, $strictWildcardSlash = true)
|
||||
{
|
||||
$regex = FinderGlob::toRegex($this->pattern, $strictLeadingDot, $strictWildcardSlash, '');
|
||||
|
||||
return new Regex($regex);
|
||||
}
|
||||
}
|
||||
321
vendor/symfony/finder/Expression/Regex.php
vendored
321
vendor/symfony/finder/Expression/Regex.php
vendored
@@ -1,321 +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\Expression;
|
||||
|
||||
@trigger_error('The '.__NAMESPACE__.'\Regex class is deprecated since Symfony 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
class Regex implements ValueInterface
|
||||
{
|
||||
const START_FLAG = '^';
|
||||
const END_FLAG = '$';
|
||||
const BOUNDARY = '~';
|
||||
const JOKER = '.*';
|
||||
const ESCAPING = '\\';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $pattern;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $options;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $startFlag;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $endFlag;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $startJoker;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $endJoker;
|
||||
|
||||
/**
|
||||
* @param string $expr
|
||||
*
|
||||
* @return self
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public static function create($expr)
|
||||
{
|
||||
if (preg_match('/^(.{3,}?)([imsxuADU]*)$/', $expr, $m)) {
|
||||
$start = substr($m[1], 0, 1);
|
||||
$end = substr($m[1], -1);
|
||||
|
||||
if (
|
||||
($start === $end && !preg_match('/[*?[:alnum:] \\\\]/', $start))
|
||||
|| ('{' === $start && '}' === $end)
|
||||
|| ('(' === $start && ')' === $end)
|
||||
) {
|
||||
return new self(substr($m[1], 1, -1), $m[2], $end);
|
||||
}
|
||||
}
|
||||
|
||||
throw new \InvalidArgumentException('Given expression is not a regex.');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $pattern
|
||||
* @param string $options
|
||||
* @param string $delimiter
|
||||
*/
|
||||
public function __construct($pattern, $options = '', $delimiter = null)
|
||||
{
|
||||
if (null !== $delimiter) {
|
||||
// removes delimiter escaping
|
||||
$pattern = str_replace('\\'.$delimiter, $delimiter, $pattern);
|
||||
}
|
||||
|
||||
$this->parsePattern($pattern);
|
||||
$this->options = $options;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return $this->render();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render()
|
||||
{
|
||||
return self::BOUNDARY
|
||||
.$this->renderPattern()
|
||||
.self::BOUNDARY
|
||||
.$this->options;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function renderPattern()
|
||||
{
|
||||
return ($this->startFlag ? self::START_FLAG : '')
|
||||
.($this->startJoker ? self::JOKER : '')
|
||||
.str_replace(self::BOUNDARY, '\\'.self::BOUNDARY, $this->pattern)
|
||||
.($this->endJoker ? self::JOKER : '')
|
||||
.($this->endFlag ? self::END_FLAG : '');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function isCaseSensitive()
|
||||
{
|
||||
return !$this->hasOption('i');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return Expression::TYPE_REGEX;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function prepend($expr)
|
||||
{
|
||||
$this->pattern = $expr.$this->pattern;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function append($expr)
|
||||
{
|
||||
$this->pattern .= $expr;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $option
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function hasOption($option)
|
||||
{
|
||||
return false !== strpos($this->options, $option);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $option
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function addOption($option)
|
||||
{
|
||||
if (!$this->hasOption($option)) {
|
||||
$this->options .= $option;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $option
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function removeOption($option)
|
||||
{
|
||||
$this->options = str_replace($option, '', $this->options);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $startFlag
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setStartFlag($startFlag)
|
||||
{
|
||||
$this->startFlag = $startFlag;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function hasStartFlag()
|
||||
{
|
||||
return $this->startFlag;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $endFlag
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setEndFlag($endFlag)
|
||||
{
|
||||
$this->endFlag = (bool) $endFlag;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function hasEndFlag()
|
||||
{
|
||||
return $this->endFlag;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $startJoker
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setStartJoker($startJoker)
|
||||
{
|
||||
$this->startJoker = $startJoker;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function hasStartJoker()
|
||||
{
|
||||
return $this->startJoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $endJoker
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setEndJoker($endJoker)
|
||||
{
|
||||
$this->endJoker = (bool) $endJoker;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function hasEndJoker()
|
||||
{
|
||||
return $this->endJoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
public function replaceJokers($replacement)
|
||||
{
|
||||
$replace = function ($subject) use ($replacement) {
|
||||
$subject = $subject[0];
|
||||
$replace = 0 === substr_count($subject, '\\') % 2;
|
||||
|
||||
return $replace ? str_replace('.', $replacement, $subject) : $subject;
|
||||
};
|
||||
|
||||
$this->pattern = preg_replace_callback('~[\\\\]*\\.~', $replace, $this->pattern);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $pattern
|
||||
*/
|
||||
private function parsePattern($pattern)
|
||||
{
|
||||
if ($this->startFlag = self::START_FLAG === substr($pattern, 0, 1)) {
|
||||
$pattern = substr($pattern, 1);
|
||||
}
|
||||
|
||||
if ($this->startJoker = self::JOKER === substr($pattern, 0, 2)) {
|
||||
$pattern = substr($pattern, 2);
|
||||
}
|
||||
|
||||
if ($this->endFlag = (self::END_FLAG === substr($pattern, -1) && self::ESCAPING !== substr($pattern, -2, -1))) {
|
||||
$pattern = substr($pattern, 0, -1);
|
||||
}
|
||||
|
||||
if ($this->endJoker = (self::JOKER === substr($pattern, -2) && self::ESCAPING !== substr($pattern, -3, -2))) {
|
||||
$pattern = substr($pattern, 0, -2);
|
||||
}
|
||||
|
||||
$this->pattern = $pattern;
|
||||
}
|
||||
}
|
||||
@@ -1,62 +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\Expression;
|
||||
|
||||
@trigger_error('The '.__NAMESPACE__.'\ValueInterface interface is deprecated since Symfony 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
|
||||
|
||||
/**
|
||||
* @author Jean-François Simon <contact@jfsimon.fr>
|
||||
*/
|
||||
interface ValueInterface
|
||||
{
|
||||
/**
|
||||
* Renders string representation of expression.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function render();
|
||||
|
||||
/**
|
||||
* Renders string representation of pattern.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function renderPattern();
|
||||
|
||||
/**
|
||||
* Returns value case sensitivity.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isCaseSensitive();
|
||||
|
||||
/**
|
||||
* Returns expression type.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getType();
|
||||
|
||||
/**
|
||||
* @param string $expr
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function prepend($expr);
|
||||
|
||||
/**
|
||||
* @param string $expr
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function append($expr);
|
||||
}
|
||||
135
vendor/symfony/finder/Iterator/FilePathsIterator.php
vendored
135
vendor/symfony/finder/Iterator/FilePathsIterator.php
vendored
@@ -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 Symfony 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);
|
||||
}
|
||||
}
|
||||
278
vendor/symfony/finder/Shell/Command.php
vendored
278
vendor/symfony/finder/Shell/Command.php
vendored
@@ -1,278 +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 Symfony 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
|
||||
{
|
||||
private $parent;
|
||||
private $bits = array();
|
||||
private $labels = array();
|
||||
|
||||
/**
|
||||
* @var \Closure|null
|
||||
*/
|
||||
private $errorHandler;
|
||||
|
||||
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.
|
||||
*
|
||||
* @return self
|
||||
*/
|
||||
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 $this
|
||||
*/
|
||||
public function add($bit)
|
||||
{
|
||||
$this->bits[] = $bit;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepends a string or a command instance.
|
||||
*
|
||||
* @param string|Command $bit
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function top($bit)
|
||||
{
|
||||
array_unshift($this->bits, $bit);
|
||||
|
||||
foreach ($this->labels as $label => $index) {
|
||||
++$this->labels[$label];
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends an argument, will be quoted.
|
||||
*
|
||||
* @param string $arg
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function arg($arg)
|
||||
{
|
||||
$this->bits[] = self::quote($arg);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends escaped special command chars.
|
||||
*
|
||||
* @param string $esc
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
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 self|string
|
||||
*
|
||||
* @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 self|string
|
||||
*
|
||||
* @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 self
|
||||
*
|
||||
* @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);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return $this
|
||||
*/
|
||||
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 $this
|
||||
*/
|
||||
public function addAtIndex($bit, $index)
|
||||
{
|
||||
array_splice($this->bits, $index, 0, $bit instanceof self ? array($bit) : $bit);
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
101
vendor/symfony/finder/Shell/Shell.php
vendored
101
vendor/symfony/finder/Shell/Shell.php
vendored
@@ -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 Symfony 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user