github.com/argoproj/argo-cd/v3@v3.2.1/applicationset/services/repo_service.go (about) 1 package services 2 3 import ( 4 "context" 5 "fmt" 6 7 "github.com/argoproj/argo-cd/v3/pkg/apis/application/v1alpha1" 8 "github.com/argoproj/argo-cd/v3/reposerver/apiclient" 9 "github.com/argoproj/argo-cd/v3/util/db" 10 utilio "github.com/argoproj/argo-cd/v3/util/io" 11 ) 12 13 type argoCDService struct { 14 getRepository func(ctx context.Context, url, project string) (*v1alpha1.Repository, error) 15 submoduleEnabled bool 16 newFileGlobbingEnabled bool 17 getGitFilesFromRepoServer func(ctx context.Context, req *apiclient.GitFilesRequest) (*apiclient.GitFilesResponse, error) 18 getGitDirectoriesFromRepoServer func(ctx context.Context, req *apiclient.GitDirectoriesRequest) (*apiclient.GitDirectoriesResponse, error) 19 } 20 21 type Repos interface { 22 // GetFiles returns content of files (not directories) within the target repo 23 GetFiles(ctx context.Context, repoURL, revision, project, pattern string, noRevisionCache, verifyCommit bool) (map[string][]byte, error) 24 25 // GetDirectories returns a list of directories (not files) within the target repo 26 GetDirectories(ctx context.Context, repoURL, revision, project string, noRevisionCache, verifyCommit bool) ([]string, error) 27 } 28 29 func NewArgoCDService(db db.ArgoDB, submoduleEnabled bool, repoClientset apiclient.Clientset, newFileGlobbingEnabled bool) Repos { 30 return &argoCDService{ 31 getRepository: db.GetRepository, 32 submoduleEnabled: submoduleEnabled, 33 newFileGlobbingEnabled: newFileGlobbingEnabled, 34 getGitFilesFromRepoServer: func(ctx context.Context, fileRequest *apiclient.GitFilesRequest) (*apiclient.GitFilesResponse, error) { 35 closer, client, err := repoClientset.NewRepoServerClient() 36 if err != nil { 37 return nil, fmt.Errorf("error initializing new repo server client: %w", err) 38 } 39 defer utilio.Close(closer) 40 return client.GetGitFiles(ctx, fileRequest) 41 }, 42 getGitDirectoriesFromRepoServer: func(ctx context.Context, dirRequest *apiclient.GitDirectoriesRequest) (*apiclient.GitDirectoriesResponse, error) { 43 closer, client, err := repoClientset.NewRepoServerClient() 44 if err != nil { 45 return nil, fmt.Errorf("error initialising new repo server client: %w", err) 46 } 47 defer utilio.Close(closer) 48 return client.GetGitDirectories(ctx, dirRequest) 49 }, 50 } 51 } 52 53 func (a *argoCDService) GetFiles(ctx context.Context, repoURL, revision, project, pattern string, noRevisionCache, verifyCommit bool) (map[string][]byte, error) { 54 repo, err := a.getRepository(ctx, repoURL, project) 55 if err != nil { 56 return nil, fmt.Errorf("error in GetRepository: %w", err) 57 } 58 59 fileRequest := &apiclient.GitFilesRequest{ 60 Repo: repo, 61 SubmoduleEnabled: a.submoduleEnabled, 62 Revision: revision, 63 Path: pattern, 64 NewGitFileGlobbingEnabled: a.newFileGlobbingEnabled, 65 NoRevisionCache: noRevisionCache, 66 VerifyCommit: verifyCommit, 67 } 68 fileResponse, err := a.getGitFilesFromRepoServer(ctx, fileRequest) 69 if err != nil { 70 return nil, fmt.Errorf("error retrieving Git files: %w", err) 71 } 72 return fileResponse.GetMap(), nil 73 } 74 75 func (a *argoCDService) GetDirectories(ctx context.Context, repoURL, revision, project string, noRevisionCache, verifyCommit bool) ([]string, error) { 76 repo, err := a.getRepository(ctx, repoURL, project) 77 if err != nil { 78 return nil, fmt.Errorf("error in GetRepository: %w", err) 79 } 80 81 dirRequest := &apiclient.GitDirectoriesRequest{ 82 Repo: repo, 83 SubmoduleEnabled: a.submoduleEnabled, 84 Revision: revision, 85 NoRevisionCache: noRevisionCache, 86 VerifyCommit: verifyCommit, 87 } 88 89 dirResponse, err := a.getGitDirectoriesFromRepoServer(ctx, dirRequest) 90 if err != nil { 91 return nil, fmt.Errorf("error retrieving Git Directories: %w", err) 92 } 93 return dirResponse.GetPaths(), nil 94 }