1
0
www.mikescher.com/www/extern/egh/ConnectionGithub.php

166 lines
4.1 KiB
PHP

<?php
require_once 'SingleCommitInfo.php';
require_once 'Utils.php';
class ConnectionGithub
{
const API_OAUTH_AUTH = 'https://github.com/login/oauth/authorize?client_id=%s';
const URL_OAUTH_TOKEN = 'https://github.com/login/oauth/access_token?client_id={id}&client_secret={secret}&code={code}';
const API_RATELIMIT = 'https://api.github.com/rate_limit';
const API_REPOSITORIESLIST = 'https://api.github.com/users/{user}/repos?page={page}&per_page=100';
const API_COMMITSLIST = 'https://api.github.com/repos/{repo}/commits?per_page=100&page={page}&author={author}';
/* @var string */
private $token;
/* @var string */
private $owner;
/**
* @param $owner ExtendedGitGraph
*/
public function __construct($owner) {
$this->owner = $owner;
}
public function setAPIToken($token) {
$this->token = $token;
}
public function queryAPIToken($client_id, $client_secret) {
$url = Utils::sharpFormat(self::URL_OAUTH_TOKEN, ['id'=>$client_id, 'secret'=>$client_secret, 'code'=>'egh']);
$result = file_get_contents($url);
$result = str_replace('access_token=', '', $result);
$result = str_replace('&scope=&token_type=bearer', '', $result);
$this->setAPIToken($result);
}
/**
* @param $cfg EGHRemoteConfig
* @return SingleCommitInfo[]
*/
public function getDataUser($cfg)
{
$repos = $this->listRepositoriesByUser($cfg->Param);
$result = [];
foreach ($repos as $repo)
{
$commits = $this->listCommitsFromRepo($repo, $cfg->Author);
foreach ($commits as $c) $result []= $c;
}
return $result;
}
/**
* @param $cfg EGHRemoteConfig
* @return SingleCommitInfo[]
*/
public function getDataRepository($cfg)
{
return $this->listCommitsFromRepo($cfg->Param, $cfg->Author);
}
/**
* @param $user string
* @return string[]
*/
private function listRepositoriesByUser($user)
{
$result = [];
$page = 1;
$url = Utils::sharpFormat(self::API_REPOSITORIESLIST, ['user'=>$user, 'page'=>$page, 'token'=>$this->token]);
$json = $this->getJSON($url);
while (! empty($json)) {
foreach ($json as $result_repo) {
$result []= $result_repo->{'full_name'};
$this->owner->out("Found Repo: " . $result_repo->{'full_name'});
}
$page++;
$url = Utils::sharpFormat(self::API_REPOSITORIESLIST, ['user'=>$user, 'page'=>$page, 'token'=>$this->token]);
$json = $this->getJSON($url);
}
return $result;
}
/**
* @param $repo string
* @param $user string
* @return SingleCommitInfo[]
*/
private function listCommitsFromRepo($repo, $user)
{
$page = 1;
$url = Utils::sharpFormat(self::API_COMMITSLIST, ['repo'=>$repo, 'author'=>$user, 'page'=>$page, 'token'=>$this->token]);
$result = $this->getJSON($url);
$commit_list = [];
while (! empty($result)) {
foreach ($result as $rc) $commit_list[] = new SingleCommitInfo(DateTime::createFromFormat(DateTime::ISO8601, $rc->{'commit'}->{'author'}->{'date'}), 'github', $user, $repo);
$this->owner->out("Found " . count($result) . " Commits in " . $repo);
$page++;
$url = Utils::sharpFormat(self::API_COMMITSLIST, [ 'repo'=>$repo, 'author'=>$user, 'page'=>$page, 'token'=>$this->token ]);
$result = $this->getJSON($url);
}
return $commit_list;
}
public function getJSON($url) {
if (array_key_exists('HTTP_USER_AGENT', $_SERVER)) {
$options =
[
'http' =>
[
'user_agent' => $_SERVER['HTTP_USER_AGENT'],
'header' => 'Authorization: token ' . $this->token,
],
'https' =>
[
'user_agent' => $_SERVER['HTTP_USER_AGENT'],
'header' => 'Authorization: token ' . $this->token,
],
];
} else {
$options =
[
'http' =>
[
'user_agent' => 'ExtendedGitGraph_for_mikescher.com',
'header' => 'Authorization: token ' . $this->token,
],
'https' =>
[
'user_agent' => 'ExtendedGitGraph_for_mikescher.com',
'header' => 'Authorization: token ' . $this->token,
],
];
}
$context = stream_context_create($options);
$response = @file_get_contents($url, false, $context);
if ($response === false)
{
$this->owner->out("Error recieving json: '" . $url . "'");
return [];
}
return json_decode($response);
}
}