You are here

private function ModuleBuildDependencies::drupalParseDependency in X Autoload 7.5

Parameters

$dependency:

Return value

array

See also

drupal_parse_dependency()

1 call to ModuleBuildDependencies::drupalParseDependency()
ModuleBuildDependencies::moduleBuildDependencies in tests/src/VirtualDrupal/ModuleBuildDependencies.php

File

tests/src/VirtualDrupal/ModuleBuildDependencies.php, line 151

Class

ModuleBuildDependencies

Namespace

Drupal\xautoload\Tests\VirtualDrupal

Code

private function drupalParseDependency($dependency) {

  // We use named subpatterns and support every op that version_compare
  // supports. Also, op is optional and defaults to equals.
  $p_op = '(?P<operation>!=|==|=|<|<=|>|>=|<>)?';

  // Core version is always optional: 7.x-2.x and 2.x is treated the same.
  $p_core = '(?:' . preg_quote('7.x') . '-)?';
  $p_major = '(?P<major>\\d+)';

  // By setting the minor version to x, branches can be matched.
  $p_minor = '(?P<minor>(?:\\d+|x)(?:-[A-Za-z]+\\d+)?)';
  $value = array();
  $parts = explode('(', $dependency, 2);
  $value['name'] = trim($parts[0]);
  if (isset($parts[1])) {
    $value['original_version'] = ' (' . $parts[1];
    foreach (explode(',', $parts[1]) as $version) {
      if (preg_match("/^\\s*{$p_op}\\s*{$p_core}{$p_major}\\.{$p_minor}/", $version, $matches)) {
        $op = !empty($matches['operation']) ? $matches['operation'] : '=';
        if ($matches['minor'] == 'x') {

          // Drupal considers "2.x" to mean any version that begins with
          // "2" (e.g. 2.0, 2.9 are all "2.x"). PHP's version_compare(),
          // on the other hand, treats "x" as a string; so to
          // version_compare(), "2.x" is considered less than 2.0. This
          // means that >=2.x and <2.x are handled by version_compare()
          // as we need, but > and <= are not.
          if ($op == '>' || $op == '<=') {
            $matches['major']++;
          }

          // Equivalence can be checked by adding two restrictions.
          if ($op == '=' || $op == '==') {
            $value['versions'][] = array(
              'op' => '<',
              'version' => $matches['major'] + 1 . '.x',
            );
            $op = '>=';
          }
        }
        $value['versions'][] = array(
          'op' => $op,
          'version' => $matches['major'] . '.' . $matches['minor'],
        );
      }
    }
  }
  return $value;
}