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 }