1<?php
2
3/*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Symfony\Component\Console;
13
14use Symfony\Component\Console\Command\Command;
15use Symfony\Component\Console\Input\InputInterface;
16use Symfony\Component\Console\Output\OutputInterface;
17
18/**
19 * @author Grégoire Pineau <lyrixx@lyrixx.info>
20 */
21class SingleCommandApplication extends Command
22{
23    private $version = 'UNKNOWN';
24    private $autoExit = true;
25    private $running = false;
26
27    /**
28     * @return $this
29     */
30    public function setVersion(string $version): self
31    {
32        $this->version = $version;
33
34        return $this;
35    }
36
37    /**
38     * @final
39     *
40     * @return $this
41     */
42    public function setAutoExit(bool $autoExit): self
43    {
44        $this->autoExit = $autoExit;
45
46        return $this;
47    }
48
49    public function run(InputInterface $input = null, OutputInterface $output = null): int
50    {
51        if ($this->running) {
52            return parent::run($input, $output);
53        }
54
55        // We use the command name as the application name
56        $application = new Application($this->getName() ?: 'UNKNOWN', $this->version);
57        $application->setAutoExit($this->autoExit);
58        // Fix the usage of the command displayed with "--help"
59        $this->setName($_SERVER['argv'][0]);
60        $application->add($this);
61        $application->setDefaultCommand($this->getName(), true);
62
63        $this->running = true;
64        try {
65            $ret = $application->run($input, $output);
66        } finally {
67            $this->running = false;
68        }
69
70        return $ret ?? 1;
71    }
72}
73