From 12c5813f0c224436a1336896d74958f1d022857e Mon Sep 17 00:00:00 2001 From: Priyanshubhartistm Date: Mon, 22 Jun 2026 00:04:33 +0530 Subject: [PATCH] pkg/api: paginate all repos in DeleteProject --force ListRepository was called once with no opts, so the Harbor API defaulted to page_size=10. Projects with more than 10 repos had only the first page deleted, causing DeleteProject to return 412. Replace the single call with a loop over pages of 100 until all repositories are deleted before attempting project deletion. Signed-off-by: Priyanshubhartistm --- pkg/api/project_handler.go | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/pkg/api/project_handler.go b/pkg/api/project_handler.go index 9c47d2441..97ba23426 100644 --- a/pkg/api/project_handler.go +++ b/pkg/api/project_handler.go @@ -111,23 +111,34 @@ func DeleteProject(projectNameOrID string, forceDelete bool, useProjectID bool) } } - resp, err = ListRepository(projectNameOrID, useProjectID) - if err != nil { - log.Errorf("failed to list repositories: %v", err) - return err - } - - for _, repo := range resp.Payload { - _, repoName, err := utils.ParseProjectRepo(repo.Name) + var page int64 = 1 + const pageSize int64 = 100 + + for { + resp, err = ListRepository(projectNameOrID, useProjectID, ListFlags{ + Page: page, + PageSize: pageSize, + }) if err != nil { - log.Errorf("failed to parse project/repo: %v", err) + log.Errorf("failed to list repositories: %v", err) return err } - err = RepoDelete(projectNameOrID, repoName, useProjectID) - if err != nil { - log.Errorf("failed to delete repository: %v", err) - return err + for _, repo := range resp.Payload { + _, repoName, err := utils.ParseProjectRepo(repo.Name) + if err != nil { + log.Errorf("failed to parse project/repo: %v", err) + return err + } + err = RepoDelete(projectNameOrID, repoName, useProjectID) + if err != nil { + log.Errorf("failed to delete repository: %v", err) + return err + } + } + if int64(len(resp.Payload)) < pageSize { + break } + page++ } } useProjectName := !useProjectID