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  }