X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=app%2FController%2FGithub%2FHook%2FReceive.php;h=30a744e4ff3d5f69b844b9aca0ae8fe9f1c7fc02;hb=1097a4f83de3562c3518f31b168448c2c2ac0451;hp=eda96fac3e5eff07fbd35c1c651b4f65db0768c0;hpb=d4a4eae6b299ec3c066a4b8b68e048ddf69e0268;p=pharext%2Fpharext.org diff --git a/app/Controller/Github/Hook/Receive.php b/app/Controller/Github/Hook/Receive.php index eda96fa..30a744e 100644 --- a/app/Controller/Github/Hook/Receive.php +++ b/app/Controller/Github/Hook/Receive.php @@ -64,35 +64,66 @@ 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; + } 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); + $this->setTokenForUser($release->repository->owner->login); + $this->github->uploadAssetForRelease($release->release, $release->repository, null, function($json) use($response) { + $response->setResponseCode(201); + $response->setHeader("Location", $json->url); + })->send(); } - 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); - }); + 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, null, function($json) use($response) { + $response->setResponseCode(201); + $response->setHeader("Location", $json->url); })->send(); } private function createReleaseAsset($release, $repo) { $hook = $this->github->checkRepoHook($repo); + $phar = new Pharext\Package($repo->clone_url, $release->tag_name, $repo->name, $hook->config); + return $phar->getFile(); + $dir = (new Task\GitClone($repo->clone_url, $release->tag_name))->run(); if (!empty($hook->config->pecl)) { $src = new SoureDir\Pecl($dir); @@ -109,40 +140,5 @@ class Receive implements Controller $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"), - $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); - $this->github->createRelease($repo->full_name, $tag, function($json) { - $response = $this->app->getResponse(); - $response->setResponseCode(201); - $response->setHeader("Location", $json->url); - })->send(); - } + }