public void CIBuildVersion_LastReleaseBased_are_correctely_ordered(string tag) { ReleaseTagFormat formatV2 = ReleaseTagFormat.NugetPackageV2; var t = ReleaseTagVersion.TryParse(tag); var v = SemVersion.Parse(t.ToString(ReleaseTagFormat.SemVer), true); var tNext = new ReleaseTagVersion(t.OrderedVersion + 1); var vNext = SemVersion.Parse(tNext.ToString(ReleaseTagFormat.SemVer), true); var tPrev = new ReleaseTagVersion(t.OrderedVersion - 1); var vPrev = SemVersion.Parse(tPrev.ToString(ReleaseTagFormat.SemVer), true); Assert.That(vPrev < v, "{0} < {1}", vPrev, v); Assert.That(v < vNext, "{0} < {1}", v, vNext); var sNuGet = t.ToString(formatV2); var sNuGetPrev = tPrev.ToString(formatV2); var sNuGetNext = tNext.ToString(formatV2); Assert.That(NuGetV2StringComparer.DefaultComparer.Compare(sNuGetPrev, sNuGet) < 0, "{0} < {1}", sNuGetPrev, sNuGet); Assert.That(NuGetV2StringComparer.DefaultComparer.Compare(sNuGet, sNuGetNext) < 0, "{0} < {1}", sNuGet, sNuGetNext); CIBuildDescriptor ci = new CIBuildDescriptor { BranchName = "dev", BuildIndex = 1 }; string sCI = t.ToString(ReleaseTagFormat.SemVer, ci); SemVersion vCi = SemVersion.Parse(sCI, true); Assert.That(v < vCi, "{0} < {1}", v, vCi); Assert.That(vCi < vNext, "{0} < {1}", vCi, vNext); var sNuGetCI = t.ToString(formatV2, ci); Assert.That(NuGetV2StringComparer.DefaultComparer.Compare(sNuGet, sNuGetCI) < 0, "{0} < {1}", sNuGet, sNuGetCI); Assert.That(NuGetV2StringComparer.DefaultComparer.Compare(sNuGetCI, sNuGetNext) < 0, "{0} < {1}", sNuGetCI, sNuGetNext); string sCiNext = tNext.ToString(ReleaseTagFormat.SemVer, ci); SemVersion vCiNext = SemVersion.Parse(sCiNext, true); Assert.That(vCiNext > vCi, "{0} > {1}", vCiNext, vCi); Assert.That(vCiNext > vNext, "{0} > {1}", vCiNext, vNext); var sNuGetCINext = tNext.ToString(formatV2, ci); Assert.That(NuGetV2StringComparer.DefaultComparer.Compare(sNuGetCINext, sNuGetCI) > 0, "{0} > {1}", sNuGetCINext, sNuGetCI); Assert.That(NuGetV2StringComparer.DefaultComparer.Compare(sNuGetCINext, sNuGetNext) > 0, "{0} > {1}", sNuGetCINext, sNuGetNext); string sCiPrev = tPrev.ToString(ReleaseTagFormat.SemVer, ci); SemVersion vCiPrev = SemVersion.Parse(sCiPrev, true); Assert.That(vCiPrev > vPrev, "{0} > {1}", vCiPrev, vPrev); Assert.That(vCiPrev < v, "{0} < {1}", vCiPrev, v); Assert.That(vCiPrev < vCiNext, "{0} < {1}", vCiPrev, vCiNext); var sNuGetCIPrev = tPrev.ToString(formatV2, ci); Assert.That(NuGetV2StringComparer.DefaultComparer.Compare(sNuGetCIPrev, sNuGetPrev) > 0, "{0} > {1}", sNuGetCIPrev, sNuGetPrev); Assert.That(NuGetV2StringComparer.DefaultComparer.Compare(sNuGetCIPrev, sNuGet) < 0, "{0} < {1}", sNuGetCIPrev, sNuGet); Assert.That(NuGetV2StringComparer.DefaultComparer.Compare(sNuGetCIPrev, sNuGetCINext) < 0, "{0} < {1}", sNuGetCIPrev, sNuGetCINext); }
/// <summary> /// Gets the string version in the given format. /// </summary> /// <param name="f">Format to use.</param> /// <param name="buildInfo">Not null to generate a post-release version.</param> /// <param name="usePreReleaseNameFromTag">True to use <see cref="PreReleaseNameFromTag"/> instead of standardized <see cref="PreReleaseName"/>.</param> /// <returns>Formated string (or <see cref="ParseErrorMessage"/> if any).</returns> public string ToString(ReleaseTagFormat f, CIBuildDescriptor buildInfo = null, bool usePreReleaseNameFromTag = false) { if (ParseErrorMessage != null) { return(ParseErrorMessage); } if (buildInfo != null && !buildInfo.IsValid) { throw new ArgumentException("buildInfo must be valid."); } if (f == ReleaseTagFormat.FileVersion) { return(ToStringFileVersion(buildInfo != null)); } string prName = usePreReleaseNameFromTag ? PreReleaseNameFromTag : PreReleaseName; switch (f) { case ReleaseTagFormat.NugetPackageV2: { // For NuGetV2, we are obliged to use the initial otherwise the special part for a pre release fix is too long for CI-Build LastReleasedBased. if (usePreReleaseNameFromTag) { throw new ArgumentException("ReleaseTagFormat.NugetPackageV2 can not use PreReleaseNameFromTag."); } prName = PreReleaseNameIdx >= 0 ? _standardNames[PreReleaseNameIdx][0].ToString() : String.Empty; string suffix = IsMarkedInvalid ? Marker : null; bool isCIBuild = buildInfo != null; if (isCIBuild && !buildInfo.IsValidForNuGetV2) { throw new ArgumentException("buildInfo must be valid for NuGetV2 format."); } if (isCIBuild) { suffix = buildInfo.ToStringForNuGetV2() + suffix; } if (IsPreRelease) { if (IsPreReleasePatch) { if (isCIBuild) { return(string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}{4:00}-{5:00}-{6}", Major, Minor, Patch, prName, PreReleaseNumber, PreReleasePatch, suffix)); } return(string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}{4:00}-{5:00}{6}", Major, Minor, Patch, prName, PreReleaseNumber, PreReleasePatch, suffix)); } if (PreReleaseNumber > 0) { if (isCIBuild) { return(string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}{4:00}-00-{5}", Major, Minor, Patch, prName, PreReleaseNumber, suffix)); } return(string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}{4:00}{5}", Major, Minor, Patch, prName, PreReleaseNumber, suffix)); } if (isCIBuild) { return(string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}00-00-{4}", Major, Minor, Patch, prName, suffix)); } return(string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}{4}", Major, Minor, Patch, prName, suffix)); } if (isCIBuild) { return(string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}-C{3}", Major, Minor, Patch + 1, suffix)); } return(string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}{3}", Major, Minor, Patch, suffix)); } case ReleaseTagFormat.SemVer: case ReleaseTagFormat.SemVerWithMarker: { string suffix = f == ReleaseTagFormat.SemVerWithMarker ? Marker : string.Empty; bool isCIBuild = buildInfo != null; if (isCIBuild) { suffix = buildInfo.ToString() + suffix; } if (IsPreRelease) { if (IsPreReleasePatch) { if (isCIBuild) { return(string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}.{4}.{5}.{6}", Major, Minor, Patch, prName, PreReleaseNumber, PreReleasePatch, suffix)); } return(string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}.{4}.{5}{6}", Major, Minor, Patch, prName, PreReleaseNumber, PreReleasePatch, suffix)); } if (PreReleaseNumber > 0) { if (isCIBuild) { return(string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}.{4}.0.{5}", Major, Minor, Patch, prName, PreReleaseNumber, suffix)); } return(string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}.{4}{5}", Major, Minor, Patch, prName, PreReleaseNumber, suffix)); } if (isCIBuild) { return(string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}.0.0.{4}", Major, Minor, Patch, prName, suffix)); } return(string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}{4}", Major, Minor, Patch, prName, suffix)); } if (isCIBuild) { return(string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}--{3}", Major, Minor, Patch + 1, suffix)); } return(string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}{3}", Major, Minor, Patch, suffix)); } default: { Debug.Assert(f == ReleaseTagFormat.Normalized); if (IsPreRelease) { if (IsPreReleasePatch) { return(string.Format(CultureInfo.InvariantCulture, "v{0}.{1}.{2}-{3}.{4}.{5}{6}", Major, Minor, Patch, prName, PreReleaseNumber, PreReleasePatch, Marker)); } if (PreReleaseNumber > 0) { return(string.Format(CultureInfo.InvariantCulture, "v{0}.{1}.{2}-{3}.{4}{5}", Major, Minor, Patch, prName, PreReleaseNumber, Marker)); } return(string.Format(CultureInfo.InvariantCulture, "v{0}.{1}.{2}-{3}{4}", Major, Minor, Patch, prName, Marker)); } return(string.Format(CultureInfo.InvariantCulture, "v{0}.{1}.{2}{3}", Major, Minor, Patch, Marker)); } } }
/// <summary> /// Gets the string version in the given format. /// </summary> /// <param name="f">Format to use.</param> /// <param name="buildInfo">Not null to generate a post-release version.</param> /// <param name="usePreReleaseNameFromTag">True to use <see cref="PreReleaseNameFromTag"/> instead of standardized <see cref="PreReleaseName"/>.</param> /// <returns>Formated string (or <see cref="ParseErrorMessage"/> if any).</returns> public string ToString( ReleaseTagFormat f, CIBuildDescriptor buildInfo = null, bool usePreReleaseNameFromTag = false ) { if( ParseErrorMessage != null ) return ParseErrorMessage; if( buildInfo != null && !buildInfo.IsValid ) throw new ArgumentException( "buildInfo must be valid." ); if( f == ReleaseTagFormat.FileVersion ) { return ToStringFileVersion( buildInfo != null ); } string prName = usePreReleaseNameFromTag ? PreReleaseNameFromTag : PreReleaseName; switch( f ) { case ReleaseTagFormat.NugetPackageV2: { // For NuGetV2, we are obliged to use the initial otherwise the special part for a pre release fix is too long for CI-Build LastReleasedBased. if( usePreReleaseNameFromTag ) throw new ArgumentException( "ReleaseTagFormat.NugetPackageV2 can not use PreReleaseNameFromTag." ); prName = PreReleaseNameIdx >= 0 ? _standardNames[PreReleaseNameIdx][0].ToString() : String.Empty; string suffix = IsMarkedInvalid ? Marker : null; bool isCIBuild = buildInfo != null; if( isCIBuild && !buildInfo.IsValidForNuGetV2 ) throw new ArgumentException( "buildInfo must be valid for NuGetV2 format." ); if( isCIBuild ) { suffix = buildInfo.ToStringForNuGetV2() + suffix; } if( IsPreRelease ) { if( IsPreReleasePatch ) { if( isCIBuild ) { return string.Format( CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}{4:00}-{5:00}-{6}", Major, Minor, Patch, prName, PreReleaseNumber, PreReleasePatch, suffix ); } return string.Format( CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}{4:00}-{5:00}{6}", Major, Minor, Patch, prName, PreReleaseNumber, PreReleasePatch, suffix ); } if( PreReleaseNumber > 0 ) { if( isCIBuild ) { return string.Format( CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}{4:00}-00-{5}", Major, Minor, Patch, prName, PreReleaseNumber, suffix ); } return string.Format( CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}{4:00}{5}", Major, Minor, Patch, prName, PreReleaseNumber, suffix ); } if( isCIBuild ) { return string.Format( CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}00-00-{4}", Major, Minor, Patch, prName, suffix ); } return string.Format( CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}{4}", Major, Minor, Patch, prName, suffix ); } if( isCIBuild ) { return string.Format( CultureInfo.InvariantCulture, "{0}.{1}.{2}-C{3}", Major, Minor, Patch+1, suffix ); } return string.Format( CultureInfo.InvariantCulture, "{0}.{1}.{2}{3}", Major, Minor, Patch, suffix ); } case ReleaseTagFormat.SemVer: case ReleaseTagFormat.SemVerWithMarker: { string suffix = f == ReleaseTagFormat.SemVerWithMarker ? Marker : string.Empty; bool isCIBuild = buildInfo != null; if( isCIBuild ) { suffix = buildInfo.ToString() + suffix; } if( IsPreRelease ) { if( IsPreReleasePatch ) { if( isCIBuild ) { return string.Format( CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}.{4}.{5}.{6}", Major, Minor, Patch, prName, PreReleaseNumber, PreReleasePatch, suffix ); } return string.Format( CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}.{4}.{5}{6}", Major, Minor, Patch, prName, PreReleaseNumber, PreReleasePatch, suffix ); } if( PreReleaseNumber > 0 ) { if( isCIBuild ) { return string.Format( CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}.{4}.0.{5}", Major, Minor, Patch, prName, PreReleaseNumber, suffix ); } return string.Format( CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}.{4}{5}", Major, Minor, Patch, prName, PreReleaseNumber, suffix ); } if( isCIBuild ) { return string.Format( CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}.0.0.{4}", Major, Minor, Patch, prName, suffix ); } return string.Format( CultureInfo.InvariantCulture, "{0}.{1}.{2}-{3}{4}", Major, Minor, Patch, prName, suffix ); } if( isCIBuild ) { return string.Format( CultureInfo.InvariantCulture, "{0}.{1}.{2}--{3}", Major, Minor, Patch+1, suffix ); } return string.Format( CultureInfo.InvariantCulture, "{0}.{1}.{2}{3}", Major, Minor, Patch, suffix ); } default: { Debug.Assert( f == ReleaseTagFormat.Normalized ); if( IsPreRelease ) { if( IsPreReleasePatch ) { return string.Format( CultureInfo.InvariantCulture, "v{0}.{1}.{2}-{3}.{4}.{5}{6}", Major, Minor, Patch, prName, PreReleaseNumber, PreReleasePatch, Marker ); } if( PreReleaseNumber > 0 ) { return string.Format( CultureInfo.InvariantCulture, "v{0}.{1}.{2}-{3}.{4}{5}", Major, Minor, Patch, prName, PreReleaseNumber, Marker ); } return string.Format( CultureInfo.InvariantCulture, "v{0}.{1}.{2}-{3}{4}", Major, Minor, Patch, prName, Marker ); } return string.Format( CultureInfo.InvariantCulture, "v{0}.{1}.{2}{3}", Major, Minor, Patch, Marker ); } } }