From 4a438cde67a1509ec2e7a2b72ec026aa5e0c7bc2 Mon Sep 17 00:00:00 2001 From: Amber Erickson Date: Thu, 16 Jun 2022 22:27:33 -0700 Subject: [PATCH 1/4] Update nuget client dependency packages --- src/code/PowerShellGet.csproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/code/PowerShellGet.csproj b/src/code/PowerShellGet.csproj index 6d580abac..dbd51ee95 100644 --- a/src/code/PowerShellGet.csproj +++ b/src/code/PowerShellGet.csproj @@ -15,12 +15,12 @@ - - - - - - + + + + + + From 082aa218ccfc1af841be80ee7fdb5894115ece24 Mon Sep 17 00:00:00 2001 From: Amber Erickson Date: Thu, 7 Jul 2022 10:33:26 -0700 Subject: [PATCH 2/4] Change Ienumerables into lists --- src/code/FindHelper.cs | 28 +++++++++++++++------------- src/code/InstallHelper.cs | 21 +++++++++++---------- src/code/UninstallPSResource.cs | 6 +++--- 3 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/code/FindHelper.cs b/src/code/FindHelper.cs index 916e5a793..1de998f20 100644 --- a/src/code/FindHelper.cs +++ b/src/code/FindHelper.cs @@ -351,7 +351,7 @@ private IEnumerable FindFromPackageSourceSearchAPI( if (!pkgName.Contains("*")) { // case: searching for specific package name i.e "Carbon" - IEnumerable retrievedPkgs = null; + List retrievedPkgs = null; try { // GetMetadataAsync() API returns all versions for a specific non-wildcard package name @@ -362,7 +362,7 @@ private IEnumerable FindFromPackageSourceSearchAPI( includeUnlisted: false, sourceCacheContext: sourceContext, log: NullLogger.Instance, - token: _cancellationToken).GetAwaiter().GetResult(); + token: _cancellationToken).GetAwaiter().GetResult().ToList(); } catch (HttpRequestException ex) { @@ -405,7 +405,7 @@ private IEnumerable FindFromPackageSourceSearchAPI( yield break; } // case: searching for name containing wildcard i.e "Carbon.*" - IEnumerable wildcardPkgs = null; + List wildcardPkgs = null; try { // SearchAsync() API returns the latest version only for all packages that match the wild-card name @@ -415,17 +415,19 @@ private IEnumerable FindFromPackageSourceSearchAPI( skip: 0, take: SearchAsyncMaxTake, log: NullLogger.Instance, - cancellationToken: _cancellationToken).GetAwaiter().GetResult(); + cancellationToken: _cancellationToken).GetAwaiter().GetResult().ToList(); + if (wildcardPkgs.Count() > SearchAsyncMaxReturned) { // get the rest of the packages - wildcardPkgs = wildcardPkgs.Concat(pkgSearchResource.SearchAsync( - searchTerm: pkgName, - filters: searchFilter, - skip: SearchAsyncMaxTake, - take: GalleryMax, - log: NullLogger.Instance, - cancellationToken: _cancellationToken).GetAwaiter().GetResult()); + wildcardPkgs.AddRange( + pkgSearchResource.SearchAsync( + searchTerm: pkgName, + filters: searchFilter, + skip: SearchAsyncMaxTake, + take: GalleryMax, + log: NullLogger.Instance, + cancellationToken: _cancellationToken).GetAwaiter().GetResult().ToList()); } } catch (HttpRequestException ex) @@ -605,13 +607,13 @@ SourceCacheContext sourceCacheContext { foreach(var dep in currentPkg.Dependencies) { - IEnumerable depPkgs = packageMetadataResource.GetMetadataAsync( + List depPkgs = packageMetadataResource.GetMetadataAsync( packageId: dep.Name, includePrerelease: _prerelease, includeUnlisted: false, sourceCacheContext: sourceCacheContext, log: NullLogger.Instance, - token: _cancellationToken).GetAwaiter().GetResult(); + token: _cancellationToken).GetAwaiter().GetResult().ToList(); if (depPkgs.Count() > 0) { diff --git a/src/code/InstallHelper.cs b/src/code/InstallHelper.cs index 5f2a7b06f..5afaf00d3 100644 --- a/src/code/InstallHelper.cs +++ b/src/code/InstallHelper.cs @@ -192,7 +192,7 @@ private List ProcessRepositories( var isLocalRepo = repo.Uri.AbsoluteUri.StartsWith(Uri.UriSchemeFile + Uri.SchemeDelimiter, StringComparison.OrdinalIgnoreCase); // Finds parent packages and dependencies - IEnumerable pkgsFromRepoToInstall = findHelper.FindByResourceName( + List pkgsFromRepoToInstall = findHelper.FindByResourceName( name: _pkgNamesToInstall.ToArray(), type: ResourceType.None, version: _versionRange != null ? _versionRange.OriginalString : null, @@ -200,7 +200,7 @@ private List ProcessRepositories( tag: null, repository: new string[] { repoName }, credential: credential, - includeDependencies: !skipDependencyCheck); + includeDependencies: !skipDependencyCheck).ToList(); if (!pkgsFromRepoToInstall.Any()) { @@ -222,7 +222,7 @@ private List ProcessRepositories( // Check to see if the pkgs (including dependencies) are already installed (ie the pkg is installed and the version satisfies the version range provided via param) if (!_reinstall) { - pkgsFromRepoToInstall = FilterByInstalledPkgs(pkgsFromRepoToInstall); + pkgsFromRepoToInstall = FilterByInstalledPkgs(pkgsFromRepoToInstall).ToList(); } if (!pkgsFromRepoToInstall.Any()) @@ -261,7 +261,7 @@ private List ProcessRepositories( } // Check if any of the pkg versions are already installed, if they are we'll remove them from the list of packages to install - private IEnumerable FilterByInstalledPkgs(IEnumerable packages) + private List FilterByInstalledPkgs(List packages) { // Create list of installation paths to search. List _pathsToSearch = new List(); @@ -286,11 +286,12 @@ private IEnumerable FilterByInstalledPkgs(IEnumerable pkgsAlreadyInstalled = getHelper.GetPackagesFromPath( + List pkgsAlreadyInstalled = getHelper.GetPackagesFromPath( name: filteredPackages.Keys.ToArray(), versionRange: _versionRange, pathsToSearch: _pathsToSearch, - selectPrereleaseOnly: false); + selectPrereleaseOnly: false).ToList(); + if (!pkgsAlreadyInstalled.Any()) { return packages; @@ -308,11 +309,11 @@ private IEnumerable FilterByInstalledPkgs(IEnumerable x.Equals(pkg.Name, StringComparison.InvariantCultureIgnoreCase)); } - return filteredPackages.Values.ToArray(); + return filteredPackages.Values.ToList(); } private List InstallPackage( - IEnumerable pkgsToInstall, // those found to be required to be installed (includes Dependency packages as well) + List pkgsToInstall, // those found to be required to be installed (includes Dependency packages as well) string repoName, string repoUri, PSCredentialInfo repoCredentialInfo, @@ -689,11 +690,11 @@ private bool DetectClobber(string pkgName, Hashtable parsedMetadataHashtable) bool foundClobber = false; GetHelper getHelper = new GetHelper(_cmdletPassedIn); // selectPrereleaseOnly is false because even if Prerelease is true we want to include both stable and prerelease, never select prerelease only. - IEnumerable pkgsAlreadyInstalled = getHelper.GetPackagesFromPath( + List pkgsAlreadyInstalled = getHelper.GetPackagesFromPath( name: new string[] { "*" }, versionRange: VersionRange.All, pathsToSearch: _pathsToSearch, - selectPrereleaseOnly: false); + selectPrereleaseOnly: false).ToList(); // user parsed metadata hash List listOfCmdlets = new List(); foreach (var cmdletName in parsedMetadataHashtable["CmdletsToExport"] as object[]) diff --git a/src/code/UninstallPSResource.cs b/src/code/UninstallPSResource.cs index 96a15d362..d97f19459 100644 --- a/src/code/UninstallPSResource.cs +++ b/src/code/UninstallPSResource.cs @@ -329,13 +329,13 @@ private bool CheckIfDependency(string pkgName, out ErrorRecord errorRecord) // Results is a collection of PSModuleInfo objects that contain a property listing module dependencies, "RequiredModules". // RequiredModules is collection of PSModuleInfo objects that need to be iterated through to see if any of them are the pkg we're trying to uninstall // If we anything from the final call gets returned, there is a dependency on this pkg. - IEnumerable pkgsWithRequiredModules = new List(); + List pkgsWithRequiredModules = new List(); errorRecord = null; try { - pkgsWithRequiredModules = results.Where( + pkgsWithRequiredModules = (results.Where( pkg => ((ReadOnlyCollection)pkg.Properties["RequiredModules"].Value).Where( - rm => rm.Name.Equals(pkgName, StringComparison.InvariantCultureIgnoreCase)).Any()); + rm => rm.Name.Equals(pkgName, StringComparison.InvariantCultureIgnoreCase)).Any())).ToList(); } catch (Exception e) { From e267d4efa43ee5e4c72d0e878b8292c0da109eb9 Mon Sep 17 00:00:00 2001 From: Amber Erickson Date: Tue, 19 Jul 2022 15:56:15 -0700 Subject: [PATCH 3/4] Incorporate code review suggestions --- src/code/FindHelper.cs | 6 +++--- src/code/InstallHelper.cs | 27 +++++++++++++++------------ 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/code/FindHelper.cs b/src/code/FindHelper.cs index 1de998f20..4b520beaa 100644 --- a/src/code/FindHelper.cs +++ b/src/code/FindHelper.cs @@ -384,7 +384,7 @@ private IEnumerable FindFromPackageSourceSearchAPI( yield break; } - foundPackagesMetadata.AddRange(retrievedPkgs.ToList()); + foundPackagesMetadata.AddRange(retrievedPkgs); // _pkgsLeftToFind.Remove(pkgName); @@ -427,7 +427,7 @@ private IEnumerable FindFromPackageSourceSearchAPI( skip: SearchAsyncMaxTake, take: GalleryMax, log: NullLogger.Instance, - cancellationToken: _cancellationToken).GetAwaiter().GetResult().ToList()); + cancellationToken: _cancellationToken).GetAwaiter().GetResult()); } } catch (HttpRequestException ex) @@ -450,7 +450,7 @@ private IEnumerable FindFromPackageSourceSearchAPI( // perhaps validate in Find-PSResource, and use debugassert here? WildcardPattern nameWildcardPattern = new WildcardPattern(pkgName, WildcardOptions.IgnoreCase); foundPackagesMetadata.AddRange(wildcardPkgs.Where( - p => nameWildcardPattern.IsMatch(p.Identity.Id)).ToList()); + p => nameWildcardPattern.IsMatch(p.Identity.Id))); if (!_repositoryNameContainsWildcard) { diff --git a/src/code/InstallHelper.cs b/src/code/InstallHelper.cs index 1c53ada85..4a6217d67 100644 --- a/src/code/InstallHelper.cs +++ b/src/code/InstallHelper.cs @@ -202,7 +202,7 @@ private List ProcessRepositories( credential: credential, includeDependencies: !skipDependencyCheck).ToList(); - if (!pkgsFromRepoToInstall.Any()) + if (pkgsFromRepoToInstall.Count == 0) { _cmdletPassedIn.WriteVerbose(string.Format("None of the specified resources were found in the '{0}' repository.", repoName)); // Check in the next repository @@ -222,10 +222,10 @@ private List ProcessRepositories( // Check to see if the pkgs (including dependencies) are already installed (ie the pkg is installed and the version satisfies the version range provided via param) if (!_reinstall) { - pkgsFromRepoToInstall = FilterByInstalledPkgs(pkgsFromRepoToInstall).ToList(); + pkgsFromRepoToInstall = FilterByInstalledPkgs(pkgsFromRepoToInstall); } - if (!pkgsFromRepoToInstall.Any()) + if (pkgsFromRepoToInstall.Count == 0) { continue; } @@ -277,22 +277,24 @@ private List FilterByInstalledPkgs(List packages _pathsToSearch.AddRange(Utils.GetSubDirectories(path)); } - var filteredPackages = new Dictionary(); - foreach (var pkg in packages) + var filteredPackages = new HashSet(packages); + + List pkgNames = new List(); + foreach (PSResourceInfo pkg in packages) { - filteredPackages.Add(pkg.Name, pkg); + pkgNames.Add(pkg.Name); } GetHelper getHelper = new GetHelper(_cmdletPassedIn); // Get currently installed packages. // selectPrereleaseOnly is false because even if Prerelease is true we want to include both stable and prerelease, never select prerelease only. List pkgsAlreadyInstalled = getHelper.GetPackagesFromPath( - name: filteredPackages.Keys.ToArray(), + name: pkgNames.ToArray(), versionRange: _versionRange, pathsToSearch: _pathsToSearch, selectPrereleaseOnly: false).ToList(); - if (!pkgsAlreadyInstalled.Any()) + if (pkgsAlreadyInstalled.Count == 0) { return packages; } @@ -305,11 +307,11 @@ private List FilterByInstalledPkgs(List packages pkg.Name, pkg.Version)); - filteredPackages.Remove(pkg.Name); + filteredPackages.Remove(pkg); _pkgNamesToInstall.RemoveAll(x => x.Equals(pkg.Name, StringComparison.InvariantCultureIgnoreCase)); } - return filteredPackages.Values.ToList(); + return filteredPackages.ToList(); } private List InstallPackage( @@ -694,11 +696,12 @@ private bool DetectClobber(string pkgName, Hashtable parsedMetadataHashtable) bool foundClobber = false; GetHelper getHelper = new GetHelper(_cmdletPassedIn); // selectPrereleaseOnly is false because even if Prerelease is true we want to include both stable and prerelease, never select prerelease only. - List pkgsAlreadyInstalled = getHelper.GetPackagesFromPath( + IEnumerable pkgsAlreadyInstalled = getHelper.GetPackagesFromPath( name: new string[] { "*" }, versionRange: VersionRange.All, pathsToSearch: _pathsToSearch, - selectPrereleaseOnly: false).ToList(); + selectPrereleaseOnly: false); + // user parsed metadata hash List listOfCmdlets = new List(); foreach (var cmdletName in parsedMetadataHashtable["CmdletsToExport"] as object[]) From a19d58ca68fc6696e7d9cd652b29eaf45e731475 Mon Sep 17 00:00:00 2001 From: Amber Erickson Date: Tue, 19 Jul 2022 16:07:15 -0700 Subject: [PATCH 4/4] Change FindByResourceName to return type List instead of IEnumerable --- src/code/FindHelper.cs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/code/FindHelper.cs b/src/code/FindHelper.cs index 4b520beaa..c8c6f7a37 100644 --- a/src/code/FindHelper.cs +++ b/src/code/FindHelper.cs @@ -70,7 +70,7 @@ public FindHelper(CancellationToken cancellationToken, PSCmdlet cmdletPassedIn) #region Public methods - public IEnumerable FindByResourceName( + public List FindByResourceName( string[] name, ResourceType type, string version, @@ -86,12 +86,14 @@ public IEnumerable FindByResourceName( _tag = tag; _credential = credential; _includeDependencies = includeDependencies; - - Dbg.Assert(name.Length != 0, "Name length cannot be 0"); - _pkgsLeftToFind = name.ToList(); - List repositoriesToSearch; + List packagesFound = new List(); + + if (name.Length == 0) + { + _cmdletPassedIn.WriteVerbose("No name was provided to FindByResourceName."); + } //determine if repository array of names of repositories input to be searched contains wildcard if (repository != null) @@ -126,7 +128,7 @@ public IEnumerable FindByResourceName( "ErrorLoadingRepositoryStoreFile", ErrorCategory.InvalidArgument, this)); - yield break; + return packagesFound; } // loop through repositoriesToSearch and if PSGallery or PoshTestGallery add its Scripts endpoint repo @@ -185,9 +187,11 @@ public IEnumerable FindByResourceName( repositoryUri: repositoriesToSearch[i].Uri, repositoryCredentialInfo: repositoriesToSearch[i].CredentialInfo)) { - yield return pkg; + packagesFound.Add(pkg); } } + + return packagesFound; } #endregion