public static Tuple <int, SemverComparator[]> HyphenRange(string spec) { string pattern = String.Format(@"^\s*({0}+)\s+\-\s+({0}+)\s*", versionChars); var regex = new Regex(pattern); var match = regex.Match(spec); if (!match.Success) { return(null); } PartialVersion minPartialVersion = null; PartialVersion maxPartialVersion = null; // Parse versions from lower and upper ranges, which might // be partial versions. try { minPartialVersion = new PartialVersion(match.Groups[1].Value); maxPartialVersion = new PartialVersion(match.Groups[2].Value); } catch (ArgumentException) { return(null); } // Lower range has any non-supplied values replaced with zero var minVersion = minPartialVersion.ToZeroVersion(); SemverComparator.Operator maxOperator = maxPartialVersion.IsFull() ? SemverComparator.Operator.LessThanOrEqual : SemverComparator.Operator.LessThan; SemanticVersion maxVersion = null; // Partial upper range means supplied version values can't change if (!maxPartialVersion.Major.HasValue) { // eg. upper range = "*", then maxVersion remains null // and there's only a minimum } else if (!maxPartialVersion.Minor.HasValue) { maxVersion = new SemanticVersion(maxPartialVersion.Major.Value + 1, 0, 0); } else if (!maxPartialVersion.Patch.HasValue) { maxVersion = new SemanticVersion(maxPartialVersion.Major.Value, maxPartialVersion.Minor.Value + 1, 0); } else { // Fully specified max version maxVersion = maxPartialVersion.ToZeroVersion(); } return(Tuple.Create( match.Length, minMaxComparators(minVersion, maxVersion, maxOperator))); }
private static SemverComparator[] minMaxComparators(SemanticVersion minVersion, SemanticVersion maxVersion, SemverComparator.Operator maxOperator = SemverComparator.Operator.LessThan) { var minComparator = new SemverComparator( SemverComparator.Operator.GreaterThanOrEqual, minVersion); if (maxVersion == null) { return(new[] { minComparator }); } else { var maxComparator = new SemverComparator( maxOperator, maxVersion); return(new[] { minComparator, maxComparator }); } }