Commit: 458dec41c58a27f3b041c031a57ac4af870ac71d Author: Johannes Schlüter <[email protected]> Sat, 11 May 2013 01:30:56 +0200 Parents: 1e58ee7e3f2501e35da0bf9b172e1defefec656a Branches: master
Link: http://git.php.net/?p=web/master.git;a=commitdiff;h=458dec41c58a27f3b041c031a57ac4af870ac71d Log: Add script to create GitHub repos following php.net best practices Changed paths: M .gitignore A manage/github-config.php.sample A manage/github.php Diff: diff --git a/.gitignore b/.gitignore index e52e2ee..7b6cb71 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .token .token_flickr tags +manage/github-config.php diff --git a/manage/github-config.php.sample b/manage/github-config.php.sample new file mode 100644 index 0000000..eb846cc --- /dev/null +++ b/manage/github-config.php.sample @@ -0,0 +1,3 @@ +<?php +define('GITHUB_CLIENT_ID', '0123456789abcdef0123'); +define('GITHUB_CLIENT_SECRET', '0123456789abcdef0123456789abcdef01234567'); diff --git a/manage/github.php b/manage/github.php new file mode 100644 index 0000000..4ef6569 --- /dev/null +++ b/manage/github.php @@ -0,0 +1,174 @@ +<?php // vim: et ts=2 sw=2 + +// This script evolved from a quick'n'dirty shell script. If you are reading +// this feel free to clean it! + +require '../include/login.inc'; + +@include './github-config.php'; +if (!defined('GITHUB_CLIENT_ID') || !defined('GITHUB_CLIENT_SECRET')) { + die('GITHUB_CLIENT_ID or GITHUB_CLIENT_SECRET not defined. Please verify ./github-config.php'); +} + +define('GITHUB_PHP_OWNER_TEAM_ID', 65141); +define('GITHUB_REPO_TEAM_ID', 138591); +if (!defined('GITHUB_USER_AGENT')) { + define('GITHUB_USER_AGENT', 'php.net repository management (master.php.net, [email protected], [email protected])'); +} + +function github_api($endpoint, $method = 'GET', $options = array()) +{ + $options['method'] = $method; + $options['user_agent'] = GITHUB_USER_AGENT; + + $ctxt = stream_context_create(array('http' => $options)); + + $url = 'https://api.github.com'.$endpoint; + $s = @file_get_contents($url, false, $ctxt); + if ($s === false) { + die('Request to GitHub failed. Endpoint: '.$endpoint); + } + + $retval = json_decode($s); + return $retval; +} + +function github_current_user($access_token = false) +{ + if (!$access_token) { + $access_token = $_SESSION['github']['access_token']; + } + + if (empty($_SESSION['github']['current_user'])) { + $user = github_api('/user?access_token='.urlencode($access_token)); + if (!$user->login) { + die('Failed to get current user'); + } + + $_SESSION['github']['current_user'] = $user; + } + + return $_SESSION['github']['current_user']; +} + +function github_require_valid_user() +{ + if (isset($_SESSION['github']['access_token'])) { + return true; + } + + if (isset($_GET['code'])) { + $data = array( + 'client_id' => GITHUB_CLIENT_ID, + 'client_secret' => GITHUB_CLIENT_SECRET, + 'code' => $_GET['code'] + ); + $data_encoded = http_build_query($data); + $opts = array( + 'method' => 'POST', + 'user_agent' => GITHUB_USER_AGENT, + 'header' => 'Content-type: application/x-www-form-urlencoded', + 'content' => $data_encoded, + ); + $ctxt = stream_context_create(array('http' => $opts)); + $s = @file_get_contents('https://github.com/login/oauth/access_token', false, $ctxt); + if (!$s) { + die('Failed while checking with GitHub,either you are trying to hack us or our configuration is wrong (GITHUB_CLIENT_SECRET outdated?)'); + } + $gh = array(); + parse_str($s, $gh); + if (empty($gh['access_token'])) { + die("GitHub responded but didn't send an access_token"); + } + + $user = github_current_user($gh['access_token']); + + $endpoint = '/teams/'.urlencode(GITHUB_PHP_OWNER_TEAM_ID).'/members/'.urlencode($user->login); + $opts = array('user_agent' => GITHUB_USER_AGENT); + $ctxt = stream_context_create(array('http' => $opts)); + $is_member = file_get_contents('https://api.github.com'.$endpoint.'?access_token='.urlencode($gh['access_token']), false, $ctxt); + + if ($is_member === false) { + head("github administration"); + echo '<h1>You are no member of the php organization on github.</h1>'. + '<p>Please contact an existing member if you see need.</p>'; + foot(); + exit; + } + // SUCCESS + $_SESSION['github']['access_token'] = $gh['access_token']; + header('Location: github.php'); + exit; + } + + // Start oauth + header('Location: https://github.com/login/oauth/authorize?scope=repo&client_id='.urlencode(GITHUB_CLIENT_ID)); + exit; +} + +if (isset($_POST['description']) && isset($_SESSION['github']['access_token'])) { + action_create_repo(); +} elseif (isset($_GET['login']) || isset($_GET['code']) || isset($_SESSION['github']['access_token'])) { + action_form(); +} else { + action_default(); +} + +function action_default() +{ + head("github administration"); + echo '<p>This tool is for administrating PHP repos on GitHub. Currently it is used for adding repos only.</p>'; + echo '<p><b>NOTE:</b> Only members of the PHP organisation on GitHub can use this tool. We try to keep the number of members limited.</p>'; + echo '<p>In case you are a member you can <a href="github.php?login=1">login using GitHub</a>.</p>'; + foot(); +} + +function action_form() +{ + github_require_valid_user(); + head("github administration"); +?> +<p>Creating a GitHub repo using this form ensures the proper configuration. This +includes disabling the GitHub wiki and issue tracker as well as enabling the +php-pulls user to push changes made on git.php.net.</p> +<p>The name, description andhomepage should follow other existing repositories.</p> +<form method="post" action="github.php"> +Github repo name: http://github.com/php/<input name="name"> (i.e. pecl-category-foobar)<br> +Description: <input name="description"> (i.e. PECL foobar extension)<br> +Homepage: <input name="homepage"> (i.e. http://pecl.php.net/package/fooar)<br> +<input type="submit" value="Create Repository on GitHub"> +<input type="hidden" name="action" value="create"> +<?php + foot(); +} + +function action_create_repo() +{ + github_require_valid_user(); + + $data = array( + 'name' => $_POST['name'], + 'description' => $_POST['description'], + + 'homepage' => $_POST['homepage'], + 'private' => false, + 'has_issues' => false, + 'has_wiki' => false, + 'has_downloads' => false, + 'team_id' => GITHUB_REPO_TEAM_ID, + ); + $data_j = json_encode($data); + $opts = array( + 'content' => $data_j, + ); + $res = github_api('/orgs/php/repos?access_token='.urlencode($_SESSION['github']['access_token']), 'POST', $opts); + + head("github administration"); + if (isset($res->html_url)) { + echo '<p>Repo created!</p><p><a href="'.htmlentities($res->html_url, ENT_QUOTES).'">Check on GitHub</a>.</p>'; + } else { + echo "Error while creating repo."; + } + foot(); +} +?> -- PHP Webmaster List Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
