Fix bug in external version verification causing Private=true to apply to all versions of that external dependency

This commit is contained in:
Nate McMaster 2017-09-20 15:43:11 -07:00
parent 8922f69532
commit 8b112a9548
1 changed files with 21 additions and 14 deletions

View File

@ -27,16 +27,20 @@ namespace RepoTasks
public override bool Execute() public override bool Execute()
{ {
var packageLookup = new Dictionary<string, PackageInfo>(StringComparer.OrdinalIgnoreCase); var packageLookup = new Dictionary<string, PackageInfo>(StringComparer.OrdinalIgnoreCase);
var dependencyMap = new Dictionary<string, List<ExternalDependency>>(StringComparer.OrdinalIgnoreCase);
var dependencyMap = new Dictionary<string, ExternalDependency>(StringComparer.OrdinalIgnoreCase);
foreach (var dep in ExternalDependencies) foreach (var dep in ExternalDependencies)
{ {
if (!dependencyMap.TryGetValue(dep.ItemSpec, out var externalDep)) if (!dependencyMap.TryGetValue(dep.ItemSpec, out var list))
{ {
dependencyMap[dep.ItemSpec] = externalDep = new ExternalDependency(); dependencyMap[dep.ItemSpec] = list = new List<ExternalDependency>();
} }
externalDep.IsPrivate = bool.TryParse(dep.GetMetadata("Private"), out var isPrivate) && isPrivate; var externalDep = new ExternalDependency
externalDep.AllowedVersions.Add(dep.GetMetadata("Version")); {
Version = dep.GetMetadata("Version"),
IsPrivate = bool.TryParse(dep.GetMetadata("Private"), out var isPrivate) && isPrivate,
};
list.Add(externalDep);
} }
foreach (var file in PackageFiles) foreach (var file in PackageFiles)
@ -74,13 +78,13 @@ namespace RepoTasks
private class ExternalDependency private class ExternalDependency
{ {
public List<string> AllowedVersions { get; } = new List<string>(); public string Version { get; set; }
public bool IsPrivate { get; set; } public bool IsPrivate { get; set; }
} }
private void Visit( private void Visit(
IReadOnlyDictionary<string, PackageInfo> packageLookup, IReadOnlyDictionary<string, PackageInfo> packageLookup,
IReadOnlyDictionary<string, ExternalDependency> dependencyMap, IReadOnlyDictionary<string, List<ExternalDependency>> dependencyMap,
PackageInfo packageInfo) PackageInfo packageInfo)
{ {
Log.LogMessage(MessageImportance.Low, $"Processing package {packageInfo.Id}"); Log.LogMessage(MessageImportance.Low, $"Processing package {packageInfo.Id}");
@ -92,17 +96,20 @@ namespace RepoTasks
{ {
PackageInfo dependencyPackageInfo; PackageInfo dependencyPackageInfo;
var depVersion = dependency.VersionRange.MinVersion.ToString(); var depVersion = dependency.VersionRange.MinVersion.ToString();
if (dependencyMap.TryGetValue(dependency.Id, out var externalDepInfo)) if (dependencyMap.TryGetValue(dependency.Id, out var externalDependencies))
{ {
if (externalDepInfo.IsPrivate) var matchedVersion = externalDependencies.FirstOrDefault(d => depVersion.Equals(d.Version));
if (matchedVersion == null)
{
var versions = string.Join(" or ", externalDependencies.Select(d => d.Version));
Log.LogError($"Package {packageInfo.Id} has an external dependency on the wrong version of {dependency.Id}. "
+ $"It uses {depVersion} but only {versions} is allowed.");
}
else if (matchedVersion.IsPrivate)
{ {
Log.LogError($"Package {packageInfo.Id} has an external dependency on {dependency.Id}/{depVersion} which is marked as Private=true."); Log.LogError($"Package {packageInfo.Id} has an external dependency on {dependency.Id}/{depVersion} which is marked as Private=true.");
} }
else if (!externalDepInfo.AllowedVersions.Any(a => depVersion.Equals(a)))
{
Log.LogError($"Package {packageInfo.Id} has an external dependency on the wrong version of {dependency.Id}. "
+ $"It uses {depVersion} but only {string.Join(" or ", externalDepInfo.AllowedVersions)} is allowed.");
}
continue; continue;
} }
else if (!packageLookup.TryGetValue(dependency.Id, out dependencyPackageInfo)) else if (!packageLookup.TryGetValue(dependency.Id, out dependencyPackageInfo))