Mercurial > hg > isophonics-drupal-site
diff vendor/webflo/drupal-finder/src/DrupalFinder.php @ 18:af1871eacc83
Update to Drupal core 8.7.1
author | Chris Cannam |
---|---|
date | Thu, 09 May 2019 15:33:08 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/webflo/drupal-finder/src/DrupalFinder.php Thu May 09 15:33:08 2019 +0100 @@ -0,0 +1,169 @@ +<?php + +/** + * @file + * Contains \DrupalFinder\DrupalFinder. + */ + +namespace DrupalFinder; + +class DrupalFinder +{ + /** + * Drupal web public directory. + * + * @var string + */ + private $drupalRoot; + + /** + * Drupal package composer directory. + * + * @var bool + */ + private $composerRoot; + + /** + * Composer vendor directory. + * + * @var string + * + * @see https://getcomposer.org/doc/06-config.md#vendor-dir + */ + private $vendorDir; + + public function locateRoot($start_path) + { + $this->drupalRoot = false; + $this->composerRoot = false; + $this->vendorDir = false; + + foreach (array(true, false) as $follow_symlinks) { + $path = $start_path; + if ($follow_symlinks && is_link($path)) { + $path = realpath($path); + } + // Check the start path. + if ($this->isValidRoot($path)) { + return true; + } else { + // Move up dir by dir and check each. + while ($path = $this->shiftPathUp($path)) { + if ($follow_symlinks && is_link($path)) { + $path = realpath($path); + } + if ($this->isValidRoot($path)) { + return true; + } + } + } + } + + return false; + } + + /** + * Returns parent directory. + * + * @param string + * Path to start from + * + * @return string|false + * Parent path of given path or false when $path is filesystem root + */ + private function shiftPathUp($path) + { + $parent = dirname($path); + + return in_array($parent, ['.', $path]) ? false : $parent; + } + + /** + * @param $path + * + * @return bool + */ + protected function isValidRoot($path) + { + if (!empty($path) && is_dir($path) && file_exists($path . '/autoload.php') && file_exists($path . '/' . $this->getComposerFileName())) { + // Additional check for the presence of core/composer.json to + // grant it is not a Drupal 7 site with a base folder named "core". + $candidate = 'core/includes/common.inc'; + if (file_exists($path . '/' . $candidate) && file_exists($path . '/core/core.services.yml')) { + if (file_exists($path . '/core/misc/drupal.js') || file_exists($path . '/core/assets/js/drupal.js')) { + $this->composerRoot = $path; + $this->drupalRoot = $path; + $this->vendorDir = $this->composerRoot . '/vendor'; + } + } + } + if (!empty($path) && is_dir($path) && file_exists($path . '/' . $this->getComposerFileName())) { + $json = json_decode( + file_get_contents($path . '/' . $this->getComposerFileName()), + true + ); + if (is_array($json)) { + if (isset($json['extra']['installer-paths']) && is_array($json['extra']['installer-paths'])) { + foreach ($json['extra']['installer-paths'] as $install_path => $items) { + if (in_array('type:drupal-core', $items) || + in_array('drupal/core', $items) || + in_array('drupal/drupal', $items)) { + $this->composerRoot = $path; + // @todo: Remove this magic and detect the major version instead. + if ($install_path == 'core') { + $install_path = null; + } elseif (substr($install_path, -5) == '/core') { + $install_path = substr($install_path, 0, -5); + } + $this->drupalRoot = rtrim($path . '/' . $install_path, '/'); + $this->vendorDir = $this->composerRoot . '/vendor'; + } + } + } + } + } + if ($this->composerRoot && file_exists($this->composerRoot . '/' . $this->getComposerFileName())) { + $json = json_decode( + file_get_contents($path . '/' . $this->getComposerFileName()), + true + ); + if (is_array($json) && isset($json['config']['vendor-dir'])) { + $this->vendorDir = $this->composerRoot . '/' . $json['config']['vendor-dir']; + } + } + + return $this->drupalRoot && $this->composerRoot && $this->vendorDir; + } + + /** + * @return string + */ + public function getDrupalRoot() + { + return $this->drupalRoot; + } + + /** + * @return string + */ + public function getComposerRoot() + { + return $this->composerRoot; + } + + /** + * @return string + */ + protected function getComposerFileName() + { + return trim(getenv('COMPOSER')) ?: 'composer.json'; + } + + /** + * @return string + */ + public function getVendorDir() + { + return $this->vendorDir; + } +}