166 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			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);
 | |
| 	}
 | |
| 
 | |
| } |