VersionPress\Utils\QueryLanguageUtils::createGitLogQueryFromRule PHP Method

createGitLogQueryFromRule() public static method

Converts rule (array) to query string to be used as an argument for git log.
public static createGitLogQueryFromRule ( $rawRule ) : string
$rawRule array
return string
    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;
    }

Usage Example

Exemplo n.º 1
0
 public function shouldUpdate(WP_REST_Request $request)
 {
     global $versionPressContainer;
     /** @var GitRepository $repository */
     $repository = $versionPressContainer->resolve(VersionPressServices::GIT_REPOSITORY);
     $latestCommit = $request['latestCommit'];
     $query = urldecode(stripslashes($request['query']));
     $rules = QueryLanguageUtils::createRulesFromQueries([$query]);
     $gitLogQuery = !empty($rules) ? QueryLanguageUtils::createGitLogQueryFromRule($rules[0]) : '';
     $repoLatestCommit = $repository->getLastCommitHash($gitLogQuery);
     return new WP_REST_Response(["update" => $repository->wasCreatedAfter($repoLatestCommit, $latestCommit), "cleanWorkingDirectory" => $repository->isCleanWorkingDirectory()]);
 }
All Usage Examples Of VersionPress\Utils\QueryLanguageUtils::createGitLogQueryFromRule