@@ -446,19 +446,46 @@ private function api_init( $p_repo ) {
446
446
/**
447
447
* Retrieves data from the GitHub API for the given repository.
448
448
*
449
- * The JSON data is returned as an stdClass object,
449
+ * The JSON data is returned as an stdClass object.
450
450
*
451
451
* @param SourceRepo $p_repo Repository
452
452
* @param string $p_path GitHub API path
453
453
* @param string $p_member Optional top-level member to retrieve
454
454
*
455
- * @return stdClass|false
455
+ * @return stdClass|stdClass[]| false
456
456
*/
457
457
private function api_get ( $ p_repo , $ p_path , $ p_member = '' ) {
458
458
$ this ->api_init ( $ p_repo );
459
+ $ t_json = array ();
460
+
461
+ # Add pagination parameter, setting page count to maximum authorized by
462
+ # GitHub to minimize the number of requests
463
+ $ t_path = $ p_path
464
+ . ( parse_url ( $ p_path , PHP_URL_QUERY ) ? '& ' : '? ' )
465
+ . 'per_page=100 ' ;
466
+ do {
467
+ $ t_response = $ this ->githubApi ->get ( $ t_path );
468
+ $ t_data = json_decode ( $ t_response ->getBody () );
469
+
470
+ # No need for pagination if returned data is a single object
471
+ if ( !is_array ( $ t_data ) ) {
472
+ $ t_json = $ t_data ;
473
+ break ;
474
+ }
475
+ # Store retrieved data and proceed with next page
476
+ $ t_json = array_merge ( $ t_json , $ t_data );
477
+
478
+ $ t_links = GuzzleHttp \Psr7 \parse_header ( $ t_response ->getHeader ( 'Link ' ) );
479
+ foreach ( $ t_links as $ t_link ) {
480
+ if ( $ t_link ['rel ' ] == 'next ' ) {
481
+ $ t_path = trim ( $ t_link [0 ], '<> ' );
482
+ continue 2 ;
483
+ }
484
+ }
459
485
460
- $ t_response = $ this ->githubApi ->get ( $ p_path );
461
- $ t_json = json_decode ( (string ) $ t_response ->getBody () );
486
+ # There is no "next" link - all pages have been processed
487
+ break ;
488
+ } while ( true );
462
489
463
490
if ( empty ( $ p_member ) ) {
464
491
return $ t_json ;
@@ -585,7 +612,7 @@ public function import_full( $p_repo ) {
585
612
$ t_username = $ p_repo ->info ['hub_username ' ];
586
613
$ t_reponame = $ p_repo ->info ['hub_reponame ' ];
587
614
588
- $ t_json = $ this ->api_json_url ( $ p_repo , "repos/ $ t_username/ $ t_reponame/branches " );
615
+ $ t_json = $ this ->api_json_url ( $ p_repo , "repos/ $ t_username/ $ t_reponame/branches?per_page= " );
589
616
590
617
$ t_branches = array ();
591
618
foreach ($ t_json as $ t_branch ) {
0 commit comments