Verzeichnisstruktur phpBB-3.3.15


Veröffentlicht
28.08.2024

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

InstalledVersions.php

Zuletzt modifiziert: 02.04.2025, 15:02 - Dateigröße: 15.76 KiB


001  <?php
002   
003  /*
004   * This file is part of Composer.
005   *
006   * (c) Nils Adermann <naderman@naderman.de>
007   *     Jordi Boggiano <j.boggiano@seld.be>
008   *
009   * For the full copyright and license information, please view the LICENSE
010   * file that was distributed with this source code.
011   */
012   
013  namespace Composer;
014   
015  use Composer\Autoload\ClassLoader;
016  use Composer\Semver\VersionParser;
017   
018  /**
019   * This class is copied in every Composer installed project and available to all
020   *
021   * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
022   *
023   * To require its presence, you can require `composer-runtime-api ^2.0`
024   *
025   * @final
026   */
027  class InstalledVersions
028  {
029      /**
030       * @var mixed[]|null
031       * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
032       */
033      private static $installed;
034   
035      /**
036       * @var bool|null
037       */
038      private static $canGetVendors;
039   
040      /**
041       * @var array[]
042       * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
043       */
044      private static $installedByVendor = array();
045   
046      /**
047       * Returns a list of all package names which are present, either by being installed, replaced or provided
048       *
049       * @return string[]
050       * @psalm-return list<string>
051       */
052      public static function getInstalledPackages()
053      {
054          $packages = array();
055          foreach (self::getInstalled() as $installed) {
056              $packages[] = array_keys($installed['versions']);
057          }
058   
059          if (1 === \count($packages)) {
060              return $packages[0];
061          }
062   
063          return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
064      }
065   
066      /**
067       * Returns a list of all package names with a specific type e.g. 'library'
068       *
069       * @param  string   $type
070       * @return string[]
071       * @psalm-return list<string>
072       */
073      public static function getInstalledPackagesByType($type)
074      {
075          $packagesByType = array();
076   
077          foreach (self::getInstalled() as $installed) {
078              foreach ($installed['versions'] as $name => $package) {
079                  if (isset($package['type']) && $package['type'] === $type) {
080                      $packagesByType[] = $name;
081                  }
082              }
083          }
084   
085          return $packagesByType;
086      }
087   
088      /**
089       * Checks whether the given package is installed
090       *
091       * This also returns true if the package name is provided or replaced by another package
092       *
093       * @param  string $packageName
094       * @param  bool   $includeDevRequirements
095       * @return bool
096       */
097      public static function isInstalled($packageName, $includeDevRequirements = true)
098      {
099          foreach (self::getInstalled() as $installed) {
100              if (isset($installed['versions'][$packageName])) {
101                  return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
102              }
103          }
104   
105          return false;
106      }
107   
108      /**
109       * Checks whether the given package satisfies a version constraint
110       *
111       * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
112       *
113       *   Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
114       *
115       * @param  VersionParser $parser      Install composer/semver to have access to this class and functionality
116       * @param  string        $packageName
117       * @param  string|null   $constraint  A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
118       * @return bool
119       */
120      public static function satisfies(VersionParser $parser, $packageName, $constraint)
121      {
122          $constraint = $parser->parseConstraints((string) $constraint);
123          $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
124   
125          return $provided->matches($constraint);
126      }
127   
128      /**
129       * Returns a version constraint representing all the range(s) which are installed for a given package
130       *
131       * It is easier to use this via isInstalled() with the $constraint argument if you need to check
132       * whether a given version of a package is installed, and not just whether it exists
133       *
134       * @param  string $packageName
135       * @return string Version constraint usable with composer/semver
136       */
137      public static function getVersionRanges($packageName)
138      {
139          foreach (self::getInstalled() as $installed) {
140              if (!isset($installed['versions'][$packageName])) {
141                  continue;
142              }
143   
144              $ranges = array();
145              if (isset($installed['versions'][$packageName]['pretty_version'])) {
146                  $ranges[] = $installed['versions'][$packageName]['pretty_version'];
147              }
148              if (array_key_exists('aliases', $installed['versions'][$packageName])) {
149                  $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
150              }
151              if (array_key_exists('replaced', $installed['versions'][$packageName])) {
152                  $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
153              }
154              if (array_key_exists('provided', $installed['versions'][$packageName])) {
155                  $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
156              }
157   
158              return implode(' || ', $ranges);
159          }
160   
161          throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
162      }
163   
164      /**
165       * @param  string      $packageName
166       * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
167       */
168      public static function getVersion($packageName)
169      {
170          foreach (self::getInstalled() as $installed) {
171              if (!isset($installed['versions'][$packageName])) {
172                  continue;
173              }
174   
175              if (!isset($installed['versions'][$packageName]['version'])) {
176                  return null;
177              }
178   
179              return $installed['versions'][$packageName]['version'];
180          }
181   
182          throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
183      }
184   
185      /**
186       * @param  string      $packageName
187       * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
188       */
189      public static function getPrettyVersion($packageName)
190      {
191          foreach (self::getInstalled() as $installed) {
192              if (!isset($installed['versions'][$packageName])) {
193                  continue;
194              }
195   
196              if (!isset($installed['versions'][$packageName]['pretty_version'])) {
197                  return null;
198              }
199   
200              return $installed['versions'][$packageName]['pretty_version'];
201          }
202   
203          throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
204      }
205   
206      /**
207       * @param  string      $packageName
208       * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
209       */
210      public static function getReference($packageName)
211      {
212          foreach (self::getInstalled() as $installed) {
213              if (!isset($installed['versions'][$packageName])) {
214                  continue;
215              }
216   
217              if (!isset($installed['versions'][$packageName]['reference'])) {
218                  return null;
219              }
220   
221              return $installed['versions'][$packageName]['reference'];
222          }
223   
224          throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
225      }
226   
227      /**
228       * @param  string      $packageName
229       * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
230       */
231      public static function getInstallPath($packageName)
232      {
233          foreach (self::getInstalled() as $installed) {
234              if (!isset($installed['versions'][$packageName])) {
235                  continue;
236              }
237   
238              return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
239          }
240   
241          throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
242      }
243   
244      /**
245       * @return array
246       * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
247       */
248      public static function getRootPackage()
249      {
250          $installed = self::getInstalled();
251   
252          return $installed[0]['root'];
253      }
254   
255      /**
256       * Returns the raw installed.php data for custom implementations
257       *
258       * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
259       * @return array[]
260       * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
261       */
262      public static function getRawData()
263      {
264          @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
265   
266          if (null === self::$installed) {
267              // only require the installed.php file if this file is loaded from its dumped location,
268              // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
269              if (substr(__DIR__, -8, 1) !== 'C') {
270                  self::$installed = include __DIR__ . '/installed.php';
271              } else {
272                  self::$installed = array();
273              }
274          }
275   
276          return self::$installed;
277      }
278   
279      /**
280       * Returns the raw data of all installed.php which are currently loaded for custom implementations
281       *
282       * @return array[]
283       * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
284       */
285      public static function getAllRawData()
286      {
287          return self::getInstalled();
288      }
289   
290      /**
291       * Lets you reload the static array from another file
292       *
293       * This is only useful for complex integrations in which a project needs to use
294       * this class but then also needs to execute another project's autoloader in process,
295       * and wants to ensure both projects have access to their version of installed.php.
296       *
297       * A typical case would be PHPUnit, where it would need to make sure it reads all
298       * the data it needs from this class, then call reload() with
299       * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
300       * the project in which it runs can then also use this class safely, without
301       * interference between PHPUnit's dependencies and the project's dependencies.
302       *
303       * @param  array[] $data A vendor/composer/installed.php data set
304       * @return void
305       *
306       * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
307       */
308      public static function reload($data)
309      {
310          self::$installed = $data;
311          self::$installedByVendor = array();
312      }
313   
314      /**
315       * @return array[]
316       * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
317       */
318      private static function getInstalled()
319      {
320          if (null === self::$canGetVendors) {
321              self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
322          }
323   
324          $installed = array();
325   
326          if (self::$canGetVendors) {
327              foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
328                  if (isset(self::$installedByVendor[$vendorDir])) {
329                      $installed[] = self::$installedByVendor[$vendorDir];
330                  } elseif (is_file($vendorDir.'/composer/installed.php')) {
331                      /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
332                      $required = require $vendorDir.'/composer/installed.php';
333                      $installed[] = self::$installedByVendor[$vendorDir] = $required;
334                      if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
335                          self::$installed = $installed[count($installed) - 1];
336                      }
337                  }
338              }
339          }
340   
341          if (null === self::$installed) {
342              // only require the installed.php file if this file is loaded from its dumped location,
343              // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
344              if (substr(__DIR__, -8, 1) !== 'C') {
345                  /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
346                  $required = require __DIR__ . '/installed.php';
347                  self::$installed = $required;
348              } else {
349                  self::$installed = array();
350              }
351          }
352   
353          if (self::$installed !== array()) {
354              $installed[] = self::$installed;
355          }
356   
357          return $installed;
358      }
359  }
360