github.com/osievert/jfrog-cli-core@v1.2.7/artifactory/commands/generic/gitlfsclean.go (about)

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