namespace app\Github;
-use app\Github\API;
use app\Github\Storage;
use app\Github\Exception;
+use app\Pharext;
use merry\Config;
* @var \Psr\Log\LoggerInterface;
*/
private $logger;
+
+ /**
+ * Queued promises
+ * @var array
+ */
+ private $queue;
function __construct(Config $config, LoggerInterface $logger, Storage $tokens = null, Storage $cache = null) {
$this->logger = $logger;
}
function hasToken() {
- return $this->tokens->get("access_token");
+ if ($this->tokens->get("access_token", $token)) {
+ $access_token = $token->getValue();
+ if (isset($access_token)) {
+ return true;
+ }
+ $this->dropToken();
+ }
+ return false;
}
function setToken($token) {
"state" => $state,
"client_id" => $this->config->client->id,
"scope" => $this->config->client->scope,
- "redirect_uri" => $callback_url,
+ "redirect_uri" => (string) $callback_url,
];
return new Url("https://github.com/login/oauth/authorize", [
"query" => new QueryString($param)
], 0);
}
- function fetchToken($code, $state, callable $callback) {
+ function fetchToken($code, $state) {
if (!$this->tokens->get("state", $orig_state, true)) {
if (isset($orig_state)) {
- $this->logger->notice("State expired", $orig_state);
+ $this->logger->notice("State expired", compact("state", "orig_state"));
throw new Exception\StateExpired($orig_state->getLTL());
}
throw new Exception\StateNotSet;
throw new Exception\StateMismatch($orig_state->getValue(), $state);
}
- $call = new API\Users\ReadAuthToken($this, [
+ return $this->queue(new API\Users\ReadAuthToken($this, [
"code" => $code,
"client_id" => $this->config->client->id,
"client_secret" => $this->config->client->secret,
- ]);
- return $call($callback);
+ ]));
+ }
+
+ function queue(API\Call $call) {
+ return $this->queue[] = $call();
+ }
+
+ function drain() {
+ $queue = $this->queue;
+ $this->queue = array();
+ $this->client->send();
+ return $queue;
}
- function readAuthUser(callable $callback) {
- $call = new API\Users\ReadAuthUser($this);
- return $call($callback);
+ function readAuthUser() {
+ return $this->queue(new API\Users\ReadAuthUser($this));
}
- function listRepos($page, callable $callback) {
- $call = new API\Repos\ListRepos($this, compact("page"));
- return $call($callback);
+ function listRepos($page) {
+ return $this->queue(new API\Repos\ListRepos($this, compact("page")));
}
- function readRepo($repo, callable $callback) {
- $call = new API\Repos\ReadRepo($this, compact("repo"));
- return $call($callback);
+ function readRepo($repo) {
+ return $this->queue(new API\Repos\ReadRepo($this, compact("repo")));
}
/**
- * Check if the pharext webhook is set for the repo and return it
- * @param object $repo
+ * Check if the pharext webhook is set and return it
+ * @param array $hooks
* @return stdClass hook
*/
- function checkRepoHook($repo) {
- if ($repo->hooks) {
- foreach ($repo->hooks as $hook) {
+ function checkHook($hooks) {
+ if (!empty($hooks)) {
+ foreach ($hooks as $hook) {
if ($hook->name === "web" && $hook->config->url === $this->config->hook->url) {
return $hook;
}
return null;
}
- function listHooks($repo, callable $callback) {
- $call = new API\Hooks\ListHooks($this, compact("repo"));
- return $call($callback);
+ /**
+ * Check if the pharext webhook is set for the repo and return it
+ * @param object $repo
+ * @return stdClass hook
+ */
+ function checkRepoHook($repo) {
+ if (!empty($repo->hooks)) {
+ return $this->checkHook($repo->hooks);
+ }
+ return null;
+ }
+
+ function listHooks($repo) {
+ return $this->queue(new API\Hooks\ListHooks($this, compact("repo")));
}
- function listReleases($repo, $page, callable $callback) {
- $call = new API\Releases\ListReleases($this, compact("repo", "page"));
- return $call($callback);
+ function listReleases($repo, $page) {
+ return $this->queue(new API\Releases\ListReleases($this, compact("repo", "page")));
}
- function listTags($repo, $page, callable $callback) {
- $call = new API\Tags\ListTags($this, compact("repo", "page"));
- return $call($callback);
+ function listTags($repo, $page) {
+ return $this->queue(new API\Tags\ListTags($this, compact("repo", "page")));
}
- function readContents($repo, $path, callable $callback) {
- $call = new API\Repos\ReadContents($this, compact("repo", "path"));
- return $call($callback);
+ function readContents($repo, $path = null) {
+ return $this->queue(new API\Repos\ReadContents($this, compact("repo", "path")));
}
- function createRepoHook($repo, $conf, callable $callback) {
- $call = new API\Hooks\CreateHook($this, compact("repo", "conf"));
- return $call($callback);
+ function createRepoHook($repo, $conf) {
+ return $this->queue(new API\Hooks\CreateHook($this, compact("repo", "conf")));
}
- function updateRepoHook($repo, $id, $conf, callable $callback) {
- $call = new API\Hooks\UpdateHook($this, compact("repo", "id", "conf"));
- return $call($callback);
+ function updateRepoHook($repo, $id, $conf) {
+ return $this->queue(new API\Hooks\UpdateHook($this, compact("repo", "id", "conf")));
}
- function deleteRepoHook($repo, $id, callable $callback) {
- $call = new API\Hooks\DeleteHook($this, compact("repo", "id"));
- return $call($callback);
+ function deleteRepoHook($repo, $id) {
+ return $this->queue(new API\Hooks\DeleteHook($this, compact("repo", "id")));
}
- function createRelease($repo, $tag, callable $callback) {
- $call = new API\Releases\CreateRelease($this, compact("repo", "tag"));
- return $call($callback);
+ function createRelease($repo, $tag) {
+ return $this->queue(new API\Releases\CreateRelease($this, compact("repo", "tag")));
}
-
- function createReleaseAsset($url, $asset, $type, callable $callback) {
- $call = new API\Releases\CreateReleaseAsset($this, compact("url", "asset", "type"));
- return $call($callback);
+
+ function publishRelease($repo, $id, $tag) {
+ return $this->queue(new API\Releases\PublishRelease($this, compact("repo", "id", "tag")));
+ }
+
+ function createReleaseAsset($url, $asset, $type) {
+ return $this->queue(new API\Releases\CreateReleaseAsset($this, compact("url", "asset", "type")));
}
- function listReleaseAssets($repo, $id, callable $callback) {
- $call = new API\Releases\ListReleaseAssets($this, compact("repo", "id"));
- return $call($callback);
+ function listReleaseAssets($repo, $id) {
+ return $this->queue(new API\Releases\ListReleaseAssets($this, compact("repo", "id")));
+ }
+
+ function uploadAssetForRelease($repo, $release, $config = null) {
+ return $this->listHooks($repo->full_name)->then(function($result) use($release, $repo, $config) {
+ list($repo->hooks) = $result;
+ $phar = new Pharext\Package(
+ $repo->clone_url,
+ $release->tag_name,
+ $repo->name,
+ $config ?: (array) $this->checkRepoHook($repo)->config
+ );
+ $name = $phar->build();
+ $url = uri_template($release->upload_url, compact("name"));
+ $promise = $this->createReleaseAsset($url, $phar, "application/phar");
+ if ($release->draft) {
+ return $promise->then(function($result) use($release, $repo) {
+ return $this->publishRelease($repo->full_name, $release->id, $release->tag_name);
+ });
+ }
+ return $promise;
+ });
+ }
+
+ function createReleaseFromTag($repo, $tag_name, $config = null) {
+ return $this->createRelease($repo->full_name, $tag_name)->then(function($result) use($repo, $config) {
+ list($release) = $result;
+ return $this->uploadAssetForRelease($repo, $release, $config);
+ });
}
+
}