PackageCollection.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // Copyright (c) .NET Foundation. All rights reserved.
  2. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using Microsoft.Build.Framework;
  8. namespace RepoTasks.ProjectModel
  9. {
  10. public class PackageCollection
  11. {
  12. private readonly IDictionary<string, PackageCategory> _packages = new Dictionary<string, PackageCategory>(StringComparer.OrdinalIgnoreCase);
  13. private PackageCollection()
  14. {
  15. }
  16. public bool TryGetCategory(string packageId, out PackageCategory category) => _packages.TryGetValue(packageId, out category);
  17. public void Remove(string packageId) => _packages.Remove(packageId);
  18. public int Count => _packages.Count;
  19. public IEnumerable<string> Keys => _packages.Keys;
  20. public static PackageCollection FromItemGroup(ITaskItem[] items)
  21. {
  22. var list = new PackageCollection();
  23. if (items == null)
  24. {
  25. return list;
  26. }
  27. foreach (var item in items)
  28. {
  29. PackageCategory category;
  30. switch (item.GetMetadata("Category")?.ToLowerInvariant())
  31. {
  32. case "ship":
  33. category = PackageCategory.Shipping;
  34. break;
  35. case "noship":
  36. category = PackageCategory.NoShip;
  37. break;
  38. case "shipoob":
  39. category = PackageCategory.ShipOob;
  40. break;
  41. case "mirror":
  42. category = PackageCategory.Mirror;
  43. break;
  44. default:
  45. category = PackageCategory.Unknown;
  46. break;
  47. }
  48. if (list._packages.ContainsKey(item.ItemSpec))
  49. {
  50. throw new InvalidDataException($"Duplicate package id detected: {item.ItemSpec}");
  51. }
  52. list._packages.Add(item.ItemSpec, category);
  53. }
  54. return list;
  55. }
  56. }
  57. }