private static VersionNumber GenerateReleaseCanditateVersionNumber(
     IGitRepoReader repo,
     ReleaseCandidateBranchInfo releaseCandidate,
     string headCommitHash)
 {
     var ordinal = repo.HighestMatchingTagForReleaseCandidate?.PreReleaseLabel?.BranchLabel
                       .Ordinal + 1;
     var preReleaseLabel = releaseCandidate.DeterminePreReleaseLabel(ordinal ?? 1);
     var version = releaseCandidate.VersionFromName;
     return new VersionNumber(
         version.Major,
         version.Minor,
         version.Patch,
         preReleaseLabel,
         headCommitHash);
 }
        internal static VersionNumber GenerateVersionNumber(IGitRepoReader repo)
        {
            var currentBranch  = repo.CurrentBranch;
            var headCommitHash = repo.HeadCommitHash.Length > Constants.BuildMetadataHashLength
                ? repo.HeadCommitHash.Substring(0, Constants.BuildMetadataHashLength)
                : repo.HeadCommitHash;
            var tagOnHead = repo.TagOnHead;

            return(currentBranch switch
            {
                FeatureBranchInfo feature => GenerateFeatureVersionNumber(repo, feature, headCommitHash),
                ReleaseCandidateBranchInfo releaseCandidate => GenerateReleaseCandidateVersionNumber(repo, releaseCandidate, headCommitHash),
                DevelopBranchInfo develop => GenerateDevelopVersionNumber(repo, develop, headCommitHash),
                MasterBranchInfo _ when TagOnHeadIsMajorMinorPatch(tagOnHead) => VersionNumber.Parse(tagOnHead.FriendlyName),
                _ => throw new ArgumentOutOfRangeException(
                    $"'{currentBranch.Name}' is not a branch that is supported for automated version generation, please tag the commit manualy.",
                    nameof(currentBranch.Name))
            });