github.com/jfrog/jfrog-cli-core/v2@v2.51.0/artifactory/commands/generic/gitlfsclean.go (about)

     1  package generic
     2  
     3  import (
     4  	"github.com/jfrog/jfrog-cli-core/v2/artifactory/utils"
     5  	"github.com/jfrog/jfrog-cli-core/v2/utils/coreutils"
     6  	"github.com/jfrog/jfrog-client-go/artifactory/services"
     7  	clientutils "github.com/jfrog/jfrog-client-go/artifactory/services/utils"
     8  	"github.com/jfrog/jfrog-client-go/utils/errorutils"
     9  	"github.com/jfrog/jfrog-client-go/utils/io/content"
    10  	"github.com/jfrog/jfrog-client-go/utils/log"
    11  )
    12  
    13  type GitLfsCommand struct {
    14  	GenericCommand
    15  	configuration *GitLfsCleanConfiguration
    16  }
    17  
    18  func NewGitLfsCommand() *GitLfsCommand {
    19  	return &GitLfsCommand{GenericCommand: *NewGenericCommand()}
    20  }
    21  
    22  func (glc *GitLfsCommand) Configuration() *GitLfsCleanConfiguration {
    23  	return glc.configuration
    24  }
    25  
    26  func (glc *GitLfsCommand) SetConfiguration(configuration *GitLfsCleanConfiguration) *GitLfsCommand {
    27  	glc.configuration = configuration
    28  	return glc
    29  }
    30  
    31  func (glc *GitLfsCommand) Run() error {
    32  	serverDetails, err := glc.ServerDetails()
    33  	if errorutils.CheckError(err) != nil {
    34  		return err
    35  	}
    36  	servicesManager, err := utils.CreateServiceManager(serverDetails, glc.retries, glc.retryWaitTimeMilliSecs, glc.DryRun())
    37  	if err != nil {
    38  		return err
    39  	}
    40  
    41  	gitLfsCleanParams := getGitLfsCleanParams(glc.configuration)
    42  
    43  	filesToDeleteReader, err := servicesManager.GetUnreferencedGitLfsFiles(gitLfsCleanParams)
    44  	if err != nil {
    45  		return err
    46  	}
    47  	defer filesToDeleteReader.Close()
    48  	length, err := filesToDeleteReader.Length()
    49  	if err != nil || length < 1 {
    50  		return err
    51  	}
    52  
    53  	if glc.configuration.Quiet {
    54  		return glc.deleteLfsFilesFromArtifactory(filesToDeleteReader)
    55  	}
    56  	return glc.interactiveDeleteLfsFiles(filesToDeleteReader)
    57  }
    58  
    59  func (glc *GitLfsCommand) CommandName() string {
    60  	return "rt_git_lfs_clean"
    61  }
    62  
    63  func (glc *GitLfsCommand) deleteLfsFilesFromArtifactory(deleteItems *content.ContentReader) error {
    64  	length, err := deleteItems.Length()
    65  	if err != nil {
    66  		return errorutils.CheckError(err)
    67  	}
    68  	log.Info("Deleting", length, "files from", glc.configuration.Repo, "...")
    69  	servicesManager, err := utils.CreateServiceManager(glc.serverDetails, glc.retries, glc.retryWaitTimeMilliSecs, glc.DryRun())
    70  	if err != nil {
    71  		return err
    72  	}
    73  	_, err = servicesManager.DeleteFiles(deleteItems)
    74  	if err != nil {
    75  		return errorutils.CheckError(err)
    76  	}
    77  	return nil
    78  }
    79  
    80  type GitLfsCleanConfiguration struct {
    81  	Quiet   bool
    82  	Refs    string
    83  	Repo    string
    84  	GitPath string
    85  }
    86  
    87  func getGitLfsCleanParams(configuration *GitLfsCleanConfiguration) (gitLfsCleanParams services.GitLfsCleanParams) {
    88  	gitLfsCleanParams = services.NewGitLfsCleanParams()
    89  	gitLfsCleanParams.GitPath = configuration.GitPath
    90  	gitLfsCleanParams.Refs = configuration.Refs
    91  	gitLfsCleanParams.Repo = configuration.Repo
    92  	return
    93  }
    94  
    95  func (glc *GitLfsCommand) interactiveDeleteLfsFiles(filesToDelete *content.ContentReader) error {
    96  	for resultItem := new(clientutils.ResultItem); filesToDelete.NextRecord(resultItem) == nil; resultItem = new(clientutils.ResultItem) {
    97  		log.Output("  " + resultItem.Name)
    98  	}
    99  	if err := filesToDelete.GetError(); err != nil {
   100  		return err
   101  	}
   102  	filesToDelete.Reset()
   103  	confirmed := coreutils.AskYesNo("Are you sure you want to delete the above files?\n"+
   104  		"You can avoid this confirmation message by adding --quiet to the command.", false)
   105  	if confirmed {
   106  		err := glc.deleteLfsFilesFromArtifactory(filesToDelete)
   107  		return err
   108  	}
   109  	return nil
   110  }