public static function createGitLogQueryFromRule($rawRule)
{
$query = '-i --all-match';
$rule = [];
foreach ($rawRule as $key => $array) {
$escapedKey = self::escapeGitLogArgument($key);
$rule[$escapedKey] = $key === 'date' ? $rule[$escapedKey] = $array : array_map([QueryLanguageUtils::class, 'escapeGitLogArgument'], $array);
}
if (!empty($rule['author'])) {
foreach ($rule['author'] as $value) {
// name and email
if (strpos($value, '@') && strpos($value, '<')) {
$query .= ' --author="^' . $value . '$"';
} else {
if (strpos($value, '@')) {
$query .= ' --author="^.* <' . $value . '>$"';
} else {
$query .= ' --author="^' . $value . ' <.*>$"';
}
}
}
}
if (!empty($rule['date'])) {
foreach ($rule['date'] as $value) {
$val = preg_replace('/\\s+/', '', $value);
$bounds = explode('..', $val);
if (count($bounds) > 1) {
if ($bounds[0] !== '*') {
$query .= ' --after=' . date('Y-m-d', strtotime($bounds[0] . ' -1 day'));
}
if ($bounds[1] !== '*') {
$query .= ' --before=' . date('Y-m-d', strtotime($bounds[1] . ' +1 day'));
}
continue;
}
if (in_array($op = substr($val, 0, 2), ['<=', '>='])) {
$date = substr($val, 2);
} else {
if (in_array($op = substr($val, 0, 1), ['<', '>'])) {
$date = substr($val, 1);
} else {
$op = '';
$date = $val;
}
}
if ($op === '>=') {
$query .= ' --after=' . date('Y-m-d', strtotime($date . ' -1 day'));
} else {
if ($op === '>') {
$query .= ' --after=' . date('Y-m-d', strtotime($date));
} else {
if ($op === '<=') {
$query .= ' --before=' . date('Y-m-d', strtotime($date));
} else {
if ($op === '<') {
$query .= ' --before=' . date('Y-m-d', strtotime($date . '-1 day'));
} else {
$query .= ' --after=' . date('Y-m-d', strtotime($date . ' -1 day'));
$query .= ' --before=' . date('Y-m-d', strtotime($date));
}
}
}
}
}
}
if (!empty($rule['before'])) {
foreach ($rule['before'] as $value) {
$query .= ' --before=' . date('Y-m-d', strtotime($value));
}
}
if (!empty($rule['after'])) {
foreach ($rule['after'] as $value) {
$query .= ' --after=' . date('Y-m-d', strtotime($value));
}
}
if (!empty($rule['action']) || !empty($rule['vp-action'])) {
$vpAction = [];
if (!empty($rule['action'])) {
$action = array_filter($rule['action'], function ($val) {
return strpos($val, '/') === false;
});
$vpAction = array_diff($rule['action'], $action);
}
if (!empty($rule['vp-action'])) {
$vpAction = array_merge($vpAction, $rule['vp-action']);
}
if (!empty($vpAction)) {
$query .= ' --grep="^VP-Action: \\(' . implode('\\|', $vpAction) . '\\)\\(/.*\\)\\?$"';
}
}
$scope = array_merge(!empty($rule['entity']) ? $rule['entity'] : [], !empty($rule['scope']) ? $rule['scope'] : []);
if (!empty($scope) || !empty($action) || !empty($rule['vpid'])) {
$query .= ' --grep="^VP-Action: ' . (empty($scope) ? '.*' : '\\(' . implode('\\|', $scope) . '\\)') . '/' . (empty($action) ? '.*' : '\\(' . implode('\\|', $action) . '\\)') . (empty($rule['vpid']) ? '\\(/.*\\)\\?' : '/\\(' . implode('\\|', $rule['vpid']) . '\\)') . '$"';
}
if (!empty($rule['text'])) {
foreach ($rule['text'] as $value) {
$query .= ' --grep="' . $value . '"';
}
}
foreach ($rule as $key => $values) {
if (in_array($key, ['author', 'date', 'before', 'after', 'entity', 'scope', 'vp-action', 'action', 'vpid', 'text'])) {
continue;
}
if (substr($key, 0, 5) === 'x-vp-') {
$prefix = '';
} else {
if (substr($key, 0, 3) === 'vp-') {
$prefix = '\\(X-\\)\\?';
} else {
$prefix = '\\(X-VP-\\|VP-\\)';
}
}
$query .= ' --grep="^' . $prefix . $key . ': \\(' . implode('\\|', $values) . '\\)$"';
}
return $query;
}