diff --git a/src/GitHubClient.php b/src/GitHubClient.php index ab47f34..d81a0ec 100644 --- a/src/GitHubClient.php +++ b/src/GitHubClient.php @@ -146,34 +146,12 @@ public function getRepositories(?array &$failures = null, bool $withFundingLinks ksort($urls); - $i = 0; - $template = $withFundingLinks - ? '_%d: repository(owner:"%s",name:"%s"){id,viewerHasStarred,fundingLinks{platform,url}}'."\n" - : '_%d: repository(owner:"%s",name:"%s"){id,viewerHasStarred}'."\n"; - $graphql = ''; + $chunks = array_chunk($urls, 150, true); - foreach ($urls as $package => $url) { - if (preg_match('#^https://github.com/([^/]++)/(.*?)(?:\.git)?$#i', $url, $url)) { - $graphql .= sprintf($template, ++$i, $url[1], $url[2]); - $aliases['_'.$i] = [$package, sprintf('https://github.com/%s/%s', $url[1], $url[2])]; - } - } - - $failures = []; $repos = []; - foreach ($this->call(sprintf("query{\n%s}", $graphql), $failures) as $alias => $repo) { - $repo['package'] = $aliases[$alias][0]; - $repo['url'] = $aliases[$alias][1]; - $repos[$alias] = $repo; - } - - foreach ($failures as $alias => $messages) { - $failures[$alias] = [ - 'messages' => $messages, - 'package' => $aliases[$alias][0], - 'url' => $aliases[$alias][1], - ]; + foreach ($chunks as $chunk) { + $repos += $this->processChunks($chunk, $withFundingLinks, $failures); } return $repos; @@ -231,4 +209,41 @@ private function getDirectlyRequiredPackageNames(): array return array_combine($data, $data); } + + private function processChunks(array $urls, bool $withFundingLinks, ?array &$failures = null): array + { + $i = 0; + $template = $withFundingLinks + ? '_%d: repository(owner:"%s",name:"%s"){id,viewerHasStarred,fundingLinks{platform,url}}'."\n" + : '_%d: repository(owner:"%s",name:"%s"){id,viewerHasStarred}'."\n"; + $graphql = ''; + + $aliases = []; + + foreach ($urls as $package => $url) { + if (preg_match('#^https://github.com/([^/]++)/(.*?)(?:\.git)?$#i', $url, $url)) { + $graphql .= sprintf($template, ++$i, $url[1], $url[2]); + $aliases['_'.$i] = [$package, sprintf('https://github.com/%s/%s', $url[1], $url[2])]; + } + } + + $failures = []; + $repos = []; + + foreach ($this->call(sprintf("query{\n%s}", $graphql), $failures) as $alias => $repo) { + $repo['package'] = $aliases[$alias][0]; + $repo['url'] = $aliases[$alias][1]; + $repos[$alias] = $repo; + } + + foreach ($failures as $alias => $messages) { + $failures[$alias] = [ + 'messages' => $messages, + 'package' => $aliases[$alias][0], + 'url' => $aliases[$alias][1], + ]; + } + + return $repos; + } }