X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=app%2FController%2FGithub%2FHook%2FReceive.php;h=3dc519a36290716b9ad0993a68f90775bd7d3dc6;hb=21ea66aa639b5c7bbd63d687d4445f821d1475ec;hp=ec0d9fc35e24d82575acedc4b4116f021d9f1f13;hpb=efea782d7086c58432477ce2847d2be1d8b25fa6;p=pharext%2Fpharext.org diff --git a/app/Controller/Github/Hook/Receive.php b/app/Controller/Github/Hook/Receive.php index ec0d9fc..3dc519a 100644 --- a/app/Controller/Github/Hook/Receive.php +++ b/app/Controller/Github/Hook/Receive.php @@ -7,9 +7,6 @@ use app\Github\API; use app\Model\Accounts; use app\Web; use http\Params; -use pharext\Task; -use pharext\Metadata; -use pharext\SourceDir; class Receive implements Controller { @@ -64,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); - $this->github->listHooks($repo->full_name, function($hooks) use($release, $repo) { - $repo->hooks = $hooks; - $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) { - $dir = (new Task\GitClone($repo->clone_url, $release->tag_name))->run(); - $src = new SourceDir\Git($dir); - $meta = Metadata::all() + [ - "name" => $repo->name, - "release" => $release->tag_name, - "license" => $src->getLicense(), - "stub" => "pharext_installer.php", - "type" => false ? "zend_extension" : "extension", - ]; - $file = (new Task\PharBuild($src, $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"), @@ -126,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(); } }