X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=app%2FController%2FGithub%2FHook%2FReceive.php;h=3dc519a36290716b9ad0993a68f90775bd7d3dc6;hb=21ea66aa639b5c7bbd63d687d4445f821d1475ec;hp=1ac998477d3493898fa98716caf903653358f271;hpb=8b207c90c6c49876775ab61908f45510baf9981a;p=pharext%2Fpharext.org diff --git a/app/Controller/Github/Hook/Receive.php b/app/Controller/Github/Hook/Receive.php index 1ac9984..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,99 +61,68 @@ class Receive implements Controller } } - function release($release) { + private function setTokenForUser($login) { + $relations = [ + $this->accounts->getTokens()->getRelation("accounts"), + $this->accounts->getOwners()->getRelation("accounts") + ]; + $tokens = $this->accounts->getTokens()->with($relations, [ + "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 = $this->app->getResponse(); - $response->setResponseCode(202); $response->getBody()->append("Not published"); - return; - } - if (!empty($release->release->assets)) { + } 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->uploadAssetForRelease($release->release, $release->repository)->send(); - } - - private function uploadAssetForRelease($release, $repo) { - $this->setTokenForUser($repo->owner->login); - return $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) use($release, $repo) { - if ($release->draft) { - $this->github->publishRelease($repo->full_name, $release->id, $release->tag_name, function($json) { - $response = $this->app->getResponse(); - $response->setResponseCode(201); - $response->setHeader("Location", $json->url); - }); - } else { - $response = $this->app->getResponse(); - $response->setResponseCode(201); - $response->setHeader("Location", $json->url); - } - }); + $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 createReleaseAsset($release, $repo) { - $hook = $this->github->checkRepoHook($repo); - $dir = (new Task\GitClone($repo->clone_url, $release->tag_name))->run(); - if (!empty($hook->config->pecl)) { - $src = new SoureDir\Pecl($dir); - } else { - $src = new SourceDir\Git($dir); - } - $meta = Metadata::all() + [ - "name" => $repo->name, - "release" => $release->tag_name, - "license" => $src->getLicense(), - "stub" => "pharext_installer.php", - "type" => !empty($hook->config->zend) ? "zend_extension" : "extension", - ]; - $file = (new Task\PharBuild($src, $meta))->run(); - return $file; - } - - function create($create) { + private function create($create) { + $response = $this->app->getResponse(); + 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)->send(); - } - - private function setTokenForUser($login) { - $relations = [ - $this->accounts->getTokens()->getRelation("accounts"), - $this->accounts->getOwners()->getRelation("accounts") - ]; - $tokens = $this->accounts->getTokens()->with($relations, [ - "login=" => $login, - "tokens.authority=" => "github", - ]); - - if (count($tokens)) { - $this->github->setToken($tokens->current()->token->get()); - } - } - - private function createReleaseFromTag($tag, $repo) { - $this->setTokenForUser($repo->owner->login); - return $this->github->createRelease($repo->full_name, $tag, function($json) use($repo) { - $this->uploadAssetForRelease($json, $repo); + $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", $created->url); }); + $this->github->drain(); } }