PATH:
home
/
lab2454c
/
vaultchip.com
/
vendor
/
wikimedia
/
composer-merge-plugin
/
src
<?php /** * This file is part of the Composer Merge plugin. * * Copyright (C) 2021 Bryan Davis, Wikimedia Foundation, and contributors * * This software may be modified and distributed under the terms of the MIT * license. See the LICENSE file for details. */ namespace Wikimedia\Composer\Merge\V2; use Composer\Semver\Constraint\EmptyConstraint; use Composer\Semver\Constraint\MultiConstraint as SemverMultiConstraint; /** * Adapted from Composer's v2 MultiConstraint::create for Composer v1 * @link https://github.com/composer/semver/blob/3.2.4/src/Constraint/MultiConstraint.php * @author Chauncey McAskill <chauncey@mcaskill.ca> */ class MultiConstraint extends SemverMultiConstraint { /** * Tries to optimize the constraints as much as possible, meaning * reducing/collapsing congruent constraints etc. * Does not necessarily return a MultiConstraint instance if * things can be reduced to a simple constraint * * @param ConstraintInterface[] $constraints A set of constraints * @param bool $conjunctive Whether the constraints should be treated as conjunctive or disjunctive * * @return ConstraintInterface */ public static function create(array $constraints, $conjunctive = true) { if (\count($constraints) === 0) { return new EmptyConstraint(); } if (\count($constraints) === 1) { return $constraints[0]; } $optimized = self::optimizeConstraints($constraints, $conjunctive); if ($optimized !== null) { list($constraints, $conjunctive) = $optimized; if (\count($constraints) === 1) { return $constraints[0]; } } return new self($constraints, $conjunctive); } /** * @return array|null */ private static function optimizeConstraints(array $constraints, $conjunctive) { // parse the two OR groups and if they are contiguous we collapse // them into one constraint // [>= 1 < 2] || [>= 2 < 3] || [>= 3 < 4] => [>= 1 < 4] if (!$conjunctive) { $left = $constraints[0]; $mergedConstraints = array(); $optimized = false; for ($i = 1, $l = \count($constraints); $i < $l; $i++) { $right = $constraints[$i]; if ($left instanceof SemverMultiConstraint && $left->conjunctive && $right instanceof SemverMultiConstraint && $right->conjunctive && \count($left->constraints) === 2 && \count($right->constraints) === 2 && ($left0 = (string) $left->constraints[0]) && $left0[0] === '>' && $left0[1] === '=' && ($left1 = (string) $left->constraints[1]) && $left1[0] === '<' && ($right0 = (string) $right->constraints[0]) && $right0[0] === '>' && $right0[1] === '=' && ($right1 = (string) $right->constraints[1]) && $right1[0] === '<' && substr($left1, 2) === substr($right0, 3) ) { $optimized = true; $left = new MultiConstraint( array( $left->constraints[0], $right->constraints[1], ), true ); } else { $mergedConstraints[] = $left; $left = $right; } } if ($optimized) { $mergedConstraints[] = $left; return array($mergedConstraints, false); } } // TODO: Here's the place to put more optimizations return null; } } // vim:sw=4:ts=4:sts=4:et:
[-] ExtraPackage.php
[edit]
[+]
..
[-] MultiConstraint.php
[edit]
[-] MergePlugin.php
[edit]
[-] NestedArray.php
[edit]
[-] Logger.php
[edit]
[-] StabilityFlags.php
[edit]
[-] PluginState.php
[edit]
[-] MissingFileException.php
[edit]