Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. ExecutableFinder.php

class ExecutableFinder

Same name in this branch
  1. 11.1.x vendor/php-tuf/composer-stager/src/Internal/Finder/Service/ExecutableFinder.php \PhpTuf\ComposerStager\Internal\Finder\Service\ExecutableFinder
  2. 11.1.x core/modules/package_manager/src/ExecutableFinder.php \Drupal\package_manager\ExecutableFinder

Generic executable finder.

@author Fabien Potencier <fabien@symfony.com> @author Johannes M. Schmitt <schmittjoh@gmail.com>

Hierarchy

  • class \Symfony\Component\Process\ExecutableFinder

Expanded class hierarchy of ExecutableFinder

8 files declare their use of ExecutableFinder
DiagnoseCommand.php in vendor/composer/composer/src/Composer/Command/DiagnoseCommand.php
EventDispatcher.php in vendor/composer/composer/src/Composer/EventDispatcher/EventDispatcher.php
ExecutableFinder.php in vendor/php-tuf/composer-stager/src/Internal/Finder/Service/ExecutableFinder.php
HhvmDetector.php in vendor/composer/composer/src/Composer/Platform/HhvmDetector.php
InitCommand.php in vendor/composer/composer/src/Composer/Command/InitCommand.php

... See full list

File

vendor/symfony/process/ExecutableFinder.php, line 20

Namespace

Symfony\Component\Process
View source
class ExecutableFinder {
    private const CMD_BUILTINS = [
        'assoc',
        'break',
        'call',
        'cd',
        'chdir',
        'cls',
        'color',
        'copy',
        'date',
        'del',
        'dir',
        'echo',
        'endlocal',
        'erase',
        'exit',
        'for',
        'ftype',
        'goto',
        'help',
        'if',
        'label',
        'md',
        'mkdir',
        'mklink',
        'move',
        'path',
        'pause',
        'popd',
        'prompt',
        'pushd',
        'rd',
        'rem',
        'ren',
        'rename',
        'rmdir',
        'set',
        'setlocal',
        'shift',
        'start',
        'time',
        'title',
        'type',
        'ver',
        'vol',
    ];
    private array $suffixes = [];
    
    /**
     * Replaces default suffixes of executable.
     */
    public function setSuffixes(array $suffixes) : void {
        $this->suffixes = $suffixes;
    }
    
    /**
     * Adds new possible suffix to check for executable, including the dot (.).
     *
     *     $finder = new ExecutableFinder();
     *     $finder->addSuffix('.foo');
     */
    public function addSuffix(string $suffix) : void {
        $this->suffixes[] = $suffix;
    }
    
    /**
     * Finds an executable by name.
     *
     * @param string      $name      The executable name (without the extension)
     * @param string|null $default   The default to return if no executable is found
     * @param array       $extraDirs Additional dirs to check into
     */
    public function find(string $name, ?string $default = null, array $extraDirs = []) : ?string {
        // windows built-in commands that are present in cmd.exe should not be resolved using PATH as they do not exist as exes
        if ('\\' === \DIRECTORY_SEPARATOR && \in_array(strtolower($name), self::CMD_BUILTINS, true)) {
            return $name;
        }
        $dirs = array_merge(explode(\PATH_SEPARATOR, getenv('PATH') ?: getenv('Path')), $extraDirs);
        $suffixes = $this->suffixes;
        if ('\\' === \DIRECTORY_SEPARATOR) {
            $pathExt = getenv('PATHEXT');
            $suffixes = array_merge($suffixes, $pathExt ? explode(\PATH_SEPARATOR, $pathExt) : [
                '.exe',
                '.bat',
                '.cmd',
                '.com',
            ]);
        }
        $suffixes = '' !== pathinfo($name, PATHINFO_EXTENSION) ? array_merge([
            '',
        ], $suffixes) : array_merge($suffixes, [
            '',
        ]);
        foreach ($suffixes as $suffix) {
            foreach ($dirs as $dir) {
                if ('' === $dir) {
                    $dir = '.';
                }
                if (@is_file($file = $dir . \DIRECTORY_SEPARATOR . $name . $suffix) && ('\\' === \DIRECTORY_SEPARATOR || @is_executable($file))) {
                    return $file;
                }
                if (!@is_dir($dir) && basename($dir) === $name . $suffix && @is_executable($dir)) {
                    return $dir;
                }
            }
        }
        if ('\\' === \DIRECTORY_SEPARATOR || !\function_exists('exec') || \strlen($name) !== strcspn($name, '/' . \DIRECTORY_SEPARATOR)) {
            return $default;
        }
        $execResult = exec('command -v -- ' . escapeshellarg($name));
        if (($executablePath = substr($execResult, 0, strpos($execResult, \PHP_EOL) ?: null)) && @is_executable($executablePath)) {
            return $executablePath;
        }
        return $default;
    }

}

Members

Title Sort descending Modifiers Object type Summary
ExecutableFinder::$suffixes private property
ExecutableFinder::addSuffix public function Adds new possible suffix to check for executable, including the dot (.).
ExecutableFinder::CMD_BUILTINS private constant
ExecutableFinder::find public function Finds an executable by name.
ExecutableFinder::setSuffixes public function Replaces default suffixes of executable.

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal