From 9a1a4ab820b2dcdb77fd0e209cadf4374468c155 Mon Sep 17 00:00:00 2001 From: Radoslav Dimitrov Date: Fri, 19 Apr 2024 11:03:05 +0300 Subject: [PATCH] Skip or error when trying to register an archived repository (#3135) Skip or error when trying to registered an archived repository Signed-off-by: Radoslav Dimitrov --- cmd/cli/app/repo/repo_register.go | 6 ++++++ internal/controlplane/handlers_repositories.go | 2 +- internal/controlplane/handlers_repositories_test.go | 7 +++++++ internal/providers/github/common/common.go | 4 ++++ internal/repositories/github/service.go | 8 ++++++++ 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/cmd/cli/app/repo/repo_register.go b/cmd/cli/app/repo/repo_register.go index 1dde0d57e5..e6df924496 100644 --- a/cmd/cli/app/repo/repo_register.go +++ b/cmd/cli/app/repo/repo_register.go @@ -283,6 +283,12 @@ func registerSelectedRepos( } func printRepoRegistrationStatus(cmd *cobra.Command, results []*minderv1.RegisterRepoResult) { + // If there were no results, print a message and return + if len(results) == 0 { + cmd.Println("No repositories registered") + return + } + t := table.New(table.Simple, layouts.Default, []string{"Repository", "Status", "Message"}) for _, result := range results { // in the case of a malformed response, skip over it to avoid segfaulting diff --git a/internal/controlplane/handlers_repositories.go b/internal/controlplane/handlers_repositories.go index af9deb247d..7fb1e6baf9 100644 --- a/internal/controlplane/handlers_repositories.go +++ b/internal/controlplane/handlers_repositories.go @@ -87,7 +87,7 @@ func (s *Server) RegisterRepository( newRepo, err := s.repos.CreateRepository(ctx, client, provider, projectID, githubRepo.GetOwner(), githubRepo.GetName()) if err != nil { - if errors.Is(err, ghrepo.ErrPrivateRepoForbidden) { + if errors.Is(err, ghrepo.ErrPrivateRepoForbidden) || errors.Is(err, ghrepo.ErrArchivedRepoForbidden) { return nil, util.UserVisibleError(codes.InvalidArgument, err.Error()) } return nil, util.UserVisibleError(codes.Internal, "unable to register repository: %v", err) diff --git a/internal/controlplane/handlers_repositories_test.go b/internal/controlplane/handlers_repositories_test.go index ef41601cf5..55ffea548e 100644 --- a/internal/controlplane/handlers_repositories_test.go +++ b/internal/controlplane/handlers_repositories_test.go @@ -80,6 +80,13 @@ func TestServer_RegisterRepository(t *testing.T) { RepoServiceSetup: newRepoService(withFailedCreate(ghrepo.ErrPrivateRepoForbidden)), ExpectedError: "private repos cannot be registered in this project", }, + { + Name: "Repo creation fails repo is archived, and archived repos are not allowed", + RepoOwner: repoOwner, + RepoName: repoName, + RepoServiceSetup: newRepoService(withFailedCreate(ghrepo.ErrArchivedRepoForbidden)), + ExpectedError: "archived repos cannot be registered in this project", + }, { Name: "Repo creation on unexpected error", RepoOwner: repoOwner, diff --git a/internal/providers/github/common/common.go b/internal/providers/github/common/common.go index a321132886..7af4f57a75 100644 --- a/internal/providers/github/common/common.go +++ b/internal/providers/github/common/common.go @@ -25,6 +25,10 @@ import ( func ConvertRepositories(repos []*gogithub.Repository) []*minderv1.Repository { var converted []*minderv1.Repository for _, repo := range repos { + // Skip archived repositories + if repo.Archived != nil && *repo.Archived { + continue + } converted = append(converted, ConvertRepository(repo)) } return converted diff --git a/internal/repositories/github/service.go b/internal/repositories/github/service.go index 065b8bd0a8..2461ae276b 100644 --- a/internal/repositories/github/service.go +++ b/internal/repositories/github/service.go @@ -79,6 +79,9 @@ var ( // attempt to register a private repo in a project which does not allow // private repos ErrPrivateRepoForbidden = errors.New("private repos cannot be registered in this project") + // ErrArchivedRepoForbidden is returned when creation fails due to an + // attempt to register an archived repo + ErrArchivedRepoForbidden = errors.New("archived repos cannot be registered in this project") ) type repositoryService struct { @@ -114,6 +117,11 @@ func (r *repositoryService) CreateRepository( return nil, fmt.Errorf("error retrieving repo from github: %w", err) } + // skip if this is an archived repo + if githubRepo.GetArchived() { + return nil, ErrArchivedRepoForbidden + } + // skip if this is a private repo, and private repos are not enabled if githubRepo.GetPrivate() && !features.ProjectAllowsPrivateRepos(ctx, r.store, projectID) { return nil, ErrPrivateRepoForbidden