|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Hive.Versioning;
|
|
using HVersion = Hive.Versioning.Version;
|
|
|
|
namespace SemVer
|
|
{
|
|
[Obsolete("Use Hive.Versioning.VersionRange instead.")]
|
|
public class Range : IEquatable<Range>, IEquatable<VersionRange>
|
|
{
|
|
public VersionRange UnderlyingRange { get; }
|
|
|
|
private Range(VersionRange real) => UnderlyingRange = real;
|
|
|
|
public Range(string rangeSpec, bool loose = false) : this(new(rangeSpec))
|
|
=> _ = loose; // loose is ignored because Hive doesn't have an equivalent
|
|
|
|
public static Range ForHiveRange(VersionRange real) => new(real);
|
|
|
|
public bool IsSatisfied(Version version) => IsSatisfied(version.UnderlyingVersion);
|
|
public bool IsSatisfied(HVersion version) => UnderlyingRange.Matches(version);
|
|
public bool IsSatisfied(string versionString, bool loose = false) => IsSatisfied(new Version(versionString, loose));
|
|
|
|
public IEnumerable<Version> Satisfying(IEnumerable<Version> versions) => versions.Where(IsSatisfied);
|
|
public IEnumerable<string> Satisfying(IEnumerable<string> versions, bool loose = false)
|
|
=> versions.Where(v => IsSatisfied(v, loose));
|
|
public Version? MaxSatisfying(IEnumerable<Version> versions) => Satisfying(versions).Max();
|
|
public string? MaxSatisfying(IEnumerable<string> versionStrings, bool loose = false)
|
|
=> MaxSatisfying(ValidVersions(versionStrings, loose))?.ToString();
|
|
public Range Intersect(Range other) => new(UnderlyingRange & other.UnderlyingRange); // the conjunction is the intersection
|
|
public override string ToString() => UnderlyingRange.ToString();
|
|
|
|
public bool Equals(Range? other) => UnderlyingRange.Equals(other?.UnderlyingRange);
|
|
public bool Equals(VersionRange? other) => UnderlyingRange.Equals(other);
|
|
public override bool Equals(object? obj)
|
|
=> obj switch
|
|
{
|
|
Range r => Equals(r),
|
|
VersionRange vr => Equals(vr),
|
|
_ => false
|
|
};
|
|
|
|
public static bool operator ==(Range? a, Range? b) => a?.Equals(b) ?? b is null;
|
|
|
|
public static bool operator !=(Range? a, Range? b) => !(a == b);
|
|
|
|
public override int GetHashCode() => UnderlyingRange.GetHashCode();
|
|
|
|
public static bool IsSatisfied(string rangeSpec, string versionString, bool loose = false)
|
|
=> new Range(rangeSpec, loose).IsSatisfied(versionString, loose);
|
|
public static IEnumerable<string> Satisfying(string rangeSpec, IEnumerable<string> versions, bool loose = false)
|
|
=> new Range(rangeSpec, loose).Satisfying(versions, loose);
|
|
|
|
public static string? MaxSatisfying(string rangeSpec, IEnumerable<string> versions, bool loose = false)
|
|
=> new Range(rangeSpec, loose).MaxSatisfying(versions, loose);
|
|
|
|
private IEnumerable<Version> ValidVersions(IEnumerable<string> versionStrings, bool loose)
|
|
{
|
|
foreach (string versionString in versionStrings)
|
|
{
|
|
Version? version = null;
|
|
try
|
|
{
|
|
version = new Version(versionString, loose);
|
|
}
|
|
catch (ArgumentException)
|
|
{
|
|
}
|
|
|
|
if (version is not null)
|
|
{
|
|
yield return version;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|