public override bool Execute() { if (Files?.Length == 0) { Log.LogError("No packages were found."); return(false); } var expectedPackages = PackageCollection.FromItemGroup(Packages); Directory.CreateDirectory(DestinationFolder); foreach (var file in Files) { PackageIdentity identity; using (var reader = new PackageArchiveReader(file.ItemSpec)) { identity = reader.GetIdentity(); } var isSymbolsPackage = file.ItemSpec.EndsWith(".symbols.nupkg", StringComparison.OrdinalIgnoreCase); PackageCategory category; if (isSymbolsPackage) { category = PackageCategory.Symbols; } else if (!expectedPackages.TryGetCategory(identity.Id, out category)) { Log.LogError($"Unexpected package artifact with id: {identity.Id}"); continue; } string destDir; switch (category) { case PackageCategory.Unknown: throw new InvalidOperationException($"Package {identity} does not have a recognized package category."); case PackageCategory.Shipping: destDir = Path.Combine(DestinationFolder, "ship"); break; case PackageCategory.NoShip: destDir = Path.Combine(DestinationFolder, "noship"); break; case PackageCategory.ShipOob: destDir = Path.Combine(DestinationFolder, "shipoob"); break; case PackageCategory.Symbols: destDir = Path.Combine(DestinationFolder, "symbols"); break; default: throw new NotImplementedException(); } Directory.CreateDirectory(destDir); var destFile = Path.Combine(destDir, Path.GetFileName(file.ItemSpec)); if (!Overwrite && File.Exists(destFile)) { Log.LogError($"File already exists in {destFile}"); continue; } Log.LogMessage($"Copying {file.ItemSpec} to {destFile}"); File.Copy(file.ItemSpec, destFile, Overwrite); expectedPackages.Remove(identity.Id); } if (expectedPackages.Count != 0) { var error = new StringBuilder(); foreach (var key in expectedPackages.Keys) { error.Append(" - ").AppendLine(key); } Log.LogError($"Expected the following packages, but they were not found:" + error.ToString()); return(false); } return(!Log.HasLoggedErrors); }