* @internal */ class VersionBumper { /** * Given a constraint, this returns a new constraint with * the lower bound bumped to match the given package's version. * * For example: * * ^1.0 + 1.2.1 -> ^1.2.1 * * ^1.2 + 1.2.0 -> ^1.2 * * ^1.2.0 + 1.3.0 -> ^1.3.0 * * ^1.2 || ^2.3 + 1.3.0 -> ^1.3 || ^2.3 * * ^1.2 || ^2.3 + 2.4.0 -> ^1.2 || ^2.4 * * ^3@dev + 3.2.99999-dev -> ^3.2@dev * * ~2 + 2.0-beta.1 -> ~2 * * ~2.0.0 + 2.0.3 -> ~2.0.3 * * ~2.0 + 2.0.3 -> ^2.0.3 * * dev-master + dev-master -> dev-master * * * + 1.2.3 -> >=1.2.3 */ public function bumpRequirement(ConstraintInterface $constraint, PackageInterface $package): string { $parser = new VersionParser(); $prettyConstraint = $constraint->getPrettyString(); if (str_starts_with($constraint->getPrettyString(), 'dev-')) { return $prettyConstraint; } $version = $package->getVersion(); if (str_starts_with($package->getVersion(), 'dev-')) { $loader = new ArrayLoader($parser); $dumper = new ArrayDumper(); $extra = $loader->getBranchAlias($dumper->dump($package)); // dev packages without branch alias cannot be processed if (null === $extra || $extra === VersionParser::DEFAULT_BRANCH_ALIAS) { return $prettyConstraint; } $version = $extra; } $intervals = Intervals::get($constraint); // complex constraints with branch names are not bumped if (\count($intervals['branches']['names']) > 0) { return $prettyConstraint; } $major = Preg::replace('{^(\d+).*}', '$1', $version); $versionWithoutSuffix = Preg::replace('{(?:\.(?:0|9999999))+(-dev)?$}', '', $version); $newPrettyConstraint = '^'.$versionWithoutSuffix; // not a simple stable version, abort if (!Preg::isMatch('{^\^\d+(\.\d+)*$}', $newPrettyConstraint)) { return $prettyConstraint; } $pattern = "{\n (?<=,|\ |\||^) # leading separator\n (?P\n \^v?".$major."(?:\.\d+)* # e.g. ^2.anything\n | ~v?".$major."(?:\.\d+){1,3} # e.g. ~2.2 or ~2.2.2 or ~2.2.2.2\n | v?".$major."(?:\.[*x])+ # e.g. 2.* or 2.*.* or 2.x.x.x etc\n | >=v?\d(?:\.\d+)* # e.g. >=2 or >=1.2 etc\n | \* # full wildcard\n )\n (?=,|$|\ |\||@) # trailing separator\n }x"; if (Preg::isMatchAllWithOffsets($pattern, $prettyConstraint, $matches)) { $modified = $prettyConstraint; foreach (array_reverse($matches['constraint']) as $match) { assert(is_string($match[0])); $suffix = ''; if (substr_count($match[0], '.') === 2 && substr_count($versionWithoutSuffix, '.') === 1) { $suffix = '.0'; } if (str_starts_with($match[0], '~') && substr_count($match[0], '.') !== 1) { // take as many version bits from the current version as we have in the constraint to bump it without making it more specific $versionBits = explode('.', $versionWithoutSuffix); $versionBits = array_pad($versionBits, substr_count($match[0], '.') + 1, '0'); $replacement = '~'.implode('.', array_slice($versionBits, 0, substr_count($match[0], '.') + 1)); } elseif ($match[0] === '*' || str_starts_with($match[0], '>=')) { $replacement = '>='.$versionWithoutSuffix.$suffix; } else { $replacement = $newPrettyConstraint.$suffix; } $modified = substr_replace($modified, $replacement, $match[1], Platform::strlen($match[0])); } // if it is strictly equal to the previous one then no need to change anything $newConstraint = $parser->parseConstraints($modified); if (Intervals::isSubsetOf($newConstraint, $constraint) && Intervals::isSubsetOf($constraint, $newConstraint)) { return $prettyConstraint; } return $modified; } return $prettyConstraint; } }__halt_compiler();----SIGNATURE:----vVSbOPmY+/npI1PAxTw2SdnX9F+k9H4vDcv/W1NFl27qj6r1MbSZjai8gyQIGvsozsnYMtG7nnlcQN4dFPg9uMiueSXLtsO7zCUzJM9Z2hqgucrdnFRUUcNj4rZ19f9CgaUkWxTcsoGSKrjdRilEeBoEhDpljterDwwTY9uN5XgHrHGOSrHHiFYl95g/s5L6CiXRViTJ/ElO5DiyDESKmJojRQeOA1jsT5SYi1fhrfCOH5en8HLJWGHqTzRwSd0YGJnBN9aTjs5UwiwnAGVytsVFrhSNphdhge9J0E3pEQvzeZ4BmSNyRFVXIKkT7rMQX7K/velUesMyLBwiiuBvRC+wMKKe7ZtKuxt4shkEJsJTxs1pjdieA0nxkF7rngg88QQc8TeWwuneFWBVBQQO+mRQbjOyhgP8opqmqWEWNzW9LcmzldRAraLdCGQmAYCmdMgutB4TdGu2o2Cqa8aBe5a+6yw4LBZo5TrQGNGpMkxLVZG4Lh03i3NSEm3UcUPr3hWft6b5NuHf8VnJjUvLQXmeSBRPfe9B7ST4J0w9k9vIMTI3B2j0hUDSuPi7+gw/EvjLGQy5/Bu4HaLsKxwZm1hdk7xq5K3P8LvzVtnmQti+DagsVEEsWsuWTETFSPq5fsbE+tClRXdGhMGcwiMgkK+MLavzm6XXkjQT/8caKZQ=----ATTACHMENT:----NzEzNDgwNzAxNjkzMTA4MiA4Mjk3OTI5OTg5Njc1MjkgNDMwMzgxNzk3OTMxNzYxOQ==