diff --git a/phpcs.xml.dist b/phpcs.xml.dist
index b5cb2f134..38a186546 100644
--- a/phpcs.xml.dist
+++ b/phpcs.xml.dist
@@ -89,7 +89,6 @@
*/php/commands/src/CLI_(Cache_)?Command\.php$
*/php/commands/src/Help_Command\.php$
- */utils/contrib-list\.php$
diff --git a/utils/contrib-list.php b/utils/contrib-list.php
deleted file mode 100644
index b8eafcb2d..000000000
--- a/utils/contrib-list.php
+++ /dev/null
@@ -1,205 +0,0 @@
-]
- * : Render output in a specific format.
- * ---
- * default: markdown
- * options:
- * - markdown
- * - html
- * ---
- *
- * @when before_wp_load
- */
- public function __invoke( $_, $assoc_args ) {
-
- $contributors = array();
- $contributor_count = 0;
- $pull_request_count = 0;
-
- // Get the contributors to the current open large project milestones
- foreach ( array( 'wp-cli/wp-cli', 'wp-cli/handbook', 'wp-cli/wp-cli.github.com' ) as $repo ) {
- $milestones = self::get_project_milestones( $repo );
- // Cheap way to get the latest milestone
- $milestone = array_shift( $milestones );
- WP_CLI::log( 'Current open ' . $repo . ' milestone: ' . $milestone->title );
- $pull_requests = self::get_project_milestone_pull_requests( $repo, $milestone->number );
- $repo_contributors = self::parse_contributors_from_pull_requests( $pull_requests );
- WP_CLI::log( ' - Contributors: ' . count( $repo_contributors ) );
- WP_CLI::log( ' - Pull requests: ' . count( $pull_requests ) );
- $pull_request_count += count( $pull_requests );
- $contributors = array_merge( $contributors, $repo_contributors );
- }
-
- // Identify all command dependencies and their contributors
- $milestones = self::get_project_milestones( 'wp-cli/wp-cli', array( 'state' => 'closed' ) );
- // Cheap way to get the latest closed milestone
- $milestone = array_shift( $milestones );
- $composer_lock_url = sprintf( 'https://raw.githubusercontent.com/wp-cli/wp-cli/v%s/composer.lock', $milestone->title );
- WP_CLI::log( 'Fetching ' . $composer_lock_url );
- $response = Utils\http_request( 'GET', $composer_lock_url );
- if ( 200 !== $response->status_code ) {
- WP_CLI::error( sprintf( 'Could not fetch composer.json (HTTP code %d)', $response->status_code ) );
- }
- $composer_json = json_decode( $response->body, true );
- foreach ( $composer_json['packages'] as $package ) {
- $package_name = $package['name'];
- $version_constraint = str_replace( 'v', '', $package['version'] );
- if ( ! preg_match( '#^wp-cli/.+-command$#', $package_name ) ) {
- continue;
- }
- // Closed milestones denote a tagged release
- $milestones = self::get_project_milestones( $package_name, array( 'state' => 'closed' ) );
- $milestone_ids = array();
- $milestone_titles = array();
- foreach ( $milestones as $milestone ) {
- if ( ! version_compare( $milestone->title, $version_constraint, '>' ) ) {
- continue;
- }
- $milestone_ids[] = $milestone->number;
- $milestone_titles[] = $milestone->title;
- }
- // No shipped releases for this milestone.
- if ( empty( $milestone_ids ) ) {
- continue;
- }
- WP_CLI::log( 'Closed ' . $package_name . ' milestone(s): ' . implode( ', ', $milestone_titles ) );
- foreach ( $milestone_ids as $milestone_id ) {
- $pull_requests = self::get_project_milestone_pull_requests( $package_name, $milestone_id );
- $repo_contributors = self::parse_contributors_from_pull_requests( $pull_requests );
- WP_CLI::log( ' - Contributors: ' . count( $repo_contributors ) );
- WP_CLI::log( ' - Pull requests: ' . count( $pull_requests ) );
- $pull_request_count += count( $pull_requests );
- $contributors = array_merge( $contributors, $repo_contributors );
- }
- }
-
- WP_CLI::log( 'Total contributors: ' . count( $contributors ) );
- WP_CLI::log( 'Total pull requests: ' . $pull_request_count );
-
- // Sort and render the contributor list
- asort( $contributors, SORT_NATURAL | SORT_FLAG_CASE );
- if ( in_array( $assoc_args['format'], array( 'markdown', 'html' ), true ) ) {
- $contrib_list = '';
- foreach ( $contributors as $url => $login ) {
- if ( 'markdown' === $assoc_args['format'] ) {
- $contrib_list .= '[' . $login . '](' . $url . '), ';
- } elseif ( 'html' === $assoc_args['format'] ) {
- $contrib_list .= '' . $login . ', ';
- }
- }
- $contrib_list = rtrim( $contrib_list, ', ' );
- WP_CLI::log( $contrib_list );
- }
- }
-
- /**
- * Get the milestones for a given project
- *
- * @param string $project
- * @return array
- */
- private static function get_project_milestones( $project, $args = array() ) {
- $request_url = sprintf( 'https://api.github.com/repos/%s/milestones', $project );
- list( $body, $headers ) = self::make_github_api_request( $request_url, $args );
- return $body;
- }
-
- /**
- * Get the pull requests assigned to a milestone of a given project
- *
- * @param string $project
- * @param integer $milestone_id
- * @return array
- */
- private static function get_project_milestone_pull_requests( $project, $milestone_id ) {
- $request_url = sprintf( 'https://api.github.com/repos/%s/issues', $project );
- $args = array(
- 'milestone' => $milestone_id,
- 'state' => 'all',
- );
- $pull_requests = array();
- do {
- list( $body, $headers ) = self::make_github_api_request( $request_url, $args );
- foreach ( $body as $issue ) {
- if ( ! empty( $issue->pull_request ) ) {
- $pull_requests[] = $issue;
- }
- }
- $args = array();
- $request_url = false;
- // Set $request_url to 'rel="next" if present'
- if ( ! empty( $headers['Link'] ) ) {
- $bits = trim( explode( ',', $headers['Link'] ) );
- foreach ( $bits as $bit ) {
- if ( false !== stripos( $bit, 'rel="next"' ) ) {
- $hrefandrel = explode( '; ', $bit );
- $request_url = trim( $hrefandrel[0], '<>' );
- break;
- }
- }
- }
- } while ( $request_url );
- return $pull_requests;
- }
-
- /**
- * Parse the contributors from pull request objects
- *
- * @param array $pull_requests
- * @return array
- */
- private static function parse_contributors_from_pull_requests( $pull_requests ) {
- $contributors = array();
- foreach ( $pull_requests as $pull_request ) {
- if ( ! empty( $pull_request->user ) ) {
- $contributors[ $pull_request->user->html_url ] = $pull_request->user->login;
- }
- }
- return $contributors;
- }
-
- /**
- * Make a request to the GitHub API
- *
- * @param string $url
- * @param string $args
- * @return array
- */
- private static function make_github_api_request( $url, $args = array() ) {
- $headers = array(
- 'Accept' => 'application/vnd.github.v3+json',
- 'User-Agent' => 'WP-CLI',
- );
- $token = getenv( 'GITHUB_TOKEN' );
- if ( false !== $token ) {
- $headers['Authorization'] = 'token ' . $token;
- }
- $response = Utils\http_request( 'GET', $url, $args, $headers );
- if ( 200 !== $response->status_code ) {
- WP_CLI::error( sprintf( 'GitHub API returned: %s (HTTP code %d)', $response->body, $response->status_code ) );
- }
- return array( json_decode( $response->body ), $response->headers );
- }
-}
-
-WP_CLI::add_command( 'contrib-list', 'Contrib_List_Command' );