Author: Shivam Mathur (shivammathur) Date: 2024-07-08T00:28:32+05:30 Commit: https://github.com/php/web-downloads/commit/8c61d7dc67313a70d4c48f0bd45a02862f0ad468 Raw diff: https://github.com/php/web-downloads/commit/8c61d7dc67313a70d4c48f0bd45a02862f0ad468.diff
Add support for updating PECL extensions Changed paths: M src/PeclHandler.php M src/scripts/pecl.sh Diff: diff --git a/src/PeclHandler.php b/src/PeclHandler.php index 0310c1d..9dadf7f 100644 --- a/src/PeclHandler.php +++ b/src/PeclHandler.php @@ -1,9 +1,48 @@ <?php +use App\Validator; +use Symfony\Component\Process\Exception\ProcessFailedException; +use Symfony\Component\Process\Process; + class PeclHandler { - public function handle() + protected string $script = 'pecl.sh'; + + public function handle(): void + { + $data = json_decode(file_get_contents('php://input'), true); + + if(!$this->validate($data)) { + http_response_code(400); + echo 'Invalid request'; + } else { + $this->execute($data); + } + } + + private function validate(mixed $data): bool { + return (new Validator)->validate($data, [ + 'url' => 'required|url', + 'extension' => 'required|string', + 'ref' => 'required|string', + ]); + } + + private function execute(array $data): void + { + extract($data); + + $process = new Process(['sudo -u $SCRIPTS_USER bash', $this->script, $url, $extension, $ref, $token ?? '']); + + try { + $process->mustRun(function ($type, $buffer): void { + echo $buffer; + }); + } catch (ProcessFailedException $exception) { + http_response_code(500); + echo 'Failed to add extension: ' . $exception->getMessage(); + } } } \ No newline at end of file diff --git a/src/scripts/pecl.sh b/src/scripts/pecl.sh index 222a175..520430c 100644 --- a/src/scripts/pecl.sh +++ b/src/scripts/pecl.sh @@ -1,3 +1,30 @@ #!/usr/bin/env bash -# TODO: Fetch PECL builds +extension=$1 +ref=$2 +url=$3 +token=$4 + +SCRIPT_DIRECTORY="$(cd "$(dirname "$0")" && pwd)" + +source "$SCRIPT_DIRECTORY/../../.env" +source "$SCRIPT_DIRECTORY/common.sh" + +for tool in curl unzip; do + if ! command -v "$tool" &> /dev/null; then + echo "$tool not found" + exit 1 + fi +done + +zip_file="/tmp/$extension-$ref.zip" +fetch_artifact "$zip_file" "$url" "$token" +if [[ -e "$zip_file" && "$(file --mime-type -b "$zip_file")" = "application/zip" ]]; then + if ! unzip "$zip_file" -d "${BUILDS_DIRECTORY:?}"/pecl/releases/; then + echo "Failed to unzip the build" + exit 1 + fi +else + echo "Failed to fetch the build" + exit 1 +fi \ No newline at end of file