X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=app%2FController%2FGithub%2FHook%2FReceive.php;h=3dc519a36290716b9ad0993a68f90775bd7d3dc6;hb=21ea66aa639b5c7bbd63d687d4445f821d1475ec;hp=62722edf99a75ce3c73fc08812864d1c747a606f;hpb=917c0fd609f9d91fa6b407c4a1c853f2319eb23b;p=pharext%2Fpharext.org diff --git a/app/Controller/Github/Hook/Receive.php b/app/Controller/Github/Hook/Receive.php index 62722ed..3dc519a 100644 --- a/app/Controller/Github/Hook/Receive.php +++ b/app/Controller/Github/Hook/Receive.php @@ -7,10 +7,6 @@ use app\Github\API; use app\Model\Accounts; use app\Web; use http\Params; -use pharext\Task; -use pharext\SourceDir\Git; - -require_once __DIR__."/../../../../vendor/m6w6/pharext/src/pharext/Version.php"; class Receive implements Controller { @@ -65,59 +61,6 @@ class Receive implements Controller } } - function release($release) { - if ($release->action !== "published") { - $response = $this->app->getResponse(); - - $response->setResponseCode(202); - $response->getBody()->append("Not published"); - return; - } - - $this->uploadAssetForRelease($release->release, $release->repository); - } - - private function uploadAssetForRelease($release, $repo) { - $this->setTokenForUser($repo->owner->login); - $asset = $this->createReleaseAsset($release, $repo); - $name = sprintf("%s-%s.ext.phar", $repo->name, $release->tag_name); - $url = uri_template($release->upload_url, compact("name")); - $this->github->createReleaseAsset($url, $asset, "application/phar", function($json) { - $response = $this->app->getResponse(); - $response->setResponseCode(201); - $response->setHeader("Location", $json->url); - })->send(); - } - - private function createReleaseAsset($release, $repo) { - $source = (new Task\GitClone($repo->clone_url, $release->tag_name))->run(); - $iterator = new Git($source); - $meta = [ - "header" => sprintf("pharext v%s (c) Michael Wallner ", \pharext\VERSION), - "version" => \pharext\VERSION, - "date" => date("Y-m-d"), - "name" => $repo->name, - "release" => $release->tag_name, - "license" => @file_get_contents(current(glob($iterator->getBaseDir()."/LICENSE*"))), - "stub" => "pharext_installer.php", - "type" => false ? "zend_extension" : "extension", - ]; - $file = (new Task\PharBuild($iterator, $meta))->run(); - return $file; - } - - function create($create) { - if ($create->ref_type !== "tag") { - $response = $this->app->getResponse(); - - $response->setResponseCode(202); - $response->getBody()->append("Not a tag"); - return; - } - - $this->createReleaseFromTag($create->ref, $create->repository); - } - private function setTokenForUser($login) { $relations = [ $this->accounts->getTokens()->getRelation("accounts"), @@ -127,18 +70,59 @@ class Receive implements Controller "login=" => $login, "tokens.authority=" => "github", ]); - + if (count($tokens)) { $this->github->setToken($tokens->current()->token->get()); } } + + private function release($release) { + $response = $this->app->getResponse(); + + if ($release->action !== "published") { + $response->setResponseCode(202); + $response->getBody()->append("Not published"); + } elseif (!empty($release->release->assets)) { + foreach ($release->release->assets as $asset) { + if ($asset->content_type === "application/phar") { + /* we've already uploaded the asset when we created the release */ + $response->setResponseCode(202); + $response->getBody()->append("Already published"); + return; + } + } + } + + $this->setTokenForUser($release->repository->owner->login); + $this->github->uploadAssetForRelease( + $release->release, + $release->repository + )->done(function($result) use($response) { + list($created) = $result; + $response->setResponseCode(201); + $response->setHeader("Location", $created->url); + }); + $this->github->drain(); + } - private function createReleaseFromTag($tag, $repo) { - $this->setTokenForUser($repo->owner->login); - $this->github->createRelease($repo->full_name, $tag, function($json) { - $response = $this->app->getResponse(); + private function create($create) { + $response = $this->app->getResponse(); + + if ($create->ref_type !== "tag") { + $response->setResponseCode(202); + $response->getBody()->append("Not a tag"); + return; + } + + $this->setTokenForUser($create->repository->owner->login); + $this->github->createReleaseFromTag( + $create->repository, + $create->ref + )->done(function($result) use($response) { + list($created) = $result; $response->setResponseCode(201); - $response->setHeader("Location", $json->url); - })->send(); + $response->setHeader("Location", $created->url); + }); + $this->github->drain(); } }