X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=app%2FController%2FGithub%2FHook%2FReceive.php;h=30a744e4ff3d5f69b844b9aca0ae8fe9f1c7fc02;hb=1097a4f83de3562c3518f31b168448c2c2ac0451;hp=c53878c614123c602cad9aad19140821a03831f6;hpb=36cfa28cf2dcee3422f0231f91c6692eb28e7824;p=pharext%2Fpharext.org diff --git a/app/Controller/Github/Hook/Receive.php b/app/Controller/Github/Hook/Receive.php index c53878c..30a744e 100644 --- a/app/Controller/Github/Hook/Receive.php +++ b/app/Controller/Github/Hook/Receive.php @@ -8,10 +8,9 @@ use app\Model\Accounts; use app\Web; use http\Params; use pharext\Task; +use pharext\Metadata; use pharext\SourceDir; -require_once __DIR__."/../../../../vendor/m6w6/pharext/src/pharext/Version.php"; - class Receive implements Controller { private $app; @@ -65,62 +64,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) { - $source = (new Task\GitClone($repo->clone_url, $release->tag_name))->run(); - $iterator = new SourceDir\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"), @@ -130,18 +73,72 @@ 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, null, function($json) use($response) { + $response->setResponseCode(201); + $response->setHeader("Location", $json->url); + })->send(); + } - 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, 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); + } 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; + } + }