mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-28 06:08:52 +00:00
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:
commit
1e4ad4c368
2 changed files with 83 additions and 28 deletions
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue