Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        /// <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));
            }
            }
        }
Ejemplo n.º 3
0
        /// <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 );
                    }
            }
        }