ResolveVersionRange.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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 Microsoft.Build.Framework;
  5. using Microsoft.Build.Utilities;
  6. using NuGet.Versioning;
  7. using RepoTasks.Utilities;
  8. namespace RepoTasks
  9. {
  10. public class ResolveVersionRange : Task
  11. {
  12. [Required]
  13. [Output]
  14. public ITaskItem[] Items { get; set; }
  15. [Required]
  16. public string Version { get; set; }
  17. [Required]
  18. public string RangeType { get; set; }
  19. // MSBuild doesn't allow binding to enums directly.
  20. private enum VersionRangeType
  21. {
  22. Minimum, // [1.1.1, )
  23. MajorMinor, // [1.1.1, 1.2.0)
  24. }
  25. public override bool Execute()
  26. {
  27. if (!Enum.TryParse<VersionRangeType>(RangeType, out var rangeType))
  28. {
  29. Log.LogError("Unexpected value {0} for RangeType", RangeType);
  30. return false;
  31. }
  32. var versionRange = GetVersionRange(rangeType, Version);
  33. foreach (var item in Items)
  34. {
  35. item.SetMetadata("_OriginalVersion", Version);
  36. item.SetMetadata("Version", versionRange);
  37. }
  38. return !Log.HasLoggedErrors;
  39. }
  40. private string GetVersionRange(VersionRangeType rangeType, string packageVersion)
  41. {
  42. switch (rangeType)
  43. {
  44. case VersionRangeType.MajorMinor:
  45. if (!NuGetVersion.TryParse(packageVersion, out var nugetVersion))
  46. {
  47. Log.LogError("Invalid NuGet version '{0}'", packageVersion);
  48. return null;
  49. }
  50. return $"[{packageVersion}, {nugetVersion.Major}.{nugetVersion.Minor + 1}.0)";
  51. case VersionRangeType.Minimum:
  52. return packageVersion;
  53. default:
  54. throw new NotImplementedException();
  55. }
  56. }
  57. }
  58. }