github.com/jfrog/jfrog-cli-core/v2@v2.51.0/artifactory/commands/transferconfig/configxmlutils/includerepos.go (about) 1 package configxmlutils 2 3 import ( 4 "encoding/xml" 5 "fmt" 6 7 "github.com/jfrog/jfrog-cli-core/v2/artifactory/utils" 8 ) 9 10 // Remove non-included repositories from artifactory.config.xml 11 // configXml - artifactory.config.xml of the source Artifactory 12 // includedRepositories - Selected repositories 13 func RemoveNonIncludedRepositories(configXml string, includeExcludeFilter *utils.IncludeExcludeFilter) (string, error) { 14 for _, repoType := range append(utils.RepoTypes, "releaseBundles") { 15 xmlTagIndices, exist, err := findAllXmlTagIndices(configXml, repoType+`Repositories`, true) 16 if err != nil { 17 return "", err 18 } 19 if !exist { 20 continue 21 } 22 prefix, content, suffix := splitXmlTag(configXml, xmlTagIndices, 0) 23 includedRepositories, err := doRemoveNonIncludedRepositories(content, repoType, includeExcludeFilter) 24 if err != nil { 25 return "", err 26 } 27 configXml = prefix + includedRepositories + suffix 28 } 29 return configXml, nil 30 } 31 32 func doRemoveNonIncludedRepositories(content string, repoType string, includeExcludeFilter *utils.IncludeExcludeFilter) (string, error) { 33 xmlTagIndices, exist, err := findAllXmlTagIndices(content, repoType+`Repository`, false) 34 if err != nil { 35 return "", err 36 } 37 if !exist { 38 return content, nil 39 } 40 results := "" 41 for i := range xmlTagIndices { 42 prefix, content, suffix := splitXmlTag(content, xmlTagIndices, i) 43 shouldFilter, err := shouldRemoveRepository(content, includeExcludeFilter) 44 if err != nil { 45 return "", err 46 } 47 if !shouldFilter { 48 results += prefix + content + suffix 49 } 50 } 51 return results, nil 52 } 53 54 func shouldRemoveRepository(content string, includeExcludeFilter *utils.IncludeExcludeFilter) (bool, error) { 55 rtRepo := &artifactoryRepository{} 56 // The content of the repository tag must be wrapped inside an outer tag in order to be unmarshalled. 57 content = fmt.Sprintf("<repo>%s</repo>", content) 58 err := xml.Unmarshal([]byte(content), rtRepo) 59 if err != nil { 60 return false, err 61 } 62 63 includeRepo, err := includeExcludeFilter.ShouldIncludeRepository(rtRepo.Key) 64 if err != nil { 65 return false, err 66 } 67 return !includeRepo, nil 68 } 69 70 type artifactoryRepository struct { 71 Key string `xml:"key"` 72 Type string `xml:"type"` 73 }