Parses a dependency for comparison by drupal_check_incompatibility().
$dependency: A dependency string, for example 'foo (>=8.x-4.5-beta5, 3.x)'.
An associative array with three keys:
Callers should pass this structure to drupal_check_incompatibility().
drupal_check_incompatibility()
protected function parseDependency($dependency) {
// We use named subpatterns and support every op that version_compare
// supports. Also, op is optional and defaults to equals.
$p_op = '(?<operation>!=|==|=|<|<=|>|>=|<>)?';
// Core version is always optional: 8.x-2.x and 2.x is treated the same.
$p_core = '(?:' . preg_quote(DRUPAL_CORE_COMPATIBILITY) . '-)?';
$p_major = '(?<major>\\d+)';
// By setting the minor version to x, branches can be matched.
$p_minor = '(?<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;
}