Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

Shell.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 6.49 KiB


001  <?php
002   
003  /*
004   * This file is part of the Symfony package.
005   *
006   * (c) Fabien Potencier <fabien@symfony.com>
007   *
008   * For the full copyright and license information, please view the LICENSE
009   * file that was distributed with this source code.
010   */
011   
012  namespace Symfony\Component\Console;
013   
014  use Symfony\Component\Console\Exception\RuntimeException;
015  use Symfony\Component\Console\Input\StringInput;
016  use Symfony\Component\Console\Output\ConsoleOutput;
017  use Symfony\Component\Process\ProcessBuilder;
018  use Symfony\Component\Process\PhpExecutableFinder;
019   
020  /**
021   * A Shell wraps an Application to add shell capabilities to it.
022   *
023   * Support for history and completion only works with a PHP compiled
024   * with readline support (either --with-readline or --with-libedit)
025   *
026   * @deprecated since version 2.8, to be removed in 3.0.
027   *
028   * @author Fabien Potencier <fabien@symfony.com>
029   * @author Martin Hasoň <martin.hason@gmail.com>
030   */
031  class Shell
032  {
033      private $application;
034      private $history;
035      private $output;
036      private $hasReadline;
037      private $processIsolation = false;
038   
039      /**
040       * Constructor.
041       *
042       * If there is no readline support for the current PHP executable
043       * a \RuntimeException exception is thrown.
044       *
045       * @param Application $application An application instance
046       */
047      public function __construct(Application $application)
048      {
049          @trigger_error('The '.__CLASS__.' class is deprecated since Symfony 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
050   
051          $this->hasReadline = function_exists('readline');
052          $this->application = $application;
053          $this->history = getenv('HOME').'/.history_'.$application->getName();
054          $this->output = new ConsoleOutput();
055      }
056   
057      /**
058       * Runs the shell.
059       */
060      public function run()
061      {
062          $this->application->setAutoExit(false);
063          $this->application->setCatchExceptions(true);
064   
065          if ($this->hasReadline) {
066              readline_read_history($this->history);
067              readline_completion_function(array($this, 'autocompleter'));
068          }
069   
070          $this->output->writeln($this->getHeader());
071          $php = null;
072          if ($this->processIsolation) {
073              $finder = new PhpExecutableFinder();
074              $php = $finder->find();
075              $this->output->writeln(<<<'EOF'
076  <info>Running with process isolation, you should consider this:</info>
077    * each command is executed as separate process,
078    * commands don't support interactivity, all params must be passed explicitly,
079    * commands output is not colorized.
080   
081  EOF
082              );
083          }
084   
085          while (true) {
086              $command = $this->readline();
087   
088              if (false === $command) {
089                  $this->output->writeln("\n");
090   
091                  break;
092              }
093   
094              if ($this->hasReadline) {
095                  readline_add_history($command);
096                  readline_write_history($this->history);
097              }
098   
099              if ($this->processIsolation) {
100                  $pb = new ProcessBuilder();
101   
102                  $process = $pb
103                      ->add($php)
104                      ->add($_SERVER['argv'][0])
105                      ->add($command)
106                      ->inheritEnvironmentVariables(true)
107                      ->getProcess()
108                  ;
109   
110                  $output = $this->output;
111                  $process->run(function ($type, $data) use ($output) {
112                      $output->writeln($data);
113                  });
114   
115                  $ret = $process->getExitCode();
116              } else {
117                  $ret = $this->application->run(new StringInput($command), $this->output);
118              }
119   
120              if (0 !== $ret) {
121                  $this->output->writeln(sprintf('<error>The command terminated with an error status (%s)</error>', $ret));
122              }
123          }
124      }
125   
126      /**
127       * Returns the shell header.
128       *
129       * @return string The header string
130       */
131      protected function getHeader()
132      {
133          return <<<EOF
134   
135  Welcome to the <info>{$this->application->getName()}</info> shell (<comment>{$this->application->getVersion()}</comment>).
136   
137  At the prompt, type <comment>help</comment> for some help,
138  or <comment>list</comment> to get a list of available commands.
139   
140  To exit the shell, type <comment>^D</comment>.
141   
142  EOF;
143   
144      }
145   
146      /**
147       * Renders a prompt.
148       *
149       * @return string The prompt
150       */
151      protected function getPrompt()
152      {
153          // using the formatter here is required when using readline
154          return $this->output->getFormatter()->format($this->application->getName().' > ');
155      }
156   
157      protected function getOutput()
158      {
159          return $this->output;
160      }
161   
162      protected function getApplication()
163      {
164          return $this->application;
165      }
166   
167      /**
168       * Tries to return autocompletion for the current entered text.
169       *
170       * @param string $text The last segment of the entered text
171       *
172       * @return bool|array A list of guessed strings or true
173       */
174      private function autocompleter($text)
175      {
176          $info = readline_info();
177          $text = substr($info['line_buffer'], 0, $info['end']);
178   
179          if ($info['point'] !== $info['end']) {
180              return true;
181          }
182   
183          // task name?
184          if (false === strpos($text, ' ') || !$text) {
185              return array_keys($this->application->all());
186          }
187   
188          // options and arguments?
189          try {
190              $command = $this->application->find(substr($text, 0, strpos($text, ' ')));
191          } catch (\Exception $e) {
192              return true;
193          }
194   
195          $list = array('--help');
196          foreach ($command->getDefinition()->getOptions() as $option) {
197              $list[] = '--'.$option->getName();
198          }
199   
200          return $list;
201      }
202   
203      /**
204       * Reads a single line from standard input.
205       *
206       * @return string The single line from standard input
207       */
208      private function readline()
209      {
210          if ($this->hasReadline) {
211              $line = readline($this->getPrompt());
212          } else {
213              $this->output->write($this->getPrompt());
214              $line = fgets(STDIN, 1024);
215              $line = (false === $line || '' === $line) ? false : rtrim($line);
216          }
217   
218          return $line;
219      }
220   
221      public function getProcessIsolation()
222      {
223          return $this->processIsolation;
224      }
225   
226      public function setProcessIsolation($processIsolation)
227      {
228          $this->processIsolation = (bool) $processIsolation;
229   
230          if ($this->processIsolation && !class_exists('Symfony\\Component\\Process\\Process')) {
231              throw new RuntimeException('Unable to isolate processes as the Symfony Process Component is not installed.');
232          }
233      }
234  }
235