Merge branch 'develop-olympus' into develop

* develop-olympus:
  [ticket/11603] Throw RuntimeExceptions instead of using exit()
  [ticket/11603] Avoid using cURL
  [ticket/11603] Split api_request into two functions (query only vs. full url)
  [ticket/11603] Fix spacing and add some comments
  [ticket/11603] Fix github API calls
  [ticket/11603] Rename network to forks and fix handling
  [ticket/11603] Fix github api url and use curl with valid user agent
This commit is contained in:
Andreas Fischer 2013-06-20 11:34:54 +02:00
commit 1e4ad4c368
2 changed files with 83 additions and 28 deletions

View file

@ -124,19 +124,34 @@ function get_repository_url($username, $repository, $ssh = false)
function api_request($query) function api_request($query)
{ {
$contents = file_get_contents("http://github.com/api/v2/json/$query"); return api_url_request("https://api.github.com/$query?per_page=100");
}
function api_url_request($url)
{
$contents = file_get_contents($url, false, stream_context_create(array(
'http' => array(
'header' => "User-Agent: phpBB/1.0\r\n",
),
)));
if ($contents === false) if ($contents === false)
{ {
throw new RuntimeException("Error: failed to retrieve pull request data\n", 4); throw new RuntimeException("Error: failed to retrieve pull request data\n", 4);
} }
$contents = json_decode($contents);
return json_decode($contents); if (isset($contents->message) && strpos($contents->message, 'API Rate Limit') === 0)
{
throw new RuntimeException('Reached github API Rate Limit. Please try again later' . "\n", 4);
}
return $contents;
} }
function get_pull($username, $repository, $pull_id) function get_pull($username, $repository, $pull_id)
{ {
$request = api_request("pulls/$username/$repository/$pull_id"); $request = api_request("repos/$username/$repository/pulls/$pull_id");
$pull = $request->pull; $pull = $request->pull;

View file

@ -22,7 +22,7 @@ function show_usage()
echo " collaborators Repositories of people who have push access to the specified repository\n"; echo " collaborators Repositories of people who have push access to the specified repository\n";
echo " contributors Repositories of people who have contributed to the specified repository\n"; echo " contributors Repositories of people who have contributed to the specified repository\n";
echo " organisation Repositories of members of the organisation at github\n"; echo " organisation Repositories of members of the organisation at github\n";
echo " network All repositories of the whole github network\n"; echo " forks All repositories of the whole github network\n";
echo "\n"; echo "\n";
echo "Options:\n"; echo "Options:\n";
@ -55,31 +55,31 @@ exit(work($scope, $username, $repository, $developer));
function work($scope, $username, $repository, $developer) function work($scope, $username, $repository, $developer)
{ {
// Get some basic data // Get some basic data
$network = get_network($username, $repository); $forks = get_forks($username, $repository);
$collaborators = get_collaborators($username, $repository); $collaborators = get_collaborators($username, $repository);
if ($network === false || $collaborators === false) if ($forks === false || $collaborators === false)
{ {
echo "Error: failed to retrieve network or collaborators\n"; echo "Error: failed to retrieve forks or collaborators\n";
return 1; return 1;
} }
switch ($scope) switch ($scope)
{ {
case 'collaborators': case 'collaborators':
$remotes = array_intersect_key($network, $collaborators); $remotes = array_intersect_key($forks, $collaborators);
break; break;
case 'organisation': case 'organisation':
$remotes = array_intersect_key($network, get_organisation_members($username)); $remotes = array_intersect_key($forks, get_organisation_members($username));
break; break;
case 'contributors': case 'contributors':
$remotes = array_intersect_key($network, get_contributors($username, $repository)); $remotes = array_intersect_key($forks, get_contributors($username, $repository));
break; break;
case 'network': case 'forks':
$remotes = $network; $remotes = $forks;
break; break;
default: default:
@ -145,26 +145,66 @@ function get_repository_url($username, $repository, $ssh = false)
function api_request($query) function api_request($query)
{ {
$contents = file_get_contents("http://github.com/api/v2/json/$query"); return api_url_request("https://api.github.com/$query?per_page=100");
}
function api_url_request($url)
{
$contents = file_get_contents($url, false, stream_context_create(array(
'http' => array(
'header' => "User-Agent: phpBB/1.0\r\n",
),
)));
$sub_request_result = array();
// Split possible headers from the body
if (!empty($http_response_header))
{
foreach ($http_response_header as $header_element)
{
// Find Link Header which gives us a link to the next page
if (strpos($header_element, 'Link: ') === 0)
{
list($head, $header_content) = explode(': ', $header_element);
foreach (explode(', ', $header_content) as $links)
{
list($url, $rel) = explode('; ', $links);
if ($rel == 'rel="next"')
{
// Found a next link, follow it and merge the results
$sub_request_result = api_url_request(substr($url, 1, -1));
}
}
}
}
}
if ($contents === false) if ($contents === false)
{ {
return false; return false;
} }
return json_decode($contents); $contents = json_decode($contents);
if (isset($contents->message) && strpos($contents->message, 'API Rate Limit') === 0)
{
throw new RuntimeException('Reached github API Rate Limit. Please try again later' . "\n", 4);
}
return ($sub_request_result) ? array_merge($sub_request_result, $contents) : $contents;
} }
function get_contributors($username, $repository) function get_contributors($username, $repository)
{ {
$request = api_request("repos/show/$username/$repository/contributors"); $request = api_request("repos/$username/$repository/stats/contributors");
if ($request === false) if ($request === false)
{ {
return false; return false;
} }
$usernames = array(); $usernames = array();
foreach ($request->contributors as $contributor) foreach ($request as $contribution)
{ {
$usernames[$contributor->login] = $contributor->login; $usernames[$contribution->author->login] = $contribution->author->login;
} }
return $usernames; return $usernames;
@ -172,14 +212,14 @@ function get_contributors($username, $repository)
function get_organisation_members($username) function get_organisation_members($username)
{ {
$request = api_request("organizations/$username/public_members"); $request = api_request("orgs/$username/public_members");
if ($request === false) if ($request === false)
{ {
return false; return false;
} }
$usernames = array(); $usernames = array();
foreach ($request->users as $member) foreach ($request as $member)
{ {
$usernames[$member->login] = $member->login; $usernames[$member->login] = $member->login;
} }
@ -189,35 +229,35 @@ function get_organisation_members($username)
function get_collaborators($username, $repository) function get_collaborators($username, $repository)
{ {
$request = api_request("repos/show/$username/$repository/collaborators"); $request = api_request("repos/$username/$repository/collaborators");
if ($request === false) if ($request === false)
{ {
return false; return false;
} }
$usernames = array(); $usernames = array();
foreach ($request->collaborators as $collaborator) foreach ($request as $collaborator)
{ {
$usernames[$collaborator] = $collaborator; $usernames[$collaborator->login] = $collaborator->login;
} }
return $usernames; return $usernames;
} }
function get_network($username, $repository) function get_forks($username, $repository)
{ {
$request = api_request("repos/show/$username/$repository/network"); $request = api_request("repos/$username/$repository/forks");
if ($request === false) if ($request === false)
{ {
return false; return false;
} }
$usernames = array(); $usernames = array();
foreach ($request->network as $network) foreach ($request as $fork)
{ {
$usernames[$network->owner] = array( $usernames[$fork->owner->login] = array(
'username' => $network->owner, 'username' => $fork->owner->login,
'repository' => $network->name, 'repository' => $fork->name,
); );
} }