#!/usr/bin/env php localBranch = exec('git rev-parse --abbrev-ref HEAD'); $this->remoteBranch = exec('git rev-parse --abbrev-ref --symbolic-full-name @{u}'); $this->remoteBranch = str_replace('origin/', '', $this->remoteBranch); } function confirmCiStatusIsPassing(): void { echo 'Confirming ci-status on PR is green...' . PHP_EOL; // TODO: Check for failures, or skip if there is no CI. switch (exec('hub ci-status')) { case self::CI_PENDING: die('CI pending'); break; } } function fetchOrigin(): void { print 'Fetching origin to confirm local and remote in sync...' . PHP_EOL; exec("git fetch origin"); } function checkoutTargetBranch(): void { print sprintf('Checking out %s...' . PHP_EOL, $this->targetBranch); exec(sprintf('git checkout %s', $this->targetBranch)); } function mergeLocalBranch(): void { echo sprintf( 'Merging %s into %s...' . PHP_EOL, $this->localBranch, $this->targetBranch ); exec(sprintf('git merge --ff-only %s', $this->localBranch)); } public function pushTargetBranch(): void { print(sprintf('Pushing updated %s branch...', $this->targetBranch)); exec(sprintf('git push origin %s', $this->targetBranch)); } public function deleteRemoteBranch(): void { echo 'Deleting remote branch...' . PHP_EOL; exec(sprintf('git push origin :%s', $this->remoteBranch)); } public function deleteLocalBranch(): void { echo 'Deleting local branch...' . PHP_EOL; exec(sprintf('git branch -d %s', $this->localBranch)); } public function __invoke(): void { $this->confirmCiStatusIsPassing(); // TODO: Check that the current branch has a tracking branch. $this->fetchOrigin(); // TODO: Ensure both branches are up to date. $this->checkoutTargetBranch(); $this->mergeLocalBranch(); $this->pushTargetBranch(); $this->deleteRemoteBranch(); $this->deleteLocalBranch(); } } (new ClosesPullRequests())->__invoke();