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  }