279 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			279 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?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; | ||
|  |     } | ||
|  | } |