For example if there are 1000 commits, 25 per page and you are on page 10,
it returns 0,7,8,9,10,11,12,13,20,29,39.
The algorithm is from VisualPaginator component for Nette Framework.
public getPrettySteps ( $currentPage ) : array | ||
$currentPage | ||
return | array |
} $isEnabled = $isChildOfInitialCommit || $canRollbackToThisCommit || $commit->getHash() === $initialCommitHash; $message = $changeInfo->getChangeDescription(); echo "\n <tr class=\"post-1 type-post status-publish format-standard hentry category-uncategorized\n alternate level-0" . ($isEnabled ? "" : " disabled") . "\">\n <td title=\"{$commitDate}\">{$commit->getRelativeDate()}</td>\n <td>{$message}</td>\n <td style=\"text-align: right\">\n {$versioningSnippet}\n </td>\n </tr>"; if ($commit->getHash() === $initialCommitHash && $key < count($commits) - 1) { echo $disabledCommitsMessage; } $isFirstCommit = false; } ?> </tbody> <tfoot> <tr> <td colspan="3"> <?php $pageNumbers = $gitLogPaginator->getPrettySteps($page); $i = 0; $links = ""; $lastNumber = 0; foreach ($pageNumbers as $pageNumber) { $divider = ""; if ($i > 0 && $lastNumber != $pageNumber - 1) { $divider = "…"; } elseif ($i > 0) { $divider = "|"; } $links .= " " . $divider . " "; $pageUrl = add_query_arg('vp-page', $pageNumber, menu_page_url('versionpress', false)); if ($pageNumber == $page) { $links .= $pageNumber + 1; } else {
/** * @param WP_REST_Request $request * @return WP_REST_Response|WP_Error */ public function getCommits(WP_REST_Request $request) { $gitLogPaginator = new GitLogPaginator($this->gitRepository); $query = urldecode(stripslashes($request['query'])); $rules = QueryLanguageUtils::createRulesFromQueries([$query]); $gitLogQuery = !empty($rules) ? QueryLanguageUtils::createGitLogQueryFromRule($rules[0]) : ''; $gitLogPaginator->setQuery($gitLogQuery); $gitLogPaginator->setCommitsPerPage(25); $page = intval($request['page']); $commits = $gitLogPaginator->getPage($page); if (empty($commits)) { return new WP_Error('notice', 'No more commits to show.', ['status' => 404]); } $initialCommitHash = $this->getInitialCommitHash(); $isChildOfInitialCommit = $this->gitRepository->wasCreatedAfter($commits[0]->getHash(), $initialCommitHash); $isFirstCommit = $page === 0; $result = []; foreach ($commits as $commit) { $isChildOfInitialCommit = $isChildOfInitialCommit && $this->gitRepository->wasCreatedAfter($commit->getHash(), $initialCommitHash); $canUndoCommit = $isChildOfInitialCommit && !$commit->isMerge(); $canRollbackToThisCommit = !$isFirstCommit && ($isChildOfInitialCommit || $commit->getHash() === $initialCommitHash); $changeInfo = $this->commitMessageParser->parse($commit->getMessage()); $isEnabled = $isChildOfInitialCommit || $commit->getHash() === $initialCommitHash; $skipVpdbFiles = $changeInfo->getChangeInfoList()[0] instanceof TrackedChangeInfo; $fileChanges = $this->getFileChanges($commit, $skipVpdbFiles); $environment = $changeInfo instanceof ChangeInfoEnvelope ? $changeInfo->getEnvironment() : '?'; $changeInfoList = $changeInfo instanceof ChangeInfoEnvelope ? $changeInfo->getChangeInfoList() : []; $result[] = ["hash" => $commit->getHash(), "date" => $commit->getDate()->format('c'), "message" => $changeInfo->getChangeDescription(), "parentHashes" => $commit->getParentHashes(), "canUndo" => $canUndoCommit, "canRollback" => $canRollbackToThisCommit, "isEnabled" => $isEnabled, "isInitial" => $commit->getHash() === $initialCommitHash, "isMerge" => $commit->isMerge(), "environment" => $environment, "changes" => array_values(array_filter(array_merge($this->convertChangeInfoList($changeInfoList), $fileChanges))), "author" => ["name" => $commit->getAuthorName(), "email" => $commit->getAuthorEmail(), "avatar" => get_avatar_url($commit->getAuthorEmail())]]; $isFirstCommit = false; } return new WP_REST_Response(['pages' => $gitLogPaginator->getPrettySteps($page), 'commits' => $result]); }
/** * @param WP_REST_Request $request * @return WP_REST_Response|\WP_Error */ public function getCommits(WP_REST_Request $request) { $gitLogPaginator = new GitLogPaginator($this->gitRepository); $gitLogPaginator->setCommitsPerPage(25); $page = intval($request['page']); $commits = $gitLogPaginator->getPage($page); if (empty($commits)) { return new \WP_Error('notice', 'No more commits to show.', array('status' => 403)); } $preActivationHash = trim(file_get_contents(VERSIONPRESS_ACTIVATION_FILE)); if (empty($preActivationHash)) { $initialCommitHash = $this->gitRepository->getInitialCommit()->getHash(); } else { $initialCommitHash = $this->gitRepository->getChildCommit($preActivationHash); } $isChildOfInitialCommit = $this->gitRepository->wasCreatedAfter($commits[0]->getHash(), $initialCommitHash); $isFirstCommit = $page === 0; $result = array(); foreach ($commits as $commit) { $isChildOfInitialCommit = $isChildOfInitialCommit && $commit->getHash() !== $initialCommitHash; $canUndoCommit = $isChildOfInitialCommit && !$commit->isMerge(); $canRollbackToThisCommit = !$isFirstCommit && ($isChildOfInitialCommit || $commit->getHash() === $initialCommitHash); $changeInfo = ChangeInfoMatcher::buildChangeInfo($commit->getMessage()); $isEnabled = $isChildOfInitialCommit || $canRollbackToThisCommit || $commit->getHash() === $initialCommitHash; $fileChanges = $this->getFileChanges($commit); $changeInfoList = $changeInfo instanceof ChangeInfoEnvelope ? $changeInfo->getChangeInfoList() : array(); $result[] = array("hash" => $commit->getHash(), "date" => $commit->getDate()->format('c'), "message" => $changeInfo->getChangeDescription(), "canUndo" => $canUndoCommit, "canRollback" => $canRollbackToThisCommit, "isEnabled" => $isEnabled, "isInitial" => $commit->getHash() === $initialCommitHash, "isMerge" => $commit->isMerge(), "changes" => array_merge($this->convertChangeInfoList($changeInfoList), $fileChanges)); $isFirstCommit = false; } return new WP_REST_Response(array('pages' => $gitLogPaginator->getPrettySteps($page), 'commits' => $result)); }