diff --git a/artifactory/commands/transferconfig/transferconfig.go b/artifactory/commands/transferconfig/transferconfig.go index 8760181c7..fcc9cbd4c 100644 --- a/artifactory/commands/transferconfig/transferconfig.go +++ b/artifactory/commands/transferconfig/transferconfig.go @@ -4,13 +4,13 @@ import ( "bytes" "context" "fmt" - "github.com/jfrog/gofrog/version" "net/http" "os" "strings" "time" - "github.com/jfrog/gofrog/datastructures" + "github.com/jfrog/gofrog/version" + "github.com/jfrog/jfrog-cli-core/v2/artifactory/commands/generic" "github.com/jfrog/jfrog-cli-core/v2/artifactory/commands/transferconfig/configxmlutils" commandsUtils "github.com/jfrog/jfrog-cli-core/v2/artifactory/commands/utils" @@ -152,9 +152,6 @@ func (tcc *TransferConfigCommand) Run() (err error) { } tcc.LogTitle("Phase 5/5 - Import repositories to the target Artifactory") - if err = tcc.deleteConflictingRepositories(selectedRepos); err != nil { - return - } if err = tcc.TransferRepositoriesToTarget(selectedRepos, remoteRepos); err != nil { return } @@ -528,30 +525,6 @@ func (tcc *TransferConfigCommand) getWorkingDirParam() string { return "" } -func (tcc *TransferConfigCommand) deleteConflictingRepositories(selectedRepos map[utils.RepoType][]string) error { - log.Info("Deleting conflicting repositories in the target Artifactory server, if any exist...") - targetRepos, err := tcc.TargetArtifactoryManager.GetAllRepositories() - if err != nil { - return err - } - allSourceRepos := datastructures.MakeSet[string]() - for _, selectedReposWithType := range selectedRepos { - for _, selectedRepo := range selectedReposWithType { - allSourceRepos.Add(selectedRepo) - } - } - - for _, targetRepo := range *targetRepos { - if allSourceRepos.Exists(targetRepo.Key) { - if err = tcc.TargetArtifactoryManager.DeleteRepository(targetRepo.Key); err != nil { - return err - } - } - } - log.Info("Done deleting conflicting repositories") - return nil -} - // Make sure that the source Artifactory version is sufficient. // Returns the source Artifactory version. func (tcc *TransferConfigCommand) validateMinVersion() error { diff --git a/artifactory/commands/utils/transferconfigbase.go b/artifactory/commands/utils/transferconfigbase.go index 133776982..00d3f6ea5 100644 --- a/artifactory/commands/utils/transferconfigbase.go +++ b/artifactory/commands/utils/transferconfigbase.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" + "github.com/jfrog/gofrog/datastructures" "github.com/jfrog/jfrog-cli-core/v2/artifactory/utils" "github.com/jfrog/jfrog-cli-core/v2/utils/config" "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" @@ -76,6 +77,11 @@ func (tcb *TransferConfigBase) ValidateDifferentServers() error { // Create a map between the repository types to the list of repositories to transfer. func (tcb *TransferConfigBase) GetSelectedRepositories() (map[utils.RepoType][]string, error) { + allTargetRepos, err := tcb.getAllTargetRepositories() + if err != nil { + return nil, err + } + result := make(map[utils.RepoType][]string, len(utils.RepoTypes)+1) sourceRepos, err := tcb.SourceArtifactoryManager.GetAllRepositories() if err != nil { @@ -87,6 +93,10 @@ func (tcb *TransferConfigBase) GetSelectedRepositories() (map[utils.RepoType][]s if shouldIncludeRepo, err := includeExcludeFilter.ShouldIncludeRepository(sourceRepo.Key); err != nil { return nil, err } else if shouldIncludeRepo { + if allTargetRepos.Exists(sourceRepo.Key) { + log.Info("Repository '" + sourceRepo.Key + "' already exists in the target Artifactory server. Skipping.") + continue + } repoType := utils.RepoTypeFromString(sourceRepo.Type) result[repoType] = append(result[repoType], sourceRepo.Key) } @@ -132,6 +142,19 @@ func (tcb *TransferConfigBase) TransferRepositoriesToTarget(reposToTransfer map[ return tcb.transferVirtualRepositoriesToTarget(reposToTransfer[utils.Virtual]) } +// Get a set of all repositories in the target Artifactory server. +func (tcb *TransferConfigBase) getAllTargetRepositories() (*datastructures.Set[string], error) { + targetRepos, err := tcb.TargetArtifactoryManager.GetAllRepositories() + if err != nil { + return nil, err + } + allTargetRepos := datastructures.MakeSet[string]() + for _, targetRepo := range *targetRepos { + allTargetRepos.Add(targetRepo.Key) + } + return allTargetRepos, nil +} + // Transfer local, federated, unknown, or virtual repositories // reposToTransfer - Repositories names to transfer // repoType - Repository type diff --git a/artifactory/commands/utils/transferconfigbase_test.go b/artifactory/commands/utils/transferconfigbase_test.go index 138f61200..dffa4784f 100644 --- a/artifactory/commands/utils/transferconfigbase_test.go +++ b/artifactory/commands/utils/transferconfigbase_test.go @@ -119,10 +119,10 @@ func TestValidateDifferentServers(t *testing.T) { } func TestGetSelectedRepositories(t *testing.T) { - testServer, serverDetails, _ := commonTests.CreateRtRestsMockServer(t, func(w http.ResponseWriter, r *http.Request) { + sourceTestServer, sourceServerDetails, _ := commonTests.CreateRtRestsMockServer(t, func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) repositories := &[]services.RepositoryDetails{ - {Key: "generic-local", Type: "local"}, {Key: "generic-local-filter", Type: "local"}, + {Key: "generic-local", Type: "local"}, {Key: "generic-local-filter", Type: "local"}, {Key: "generic-local-existed", Type: "local"}, {Key: "generic-remote", Type: "remote"}, {Key: "generic-filter-remote", Type: "remote"}, {Key: "generic-virtual", Type: "virtual"}, {Key: "filter-generic-virtual", Type: "virtual"}, {Key: "generic-federated", Type: "federated"}, {Key: "generic-federated-filter", Type: "federated"}, @@ -132,9 +132,18 @@ func TestGetSelectedRepositories(t *testing.T) { _, err = w.Write(reposBytes) assert.NoError(t, err) }) - defer testServer.Close() + defer sourceTestServer.Close() + targetTestServer, targetServerDetails, _ := commonTests.CreateRtRestsMockServer(t, func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + repositories := &[]services.RepositoryDetails{{Key: "generic-local-existed", Type: "local"}} + reposBytes, err := json.Marshal(repositories) + assert.NoError(t, err) + _, err = w.Write(reposBytes) + assert.NoError(t, err) + }) + defer targetTestServer.Close() - transferConfigBase := createTransferConfigBase(t, serverDetails, serverDetails) + transferConfigBase := createTransferConfigBase(t, sourceServerDetails, targetServerDetails) transferConfigBase.SetExcludeReposPatterns([]string{"*filter*"}) selectedRepos, err := transferConfigBase.GetSelectedRepositories() assert.NoError(t, err) diff --git a/xray/audit/npm/npm.go b/xray/audit/npm/npm.go index 1590412dc..e9b6af9bf 100644 --- a/xray/audit/npm/npm.go +++ b/xray/audit/npm/npm.go @@ -33,11 +33,16 @@ func BuildDependencyTree(npmArgs []string) (dependencyTree []*xrayUtils.GraphNod npmArgs = addIgnoreScriptsFlag(npmArgs) // Calculate npm dependencies - dependenciesList, err := biutils.CalculateNpmDependenciesList(npmExecutablePath, currentDir, packageInfo.BuildInfoModuleId(), npmArgs, false, log.Logger) + dependenciesMap, err := biutils.CalculateDependenciesMap(npmExecutablePath, currentDir, packageInfo.BuildInfoModuleId(), npmArgs, log.Logger) if err != nil { log.Info("Used npm version:", npmVersion.GetVersion()) return } + var dependenciesList []buildinfo.Dependency + for _, dependency := range dependenciesMap { + dependenciesList = append(dependenciesList, dependency.Dependency) + } + // Parse the dependencies into Xray dependency tree format dependencyTree = []*xrayUtils.GraphNode{parseNpmDependenciesList(dependenciesList, packageInfo)} return