From ec25d52a9f3b625f6b765bb6597d4cc27f7fd342 Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Fri, 27 Feb 2026 16:33:01 +0530 Subject: [PATCH 1/3] Implement `getInstallationRepository` method --- src/VCS/Adapter.php | 8 ++++++++ src/VCS/Adapter/Git/GitHub.php | 21 +++++++++++++++++++++ src/VCS/Adapter/Git/Gitea.php | 5 +++++ tests/VCS/Adapter/GitHubTest.php | 17 +++++++++++++++++ 4 files changed, 51 insertions(+) diff --git a/src/VCS/Adapter.php b/src/VCS/Adapter.php index da01f4a..27478a9 100644 --- a/src/VCS/Adapter.php +++ b/src/VCS/Adapter.php @@ -97,6 +97,14 @@ abstract public function getOwnerName(string $installationId): string; */ abstract public function searchRepositories(string $installationId, string $owner, int $page, int $per_page, string $search = ''): array; + /** + * Get repository for the installation + * + * @param string $repositoryName + * @return array + */ + abstract public function getInstallationRepository(string $repositoryName): array; + /** * Get repository * diff --git a/src/VCS/Adapter/Git/GitHub.php b/src/VCS/Adapter/Git/GitHub.php index 75a4658..78d9fc2 100644 --- a/src/VCS/Adapter/Git/GitHub.php +++ b/src/VCS/Adapter/Git/GitHub.php @@ -189,6 +189,27 @@ public function searchRepositories(string $installationId, string $owner, int $p ]; } + public function getInstallationRepository(string $repositoryName): array + { + $url = '/installation/repositories'; + $response = $this->call(self::METHOD_GET, $url, ['Authorization' => "Bearer $this->accessToken"], [ + 'page' => 1, + 'per_page' => 100, + ]); + + if (!isset($response['body']['repositories'])) { + throw new Exception("Repositories list missing in the response."); + } + + foreach ($response['body']['repositories'] as $repo) { + if (\strtolower($repo['name']) === \strtolower($repositoryName)) { + return $repo; + } + } + + throw new RepositoryNotFound("Repository not found."); + } + /** * Get GitHub repository * diff --git a/src/VCS/Adapter/Git/Gitea.php b/src/VCS/Adapter/Git/Gitea.php index fc85bf4..a371e51 100644 --- a/src/VCS/Adapter/Git/Gitea.php +++ b/src/VCS/Adapter/Git/Gitea.php @@ -118,6 +118,11 @@ public function searchRepositories(string $installationId, string $owner, int $p throw new Exception("Not implemented yet"); } + public function getInstallationRepository(string $repositoryName): array + { + throw new Exception("Not implemented yet"); + } + public function getRepository(string $owner, string $repositoryName): array { $url = "/repos/{$owner}/{$repositoryName}"; diff --git a/tests/VCS/Adapter/GitHubTest.php b/tests/VCS/Adapter/GitHubTest.php index 6b6025f..4e917c2 100644 --- a/tests/VCS/Adapter/GitHubTest.php +++ b/tests/VCS/Adapter/GitHubTest.php @@ -173,6 +173,23 @@ public function testGetComment(): void $this->assertNotEmpty($result); } + public function testGetInstallationRepository(): void + { + $repositoryName = 'basic-js-crud'; + $repo = $this->vcsAdapter->getInstallationRepository($repositoryName); + $this->assertIsArray($repo); + $this->assertSame($repositoryName, $repo['name']); + } + + public function testGetRepository(): void + { + $owner = 'vermakhushboo'; + $repositoryName = 'basic-js-crud'; + $repo = $this->vcsAdapter->getRepository($owner, $repositoryName); + $this->assertIsArray($repo); + $this->assertSame($repositoryName, $repo['name']); + } + public function testGetRepositoryName(): void { $repositoryName = $this->vcsAdapter->getRepositoryName('432284323'); From cb0f8ebb88380c6bf3ec4a9c54a9d1341871c047 Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Fri, 27 Feb 2026 16:39:25 +0530 Subject: [PATCH 2/3] test fix --- tests/VCS/Adapter/GitHubTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/VCS/Adapter/GitHubTest.php b/tests/VCS/Adapter/GitHubTest.php index 4e917c2..74af211 100644 --- a/tests/VCS/Adapter/GitHubTest.php +++ b/tests/VCS/Adapter/GitHubTest.php @@ -175,7 +175,7 @@ public function testGetComment(): void public function testGetInstallationRepository(): void { - $repositoryName = 'basic-js-crud'; + $repositoryName = 'astro-starter'; $repo = $this->vcsAdapter->getInstallationRepository($repositoryName); $this->assertIsArray($repo); $this->assertSame($repositoryName, $repo['name']); From b33588a5bd7b50c51af6ff0417c0d593566076ab Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Fri, 27 Feb 2026 17:43:33 +0530 Subject: [PATCH 3/3] feedback --- src/VCS/Adapter/Git/GitHub.php | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/VCS/Adapter/Git/GitHub.php b/src/VCS/Adapter/Git/GitHub.php index 78d9fc2..0c5abf7 100644 --- a/src/VCS/Adapter/Git/GitHub.php +++ b/src/VCS/Adapter/Git/GitHub.php @@ -191,20 +191,34 @@ public function searchRepositories(string $installationId, string $owner, int $p public function getInstallationRepository(string $repositoryName): array { + $currentPage = 1; + $perPage = 100; + $totalRepositories = 0; + $maxRepositories = 1000; $url = '/installation/repositories'; - $response = $this->call(self::METHOD_GET, $url, ['Authorization' => "Bearer $this->accessToken"], [ - 'page' => 1, - 'per_page' => 100, - ]); - if (!isset($response['body']['repositories'])) { - throw new Exception("Repositories list missing in the response."); - } + while ($totalRepositories < $maxRepositories) { + $response = $this->call(self::METHOD_GET, $url, ['Authorization' => "Bearer $this->accessToken"], [ + 'page' => $currentPage, + 'per_page' => $perPage, + ]); + + if (!isset($response['body']['repositories'])) { + throw new Exception("Repositories list missing in the response."); + } + + foreach ($response['body']['repositories'] as $repo) { + if (\strtolower($repo['name']) === \strtolower($repositoryName)) { + return $repo; + } + } - foreach ($response['body']['repositories'] as $repo) { - if (\strtolower($repo['name']) === \strtolower($repositoryName)) { - return $repo; + if (\count($response['body']['repositories']) < $perPage) { + break; } + + $currentPage++; + $totalRepositories += $perPage; } throw new RepositoryNotFound("Repository not found.");