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 }