github.com/argoproj/argo-cd/v2@v2.10.9/applicationset/services/repo_service.go (about)

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