From ebc0d017c8a24bd16ca1f4347b39b07ba4349135 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Tue, 31 Mar 2015 17:14:07 +0200 Subject: [PATCH] inital commit --- .gitignore | 3 + app/BaseUrl.php | 38 +++ app/Controller.php | 8 + app/Controller/Github.php | 78 ++++++ app/Controller/Github/Callback.php | 34 +++ app/Controller/Github/Index.php | 35 +++ app/Controller/Github/Repo.php | 50 ++++ app/Controller/Github/Signin.php | 17 ++ app/Controller/Homepage.php | 20 ++ app/Controller/Wikipage.php | 37 +++ app/Github/API.php | 142 ++++++++++ app/Github/Exception.php | 8 + app/Github/Exception/HooksFetchFailed.php | 12 + .../Exception/ReleasesFetchFailed.php.php | 12 + app/Github/Exception/ReposFetchFailed.php | 12 + app/Github/Exception/RequestException.php | 9 + app/Github/Exception/StateException.php | 9 + app/Github/Exception/StateExpired.php | 19 ++ app/Github/Exception/StateMismatch.php | 12 + app/Github/Exception/StateNotSet.php | 12 + app/Github/Exception/TokenException.php | 9 + app/Github/Exception/TokenExpired.php | 19 ++ app/Github/Exception/TokenFetchFailed.php | 13 + app/Github/Exception/TokenNotSet.php | 12 + app/Github/Fetch.php | 132 +++++++++ app/Github/Fetch/Hooks.php | 29 ++ app/Github/Fetch/Releases.php | 34 +++ app/Github/Fetch/Repo.php | 27 ++ app/Github/Fetch/Repos.php | 49 ++++ app/Github/Fetch/Tags.php | 33 +++ app/Github/Fetch/Token.php | 39 +++ app/Github/Storage.php | 10 + app/Github/Storage/Memcache.php | 78 ++++++ app/Github/Storage/Session.php | 43 +++ app/Session.php | 57 ++++ app/Web.php | 77 ++++++ app/bootstrap.php | 23 ++ app/bootstrap/config.php | 22 ++ app/bootstrap/github.php | 17 ++ app/bootstrap/plates.php | 46 ++++ app/bootstrap/web.php | 75 ++++++ app/config.ini | 24 ++ app/routes.ini | 19 ++ app/views/404.phtml | 5 + app/views/405.phtml | 5 + app/views/alert.phtml | 10 + app/views/github/callback.phtml | 5 + app/views/github/index.phtml | 65 +++++ app/views/github/repo.phtml | 156 +++++++++++ app/views/layout.phtml | 38 +++ app/views/navbar.phtml | 82 ++++++ app/views/pages/index.phtml | 60 +++++ app/views/pages/wiki.phtml | 7 + composer.json | 27 ++ composer.lock | 255 ++++++++++++++++++ public/.htaccess | 6 + public/index.css | 24 ++ public/index.php | 7 + public/octicons/LICENSE.txt | 9 + public/octicons/README.md | 1 + public/octicons/octicons-local.ttf | Bin 0 -> 53604 bytes public/octicons/octicons.css | 236 ++++++++++++++++ public/octicons/octicons.eot | Bin 0 -> 31908 bytes public/octicons/octicons.less | 235 ++++++++++++++++ public/octicons/octicons.svg | 200 ++++++++++++++ public/octicons/octicons.ttf | Bin 0 -> 31740 bytes public/octicons/octicons.woff | Bin 0 -> 17772 bytes public/octicons/sprockets-octicons.scss | 232 ++++++++++++++++ 68 files changed, 3119 insertions(+) create mode 100644 .gitignore create mode 100644 app/BaseUrl.php create mode 100644 app/Controller.php create mode 100644 app/Controller/Github.php create mode 100644 app/Controller/Github/Callback.php create mode 100644 app/Controller/Github/Index.php create mode 100644 app/Controller/Github/Repo.php create mode 100644 app/Controller/Github/Signin.php create mode 100644 app/Controller/Homepage.php create mode 100644 app/Controller/Wikipage.php create mode 100644 app/Github/API.php create mode 100644 app/Github/Exception.php create mode 100644 app/Github/Exception/HooksFetchFailed.php create mode 100644 app/Github/Exception/ReleasesFetchFailed.php.php create mode 100644 app/Github/Exception/ReposFetchFailed.php create mode 100644 app/Github/Exception/RequestException.php create mode 100644 app/Github/Exception/StateException.php create mode 100644 app/Github/Exception/StateExpired.php create mode 100644 app/Github/Exception/StateMismatch.php create mode 100644 app/Github/Exception/StateNotSet.php create mode 100644 app/Github/Exception/TokenException.php create mode 100644 app/Github/Exception/TokenExpired.php create mode 100644 app/Github/Exception/TokenFetchFailed.php create mode 100644 app/Github/Exception/TokenNotSet.php create mode 100644 app/Github/Fetch.php create mode 100644 app/Github/Fetch/Hooks.php create mode 100644 app/Github/Fetch/Releases.php create mode 100644 app/Github/Fetch/Repo.php create mode 100644 app/Github/Fetch/Repos.php create mode 100644 app/Github/Fetch/Tags.php create mode 100644 app/Github/Fetch/Token.php create mode 100644 app/Github/Storage.php create mode 100644 app/Github/Storage/Memcache.php create mode 100644 app/Github/Storage/Session.php create mode 100644 app/Session.php create mode 100644 app/Web.php create mode 100644 app/bootstrap.php create mode 100644 app/bootstrap/config.php create mode 100644 app/bootstrap/github.php create mode 100644 app/bootstrap/plates.php create mode 100644 app/bootstrap/web.php create mode 100644 app/config.ini create mode 100644 app/routes.ini create mode 100644 app/views/404.phtml create mode 100644 app/views/405.phtml create mode 100644 app/views/alert.phtml create mode 100644 app/views/github/callback.phtml create mode 100644 app/views/github/index.phtml create mode 100644 app/views/github/repo.phtml create mode 100644 app/views/layout.phtml create mode 100644 app/views/navbar.phtml create mode 100644 app/views/pages/index.phtml create mode 100644 app/views/pages/wiki.phtml create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 public/.htaccess create mode 100644 public/index.css create mode 100644 public/index.php create mode 100644 public/octicons/LICENSE.txt create mode 100644 public/octicons/README.md create mode 100644 public/octicons/octicons-local.ttf create mode 100644 public/octicons/octicons.css create mode 100644 public/octicons/octicons.eot create mode 100644 public/octicons/octicons.less create mode 100644 public/octicons/octicons.svg create mode 100644 public/octicons/octicons.ttf create mode 100644 public/octicons/octicons.woff create mode 100644 public/octicons/sprockets-octicons.scss diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b551a21 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +vendor +nbproject +app/credentials.ini diff --git a/app/BaseUrl.php b/app/BaseUrl.php new file mode 100644 index 0000000..1116543 --- /dev/null +++ b/app/BaseUrl.php @@ -0,0 +1,38 @@ + filter_input(INPUT_SERVER, "HTTPS", FILTER_VALIDATE_BOOLEAN) ? "https":"http", + "path" => dirname(filter_input(INPUT_SERVER, "SCRIPT_NAME"))."/" + ); + parent::__construct($self, $url, + self::JOIN_PATH | + self::SANITIZE_PATH | + self::STRIP_QUERY | + self::STRIP_AUTH | + self::FROM_ENV + ); + } + /** + * Extract path info + * + * @param mixed $url full request url + * @return string + */ + function pathinfo($url) { + $url = new Url($this, $url, Url::FROM_ENV | Url::STRIP_QUERY); + $info = substr($url, strlen($this)-1); + return $info; + } + + +} diff --git a/app/Controller.php b/app/Controller.php new file mode 100644 index 0000000..950ae14 --- /dev/null +++ b/app/Controller.php @@ -0,0 +1,8 @@ +app = $app; + $this->github = $github; + $this->app->getView()->addData(["location" => "github"]); + $this->app->getView()->registerFunction("check", [$this, "checkRepoHook"]); + } + + protected function checkToken() { + if ($this->github->hasToken()) { + return true; + } + $this->app->redirect($this->app->getBaseUrl()->mod([ + "path" => "github/signin", + "query" => new QueryString(["returnto" => $this->session->current]) + ])); + return false; + } + + function setSession(Session $session) { + $this->session = $session; + } + + function checkRepoHook($repo) { + if ($repo->hooks) { + foreach ($repo->hooks as $hook) { + if ($hook->name === "web" && $hook->config->url === $this->github->getConfig()->hook->url) { + return true; + } + } + } + return false; + } + + function createLinkGenerator($links) { + return function($which) use($links) { + if (!isset($links[$which])) { + if ($which !== "next" || !isset($links["last"])) { + return null; + } else { + $which = "last"; + } + } + $url = new Url($links[$which], null, 0); + $qry = new QueryString($url->query); + return $qry->getInt("page", 1); + }; + } + +} diff --git a/app/Controller/Github/Callback.php b/app/Controller/Github/Callback.php new file mode 100644 index 0000000..ac2ce7b --- /dev/null +++ b/app/Controller/Github/Callback.php @@ -0,0 +1,34 @@ +app->getRequest()->getQuery("error")) { + $this->app->getView()->addData([ + "error" => $this->app->getRequest()->getQuery("error_description") + ]); + } else { + try { + $this->github->fetchToken( + $this->app->getRequest()->getQuery("code"), + $this->app->getRequest()->getQuery("state"), + function($json) { + $this->github->setToken($json->access_token); + })->send(); + if (isset($this->session->returnto)) { + $this->app->redirect($this->session->returnto); + } else { + $this->app->redirect( + $this->app->getBaseUrl()->mod("./github")); + } + } catch (\app\Github\Exception $exception) { + $this->app->getView()->addData(compact("exception")); + } + } + $this->app->display("github/callback"); + } +} diff --git a/app/Controller/Github/Index.php b/app/Controller/Github/Index.php new file mode 100644 index 0000000..f55eb0c --- /dev/null +++ b/app/Controller/Github/Index.php @@ -0,0 +1,35 @@ +checkToken()) { + try { + $this->github->fetchRepos( + $this->app->getRequest()->getQuery("page"), + [$this, "reposCallback"] + )->send(); + } catch (\app\Github\Exception $exception) { + $this->view->addData(compact("exception")); + } + $this->app->display("github/index"); + } + } + + function reposCallback($repos, $links) { + $this->app->getView()->addData(compact("repos")); + $this->app->getView()->registerFunction("link", $this->createLinkGenerator($links)); + + foreach ($repos as $repo) { + $this->github->fetchHooks($repo->full_name, function($hooks) use($repo) { + $repo->hooks = $hooks; + }); + } + } +} diff --git a/app/Controller/Github/Repo.php b/app/Controller/Github/Repo.php new file mode 100644 index 0000000..0c33a01 --- /dev/null +++ b/app/Controller/Github/Repo.php @@ -0,0 +1,50 @@ +checkToken()) { + try { + $this->github->fetchRepo( + "$owner/$name", + [$this, "repoCallback"] + )->send(); + } catch (\app\Github\Exception $exception) { + $this->app->getView()->addData(compact("exception", "owner", "name")); + } + $this->app->display("github/repo"); + } + } + + function repoCallback($repo, $links) { + $this->app->getView()->addData(compact("repo")); + settype($repo->tags, "object"); + $this->github->fetchTags($repo->full_name, 1, $this->createTagsCallback($repo)); + $this->github->fetchReleases($repo->full_name, 1, $this->createReleasesCallback($repo)); + } + + function createReleasesCallback($repo) { + return function($releases, $links) use($repo) { + foreach ($releases as $release) { + $tag = $release->tag_name; + settype($repo->tags->$tag, "object"); + $repo->tags->$tag->release = $release; + } + }; + } + + function createTagsCallback($repo) { + return function($tags, $links) use ($repo) { + foreach ($tags as $tag) { + $name = $tag->name; + settype($repo->tags->$name, "object"); + $repo->tags->$name->tag = $tag; + } + }; + } +} diff --git a/app/Controller/Github/Signin.php b/app/Controller/Github/Signin.php new file mode 100644 index 0000000..05f3e3c --- /dev/null +++ b/app/Controller/Github/Signin.php @@ -0,0 +1,17 @@ +app->getBaseUrl()->mod("./github/callback"); + $location = $this->github->getAuthUrl($callback); + $this->app->redirect($location); + if ($returnto = $this->app->getRequest()->getQuery("returnto")) { + $this->session->returnto = $returnto; + } + } +} diff --git a/app/Controller/Homepage.php b/app/Controller/Homepage.php new file mode 100644 index 0000000..cf065ff --- /dev/null +++ b/app/Controller/Homepage.php @@ -0,0 +1,20 @@ +app = $app; + } + + function __invoke(array $args = null) { + $this->app->getResponse()->getBody()->append( + $this->app->getView()->render("pages/index") + ); + } +} diff --git a/app/Controller/Wikipage.php b/app/Controller/Wikipage.php new file mode 100644 index 0000000..f350f9a --- /dev/null +++ b/app/Controller/Wikipage.php @@ -0,0 +1,37 @@ +app = $app; + $app->getView()->addData([ + "pages" => $this->wikiPages() + ]); + } + + function __invoke(array $args = null) { + $title = $args["page"]; + $page = $this->wikiPath($args["page"]); + $this->app->display("pages/wiki", compact("title", "page")); + } + + function wikiPages() { + return array_filter(array_map(function($s) { + return strtr(basename($s, ".md"), "-", " "); + }, scandir(self::WIKI_PATH)), function($s) { + return $s{0} !== "."; + }); + } + function wikiPath($page) { + $file = basename(strtr($page, " ", "-"), ".md") . ".md"; + return self::WIKI_PATH . $file; + } +} \ No newline at end of file diff --git a/app/Github/API.php b/app/Github/API.php new file mode 100644 index 0000000..381533d --- /dev/null +++ b/app/Github/API.php @@ -0,0 +1,142 @@ +config = $config; + $this->client = new Client; + $this->tokens = $tokens ?: new Storage\Session; + $this->cache = $cache; + } + + function getConfig() { + return $this->config; + } + + function getClient() { + return $this->client; + } + + function getTokenStorage() { + return $this->tokens; + } + + function getCacheStorage() { + return $this->cache; + } + + function getCacheKey($ident, $page = null) { + return sprintf("%s:%s:%s", $this->getToken(), $ident, $page ?: 1); + } + + function hasToken() { + return $this->tokens->get("access_token"); + } + + function setToken($token) { + $this->tokens->set("access_token", $token, + $this->config->storage->token->ttl); + } + + function getToken() { + if ($this->tokens->get("access_token", $token, $ttl, true)) { + return $token; + } + if (isset($ttl)) { + throw new Exception\TokenExpired($ttl); + } + throw new Exception\TokenNotSet; + } + + function dropToken() { + $this->tokens->del("access_token"); + } + + function getAuthUrl($callback_url) { + $state = base64_encode(openssl_random_pseudo_bytes(24)); + $this->tokens->set("state", $state, 5*60); + $param = [ + "state" => $state, + "client_id" => $this->config->client->id, + "scope" => $this->config->client->scope, + "redirect_uri" => $callback_url, + ]; + return new Url("https://github.com/login/oauth/authorize", [ + "query" => new QueryString($param) + ], 0); + } + + function fetchToken($code, $state, callable $callback) { + if (!$this->tokens->get("state", $orig_state, $ttl, true)) { + if (isset($ttl)) { + throw new Exception\StateExpired($ttl); + } + throw new Exception\StateNotSet; + } + if ($state !== $orig_state) { + throw new Exception\StateMismatch($orig_state, $state); + } + + $fetch = new Fetch\Token($this, compact("code") + $this->config->client->toArray()); + return $fetch($callback); + } + + function fetchRepos($page, callable $callback) { + $fetch = new Fetch\Repos($this); + $fetch->setPage($page); + return $fetch($callback); + } + + function fetchRepo($repo, callable $callback) { + $fetch = new Fetch\Repo($this, compact("repo")); + return $fetch($callback); + } + + function fetchHooks($repo, callable $callback) { + $fetch = new Fetch\Hooks($this, compact("repo")); + return $fetch($callback); + } + + function fetchReleases($repo, $page, callable $callback) { + $fetch = new Fetch\Releases($this, compact("repo")); + $fetch->setPage($page); + return $fetch($callback); + } + + function fetchTags($repo, $page, callable $callback) { + $fetch = new Fetch\Tags($this, compact("repo")); + $fetch->setPage($page); + return $fetch($callback); + } +} diff --git a/app/Github/Exception.php b/app/Github/Exception.php new file mode 100644 index 0000000..3bad002 --- /dev/null +++ b/app/Github/Exception.php @@ -0,0 +1,8 @@ +seconds = abs($seconds); + parent::__construct("State expired $this->seconds seconds ago", 0, $previous); + } + + function getSeconds() { + return $this->seconds; + } +} diff --git a/app/Github/Exception/StateMismatch.php b/app/Github/Exception/StateMismatch.php new file mode 100644 index 0000000..94e16a9 --- /dev/null +++ b/app/Github/Exception/StateMismatch.php @@ -0,0 +1,12 @@ +seconds = abs($seconds); + parent::__construct("Token expired $this->seconds seconds ago", 0, $previous); + } + + function getSeconds() { + return $this->seconds; + } +} diff --git a/app/Github/Exception/TokenFetchFailed.php b/app/Github/Exception/TokenFetchFailed.php new file mode 100644 index 0000000..128330f --- /dev/null +++ b/app/Github/Exception/TokenFetchFailed.php @@ -0,0 +1,13 @@ +api = $api; + $this->config = $api->getConfig(); + $this->args = $args; + $this->url = new Url("https://api.github.com/", null, 0); + if (isset($this->config->fetch->{$this}->per_page)) { + header("X-Fetch-{$this}: ".$this->config->fetch->{$this}->per_page, false); + $this->url->query = "per_page=" . $this->config->fetch->{$this}->per_page; + } + } + + function setPage($page) { + $this->page = $page; + return $this; + } + + function getPage() { + return $this->page; + } + + function __toString() { + $parts = explode("\\", get_class($this)); + return strtolower(end($parts)); + } + + function getStorage(&$ttl = null) { + if (isset($this->config->storage->cache->{$this}->ttl)) { + $ttl = $this->config->storage->cache->{$this}->ttl; + } + return $this->api->getCacheStorage(); + } + + abstract function getRequest(); + abstract function getException($message, $code, $previous = null); + abstract function getCacheKey(); + + function parseLinks(Header $header) { + $params = new Params($header->value, ",", ";", "=", + Params::PARSE_RFC5988 | Params::PARSE_ESCAPED); + $links = []; + foreach ($params->params as $link => $param) { + // strip enclosing brackets + $links[$param["arguments"]["rel"]] = $link; + } + return $links; + } + + function __invoke(callable $callback) { + $ttl = -1; + $key = $this->getCacheKey(); + if (($cache = $this->api->getCacheStorage()) + && $cache->get($key, $cached, $ttl)) { + call_user_func_array($callback, $cached); + } else { + $this->enqueue($callback); + } + return $this->api->getClient(); + } + + protected function wrap(callable $callback) { + return function($response) use($callback) { + $rc = $response->getResponseCode(); + + if ($rc !== 200) { + if ($response->getHeader("Content-Type", Header::class)->match("application/json", Header::MATCH_WORD)) { + $message = json_decode($response->getBody())->message; + } else { + $message = $response->getBody(); + } + throw $this->getException($message, $rc); + } + + $json = json_decode($response->getBody()); + if (($link = $response->getHeader("Link", Header::class))) { + $links = $this->parseLinks($link); + } else { + $links = []; + } + + if (isset($json->error)) { + throw $this->getException($json->error_description, $rc); + } elseif (($cache = $this->getStorage($ttl))) { + $cache->set($this->getCacheKey(), [$json, $links], $ttl); + } + + $callback($json, $links); + + return true; + }; + } + + function enqueue(callable $callback) { + $request = $this->getRequest(); + $wrapper = $this->wrap($callback); + return $this->api->getClient()->enqueue($request, $wrapper); + } +} \ No newline at end of file diff --git a/app/Github/Fetch/Hooks.php b/app/Github/Fetch/Hooks.php new file mode 100644 index 0000000..c2730e4 --- /dev/null +++ b/app/Github/Fetch/Hooks.php @@ -0,0 +1,29 @@ +url->mod([ + "path" => "/repos/" . $this->args["repo"] . "/hooks", + ]); + return new Request("GET", $url, [ + "Accept" => "application/vnd.github.v3+json", + "Authorization" => "token " . $this->api->getToken(), + ]); + } + + function getException($message, $code, $previous = null) { + return new HooksFetchFailed($message, $code, $previous); + } + + function getCacheKey() { + return $this->api->getCacheKey(sprintf("hooks:%s", $this->args["repo"])); + } +} diff --git a/app/Github/Fetch/Releases.php b/app/Github/Fetch/Releases.php new file mode 100644 index 0000000..fa9c012 --- /dev/null +++ b/app/Github/Fetch/Releases.php @@ -0,0 +1,34 @@ +url->mod([ + "path" => "/repos/" . $this->args["repo"] . "/releases", + "query" => new QueryString([ + "page" => $this->getPage(), + ]) + ], 0); + echo $url."
"; + return new Request("GET", $url, [ + "Accept" => "application/vnd.github.v3+json", + "Authorization" => "token " . $this->api->getToken(), + ]); + } + + function getException($message, $code, $previous = null) { + return new ReleasesFetchFailed($message, $code, $previous); + } + + function getCacheKey() { + return $this->api->getCacheKey(sprintf("releases:%s", $this->args["repo"])); + } +} \ No newline at end of file diff --git a/app/Github/Fetch/Repo.php b/app/Github/Fetch/Repo.php new file mode 100644 index 0000000..a0889d6 --- /dev/null +++ b/app/Github/Fetch/Repo.php @@ -0,0 +1,27 @@ +url->mod("/repos/" . $this->args["repo"]); + return new Request("GET", $url, [ + "Accept" => "application/vnd.github.v3+json", + "Authorization" => "token " . $this->api->getToken(), + ]); + } + + function getException($message, $code, $previous = null) { + return new ReposFetchFailed($message, $code, $previous); + } + + function getCacheKey() { + return $this->api->getCacheKey(sprintf("repo:%s", $this->args["repo"])); + } +} diff --git a/app/Github/Fetch/Repos.php b/app/Github/Fetch/Repos.php new file mode 100644 index 0000000..30b3c4c --- /dev/null +++ b/app/Github/Fetch/Repos.php @@ -0,0 +1,49 @@ +url->mod([ + "path" => "/user/repos", + "query" => new QueryString([ + "page" => $this->getPage() + ]) + ]); + return new Request("GET", $url, [ + "Accept" => "application/vnd.github.v3+json", + "Authorization" => "token " . $this->api->getToken(), + ]); + } + + function getException($message, $code, $previous = null) { + return new ReposFetchFailed($message, $code, $previous); + } + + function getCacheKey() { + return $this->api->getCacheKey("repos", $this->page); + } + + protected function wrap(callable $callback) { + return parent::wrap(function($json, $links) use($callback) { + if (($cache = $this->getStorage($ttl))) { + foreach ($json as $repo) { + $key = $this->api->getCacheKey(sprintf("repo:%s", $repo->full_name)); + $cache->set($key, [$repo, $links], $ttl); + } + } + + $callback($json, $links); + + return true; + }); + } + +} diff --git a/app/Github/Fetch/Tags.php b/app/Github/Fetch/Tags.php new file mode 100644 index 0000000..9ddd606 --- /dev/null +++ b/app/Github/Fetch/Tags.php @@ -0,0 +1,33 @@ +url->mod([ + "path" => "/repos/" . $this->args["repo"] . "/tags", + "query" => new QueryString([ + "page" => $this->getPage(), + ]) + ], 0); + return new Request("GET", $url, [ + "Accept" => "application/vnd.github.v3+json", + "Authorization" => "token " . $this->api->getToken(), + ]); + } + + function getException($message, $code, $previous = null) { + return new TagsFetchFailed($message, $code, $previous); + } + + function getCacheKey() { + return $this->api->getCacheKey(sprintf("tags:%s", $this->args["repo"])); + } +} \ No newline at end of file diff --git a/app/Github/Fetch/Token.php b/app/Github/Fetch/Token.php new file mode 100644 index 0000000..16a270a --- /dev/null +++ b/app/Github/Fetch/Token.php @@ -0,0 +1,39 @@ + "application/json", + ]); + $request->getBody()->append( + new QueryString([ + "client_id" => $this->args["id"], + "client_secret" => $this->args["secret"], + "code" => $this->args["code"] + ]) + ); + return $request; + } + + function getException($message, $code, $previous = null) { + return new TokenFetchFailed($message, $code, $previous); + } + + function getCacheKey() { + return "access_token"; + } + + function getStorage(&$ttl = null) { + /* do not cache externally */ + return null; + } +} \ No newline at end of file diff --git a/app/Github/Storage.php b/app/Github/Storage.php new file mode 100644 index 0000000..3855107 --- /dev/null +++ b/app/Github/Storage.php @@ -0,0 +1,10 @@ +ns = $ns; + if (!$mc) { + $mc = new \Memcached("pharext"); + $mc->addServer("localhost", 11211); + } + $this->mc = $mc; + } + + private function key($key) { + return sprintf("%s:%s", $this->ns, $key); + } + + function get($key, &$val = null, &$ltl = null, $update = false) { + if (!$item = $this->mc->get($this->key($key))) { + return false; + } + + $val = $item->value; + $ttl = $item->ttl; + $set = $item->time; + + if (!isset($ttl)) { + return true; + } + $now = time(); + $ltl = $ttl - ($now - $set); + if ($ltl >= 0) { + if ($update) { + $item->time = time(); + $this->mc->set($this->key($key), $item, $ttl + 60*60*24); + } + return true; + } + return false; + } + + function set($key, $val, $ttl = null) { + $item = new Memcache\Item([ + "value" => $val, + "ttl" => $ttl, + "time" => isset($ttl) ? time() : null + ]); + $this->mc->set($this->key($key), $item, isset($ttl) ? $ttl + 60*60*24 : 0); + return $this; + } + + function del($key) { + $this->mc->delete($this->key($key)); + } +} + +namespace app\Github\Storage\Memcache; + +class Item +{ + public $value; + public $time; + public $ttl; + + function __construct(array $data) { + foreach ($data as $key => $val) { + $this->$key = $val; + } + } +} + diff --git a/app/Github/Storage/Session.php b/app/Github/Storage/Session.php new file mode 100644 index 0000000..943e975 --- /dev/null +++ b/app/Github/Storage/Session.php @@ -0,0 +1,43 @@ +ns = $ns; + } + + function set($key, $val, $ttl = null) { + $_SESSION[$this->ns][$key] = [$val, $ttl, isset($ttl) ? time() : null]; + return $this; + } + + function get($key, &$val = null, &$ltl = null, $update = false) { + if (!isset($_SESSION[$this->ns][$key])) { + return false; + } + list($val, $ttl, $set) = $_SESSION[$this->ns][$key]; + if (!isset($ttl)) { + return true; + } + $now = time(); + $ltl = $ttl - ($now - $set); + if ($ltl >= 0) { + if ($update) { + $_SESSION[$this->ns][$key][2] = $now; + } + return true; + } + return false; + } + + function del($key) { + unset($_SESSION[$this->ns][$key]); + return $this; + } +} diff --git a/app/Session.php b/app/Session.php new file mode 100644 index 0000000..87189dc --- /dev/null +++ b/app/Session.php @@ -0,0 +1,57 @@ +session as $key => $val) { + ini_set("session.$key", $val); + } + session_start(); + } + + function regenerateId() { + session_regenerate_id(); + return $this; + } + + function reset() { + $_SESSION = array(); + session_destroy(); + return $this; + } + + function __debugInfo() { + return $_SESSION; + } + + function &__get($p) { + return $_SESSION[$p]; + } + function &offsetGet($o) { + return $_SESSION[$o]; + } + function __set($p, $v) { + $_SESSION[$p] = $v; + } + function offsetSet($o, $v) { + $_SESSION[$o] = $v; + } + function __isset($p) { + return isset($_SESSION[$p]); + } + function offsetExists($o) { + return isset($_SESSION[$o]); + } + function __unset($p) { + unset($_SESSION[$p]); + } + function offsetUnset($o) { + unset($_SESSION[$o]); + } + +} diff --git a/app/Web.php b/app/Web.php new file mode 100644 index 0000000..e9d5d16 --- /dev/null +++ b/app/Web.php @@ -0,0 +1,77 @@ +baseUrl = $baseUrl; + $this->request = $request; + $this->response = $response; + $this->view = $view; + ob_start($response); + } + + function __invoke(Dispatcher $dispatcher) { + $route = $dispatcher->dispatch($this->request->getRequestMethod(), + $this->baseUrl->pathinfo($this->request->getRequestUrl())); + + switch ($route[0]) { + case Dispatcher::NOT_FOUND: + $this->response->setResponseCode(404); + $this->response->getBody()->append($this->view->render("404")); + break; + + case Dispatcher::METHOD_NOT_ALLOWED: + $this->response->setResponseCode(405); + $this->response->setHeader("Allowed", $route[1]); + $this->response->getBody()->append($this->view->render("405")); + break; + + case Dispatcher::FOUND: + list(, $handler, $args) = $route; + $handler(array_map("urldecode", $args)); + break; + } + + $this->response->send(); + } + + function display($view, array $data = []) { + $this->response->getBody()->append( + $this->view->render($view, $data)); + } + + function redirect($url, $code = 302) { + $this->response->setResponseCode($code); + $this->response->setHeader("Location", $url); + } + + function getBaseUrl() { + return $this->baseUrl; + } + + function getView() { + return $this->view; + } + + function getRequest() { + return $this->request; + } + + function getResponse() { + return $this->response; + } +} diff --git a/app/bootstrap.php b/app/bootstrap.php new file mode 100644 index 0000000..0cc7ab8 --- /dev/null +++ b/app/bootstrap.php @@ -0,0 +1,23 @@ +share(Config::class) + ->define(Config::class, [ + ":array" => parse_ini_file(__DIR__."/../config.ini", true), + ":section" => getenv("APP_ENVIRONMENT") + ]) + ->prepare(Config::class, function(Config $config) { + $credentials = parse_ini_file(__DIR__."/../credentials.ini", true); + foreach (new Config($credentials, getenv("APP_ENVIRONMENT")) as $app => $creds) { + /* one level down should suffice, i.e. $config->github->client = {id,secret,scope} */ + if ($creds instanceof Config) { + foreach ($creds as $key => $val) { + $config->$app->$key = $val; + } + } else { + $config->$app = $creds; + } + } + }); diff --git a/app/bootstrap/github.php b/app/bootstrap/github.php new file mode 100644 index 0000000..55a49a7 --- /dev/null +++ b/app/bootstrap/github.php @@ -0,0 +1,17 @@ +share(Github\API::class) + ->delegate(Github\API::class, function() use($injector) { + return new Github\API( + $injector->make(Config::class)->github + ,new Github\Storage\Session("gh-tokens") + #,new Github\Storage\Memcache("gh-cache") + ); + }); + diff --git a/app/bootstrap/plates.php b/app/bootstrap/plates.php new file mode 100644 index 0000000..0b14222 --- /dev/null +++ b/app/bootstrap/plates.php @@ -0,0 +1,46 @@ +share(Plates\Engine::class) + ->define(Plates\Engine::class, [ + ":directory" => __DIR__."/../views", + ":fileExtension" => "phtml" + ]) + ->prepare(Plates\Engine::class, function(Plates\Engine $view) use($injector) { + $view->addData([ + "config" => $injector->make(Config::class), + "baseUrl" => $injector->make(BaseUrl::class), + "request" => $injector->make(Request::class), + "response" => $injector->make(Response::class), + ]); + $view->registerFunction("shorten", function($text) { + if (strlen($text) < 78) { + return $text; + } + return current(explode("\n", wordwrap($text)))."…"; + }); + $view->registerFunction("utc", function($d) { + return date_create($d)->setTimeZone(new \DateTimeZone("UTC")); + }); + $view->registerFunction("md", function($string, $file = false) { + if ($file) { + $md = \MarkdownDocument::createFromStream($string); + } else { + $md = \MarkdownDocument::createFromString($string); + } + $md->compile(\MarkdownDocument::AUTOLINK); + return $md->getHtml(); + }); + }); + diff --git a/app/bootstrap/web.php b/app/bootstrap/web.php new file mode 100644 index 0000000..2ad975f --- /dev/null +++ b/app/bootstrap/web.php @@ -0,0 +1,75 @@ +share(Request::class); +$injector->share(Response::class); + +$injector->share(RouteCollector::class) + ->prepare(RouteCollector::class, function($routes) use($injector) { + $routes->addRoute("GET", "/reset", function(array $args = null) use($injector) { + $injector->make(Session::class)->reset()->regenerateId(); + $injector->make(Web::class)->redirect($injector->make(BaseUrl::class)); + }); + $routes->addRoute("GET", "/session", function(array $args = null) use($injector) { + $session = $injector->make(Session::class); + $response = $injector->make(Response::class); + $response->setContentType("text/plain"); + ob_start($response); + var_dump($_SESSION, $session); + }); + $routes->addRoute("GET", "/info", function(array $args = null) { + phpinfo(); + }); + + foreach (parse_ini_file(__DIR__."/../routes.ini", true) as $controller => $definition) { + $factory = function(array $args = null) use($injector, $controller) { + $handler = $injector->make("app\\Controller\\$controller"); + $handler($args); + }; + foreach ($definition as $method => $locations) { + foreach ($locations as $location) { + $routes->addRoute($method, $location, $factory); + } + } + } + }) + ->alias(RouteParser::class, RouteParser\Std::class) + ->alias(DataGenerator::class, DataGenerator\GroupCountBased::class); + +$injector->share(Dispatcher::class) + ->alias(Dispatcher::class, Dispatcher\GroupCountBased::class) + ->delegate(Dispatcher\GroupCountBased::class, function($class, Injector $injector) { + return new $class($injector->make(RouteCollector::class)->getData()); + }); + +$injector->prepare(Controller::class, function(Controller $controller, Injector $injector) { + if (method_exists($controller, "setSession")) { + $controller->setSession($injector->make(Session::class)); + } +}); + +$injector->share(Session::class) + ->prepare(Session::class, function(Session $session, Injector $injector) { + if (isset($session->current) && (!isset($session->previous) || strcmp($session->current, $session->previous))) { + $session->previous = $session->current; + $session->current = $injector->make(Request::class)->getRequestUrl(); + } + $session->current = $injector->make(Request::class)->getRequestUrl(); + }); + +$injector->share(BaseUrl::class); +$injector->share(Web::class); diff --git a/app/config.ini b/app/config.ini new file mode 100644 index 0000000..22dd591 --- /dev/null +++ b/app/config.ini @@ -0,0 +1,24 @@ +[production] + +github.hook.url = https://pharext.org/github/hook + +github.fetch.repos.per_page = 10 +github.fetch.hooks.per_page = 100 + +github.storage.token.ttl = 3600 +github.storage.cache.repo.ttl = 3600 +github.storage.cache.repos.ttl = 3600 +github.storage.cache.hooks.ttl = 3600 +github.storage.cache.tags.ttl = 3600 +github.storage.cache.releases.ttl = 3600 + +session.use_cookies = 1 +session.use_only_cookies = 1 +session.use_strict_mode = 1 +session.cookie_httponly = 1 +session.cookie_secure = 1 +session.cache_limiter = private_no_expire +; minutes +session.cache_expire = 0 + +[localhost : production] diff --git a/app/routes.ini b/app/routes.ini new file mode 100644 index 0000000..f9954d8 --- /dev/null +++ b/app/routes.ini @@ -0,0 +1,19 @@ +[Homepage] +GET[] = / + +[Wikipage] +GET[] = /pages/{page} + +[Github\Callback] +GET[] = /github/callback + +[Github\Index] +GET[] = /github + +[Github\Repo] +GET[] = /github/repo/{owner}/{name} +GET[] = /github/repo/{owner}/{name}/{page} + +[Github\Signin] +GET[] = /github/signin + diff --git a/app/views/404.phtml b/app/views/404.phtml new file mode 100644 index 0000000..491df9c --- /dev/null +++ b/app/views/404.phtml @@ -0,0 +1,5 @@ +layout("layout") ?> + + diff --git a/app/views/405.phtml b/app/views/405.phtml new file mode 100644 index 0000000..ec25164 --- /dev/null +++ b/app/views/405.phtml @@ -0,0 +1,5 @@ +layout("layout") ?> + + diff --git a/app/views/alert.phtml b/app/views/alert.phtml new file mode 100644 index 0000000..bd8c0b7 --- /dev/null +++ b/app/views/alert.phtml @@ -0,0 +1,10 @@ + + diff --git a/app/views/github/callback.phtml b/app/views/github/callback.phtml new file mode 100644 index 0000000..f3fdf46 --- /dev/null +++ b/app/views/github/callback.phtml @@ -0,0 +1,5 @@ +layout("layout") ?> + + + fetch("alert") ?> + diff --git a/app/views/github/index.phtml b/app/views/github/index.phtml new file mode 100644 index 0000000..987ea8e --- /dev/null +++ b/app/views/github/index.phtml @@ -0,0 +1,65 @@ +layout("layout") ?> + + + + + fetch("alert") ?> + + + + + + + + + + + + + + "> + + + + + + + +
RepoForkLast PushedHook
+ full_name) ?>"> + e($repo->name) ?> + +
+ e($this->shorten($repo->description)) ?> +
fork) : ?> + + + + " + href="mod("./github/repo/".$repo->full_name) ?>"> + + " + href="mod(["path" => "github/repo", "query" => "hook=del&repo=". urlencode($repo->full_name)]) ?>"> + +
+ + + diff --git a/app/views/github/repo.phtml b/app/views/github/repo.phtml new file mode 100644 index 0000000..4477e8a --- /dev/null +++ b/app/views/github/repo.phtml @@ -0,0 +1,156 @@ +layout("layout") ?> + + + + + fetch("alert") ?> + + +
+
+
+

e($repo->description) ?>

+
+
+
+
+
+ +
+ + watchers_count ?> Watchers + +
+
+ +
+ + stargazers_count ?> Stars + +
+
+ +
+ + forks_count ?> Forks + +
+
+
+
+ +
+
+
+
+

Has a config*.m4 file?

+
+
+

YES

+
+
+ +
+
+

Has a package*.xml file?

+
+
+

NO

+
+
+ +
+
+

Has a pharext_package.php file?

+
+
+

YES

+
+
+ +
+
+

Is the pharext hook enabled?

+
+
+

NO

+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+ +

Release History

+ +tags as $name => $v) : ?> +
"> +
+

+ release)) : ?> + e($v->tag->name) ?> + Tag + + e($v->release->name) ?> + Release + +

+
+
+ release)) : ?> +

md($v->release->body) ?>

+ +
    +
  • + + e($v->tag->name) ?> +
  • + + release)) : ?> +
  • + + e($v->release->target_commitish) ?> +
  • +
  • + + + + + +
+
+
+ + +
+ + diff --git a/app/views/layout.phtml b/app/views/layout.phtml new file mode 100644 index 0000000..a321f80 --- /dev/null +++ b/app/views/layout.phtml @@ -0,0 +1,38 @@ + + + + + + <?php if (!empty($title)) : ?> + <?= $this->e($title) ?> + <?php endif; ?> + PHARext + + + + "> + "> + + + +
"> + + section("content") ?> + +
+ + + + + diff --git a/app/views/navbar.phtml b/app/views/navbar.phtml new file mode 100644 index 0000000..f2c9571 --- /dev/null +++ b/app/views/navbar.phtml @@ -0,0 +1,82 @@ + + \ No newline at end of file diff --git a/app/views/pages/index.phtml b/app/views/pages/index.phtml new file mode 100644 index 0000000..af4bed4 --- /dev/null +++ b/app/views/pages/index.phtml @@ -0,0 +1,60 @@ +layout("layout", ["container" => false, "location" => null]) ?> + +
+
+

+ PHARext + PHP extension packaging +

+
+
+

+ What? +

+

+ Distribute your PHP extensions as self-installing PHAR archives.1) +

+

" class="btn btn-primary btn-lg btn-block"> + Learn more about pharext! + +

+
+
+

+ Services +

+

+ Manage automatic pharext builds of your PHP extensions. +

+ " class="btn btn-primary btn-lg btn-block"> + Start right with your Github repos! + +
+
+
+
+ +
+ +
+ +
+
+
+

+ 1) + On Unix-like operating systems only. + +

+
+
+
+ diff --git a/app/views/pages/wiki.phtml b/app/views/pages/wiki.phtml new file mode 100644 index 0000000..e0c7056 --- /dev/null +++ b/app/views/pages/wiki.phtml @@ -0,0 +1,7 @@ +layout("layout", ["location" => "pages"]) ?> + + + +md($page, true) ?> diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..573d1d9 --- /dev/null +++ b/composer.json @@ -0,0 +1,27 @@ +{ + "repositories": [{ + "type": "package", + "package": { + "name": "m6w6/pharext.wiki", + "version": "dev-master", + "source": { + "url": "https://github.com/m6w6/pharext.wiki.git", + "type": "git", + "reference": "master" + } + } + }], + "autoload": { + "psr-0": { + "app": "" + } + }, + "require": { + "m6w6/pharext": "~3.0", + "m6w6/merry": "~1.1", + "nikic/fast-route": "0.4.*", + "league/plates": "~3.1", + "rdlowrey/auryn": "dev-master", + "m6w6/pharext.wiki": "dev-master" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..9ed2b4d --- /dev/null +++ b/composer.lock @@ -0,0 +1,255 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "c13d01568dea02e2afe4b9060478178f", + "packages": [ + { + "name": "league/plates", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/plates.git", + "reference": "c39d8fbcbeb07a0948d5e1cf8d78c6e1ef3e81a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/plates/zipball/c39d8fbcbeb07a0948d5e1cf8d78c6e1ef3e81a8", + "reference": "c39d8fbcbeb07a0948d5e1cf8d78c6e1ef3e81a8", + "shasum": "" + }, + "require-dev": { + "mikey179/vfsstream": "~1.4.0", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Plates\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Reinink", + "email": "jonathan@reinink.ca", + "role": "Developer" + } + ], + "description": "Plates, the native PHP template system that's fast, easy to use and easy to extend.", + "homepage": "http://platesphp.com", + "keywords": [ + "league", + "package", + "templates", + "templating", + "views" + ], + "time": "2014-10-21 12:06:12" + }, + { + "name": "m6w6/merry", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/m6w6/merry.git", + "reference": "079ca547531915b0ba0cb6829a89d9c7d4b93408" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/m6w6/merry/zipball/079ca547531915b0ba0cb6829a89d9c7d4b93408", + "reference": "079ca547531915b0ba0cb6829a89d9c7d4b93408", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "merry\\": "lib/merry" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Michael Wallner", + "email": "mike@php.net" + } + ], + "description": "Merry container and configuration", + "homepage": "http://github.com/m6w6/merry", + "keywords": [ + "config", + "configuration", + "container", + "merry" + ], + "time": "2015-03-12 13:49:46" + }, + { + "name": "m6w6/pharext", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/m6w6/pharext.git", + "reference": "3dcc326aa922ce4b70d07049572c6f15a744869c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/m6w6/pharext/zipball/3dcc326aa922ce4b70d07049572c6f15a744869c", + "reference": "3dcc326aa922ce4b70d07049572c6f15a744869c", + "shasum": "" + }, + "bin": [ + "bin/pharext", + "bin/pharext.pubkey" + ], + "type": "project", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "description": "Package PHP extensions as self-installing PHARs", + "keywords": [ + "ext", + "extension", + "install", + "package", + "phar" + ], + "time": "2015-04-08 10:17:40" + }, + { + "name": "m6w6/pharext.wiki", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/m6w6/pharext.wiki.git", + "reference": "master" + }, + "type": "library", + "time": "2015-04-30 17:39:40" + }, + { + "name": "nikic/fast-route", + "version": "v0.4.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "f26a8f7788f25c0e3e9b1579d38d7ccab2755320" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/f26a8f7788f25c0e3e9b1579d38d7ccab2755320", + "reference": "f26a8f7788f25c0e3e9b1579d38d7ccab2755320", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "FastRoute\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ], + "time": "2015-02-26 15:33:07" + }, + { + "name": "rdlowrey/auryn", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/rdlowrey/Auryn.git", + "reference": "500b08ec9942eb8b647b128fa13942d45754e3d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rdlowrey/Auryn/zipball/500b08ec9942eb8b647b128fa13942d45754e3d4", + "reference": "500b08ec9942eb8b647b128fa13942d45754e3d4", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Auryn\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dan Ackroyd", + "email": "Danack@basereality.com", + "homepage": "http://www.basereality.com", + "role": "Developer" + }, + { + "name": "Daniel Lowrey", + "email": "rdlowrey@gmail.com", + "role": "Creator / Main Developer" + }, + { + "name": "Levi Morrison", + "email": "levim@php.net", + "homepage": "http://morrisonlevi.github.com/", + "role": "Developer" + } + ], + "description": "Auryn is a dependency injector for bootstrapping object-oriented PHP applications.", + "homepage": "https://github.com/rdlowrey/Auryn", + "keywords": [ + "dependency injection", + "dic", + "ioc" + ], + "time": "2015-03-12 19:52:27" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "rdlowrey/auryn": 20, + "m6w6/pharext.wiki": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..affb2a0 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,6 @@ +RewriteEngine On +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d [OR] +RewriteCond %{REQUEST_FILENAME} -l +RewriteRule ^ - [L] +RewriteRule ^ index.php [L] diff --git a/public/index.css b/public/index.css new file mode 100644 index 0000000..64b1821 --- /dev/null +++ b/public/index.css @@ -0,0 +1,24 @@ +.footer { + position: fixed; + bottom: 0px; + width: 100%; + height: 60px; + background-color: #F5F5F5; +} +body { + margin-bottom: 60px; +} +.footer > .container { + padding: 15px; + text-align: center; +} + +pre { + display: inline-block; + background-color: #333; + color: #ccc; +} + +h4 { + margin-top: 20px; +} \ No newline at end of file diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..8d0bf63 --- /dev/null +++ b/public/index.php @@ -0,0 +1,7 @@ +execute(Web::class); diff --git a/public/octicons/LICENSE.txt b/public/octicons/LICENSE.txt new file mode 100644 index 0000000..69aa0d5 --- /dev/null +++ b/public/octicons/LICENSE.txt @@ -0,0 +1,9 @@ +(c) 2012-2015 GitHub + +When using the GitHub logos, be sure to follow the GitHub logo guidelines (https://github.com/logos) + +Font License: SIL OFL 1.1 (http://scripts.sil.org/OFL) +Applies to all font files + +Code License: MIT (http://choosealicense.com/licenses/mit/) +Applies to all other files diff --git a/public/octicons/README.md b/public/octicons/README.md new file mode 100644 index 0000000..1007073 --- /dev/null +++ b/public/octicons/README.md @@ -0,0 +1 @@ +If you intend to install Octicons locally, install `octicons-local.ttf`. It should appear as “github-octicons” in your font list. It is specially designed not to conflict with GitHub's web fonts. diff --git a/public/octicons/octicons-local.ttf b/public/octicons/octicons-local.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9ed9c1add38ec96655a6fed5024e94ed51753715 GIT binary patch literal 53604 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 Pq#q-N=~KWR2z~zp8@7J} literal 0 HcmV?d00001 diff --git a/public/octicons/octicons.css b/public/octicons/octicons.css new file mode 100644 index 0000000..9b86765 --- /dev/null +++ b/public/octicons/octicons.css @@ -0,0 +1,236 @@ +@font-face { + font-family: 'octicons'; + src: url('octicons.eot?#iefix') format('embedded-opentype'), + url('octicons.woff') format('woff'), + url('octicons.ttf') format('truetype'), + url('octicons.svg#octicons') format('svg'); + font-weight: normal; + font-style: normal; +} + +/* + +.octicon is optimized for 16px. +.mega-octicon is optimized for 32px but can be used larger. + +*/ +.octicon, .mega-octicon { + font: normal normal normal 16px/1 octicons; + display: inline-block; + text-decoration: none; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.mega-octicon { font-size: 32px; } + +.octicon-alert:before { content: '\f02d'} /*  */ +.octicon-alignment-align:before { content: '\f08a'} /*  */ +.octicon-alignment-aligned-to:before { content: '\f08e'} /*  */ +.octicon-alignment-unalign:before { content: '\f08b'} /*  */ +.octicon-arrow-down:before { content: '\f03f'} /*  */ +.octicon-arrow-left:before { content: '\f040'} /*  */ +.octicon-arrow-right:before { content: '\f03e'} /*  */ +.octicon-arrow-small-down:before { content: '\f0a0'} /*  */ +.octicon-arrow-small-left:before { content: '\f0a1'} /*  */ +.octicon-arrow-small-right:before { content: '\f071'} /*  */ +.octicon-arrow-small-up:before { content: '\f09f'} /*  */ +.octicon-arrow-up:before { content: '\f03d'} /*  */ +.octicon-beer:before { content: '\f069'} /*  */ +.octicon-book:before { content: '\f007'} /*  */ +.octicon-bookmark:before { content: '\f07b'} /*  */ +.octicon-briefcase:before { content: '\f0d3'} /*  */ +.octicon-broadcast:before { content: '\f048'} /*  */ +.octicon-browser:before { content: '\f0c5'} /*  */ +.octicon-bug:before { content: '\f091'} /*  */ +.octicon-calendar:before { content: '\f068'} /*  */ +.octicon-check:before { content: '\f03a'} /*  */ +.octicon-checklist:before { content: '\f076'} /*  */ +.octicon-chevron-down:before { content: '\f0a3'} /*  */ +.octicon-chevron-left:before { content: '\f0a4'} /*  */ +.octicon-chevron-right:before { content: '\f078'} /*  */ +.octicon-chevron-up:before { content: '\f0a2'} /*  */ +.octicon-circle-slash:before { content: '\f084'} /*  */ +.octicon-circuit-board:before { content: '\f0d6'} /*  */ +.octicon-clippy:before { content: '\f035'} /*  */ +.octicon-clock:before { content: '\f046'} /*  */ +.octicon-cloud-download:before { content: '\f00b'} /*  */ +.octicon-cloud-upload:before { content: '\f00c'} /*  */ +.octicon-code:before { content: '\f05f'} /*  */ +.octicon-color-mode:before { content: '\f065'} /*  */ +.octicon-comment-add:before, +.octicon-comment:before { content: '\f02b'} /*  */ +.octicon-comment-discussion:before { content: '\f04f'} /*  */ +.octicon-credit-card:before { content: '\f045'} /*  */ +.octicon-dash:before { content: '\f0ca'} /*  */ +.octicon-dashboard:before { content: '\f07d'} /*  */ +.octicon-database:before { content: '\f096'} /*  */ +.octicon-device-camera:before { content: '\f056'} /*  */ +.octicon-device-camera-video:before { content: '\f057'} /*  */ +.octicon-device-desktop:before { content: '\f27c'} /*  */ +.octicon-device-mobile:before { content: '\f038'} /*  */ +.octicon-diff:before { content: '\f04d'} /*  */ +.octicon-diff-added:before { content: '\f06b'} /*  */ +.octicon-diff-ignored:before { content: '\f099'} /*  */ +.octicon-diff-modified:before { content: '\f06d'} /*  */ +.octicon-diff-removed:before { content: '\f06c'} /*  */ +.octicon-diff-renamed:before { content: '\f06e'} /*  */ +.octicon-ellipsis:before { content: '\f09a'} /*  */ +.octicon-eye-unwatch:before, +.octicon-eye-watch:before, +.octicon-eye:before { content: '\f04e'} /*  */ +.octicon-file-binary:before { content: '\f094'} /*  */ +.octicon-file-code:before { content: '\f010'} /*  */ +.octicon-file-directory:before { content: '\f016'} /*  */ +.octicon-file-media:before { content: '\f012'} /*  */ +.octicon-file-pdf:before { content: '\f014'} /*  */ +.octicon-file-submodule:before { content: '\f017'} /*  */ +.octicon-file-symlink-directory:before { content: '\f0b1'} /*  */ +.octicon-file-symlink-file:before { content: '\f0b0'} /*  */ +.octicon-file-text:before { content: '\f011'} /*  */ +.octicon-file-zip:before { content: '\f013'} /*  */ +.octicon-flame:before { content: '\f0d2'} /*  */ +.octicon-fold:before { content: '\f0cc'} /*  */ +.octicon-gear:before { content: '\f02f'} /*  */ +.octicon-gift:before { content: '\f042'} /*  */ +.octicon-gist:before { content: '\f00e'} /*  */ +.octicon-gist-secret:before { content: '\f08c'} /*  */ +.octicon-git-branch-create:before, +.octicon-git-branch-delete:before, +.octicon-git-branch:before { content: '\f020'} /*  */ +.octicon-git-commit:before { content: '\f01f'} /*  */ +.octicon-git-compare:before { content: '\f0ac'} /*  */ +.octicon-git-merge:before { content: '\f023'} /*  */ +.octicon-git-pull-request-abandoned:before, +.octicon-git-pull-request:before { content: '\f009'} /*  */ +.octicon-globe:before { content: '\f0b6'} /*  */ +.octicon-graph:before { content: '\f043'} /*  */ +.octicon-heart:before { content: '\2665'} /* ♥ */ +.octicon-history:before { content: '\f07e'} /*  */ +.octicon-home:before { content: '\f08d'} /*  */ +.octicon-horizontal-rule:before { content: '\f070'} /*  */ +.octicon-hourglass:before { content: '\f09e'} /*  */ +.octicon-hubot:before { content: '\f09d'} /*  */ +.octicon-inbox:before { content: '\f0cf'} /*  */ +.octicon-info:before { content: '\f059'} /*  */ +.octicon-issue-closed:before { content: '\f028'} /*  */ +.octicon-issue-opened:before { content: '\f026'} /*  */ +.octicon-issue-reopened:before { content: '\f027'} /*  */ +.octicon-jersey:before { content: '\f019'} /*  */ +.octicon-jump-down:before { content: '\f072'} /*  */ +.octicon-jump-left:before { content: '\f0a5'} /*  */ +.octicon-jump-right:before { content: '\f0a6'} /*  */ +.octicon-jump-up:before { content: '\f073'} /*  */ +.octicon-key:before { content: '\f049'} /*  */ +.octicon-keyboard:before { content: '\f00d'} /*  */ +.octicon-law:before { content: '\f0d8'} /*  */ +.octicon-light-bulb:before { content: '\f000'} /*  */ +.octicon-link:before { content: '\f05c'} /*  */ +.octicon-link-external:before { content: '\f07f'} /*  */ +.octicon-list-ordered:before { content: '\f062'} /*  */ +.octicon-list-unordered:before { content: '\f061'} /*  */ +.octicon-location:before { content: '\f060'} /*  */ +.octicon-gist-private:before, +.octicon-mirror-private:before, +.octicon-git-fork-private:before, +.octicon-lock:before { content: '\f06a'} /*  */ +.octicon-logo-github:before { content: '\f092'} /*  */ +.octicon-mail:before { content: '\f03b'} /*  */ +.octicon-mail-read:before { content: '\f03c'} /*  */ +.octicon-mail-reply:before { content: '\f051'} /*  */ +.octicon-mark-github:before { content: '\f00a'} /*  */ +.octicon-markdown:before { content: '\f0c9'} /*  */ +.octicon-megaphone:before { content: '\f077'} /*  */ +.octicon-mention:before { content: '\f0be'} /*  */ +.octicon-microscope:before { content: '\f089'} /*  */ +.octicon-milestone:before { content: '\f075'} /*  */ +.octicon-mirror-public:before, +.octicon-mirror:before { content: '\f024'} /*  */ +.octicon-mortar-board:before { content: '\f0d7'} /*  */ +.octicon-move-down:before { content: '\f0a8'} /*  */ +.octicon-move-left:before { content: '\f074'} /*  */ +.octicon-move-right:before { content: '\f0a9'} /*  */ +.octicon-move-up:before { content: '\f0a7'} /*  */ +.octicon-mute:before { content: '\f080'} /*  */ +.octicon-no-newline:before { content: '\f09c'} /*  */ +.octicon-octoface:before { content: '\f008'} /*  */ +.octicon-organization:before { content: '\f037'} /*  */ +.octicon-package:before { content: '\f0c4'} /*  */ +.octicon-paintcan:before { content: '\f0d1'} /*  */ +.octicon-pencil:before { content: '\f058'} /*  */ +.octicon-person-add:before, +.octicon-person-follow:before, +.octicon-person:before { content: '\f018'} /*  */ +.octicon-pin:before { content: '\f041'} /*  */ +.octicon-playback-fast-forward:before { content: '\f0bd'} /*  */ +.octicon-playback-pause:before { content: '\f0bb'} /*  */ +.octicon-playback-play:before { content: '\f0bf'} /*  */ +.octicon-playback-rewind:before { content: '\f0bc'} /*  */ +.octicon-plug:before { content: '\f0d4'} /*  */ +.octicon-repo-create:before, +.octicon-gist-new:before, +.octicon-file-directory-create:before, +.octicon-file-add:before, +.octicon-plus:before { content: '\f05d'} /*  */ +.octicon-podium:before { content: '\f0af'} /*  */ +.octicon-primitive-dot:before { content: '\f052'} /*  */ +.octicon-primitive-square:before { content: '\f053'} /*  */ +.octicon-pulse:before { content: '\f085'} /*  */ +.octicon-puzzle:before { content: '\f0c0'} /*  */ +.octicon-question:before { content: '\f02c'} /*  */ +.octicon-quote:before { content: '\f063'} /*  */ +.octicon-radio-tower:before { content: '\f030'} /*  */ +.octicon-repo-delete:before, +.octicon-repo:before { content: '\f001'} /*  */ +.octicon-repo-clone:before { content: '\f04c'} /*  */ +.octicon-repo-force-push:before { content: '\f04a'} /*  */ +.octicon-gist-fork:before, +.octicon-repo-forked:before { content: '\f002'} /*  */ +.octicon-repo-pull:before { content: '\f006'} /*  */ +.octicon-repo-push:before { content: '\f005'} /*  */ +.octicon-rocket:before { content: '\f033'} /*  */ +.octicon-rss:before { content: '\f034'} /*  */ +.octicon-ruby:before { content: '\f047'} /*  */ +.octicon-screen-full:before { content: '\f066'} /*  */ +.octicon-screen-normal:before { content: '\f067'} /*  */ +.octicon-search-save:before, +.octicon-search:before { content: '\f02e'} /*  */ +.octicon-server:before { content: '\f097'} /*  */ +.octicon-settings:before { content: '\f07c'} /*  */ +.octicon-log-in:before, +.octicon-sign-in:before { content: '\f036'} /*  */ +.octicon-log-out:before, +.octicon-sign-out:before { content: '\f032'} /*  */ +.octicon-split:before { content: '\f0c6'} /*  */ +.octicon-squirrel:before { content: '\f0b2'} /*  */ +.octicon-star-add:before, +.octicon-star-delete:before, +.octicon-star:before { content: '\f02a'} /*  */ +.octicon-steps:before { content: '\f0c7'} /*  */ +.octicon-stop:before { content: '\f08f'} /*  */ +.octicon-repo-sync:before, +.octicon-sync:before { content: '\f087'} /*  */ +.octicon-tag-remove:before, +.octicon-tag-add:before, +.octicon-tag:before { content: '\f015'} /*  */ +.octicon-telescope:before { content: '\f088'} /*  */ +.octicon-terminal:before { content: '\f0c8'} /*  */ +.octicon-three-bars:before { content: '\f05e'} /*  */ +.octicon-thumbsdown:before { content: '\f0db'} /*  */ +.octicon-thumbsup:before { content: '\f0da'} /*  */ +.octicon-tools:before { content: '\f031'} /*  */ +.octicon-trashcan:before { content: '\f0d0'} /*  */ +.octicon-triangle-down:before { content: '\f05b'} /*  */ +.octicon-triangle-left:before { content: '\f044'} /*  */ +.octicon-triangle-right:before { content: '\f05a'} /*  */ +.octicon-triangle-up:before { content: '\f0aa'} /*  */ +.octicon-unfold:before { content: '\f039'} /*  */ +.octicon-unmute:before { content: '\f0ba'} /*  */ +.octicon-versions:before { content: '\f064'} /*  */ +.octicon-remove-close:before, +.octicon-x:before { content: '\f081'} /*  */ +.octicon-zap:before { content: '\26A1'} /* ⚡ */ diff --git a/public/octicons/octicons.eot b/public/octicons/octicons.eot new file mode 100644 index 0000000000000000000000000000000000000000..842f6319ea71f70d270b604e1576c9b99ab0ba58 GIT binary patch literal 31908 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 + + + +(c) 2012-2015 GitHub + +When using the GitHub logos, be sure to follow the GitHub logo guidelines (https://github.com/logos) + +Font License: SIL OFL 1.1 (http://scripts.sil.org/OFL) +Applies to all font files + +Code License: MIT (http://choosealicense.com/licenses/mit/) +Applies to all other files + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/octicons/octicons.ttf b/public/octicons/octicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d9b4c893a9ff0088e5b3e21b2edabae7b8a92275 GIT binary patch literal 31740 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ⅅykOS6;$rcM_Z4qpAA=<7 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 literal 0 HcmV?d00001 diff --git a/public/octicons/sprockets-octicons.scss b/public/octicons/sprockets-octicons.scss new file mode 100644 index 0000000..1e8d1ca --- /dev/null +++ b/public/octicons/sprockets-octicons.scss @@ -0,0 +1,232 @@ +@font-face { + font-family: 'octicons'; + src: font-url('octicons.eot?#iefix') format('embedded-opentype'), + font-url('octicons.woff') format('woff'), + font-url('octicons.ttf') format('truetype'), + font-url('octicons.svg#octicons') format('svg'); + font-weight: normal; + font-style: normal; +} + +// .octicon is optimized for 16px. +// .mega-octicon is optimized for 32px but can be used larger. +.octicon, .mega-octicon { + font: normal normal normal 16px/1 octicons; + display: inline-block; + text-decoration: none; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.mega-octicon { font-size: 32px; } + +.octicon-alert:before { content: '\f02d'} /*  */ +.octicon-alignment-align:before { content: '\f08a'} /*  */ +.octicon-alignment-aligned-to:before { content: '\f08e'} /*  */ +.octicon-alignment-unalign:before { content: '\f08b'} /*  */ +.octicon-arrow-down:before { content: '\f03f'} /*  */ +.octicon-arrow-left:before { content: '\f040'} /*  */ +.octicon-arrow-right:before { content: '\f03e'} /*  */ +.octicon-arrow-small-down:before { content: '\f0a0'} /*  */ +.octicon-arrow-small-left:before { content: '\f0a1'} /*  */ +.octicon-arrow-small-right:before { content: '\f071'} /*  */ +.octicon-arrow-small-up:before { content: '\f09f'} /*  */ +.octicon-arrow-up:before { content: '\f03d'} /*  */ +.octicon-beer:before { content: '\f069'} /*  */ +.octicon-book:before { content: '\f007'} /*  */ +.octicon-bookmark:before { content: '\f07b'} /*  */ +.octicon-briefcase:before { content: '\f0d3'} /*  */ +.octicon-broadcast:before { content: '\f048'} /*  */ +.octicon-browser:before { content: '\f0c5'} /*  */ +.octicon-bug:before { content: '\f091'} /*  */ +.octicon-calendar:before { content: '\f068'} /*  */ +.octicon-check:before { content: '\f03a'} /*  */ +.octicon-checklist:before { content: '\f076'} /*  */ +.octicon-chevron-down:before { content: '\f0a3'} /*  */ +.octicon-chevron-left:before { content: '\f0a4'} /*  */ +.octicon-chevron-right:before { content: '\f078'} /*  */ +.octicon-chevron-up:before { content: '\f0a2'} /*  */ +.octicon-circle-slash:before { content: '\f084'} /*  */ +.octicon-circuit-board:before { content: '\f0d6'} /*  */ +.octicon-clippy:before { content: '\f035'} /*  */ +.octicon-clock:before { content: '\f046'} /*  */ +.octicon-cloud-download:before { content: '\f00b'} /*  */ +.octicon-cloud-upload:before { content: '\f00c'} /*  */ +.octicon-code:before { content: '\f05f'} /*  */ +.octicon-color-mode:before { content: '\f065'} /*  */ +.octicon-comment-add:before, +.octicon-comment:before { content: '\f02b'} /*  */ +.octicon-comment-discussion:before { content: '\f04f'} /*  */ +.octicon-credit-card:before { content: '\f045'} /*  */ +.octicon-dash:before { content: '\f0ca'} /*  */ +.octicon-dashboard:before { content: '\f07d'} /*  */ +.octicon-database:before { content: '\f096'} /*  */ +.octicon-device-camera:before { content: '\f056'} /*  */ +.octicon-device-camera-video:before { content: '\f057'} /*  */ +.octicon-device-desktop:before { content: '\f27c'} /*  */ +.octicon-device-mobile:before { content: '\f038'} /*  */ +.octicon-diff:before { content: '\f04d'} /*  */ +.octicon-diff-added:before { content: '\f06b'} /*  */ +.octicon-diff-ignored:before { content: '\f099'} /*  */ +.octicon-diff-modified:before { content: '\f06d'} /*  */ +.octicon-diff-removed:before { content: '\f06c'} /*  */ +.octicon-diff-renamed:before { content: '\f06e'} /*  */ +.octicon-ellipsis:before { content: '\f09a'} /*  */ +.octicon-eye-unwatch:before, +.octicon-eye-watch:before, +.octicon-eye:before { content: '\f04e'} /*  */ +.octicon-file-binary:before { content: '\f094'} /*  */ +.octicon-file-code:before { content: '\f010'} /*  */ +.octicon-file-directory:before { content: '\f016'} /*  */ +.octicon-file-media:before { content: '\f012'} /*  */ +.octicon-file-pdf:before { content: '\f014'} /*  */ +.octicon-file-submodule:before { content: '\f017'} /*  */ +.octicon-file-symlink-directory:before { content: '\f0b1'} /*  */ +.octicon-file-symlink-file:before { content: '\f0b0'} /*  */ +.octicon-file-text:before { content: '\f011'} /*  */ +.octicon-file-zip:before { content: '\f013'} /*  */ +.octicon-flame:before { content: '\f0d2'} /*  */ +.octicon-fold:before { content: '\f0cc'} /*  */ +.octicon-gear:before { content: '\f02f'} /*  */ +.octicon-gift:before { content: '\f042'} /*  */ +.octicon-gist:before { content: '\f00e'} /*  */ +.octicon-gist-secret:before { content: '\f08c'} /*  */ +.octicon-git-branch-create:before, +.octicon-git-branch-delete:before, +.octicon-git-branch:before { content: '\f020'} /*  */ +.octicon-git-commit:before { content: '\f01f'} /*  */ +.octicon-git-compare:before { content: '\f0ac'} /*  */ +.octicon-git-merge:before { content: '\f023'} /*  */ +.octicon-git-pull-request-abandoned:before, +.octicon-git-pull-request:before { content: '\f009'} /*  */ +.octicon-globe:before { content: '\f0b6'} /*  */ +.octicon-graph:before { content: '\f043'} /*  */ +.octicon-heart:before { content: '\2665'} /* ♥ */ +.octicon-history:before { content: '\f07e'} /*  */ +.octicon-home:before { content: '\f08d'} /*  */ +.octicon-horizontal-rule:before { content: '\f070'} /*  */ +.octicon-hourglass:before { content: '\f09e'} /*  */ +.octicon-hubot:before { content: '\f09d'} /*  */ +.octicon-inbox:before { content: '\f0cf'} /*  */ +.octicon-info:before { content: '\f059'} /*  */ +.octicon-issue-closed:before { content: '\f028'} /*  */ +.octicon-issue-opened:before { content: '\f026'} /*  */ +.octicon-issue-reopened:before { content: '\f027'} /*  */ +.octicon-jersey:before { content: '\f019'} /*  */ +.octicon-jump-down:before { content: '\f072'} /*  */ +.octicon-jump-left:before { content: '\f0a5'} /*  */ +.octicon-jump-right:before { content: '\f0a6'} /*  */ +.octicon-jump-up:before { content: '\f073'} /*  */ +.octicon-key:before { content: '\f049'} /*  */ +.octicon-keyboard:before { content: '\f00d'} /*  */ +.octicon-law:before { content: '\f0d8'} /*  */ +.octicon-light-bulb:before { content: '\f000'} /*  */ +.octicon-link:before { content: '\f05c'} /*  */ +.octicon-link-external:before { content: '\f07f'} /*  */ +.octicon-list-ordered:before { content: '\f062'} /*  */ +.octicon-list-unordered:before { content: '\f061'} /*  */ +.octicon-location:before { content: '\f060'} /*  */ +.octicon-gist-private:before, +.octicon-mirror-private:before, +.octicon-git-fork-private:before, +.octicon-lock:before { content: '\f06a'} /*  */ +.octicon-logo-github:before { content: '\f092'} /*  */ +.octicon-mail:before { content: '\f03b'} /*  */ +.octicon-mail-read:before { content: '\f03c'} /*  */ +.octicon-mail-reply:before { content: '\f051'} /*  */ +.octicon-mark-github:before { content: '\f00a'} /*  */ +.octicon-markdown:before { content: '\f0c9'} /*  */ +.octicon-megaphone:before { content: '\f077'} /*  */ +.octicon-mention:before { content: '\f0be'} /*  */ +.octicon-microscope:before { content: '\f089'} /*  */ +.octicon-milestone:before { content: '\f075'} /*  */ +.octicon-mirror-public:before, +.octicon-mirror:before { content: '\f024'} /*  */ +.octicon-mortar-board:before { content: '\f0d7'} /*  */ +.octicon-move-down:before { content: '\f0a8'} /*  */ +.octicon-move-left:before { content: '\f074'} /*  */ +.octicon-move-right:before { content: '\f0a9'} /*  */ +.octicon-move-up:before { content: '\f0a7'} /*  */ +.octicon-mute:before { content: '\f080'} /*  */ +.octicon-no-newline:before { content: '\f09c'} /*  */ +.octicon-octoface:before { content: '\f008'} /*  */ +.octicon-organization:before { content: '\f037'} /*  */ +.octicon-package:before { content: '\f0c4'} /*  */ +.octicon-paintcan:before { content: '\f0d1'} /*  */ +.octicon-pencil:before { content: '\f058'} /*  */ +.octicon-person-add:before, +.octicon-person-follow:before, +.octicon-person:before { content: '\f018'} /*  */ +.octicon-pin:before { content: '\f041'} /*  */ +.octicon-playback-fast-forward:before { content: '\f0bd'} /*  */ +.octicon-playback-pause:before { content: '\f0bb'} /*  */ +.octicon-playback-play:before { content: '\f0bf'} /*  */ +.octicon-playback-rewind:before { content: '\f0bc'} /*  */ +.octicon-plug:before { content: '\f0d4'} /*  */ +.octicon-repo-create:before, +.octicon-gist-new:before, +.octicon-file-directory-create:before, +.octicon-file-add:before, +.octicon-plus:before { content: '\f05d'} /*  */ +.octicon-podium:before { content: '\f0af'} /*  */ +.octicon-primitive-dot:before { content: '\f052'} /*  */ +.octicon-primitive-square:before { content: '\f053'} /*  */ +.octicon-pulse:before { content: '\f085'} /*  */ +.octicon-puzzle:before { content: '\f0c0'} /*  */ +.octicon-question:before { content: '\f02c'} /*  */ +.octicon-quote:before { content: '\f063'} /*  */ +.octicon-radio-tower:before { content: '\f030'} /*  */ +.octicon-repo-delete:before, +.octicon-repo:before { content: '\f001'} /*  */ +.octicon-repo-clone:before { content: '\f04c'} /*  */ +.octicon-repo-force-push:before { content: '\f04a'} /*  */ +.octicon-gist-fork:before, +.octicon-repo-forked:before { content: '\f002'} /*  */ +.octicon-repo-pull:before { content: '\f006'} /*  */ +.octicon-repo-push:before { content: '\f005'} /*  */ +.octicon-rocket:before { content: '\f033'} /*  */ +.octicon-rss:before { content: '\f034'} /*  */ +.octicon-ruby:before { content: '\f047'} /*  */ +.octicon-screen-full:before { content: '\f066'} /*  */ +.octicon-screen-normal:before { content: '\f067'} /*  */ +.octicon-search-save:before, +.octicon-search:before { content: '\f02e'} /*  */ +.octicon-server:before { content: '\f097'} /*  */ +.octicon-settings:before { content: '\f07c'} /*  */ +.octicon-log-in:before, +.octicon-sign-in:before { content: '\f036'} /*  */ +.octicon-log-out:before, +.octicon-sign-out:before { content: '\f032'} /*  */ +.octicon-split:before { content: '\f0c6'} /*  */ +.octicon-squirrel:before { content: '\f0b2'} /*  */ +.octicon-star-add:before, +.octicon-star-delete:before, +.octicon-star:before { content: '\f02a'} /*  */ +.octicon-steps:before { content: '\f0c7'} /*  */ +.octicon-stop:before { content: '\f08f'} /*  */ +.octicon-repo-sync:before, +.octicon-sync:before { content: '\f087'} /*  */ +.octicon-tag-remove:before, +.octicon-tag-add:before, +.octicon-tag:before { content: '\f015'} /*  */ +.octicon-telescope:before { content: '\f088'} /*  */ +.octicon-terminal:before { content: '\f0c8'} /*  */ +.octicon-three-bars:before { content: '\f05e'} /*  */ +.octicon-thumbsdown:before { content: '\f0db'} /*  */ +.octicon-thumbsup:before { content: '\f0da'} /*  */ +.octicon-tools:before { content: '\f031'} /*  */ +.octicon-trashcan:before { content: '\f0d0'} /*  */ +.octicon-triangle-down:before { content: '\f05b'} /*  */ +.octicon-triangle-left:before { content: '\f044'} /*  */ +.octicon-triangle-right:before { content: '\f05a'} /*  */ +.octicon-triangle-up:before { content: '\f0aa'} /*  */ +.octicon-unfold:before { content: '\f039'} /*  */ +.octicon-unmute:before { content: '\f0ba'} /*  */ +.octicon-versions:before { content: '\f064'} /*  */ +.octicon-remove-close:before, +.octicon-x:before { content: '\f081'} /*  */ +.octicon-zap:before { content: '\26A1'} /* ⚡ */ -- 2.30.2