/** * @test * @dataProvider changeInfosRepresentingBulkActions */ public function bulkActionsAreGroupedIntoBulkChangeInfo($changeInfos) { $changeInfoEnvelope = new ChangeInfoEnvelope($changeInfos, '1.0'); $groupedChangeInfoList = $changeInfoEnvelope->getReorganizedInfoList(); $this->assertCount(1, $groupedChangeInfoList); $this->assertInstanceOf(BulkChangeInfo::class, $groupedChangeInfoList[0]); }
/** * For a given commit message, creates ChangeInfoEnvelope containing all ChangeInfo. * * @param CommitMessage $commitMessage * @return ChangeInfoEnvelope|UntrackedChangeInfo */ public static function buildChangeInfo(CommitMessage $commitMessage) { if (self::findMatchingChangeInfo($commitMessage) === 'VersionPress\\ChangeInfos\\UntrackedChangeInfo') { return UntrackedChangeInfo::buildFromCommitMessage($commitMessage); } return ChangeInfoEnvelope::buildFromCommitMessage($commitMessage); }
/** * @param ChangeInfoEnvelope|UntrackedChangeInfo $changeInfo * @param string $fullAction * @return bool * @throws \Exception */ public static function containsAction($changeInfo, $fullAction) { if ($changeInfo instanceof ChangeInfoEnvelope) { $changeInfos = $changeInfo->getChangeInfoList(); foreach ($changeInfos as $ci) { if (self::getFullAction($ci) == $fullAction) { return true; } } return false; } else { throw new \Exception("Only ChangeInfoEnvelopes are supported"); } }
/** * Calls Git `add -A` on files that are related to the given $changeInfo. * The "exchange format" is an array documented in {@see TrackedChangedInfo::getChangedFiles()}. * * @param TrackedChangeInfo|ChangeInfoEnvelope $changeInfo */ private function stageRelatedFiles($changeInfo) { if ($changeInfo instanceof ChangeInfoEnvelope) { /** @var TrackedChangeInfo $subChangeInfo */ foreach ($changeInfo->getChangeInfoList() as $subChangeInfo) { $this->stageRelatedFiles($subChangeInfo); } return; } $changes = $changeInfo->getChangedFiles(); foreach ($changes as $change) { if ($change["type"] === "storage-file") { $entityName = $change["entity"]; $entityId = $change["id"]; $parentId = $change["parent-id"]; $path = $this->storageFactory->getStorage($entityName)->getEntityFilename($entityId, $parentId); } elseif ($change["type"] === "all-storage-files") { $entityName = $change["entity"]; $path = $this->storageFactory->getStorage($entityName)->getPathCommonToAllEntities(); } elseif ($change["type"] === "path") { $path = $change["path"]; } else { continue; } $this->repository->stageAll($path); } }
/** * Creates manual commit. Adds everything to stage. * * @param WP_REST_Request $request * @return WP_REST_Response|WP_Error */ public function commit(WP_REST_Request $request) { $currentUser = wp_get_current_user(); if ($currentUser->ID === 0) { return new WP_Error('error', 'You don\'t have permission to do this.', ['status' => 403]); } /** @noinspection PhpUndefinedFieldInspection */ $authorName = $currentUser->display_name; /** @noinspection PhpUndefinedFieldInspection */ $authorEmail = $currentUser->user_email; $this->gitRepository->stageAll(); $status = $this->gitRepository->getStatus(true); if (ArrayUtils::any($status, function ($fileStatus) { $vpdbName = basename(VP_VPDB_DIR); return Strings::contains($fileStatus[1], $vpdbName); })) { $this->updateDatabase($status); } $commitMessage = new CommitMessage($request['commit-message']); $changeInfoEnvelope = new ChangeInfoEnvelope([new UntrackedChangeInfo($commitMessage)]); $this->gitRepository->commit($changeInfoEnvelope->getCommitMessage(), $authorName, $authorEmail); return new WP_REST_Response(true); }