resolveMetaReader($owner, $repo); $prMeta = $metaReader->getPRMeta($prNumber); if ($prMeta->state !== 'open') { return ['merged' => false, 'reason' => 'not_open']; } if ($prMeta->mergeability !== 'mergeable') { return ['merged' => false, 'reason' => 'conflicts']; } if (! $this->checksHavePassed($prMeta->checkStatuses)) { return ['merged' => false, 'reason' => 'checks_pending']; } $forge->mergePullRequest($owner, $repo, $prNumber); return ['merged' => true, 'pr_number' => $prNumber]; } /** * @param array $checkStatuses */ private function checksHavePassed(array $checkStatuses): bool { if ($checkStatuses === []) { return false; } foreach ($checkStatuses as $checkStatus) { if (($checkStatus['status'] ?? null) !== 'completed') { return false; } if (($checkStatus['conclusion'] ?? null) !== 'success') { return false; } } return true; } private function resolveMetaReader(string $owner, string $repo): MetaReader { if ($this->metaReader instanceof MetaReader) { return $this->metaReader; } /** @var MetaReader $metaReader */ $metaReader = app()->makeWith(ForgejoMetaReader::class, [ 'owner' => $owner, 'repo' => $repo, ]); return $metaReader; } }