Remove duplicate copies of files from artifact output

This commit is contained in:
Nate McMaster 2018-03-23 15:59:46 -07:00
parent 3ec77938bc
commit 0f765534cb
No known key found for this signature in database
GPG Key ID: A778D9601BD78810
9 changed files with 87 additions and 224 deletions

View File

@ -13,7 +13,7 @@
ResolveCommitHash;
PrepareOutputPaths;
GetFilesToPublish;
CopyToPublishArtifacts;
PublishToLocalFolder;
PublishToAzureFeed;
PublishToTransportFeed;
PublishToMyGet;
@ -47,7 +47,7 @@
Overwrite="true" />
<ItemGroup>
<SharedFxVersionBadge Include="$(ArtifactsDir)$(SharedFxInstallerName)-%(AllSharedFxRIDs.Identity)-version-badge.svg" />
<SharedFxVersionBadge Include="$(IntermediateDir)$(SharedFxInstallerName)-%(AllSharedFxRIDs.Identity)-version-badge.svg" />
</ItemGroup>
<GenerateSvgBadge
@ -148,17 +148,10 @@
<Output TaskParameter="JoinResult" ItemName="_PackageArtifactInfoWithCategory" />
</RepoTasks.JoinItems>
<RepoTasks.JoinItems
Left="@(_SymbolsPackageArtifactInfo->WithMetadataValue('Category',''))" LeftKey="PackageId" LeftMetadata="*" LeftItemSpec="Identity"
Right="@(PackageArtifact)" RightMetadata="Category">
<Output TaskParameter="JoinResult" ItemName="_SymbolsArtifactInfoWithCategory" />
</RepoTasks.JoinItems>
<ItemGroup>
<PackageToPublish Include="%(_PackageArtifactInfoWithCategory.ArtifactPath)" Category="%(_PackageArtifactInfoWithCategory.Category)" />
<PackageToPublish Include="%(_PackageArtifactInfo.ArtifactPath)" Category="%(_PackageArtifactInfo.Category)" Condition="'%(_PackageArtifactInfo.Category)' != ''" />
<PackageToPublish Include="%(_SymbolsArtifactInfoWithCategory.ArtifactPath)" Category="%(_SymbolsArtifactInfoWithCategory.Category)" />
<PackageToPublish Include="%(_SymbolsPackageArtifactInfo.ArtifactPath)" Category="%(_SymbolsPackageArtifactInfo.Category)" Condition="'%(_SymbolsPackageArtifactInfo.Category)' != ''" />
<PackageToPublish Include="%(_SymbolsPackageArtifactInfo.ArtifactPath)" Category="symbols" />
</ItemGroup>
<ItemGroup>
@ -170,8 +163,10 @@
<Error Text="Missing expected files:%0A - @(_MissingArtifactFile, '%0A - ')" Condition="@(_MissingArtifactFile->Count()) != 0" />
</Target>
<Target Name="CopyToPublishArtifacts" DependsOnTargets="GetFilesToPublish">
<Target Name="PublishToLocalFolder" DependsOnTargets="GetFilesToPublish">
<Copy SourceFiles="%(FilesToPublish.Identity)" DestinationFiles="$(ArtifactsDir)%(FilesToPublish.RelativeBlobPath)" Condition="'%(FilesToPublish.RelativeBlobPath)' != ''" />
<Copy SourceFiles="%(NpmPackageToPublish.Identity)" DestinationFolder="$(ArtifactsDir)npm\" />
<Copy SourceFiles="%(PackageToPublish.Identity)" DestinationFolder="$(ArtifactsDir)packages\%(PackageToPublish.Category)\" />
</Target>
<Target Name="PublishToMyGet"

View File

@ -15,7 +15,7 @@
<CleanDependsOn>$(CleanDependsOn);CleanArtifacts;CleanUniverseArtifacts</CleanDependsOn>
<RestoreDependsOn>$(RestoreDependsOn);InstallDotNet</RestoreDependsOn>
<CompileDependsOn>$(CompileDependsOn);BuildRepositories</CompileDependsOn>
<PackageDependsOn Condition="'$(TestOnly)' != 'true'">$(PackageDependsOn);BuildMetapackages;BuildTemplates;SplitPackages</PackageDependsOn>
<PackageDependsOn Condition="'$(TestOnly)' != 'true'">$(PackageDependsOn);BuildMetapackages;BuildTemplates;CheckExpectedPackagesExist</PackageDependsOn>
<TestDependsOn>$(TestDependsOn);_TestRepositories</TestDependsOn>
<VerifyDependsOn Condition="'$(TestOnly)' != 'true'">$(VerifyDependsOn);VerifyCoherentVersions</VerifyDependsOn>
<GetArtifactInfoDependsOn>$(GetArtifactInfoDependsOn);ResolveRepoInfo;GetLineupPackageInfo</GetArtifactInfoDependsOn>
@ -164,18 +164,6 @@
</RepoTasks.AnalyzeBuildGraph>
</Target>
<Target Name="SplitPackages">
<ItemGroup>
<PackageArtifactFile Include="$(BuildDir)*.nupkg" />
</ItemGroup>
<RepoTasks.CopyPackagesToSplitFolders
Packages="@(PackageArtifact)"
Files="@(PackageArtifactFile)"
DestinationFolder="$(ArtifactsDir)"
Overwrite="true" />
</Target>
<Target Name="VerifyPackageArtifactConfig">
<Error Text="Invalid configuration of %(PackageArtifact.Identity). PackageArtifact must have the 'Category' metadata."
Condition="'%(PackageArtifact.Category)' == '' " />
@ -212,6 +200,14 @@
ExternalDependencies="@(ExternalDependency);@(ShippedExternalDependency)" />
</Target>
<Target Name="CheckExpectedPackagesExist">
<ItemGroup>
<PackageArtifactFile Include="$(BuildDir)*.nupkg" Exclude="$(BuildDir)*.symbols.nupkg" />
</ItemGroup>
<RepoTasks.CheckExpectedPackagesExist Packages="@(PackageArtifact)" Files="@(PackageArtifactFile)" />
</Target>
<Target Name="VerifyAllReposHaveNuGetPackageVerifier" DependsOnTargets="_PrepareRepositories">
<Error Condition="!Exists('%(Repository.RootPath)NuGetPackageVerifier.json')"
Text="Repository %(Repository.Identity) is missing NuGetPackageVerifier.json. Expected file to exist in %(Repository.RootPath)NuGetPackageVerifier.json" />

View File

@ -0,0 +1,69 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Microsoft.Build.Framework;
using NuGet.Packaging;
using NuGet.Packaging.Core;
using RepoTasks.Utilities;
namespace RepoTasks
{
public class CheckExpectedPackagesExist : Microsoft.Build.Utilities.Task
{
/// <summary>
/// The item group containing the nuget packages to split in different folders.
/// </summary>
[Required]
public ITaskItem[] Packages { get; set; }
[Required]
public ITaskItem[] Files { get; set; }
public override bool Execute()
{
if (Files?.Length == 0)
{
Log.LogError("No packages were found.");
return false;
}
var expectedPackages = new HashSet<string>(Packages.Select(i => i.ItemSpec), StringComparer.OrdinalIgnoreCase);
foreach (var file in Files)
{
PackageIdentity identity;
using (var reader = new PackageArchiveReader(file.ItemSpec))
{
identity = reader.GetIdentity();
}
if (!expectedPackages.Contains(identity.Id))
{
Log.LogError($"Unexpected package artifact with id: {identity.Id}");
continue;
}
expectedPackages.Remove(identity.Id);
}
if (expectedPackages.Count != 0)
{
var error = new StringBuilder();
foreach (var id in expectedPackages)
{
error.Append(" - ").AppendLine(id);
}
Log.LogError($"Expected the following packages, but they were not found:" + error.ToString());
return false;
}
return !Log.HasLoggedErrors;
}
}
}

View File

@ -1,116 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.IO;
using System.Text;
using Microsoft.Build.Framework;
using NuGet.Packaging;
using NuGet.Packaging.Core;
using RepoTasks.Utilities;
namespace RepoTasks
{
public class CopyPackagesToSplitFolders : Microsoft.Build.Utilities.Task
{
/// <summary>
/// The item group containing the nuget packages to split in different folders.
/// </summary>
[Required]
public ITaskItem[] Packages { get; set; }
[Required]
public ITaskItem[] Files { get; set; }
/// <summary>
/// The folder where packages should be copied. Subfolders will be created based on package category.
/// </summary>
[Required]
public string DestinationFolder { get; set; }
public bool Overwrite { get; set; }
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;
}
}
}

View File

@ -6,7 +6,7 @@
<UsingTask TaskName="RepoTasks.AddArchiveReferences" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.AddMetapackageReferences" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.AnalyzeBuildGraph" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.CopyPackagesToSplitFolders" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.CheckExpectedPackagesExist" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.CreateLzma" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.GenerateRestoreSourcesPropsFile" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.JoinItems" AssemblyFile="$(_RepoTaskAssembly)" />

View File

@ -1,15 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace RepoTasks.Utilities
{
public enum PackageCategory
{
Unknown = 0,
Shipping,
NoShip,
ShipOob,
Symbols,
}
}

View File

@ -1,66 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.Build.Framework;
namespace RepoTasks.Utilities
{
public class PackageCollection
{
private readonly IDictionary<string, PackageCategory> _packages = new Dictionary<string, PackageCategory>(StringComparer.OrdinalIgnoreCase);
private PackageCollection()
{
}
public bool TryGetCategory(string packageId, out PackageCategory category) => _packages.TryGetValue(packageId, out category);
public void Remove(string packageId) => _packages.Remove(packageId);
public int Count => _packages.Count;
public IEnumerable<string> Keys => _packages.Keys;
public static PackageCollection FromItemGroup(ITaskItem[] items)
{
var list = new PackageCollection();
if (items == null)
{
return list;
}
foreach (var item in items)
{
PackageCategory category;
switch (item.GetMetadata("Category")?.ToLowerInvariant())
{
case "ship":
category = PackageCategory.Shipping;
break;
case "noship":
category = PackageCategory.NoShip;
break;
case "shipoob":
category = PackageCategory.ShipOob;
break;
default:
category = PackageCategory.Unknown;
break;
}
if (list._packages.ContainsKey(item.ItemSpec))
{
throw new InvalidDataException($"Duplicate package id detected: {item.ItemSpec}");
}
list._packages.Add(item.ItemSpec, category);
}
return list;
}
}
}

@ -1 +1 @@
Subproject commit 39fc608adb59987e6a97f4d482a2544ebfda7924
Subproject commit 7e13e83348bea331ee8943c6649b27a681e872af

@ -1 +1 @@
Subproject commit 3b441e17095f34b80be53bee28729d2619cc461c
Subproject commit 18060e0ace1f643b57c49fd4fa2443dd14e006db