github.com/jfrog/jfrog-cli-core/v2@v2.52.0/artifactory/utils/search.go (about) 1 package utils 2 3 import ( 4 "encoding/json" 5 "errors" 6 ioutils "github.com/jfrog/gofrog/io" 7 "github.com/jfrog/jfrog-client-go/artifactory" 8 9 "github.com/jfrog/jfrog-cli-core/v2/common/spec" 10 "github.com/jfrog/jfrog-client-go/artifactory/services" 11 "github.com/jfrog/jfrog-client-go/artifactory/services/utils" 12 clientutils "github.com/jfrog/jfrog-client-go/utils" 13 "github.com/jfrog/jfrog-client-go/utils/errorutils" 14 "github.com/jfrog/jfrog-client-go/utils/io/content" 15 "github.com/jfrog/jfrog-client-go/utils/log" 16 ) 17 18 type SearchResult struct { 19 Path string `json:"path,omitempty"` 20 Type string `json:"type,omitempty"` 21 Size int64 `json:"size,omitempty"` 22 Created string `json:"created,omitempty"` 23 Modified string `json:"modified,omitempty"` 24 Sha1 string `json:"sha1,omitempty"` 25 Sha256 string `json:"sha256,omitempty"` 26 Md5 string `json:"md5,omitempty"` 27 OriginalMd5 string `json:"original_md5,omitempty"` 28 ModifiedBy string `json:"modified_by,omitempty"` 29 Updated string `json:"updated,omitempty"` 30 CreatedBy string `json:"created_by,omitempty"` 31 OriginalSha1 string `json:"original_sha1,omitempty"` 32 Depth int `json:"depth,omitempty"` 33 Props map[string][]string `json:"props,omitempty"` 34 } 35 36 func PrintSearchResults(reader *content.ContentReader) error { 37 length, err := reader.Length() 38 if length == 0 { 39 log.Output("[]") 40 return err 41 } 42 log.Output("[") 43 suffix := "," 44 for searchResult := new(SearchResult); reader.NextRecord(searchResult) == nil; searchResult = new(SearchResult) { 45 if length == 1 { 46 suffix = "" 47 } 48 err = printSearchResult(*searchResult, suffix) 49 if length == 0 { 50 log.Output("[]") 51 return err 52 } 53 length-- 54 } 55 log.Output("]") 56 reader.Reset() 57 return reader.GetError() 58 } 59 60 func printSearchResult(toPrint SearchResult, suffix string) error { 61 data, err := json.Marshal(toPrint) 62 if err != nil { 63 return errorutils.CheckError(err) 64 } 65 log.Output(" " + clientutils.IndentJsonArray(data) + suffix) 66 return nil 67 } 68 69 func AqlResultToSearchResult(readers []*content.ContentReader) (contentReader *content.ContentReader, err error) { 70 writer, err := content.NewContentWriter("results", true, false) 71 if err != nil { 72 return nil, err 73 } 74 defer ioutils.Close(writer, &err) 75 for _, reader := range readers { 76 for searchResult := new(utils.ResultItem); reader.NextRecord(searchResult) == nil; searchResult = new(utils.ResultItem) { 77 if err != nil { 78 return nil, err 79 } 80 tempResult := new(SearchResult) 81 tempResult.Path = searchResult.Repo + "/" 82 if searchResult.Path != "." { 83 tempResult.Path += searchResult.Path + "/" 84 } 85 if searchResult.Name != "." { 86 tempResult.Path += searchResult.Name 87 } 88 tempResult.Type = searchResult.Type 89 tempResult.Size = searchResult.Size 90 tempResult.Created = searchResult.Created 91 tempResult.Modified = searchResult.Modified 92 tempResult.Sha1 = searchResult.Actual_Sha1 93 tempResult.Sha256 = searchResult.Sha256 94 tempResult.Md5 = searchResult.Actual_Md5 95 tempResult.ModifiedBy = searchResult.ModifiedBy 96 tempResult.Updated = searchResult.Updated 97 tempResult.CreatedBy = searchResult.CreatedBy 98 tempResult.OriginalMd5 = searchResult.OriginalMd5 99 tempResult.Depth = searchResult.Depth 100 tempResult.Props = make(map[string][]string, len(searchResult.Properties)) 101 for _, prop := range searchResult.Properties { 102 tempResult.Props[prop.Key] = append(tempResult.Props[prop.Key], prop.Value) 103 } 104 writer.Write(*tempResult) 105 } 106 if err = reader.GetError(); err != nil { 107 return nil, err 108 } 109 reader.Reset() 110 } 111 contentReader = content.NewContentReader(writer.GetFilePath(), content.DefaultKey) 112 return 113 } 114 115 func GetSearchParams(f *spec.File) (searchParams services.SearchParams, err error) { 116 searchParams = services.NewSearchParams() 117 searchParams.CommonParams, err = f.ToCommonParams() 118 searchParams.Include = f.GetInclude() 119 if err != nil { 120 return 121 } 122 searchParams.Recursive, err = f.IsRecursive(true) 123 if err != nil { 124 return 125 } 126 searchParams.ExcludeArtifacts, err = f.IsExcludeArtifacts(false) 127 if err != nil { 128 return 129 } 130 searchParams.IncludeDeps, err = f.IsIncludeDeps(false) 131 if err != nil { 132 return 133 } 134 searchParams.IncludeDirs, err = f.IsIncludeDirs(false) 135 if err != nil { 136 return 137 } 138 searchParams.Transitive, err = f.IsTransitive(false) 139 searchParams.Include = f.GetInclude() 140 return 141 } 142 143 func SearchResultNoDate(reader *content.ContentReader) (contentReader *content.ContentReader, err error) { 144 writer, err := content.NewContentWriter("results", true, false) 145 if err != nil { 146 return nil, err 147 } 148 defer ioutils.Close(writer, &err) 149 for resultItem := new(SearchResult); reader.NextRecord(resultItem) == nil; resultItem = new(SearchResult) { 150 if err != nil { 151 return nil, err 152 } 153 resultItem.Created = "" 154 resultItem.Modified = "" 155 delete(resultItem.Props, "vcs.url") 156 delete(resultItem.Props, "vcs.revision") 157 writer.Write(*resultItem) 158 } 159 if err := reader.GetError(); err != nil { 160 return nil, err 161 } 162 reader.Reset() 163 contentReader = content.NewContentReader(writer.GetFilePath(), writer.GetArrayKey()) 164 return 165 } 166 167 func SearchFiles(servicesManager artifactory.ArtifactoryServicesManager, spec *spec.SpecFiles) (searchResults []*content.ContentReader, callbackFunc func() error, err error) { 168 callbackFunc = func() error { 169 var errs error 170 for _, reader := range searchResults { 171 errs = errors.Join(errs, reader.Close()) 172 } 173 return errs 174 } 175 176 var curSearchParams services.SearchParams 177 var curReader *content.ContentReader 178 for i := 0; i < len(spec.Files); i++ { 179 curSearchParams, err = GetSearchParams(spec.Get(i)) 180 if err != nil { 181 return 182 } 183 curReader, err = servicesManager.SearchFiles(curSearchParams) 184 if err != nil { 185 return 186 } 187 searchResults = append(searchResults, curReader) 188 } 189 return 190 }