예제 #1
0
 /**
  * undocumented function
  *
  * @return void
  * @author 
  **/
 public function takeCare()
 {
     $req = Request::instance();
     $token = $this->client->getAccessToken('authorizationCode', ['code' => $req->get('code')]);
     $github = new \Github\Client();
     $github->authenticate($token->accessToken, 'http_token');
     $response = $github->getHttpClient()->get('user');
     $user = \Github\HttpClient\Message\ResponseMediator::getContent($response);
     $verifiedEmails = $this->getVerifiedEmails($token->accessToken);
     $email = $this->getPrimaryEmail($verifiedEmails);
     $result['uid'] = $user['id'];
     $result['email'] = $email;
     $result['username'] = $user['login'];
     $result['url'] = $user['html_url'];
     $result['location'] = isset($user['location']) ? $user['location'] : null;
     $fresult = $this->findUser($result['email']);
     if ($fresult['found']) {
         $fuser = $fresult['user'];
         $result['first_name'] = $fuser->first_name;
         $result['last_name'] = $fuser->last_name;
     } else {
         if (isset($user['name'])) {
             $name = explode(' ', $user['name']);
             $result['first_name'] = $name[0];
             $result['last_name'] = isset($name[1]) ? $name[1] : $name[0];
         } else {
             $result['first_name'] = $result['last_name'] = $result['username'];
         }
     }
     $result['access_token'] = $token->accessToken;
     return $result;
 }
예제 #2
0
 /**
  * Closes any open pull requests on mirrored repositories.
  *
  * Since these are mirrored repos, any pull requests submitted are not
  * monitored or handled. Since GitHub does not support turning off pull
  * requests, it is inevitable that users will submit them anyway.
  *
  * Note: GitHub supports turning off issues, but not pull requests.
  *
  * This utility will simply auto-close any opened pull requests while
  * directing author to a (hopefully) more appropriate location to submit
  * changes to.
  *
  * @return int Shell return code.
  */
 function main()
 {
     $this->out(__('Fetching list of open issues...'));
     try {
         $client = new Github\Client();
         $client->getHttpClient()->setOption('user_agent', Configure::read('GitHub.user_agent'));
         $client->authenticate(GITHUB_USERNAME, GITHUB_PASSWORD, Github\Client::AUTH_HTTP_PASSWORD);
     } catch (Exception $exception) {
         $this->out(__('<error>Failed to authenticate with GitHub: %s</error>', $exception->getMessage()));
         $this->_unlock();
         return 1;
     }
     try {
         $response = $client->getHttpClient()->get('search/issues', array('q' => sprintf('user:%s state:open', Configure::read('GitHub.org_name'))));
         $issues = $response->getContent();
     } catch (Exception $exception) {
         $this->out(__('<error>Failed to fetch list of open issues: %s</error>', $exception->getMessage()));
         $this->_unlock();
         return 1;
     }
     if ($issues['total_count'] == 0) {
         $this->out(__('<info>No open pull requests were found.</info>'));
         $this->_unlock();
         return 0;
     }
     foreach ($issues['items'] as $pull_request) {
         $parts = explode('/', $pull_request['html_url']);
         $user = $parts[3];
         $plugin = $parts[4];
         $issue_number = $parts[6];
         $plugin_page = sprintf(Configure::read('App.plugin_http_url'), $plugin);
         $support_page = sprintf(Configure::read('App.plugin_support_url'), $plugin);
         $pull_request_url = sprintf('repos/%s/%s/pulls/%d', $user, $plugin, $issue_number);
         try {
             $client->getHttpClient()->post($pull_request['comments_url'], array('body' => sprintf($this->close_reply, $plugin_page, $support_page)));
             $client->getHttpClient()->patch($pull_request_url, array('state' => 'closed'));
         } catch (Exception $exception) {
             $this->out(__('<error>Failed to close pull request <%s>: %s</error>', $pull_request['html_url'], $exception->getMessage()));
             continue;
         }
         $this->out(__('Closed pull request: %s', $pull_request['html_url']));
     }
     $this->out(__('<info>Finished closing open issues on GitHub.</info>'));
     $this->_unlock();
     return 0;
 }
예제 #3
0
 /**
  * Creates a GitHub repository with the given name.
  *
  * @param string $repo Name of the repository (slug)
  *
  * @return bool True if GitHub repository was created, false otherwise.
  */
 protected function _createGithubRepo($repo)
 {
     try {
         $client = new Github\Client();
         $client->getHttpClient()->setOption('user_agent', Configure::read('GitHub.user_agent'));
         $client->authenticate(GITHUB_USERNAME, GITHUB_PASSWORD, Github\Client::AUTH_HTTP_PASSWORD);
         $client->getHttpClient()->post('orgs/' . Configure::read('GitHub.org_name') . '/repos', array('name' => $repo, 'description' => Configure::read('GitHub.repo_description'), 'homepage' => sprintf(Configure::read('App.plugin_app_url'), $repo), 'has_issues' => false, 'has_wiki' => false, 'has_downloads' => false));
     } catch (Exception $exception) {
         $this->out(__('<warning>Failed to create GitHub repository for "%s": %s</warning>', $repo, $exception->getMessage()));
         return false;
     }
     return true;
 }
예제 #4
0
                $issues = $client->api('issue')->all($config->org, $repo, ['labels' => $label['name']]);
                $openCount = count($issues);
                if ($SHOW_LABEL) {
                    if ($openCount === 0) {
                        print $COLOR_GRAY;
                    } else {
                        print $COLOR_RED;
                    }
                    print "    " . $label['name'] . ' ' . $openCount . $NO_COLOR . PHP_EOL;
                }
                $repositories[$repo]['labels'][$label['name']] = ['color' => $label['color'], 'open' => $openCount];
            }
        }
    }
}
$response = $client->getHttpClient()->get("rate_limit");
print "Remaining requests to GitHub this hour: " . \Github\HttpClient\Message\ResponseMediator::getContent($response)['rate']['remaining'] . PHP_EOL;
foreach ($repositories as $name => $repository) {
    foreach ($repository['milestones'] as $milestone => $info) {
        if (array_key_exists($milestone, $config->renameMilestones)) {
            $data = ["title" => $config->renameMilestones->{$milestone}, "state" => $info['state'], "description" => $info['description'], "due_on" => $info['due_on']];
            if (strpos($config->renameMilestones->{$milestone}, '-') === false && $info['open_issues'] === 0) {
                $data['state'] = 'closed';
            }
            $textStyle = $data['state'] === 'open' ? $BOLD : '';
            print $COLOR_RED . $config->org . '/' . $name . ': rename milestone ' . $milestone . ' -> ' . $config->renameMilestones->{$milestone} . ' - state: ' . $textStyle . $data['state'] . $NO_COLOR . PHP_EOL;
            if (array_key_exists($config->renameMilestones->{$milestone}, $config->dueDates)) {
                $newName = $config->renameMilestones->{$milestone};
                $data['due_on'] = $config->dueDates->{$newName} . 'T04:00:00Z';
            }
            continue;
예제 #5
0
 /**
  * Adds a new merger on its corresponding Github team
  * @param $codeReviewer_id
  * @return number
  */
 public function addCodeReviewer($codeReviewer_id)
 {
     try {
         $team_id = $this->codeReviewersGitHubTeamId();
         if (!$team_id) {
             if (!($team_id = $this->createCodeReviewersGitHubteam())) {
                 return false;
             }
         }
         $user = User::find(Session::uid());
         $token = $user->authTokenForGitHubId(GITHUB_OAUTH2_CLIENT_ID);
         $client = new Github\Client(new Github\HttpClient\CachedHttpClient(array('cache_dir' => TEMP_DIR . DIRECTORY_SEPARATOR . 'github')));
         $client->authenticate($token, '', Github\Client::AUTH_URL_TOKEN);
         $user = User::find($codeReviewer_id);
         $gh_user = $user->getGitHubUserDetails($this);
         $nickname = $gh_user['data']['login'];
         $ret = $client->getHttpClient()->put('teams/' . $team_id . '/memberships/' . $nickname);
         return true;
     } catch (Exception $e) {
         return false;
     }
 }
예제 #6
0
 $paginator = new Github\ResultPager($client);
 // get .env file and load the token from it
 Dotenv::load(__DIR__ . '/../');
 $token = getenv('GITHUB_TOKEN');
 // authenticate with github
 $client->authenticate($token, Github\Client::AUTH_HTTP_TOKEN);
 // get the user and the user repositories
 $user = $client->api('organization')->show('purplapp');
 $repositories = $client->api('repo')->show('purplapp', 'purplapp');
 $repo_contributors = $client->api('repo')->contributors('purplapp', 'purplapp', false);
 // get the languages used in the repository
 $repo_language = $client->api('repo')->languages('purplapp', 'purplapp');
 // $repo_language = new LanguageCollection($repo_language);
 // get the pull requests for the repository
 $repo_pull = $client->api('pull_request')->all('purplapp', 'purplapp', array('state' => 'all'));
 $repo_pull_comments_response = $client->getHttpClient()->get('/repos/purplapp/purplapp/comments');
 $repo_pull_comments = Github\HttpClient\Message\ResponseMediator::getContent($repo_pull_comments_response);
 // get the releases from the repository
 $repo_releases = $client->api('repo')->releases()->all('purplapp', 'purplapp');
 $repo_statistics = $client->api('repo')->statistics('purplapp', 'purplapp');
 // get total number of commits
 $commitsApi = $client->repo()->commits();
 $parameters = array('purplapp', 'purplapp', array('sha' => 'master'));
 $repo_commits = $paginator->fetchAll($commitsApi, 'all', $parameters);
 // get total number of issues
 $issuesApi = $client->issues();
 $parameters = array('purplapp', 'purplapp', array('state' => 'all'));
 $repo_issues = $paginator->fetchAll($issuesApi, 'all', $parameters);
 // get total number of comments on issues
 $issuesCommentsApi = $client->issues()->comments();
 $parameters = array('purplapp', 'purplapp', '');