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

Breadcrumb

  1. Drupal Core 11.1.x

Path.php

Same filename in this branch
  1. 11.1.x vendor/symfony/filesystem/Path.php

Namespace

PhpTuf\ComposerStager\Internal\Path\Value

File

vendor/php-tuf/composer-stager/src/Internal/Path/Value/Path.php

View source
<?php

declare (strict_types=1);
namespace PhpTuf\ComposerStager\Internal\Path\Value;

use PhpTuf\ComposerStager\API\Path\Value\PathInterface;
use PhpTuf\ComposerStager\Internal\Path\Service\PathHelperInterface;

/**
 * @package Path
 *
 * @internal Don't depend directly on this class. It may be changed or removed at any time without notice.
 */
final class Path implements PathInterface {
    private string $basePathAbsolute;
    
    /**
     * @param string $path
     *   The path string may be absolute or relative to the current working
     *   directory as returned by `getcwd()` at runtime, e.g., "/var/www/example"
     *   or "example". Nothing needs to actually exist at the path.
     * @param \PhpTuf\ComposerStager\API\Path\Value\PathInterface|null $basePath
     *   Optionally override the base path used for relative paths.
     *   Nothing needs to actually exist at the path. Therefore, it is simply
     *   assumed to represent a directory, as opposed to a file--even if
     *   it has an extension, which is no guarantee of type.
     */
    public function __construct(PathHelperInterface $pathHelper, string $path, ?PathInterface $basePath = null) {
        // Especially since it accepts relative paths, an immutable path value
        // object should be immune to environmental details like the current
        // working directory. Cache the CWD at time of creation.
        $this->basePathAbsolute = $basePath instanceof PathInterface ? $basePath->absolute() : $this->getcwd();
    }
    public function absolute() : string {
        return $this->doAbsolute($this->basePathAbsolute);
    }
    public function isAbsolute() : bool {
        if ($this->hasProtocol($this->path)) {
            return true;
        }
        return $this->pathHelper
            ->isAbsolute($this->path);
    }
    public function isRelative() : bool {
        return !$this->isAbsolute();
    }
    public function relative(PathInterface $basePath) : string {
        $basePathAbsolute = $basePath->absolute();
        return $this->doAbsolute($basePathAbsolute);
    }
    
    /**
     * In order to avoid class dependencies, PHP's internal getcwd() function is
     * called directly here.
     */
    private function getcwd() : string {
        // It is technically possible for getcwd() to fail and return false. (For
        // example, on some Unix variants, this check will fail if any one of the
        // parent directories does not have the readable or search mode set, even
        // if the current directory does.) But the likelihood is probably so slight
        // that it hardly seems worth cluttering up client code handling theoretical
        // IO exceptions. Instead, fall back to a non-existent path in the temporary
        // directory to avoid throwing errors or operating on unintended directories.
        $getcwd = getcwd();
        if ($getcwd === false) {
            return sys_get_temp_dir() . '/composer-stager/error-' . md5(microtime());
        }
        return $getcwd;
    }
    private function doAbsolute(string $basePathAbsolute) : string {
        if ($this->hasProtocol($this->path)) {
            return $this->getProtocol($this->path) . $this->pathHelper
                ->canonicalize($this->stripProtocol($this->path));
        }
        if ($this->pathHelper
            ->isAbsolute($this->pathHelper
            ->canonicalize($this->path))) {
            return $this->pathHelper
                ->canonicalize($this->path);
        }
        if ($this->hasProtocol($this->basePathAbsolute)) {
            return rtrim($this->basePathAbsolute, '/') . '/' . $this->pathHelper
                ->canonicalize($this->path);
        }
        return $this->pathHelper
            ->canonicalize($basePathAbsolute . '/' . $this->path);
    }
    private function hasProtocol(string $path) : bool {
        return $this->getProtocol($path) !== '';
    }
    private function stripProtocol(string $path) : string {
        return substr($path, strlen($this->getProtocol($path)));
    }
    private function getProtocol(string $path) : string {
        preg_match('#^[a-zA-Z]+:/{2,3}#', $path, $matches);
        return $matches[0] ?? '';
    }

}

Classes

Title Deprecated Summary
Path @package Path

API Navigation

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