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

Breadcrumb

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

function VersionParser::normalize

Normalizes a version string to be able to perform comparisons on it.

Parameters

string $version:

?string $fullVersion optional complete version string to give more context:

Return value

string

Throws

\UnexpectedValueException

1 call to VersionParser::normalize()
VersionParser::parseConstraint in vendor/composer/semver/src/VersionParser.php
@phpstan-return non-empty-array<ConstraintInterface>

File

vendor/composer/semver/src/VersionParser.php, line 108

Class

VersionParser
Version parser.

Namespace

Composer\Semver

Code

public function normalize($version, $fullVersion = null) {
    $version = trim((string) $version);
    $origVersion = $version;
    if (null === $fullVersion) {
        $fullVersion = $version;
    }
    // strip off aliasing
    if (preg_match('{^([^,\\s]++) ++as ++([^,\\s]++)$}', $version, $match)) {
        $version = $match[1];
    }
    // strip off stability flag
    if (preg_match('{@(?:' . self::$stabilitiesRegex . ')$}i', $version, $match)) {
        $version = substr($version, 0, strlen($version) - strlen($match[0]));
    }
    // normalize master/trunk/default branches to dev-name for BC with 1.x as these used to be valid constraints
    if (\in_array($version, array(
        'master',
        'trunk',
        'default',
    ), true)) {
        $version = 'dev-' . $version;
    }
    // if requirement is branch-like, use full name
    if (stripos($version, 'dev-') === 0) {
        return 'dev-' . substr($version, 4);
    }
    // strip off build metadata
    if (preg_match('{^([^,\\s+]++)\\+[^\\s]++$}', $version, $match)) {
        $version = $match[1];
    }
    // match classical versioning
    if (preg_match('{^v?(\\d{1,5}+)(\\.\\d++)?(\\.\\d++)?(\\.\\d++)?' . self::$modifierRegex . '$}i', $version, $matches)) {
        $version = $matches[1] . (!empty($matches[2]) ? $matches[2] : '.0') . (!empty($matches[3]) ? $matches[3] : '.0') . (!empty($matches[4]) ? $matches[4] : '.0');
        $index = 5;
        // match date(time) based versioning
    }
    elseif (preg_match('{^v?(\\d{4}(?:[.:-]?\\d{2}){1,6}(?:[.:-]?\\d{1,3}){0,2})' . self::$modifierRegex . '$}i', $version, $matches)) {
        $version = (string) preg_replace('{\\D}', '.', $matches[1]);
        $index = 2;
    }
    // add version modifiers if a version was matched
    if (isset($index)) {
        if (!empty($matches[$index])) {
            if ('stable' === $matches[$index]) {
                return $version;
            }
            $version .= '-' . $this->expandStability($matches[$index]) . (isset($matches[$index + 1]) && '' !== $matches[$index + 1] ? ltrim($matches[$index + 1], '.-') : '');
        }
        if (!empty($matches[$index + 2])) {
            $version .= '-dev';
        }
        return $version;
    }
    // match dev branches
    if (preg_match('{(.*?)[.-]?dev$}i', $version, $match)) {
        try {
            $normalized = $this->normalizeBranch($match[1]);
            // a branch ending with -dev is only valid if it is numeric
            // if it gets prefixed with dev- it means the branch name should
            // have had a dev- prefix already when passed to normalize
            if (strpos($normalized, 'dev-') === false) {
                return $normalized;
            }
        } catch (\Exception $e) {
        }
    }
    $extraMessage = '';
    if (preg_match('{ +as +' . preg_quote($version) . '(?:@(?:' . self::$stabilitiesRegex . '))?$}', $fullVersion)) {
        $extraMessage = ' in "' . $fullVersion . '", the alias must be an exact version';
    }
    elseif (preg_match('{^' . preg_quote($version) . '(?:@(?:' . self::$stabilitiesRegex . '))? +as +}', $fullVersion)) {
        $extraMessage = ' in "' . $fullVersion . '", the alias source must be an exact version, if it is a branch name you should prefix it with dev-';
    }
    throw new \UnexpectedValueException('Invalid version string "' . $origVersion . '"' . $extraMessage);
}

API Navigation

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