コード例 #1
0
ファイル: ProcessHelper.php プロジェクト: Danack/Console
 /**
  * Runs an external process.
  *
  * @param OutputInterface      $output    An OutputInterface instance
  * @param string|array|Process $cmd       An instance of Process or an array of arguments to escape and run or a command to run
  * @param string|null          $error     An error message that must be displayed if something went wrong
  * @param callable|null        $callback  A PHP callback to run whenever there is some
  *                                        output available on STDOUT or STDERR
  * @param int                  $verbosity The threshold for verbosity
  *
  * @return Process The process that ran
  */
 public function run(OutputInterface $output, $cmd, $error = null, $callback = null, $verbosity = OutputInterface::VERBOSITY_VERY_VERBOSE)
 {
     $formatter = $this->getHelperSet()->get('debug_formatter');
     if (is_array($cmd)) {
         $process = ProcessBuilder::create($cmd)->getProcess();
     } elseif ($cmd instanceof Process) {
         $process = $cmd;
     } else {
         $process = new Process($cmd);
     }
     if ($verbosity <= $output->getVerbosity()) {
         $output->write($formatter->start(spl_object_hash($process), $this->escapeString($process->getCommandLine())));
     }
     if ($output->isDebug()) {
         $callback = $this->wrapCallback($output, $process, $callback);
     }
     $process->run($callback);
     if ($verbosity <= $output->getVerbosity()) {
         $message = $process->isSuccessful() ? 'Command ran successfully' : sprintf('%s Command did not run successfully', $process->getExitCode());
         $output->write($formatter->stop(spl_object_hash($process), $message, $process->isSuccessful()));
     }
     if (!$process->isSuccessful() && null !== $error) {
         $output->writeln(sprintf('<error>%s</error>', $this->escapeString($error)));
     }
     return $process;
 }
コード例 #2
0
ファイル: ProgressBar.php プロジェクト: Danack/Console
 private function determineBestFormat()
 {
     switch ($this->output->getVerbosity()) {
         // OutputInterface::VERBOSITY_QUIET: display is disabled anyway
         case OutputInterface::VERBOSITY_VERBOSE:
             return $this->max ? 'verbose' : 'verbose_nomax';
         case OutputInterface::VERBOSITY_VERY_VERBOSE:
             return $this->max ? 'very_verbose' : 'very_verbose_nomax';
         case OutputInterface::VERBOSITY_DEBUG:
             return $this->max ? 'debug' : 'debug_nomax';
         default:
             return $this->max ? 'normal' : 'normal_nomax';
     }
 }
コード例 #3
0
ファイル: Application.php プロジェクト: Danack/Console
 /**
  * Renders a caught exception.
  *
  * @param \Exception      $e      An exception instance
  * @param OutputInterface $output An OutputInterface instance
  */
 public function renderException($e, $output)
 {
     do {
         $title = sprintf('  [%s]  ', get_class($e));
         $len = $this->stringWidth($title);
         $width = $this->getTerminalWidth() ? $this->getTerminalWidth() - 1 : PHP_INT_MAX;
         // HHVM only accepts 32 bits integer in str_split, even when PHP_INT_MAX is a 64 bit integer: https://github.com/facebook/hhvm/issues/1327
         if (defined('HHVM_VERSION') && $width > 1 << 31) {
             $width = 1 << 31;
         }
         $formatter = $output->getFormatter();
         $lines = array();
         foreach (preg_split('/\\r?\\n/', $e->getMessage()) as $line) {
             foreach ($this->splitStringByWidth($line, $width - 4) as $line) {
                 // pre-format lines to get the right string length
                 $lineLength = $this->stringWidth(preg_replace('/\\[[^m]*m/', '', $formatter->format($line))) + 4;
                 $lines[] = array($line, $lineLength);
                 $len = max($lineLength, $len);
             }
         }
         $messages = array('', '');
         $messages[] = $emptyLine = $formatter->format(sprintf('<error>%s</error>', str_repeat(' ', $len)));
         $messages[] = $formatter->format(sprintf('<error>%s%s</error>', $title, str_repeat(' ', max(0, $len - $this->stringWidth($title)))));
         foreach ($lines as $line) {
             $messages[] = $formatter->format(sprintf('<error>  %s  %s</error>', $line[0], str_repeat(' ', $len - $line[1])));
         }
         $messages[] = $emptyLine;
         $messages[] = '';
         $messages[] = '';
         $output->writeln($messages, OutputInterface::OUTPUT_RAW);
         if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) {
             $output->writeln('<comment>Exception trace:</comment>');
             // exception related properties
             $trace = $e->getTrace();
             array_unshift($trace, array('function' => '', 'file' => $e->getFile() != null ? $e->getFile() : 'n/a', 'line' => $e->getLine() != null ? $e->getLine() : 'n/a', 'args' => array()));
             for ($i = 0, $count = count($trace); $i < $count; $i++) {
                 $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : '';
                 $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : '';
                 $function = $trace[$i]['function'];
                 $file = isset($trace[$i]['file']) ? $trace[$i]['file'] : 'n/a';
                 $line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a';
                 $output->writeln(sprintf(' %s%s%s() at <info>%s:%s</info>', $class, $type, $function, $file, $line));
             }
             $output->writeln("");
             $output->writeln("");
         }
     } while ($e = $e->getPrevious());
     if (null !== $this->runningCommand) {
         $output->writeln(sprintf('<info>%s</info>', sprintf($this->runningCommand->getSynopsis(), $this->getName())));
         $output->writeln("");
         $output->writeln("");
     }
 }
コード例 #4
0
ファイル: ProgressHelper.php プロジェクト: Danack/Console
 /**
  * Starts the progress output.
  *
  * @param OutputInterface $output An Output instance
  * @param int|null        $max    Maximum steps
  */
 public function start(OutputInterface $output, $max = null)
 {
     $this->startTime = time();
     $this->current = 0;
     $this->max = (int) $max;
     // Disabling output when it does not support ANSI codes as it would result in a broken display anyway.
     $this->output = $output->isDecorated() ? $output : new NullOutput();
     $this->lastMessagesLength = 0;
     $this->barCharOriginal = '';
     if (null === $this->format) {
         switch ($output->getVerbosity()) {
             case OutputInterface::VERBOSITY_QUIET:
                 $this->format = self::FORMAT_QUIET_NOMAX;
                 if ($this->max > 0) {
                     $this->format = self::FORMAT_QUIET;
                 }
                 break;
             case OutputInterface::VERBOSITY_VERBOSE:
             case OutputInterface::VERBOSITY_VERY_VERBOSE:
             case OutputInterface::VERBOSITY_DEBUG:
                 $this->format = self::FORMAT_VERBOSE_NOMAX;
                 if ($this->max > 0) {
                     $this->format = self::FORMAT_VERBOSE;
                 }
                 break;
             default:
                 $this->format = self::FORMAT_NORMAL_NOMAX;
                 if ($this->max > 0) {
                     $this->format = self::FORMAT_NORMAL;
                 }
                 break;
         }
     }
     $this->initialize();
 }
コード例 #5
0
ファイル: AbstractCommand.php プロジェクト: Danack/Console
 /**
  * Runs the command.
  *
  * The code to execute is either defined directly with the
  * setCode() method or by overriding the execute() method
  * in a sub-class.
  *
  * @param InputInterface  $input  An InputInterface instance
  * @param OutputInterface $output An OutputInterface instance
  *
  * @return array An array of [null, $callable, $parameters] that should be called for the command
  *
  * @throws \Exception
  *
  * @see setCode()
  * @see execute()
  *
  * @api
  */
 public function run(InputInterface $input, OutputInterface $output)
 {
     if (null !== $this->processTitle) {
         if (function_exists('cli_set_process_title')) {
             cli_set_process_title($this->processTitle);
         } elseif (function_exists('setproctitle')) {
             setproctitle($this->processTitle);
         } elseif (OutputInterface::VERBOSITY_VERY_VERBOSE === $output->getVerbosity()) {
             $output->writeln('<comment>Install the proctitle PECL to be able to change the process title.</comment>');
         }
     }
     // force the creation of the synopsis before the merge with the app definition
     $this->getSynopsis();
     // add the application arguments and options
     $this->mergeApplicationDefinition();
     // bind the input against the command specific arguments/options
     try {
         $input->bind($this->definition);
     } catch (\Exception $e) {
         if (!$this->ignoreValidationErrors) {
             throw $e;
         }
     }
     $this->initialize($input, $output);
     if ($input->isInteractive()) {
         $this->interact($input, $output);
     }
     $input->validate();
     $callable = $this->getCallable();
     $params = $this->parseInput($input, $output);
     return new ParsedCommand($callable, $params, $input, $output);
 }