public SemanticVersion FindMainlineModeVersion(BaseVersion baseVersion)
        {
            if (baseVersion.SemanticVersion.PreReleaseTag.HasTag())
            {
                throw new NotSupportedException("Mainline development mode doesn't yet support pre-release tags on master");
            }

            using (log.IndentLog("Using mainline development mode to calculate current version"))
            {
                var mainlineVersion = baseVersion.SemanticVersion;

                // Forward merge / PR
                //          * feature/foo
                //         / |
                // master *  *
                //

                var mergeBase   = baseVersion.BaseVersionSource;
                var mainline    = GetMainline(baseVersion.BaseVersionSource);
                var mainlineTip = mainline.Tip;

                // when the current branch is not mainline, find the effective mainline tip for versioning the branch
                if (!context.CurrentBranch.IsSameBranch(mainline))
                {
                    mergeBase = FindMergeBaseBeforeForwardMerge(baseVersion.BaseVersionSource, mainline, out mainlineTip);
                    log.Info($"Current branch ({context.CurrentBranch.FriendlyName}) was branch from {mergeBase}");
                }

                var mainlineCommitLog = repositoryMetadataProvider.GetMainlineCommitLog(baseVersion.BaseVersionSource, mainlineTip);
                var directCommits     = new List <Commit>(mainlineCommitLog.Count);

                if (string.IsNullOrEmpty(context.Configuration.NextVersion))
                {
                    // Scans commit log in reverse, aggregating merge commits
                    foreach (var commit in mainlineCommitLog)
                    {
                        directCommits.Add(commit);
                        if (commit.Parents.Count() > 1)
                        {
                            mainlineVersion = AggregateMergeCommitIncrement(commit, directCommits, mainlineVersion, mainline);
                        }
                    }

                    // This will increment for any direct commits on mainline
                    mainlineVersion = IncrementForEachCommit(directCommits, mainlineVersion, mainline);
                }
                mainlineVersion.BuildMetaData = CreateVersionBuildMetaData(mergeBase);

                // branches other than master always get a bump for the act of branching
                if ((!context.CurrentBranch.IsSameBranch(mainline)) && (string.IsNullOrEmpty(context.Configuration.NextVersion)))
                {
                    var branchIncrement = FindMessageIncrement(null, context.CurrentCommit, mergeBase, mainlineCommitLog);
                    log.Info($"Performing {branchIncrement} increment for current branch ");

                    mainlineVersion = mainlineVersion.IncrementVersion(branchIncrement);
                }

                return(mainlineVersion);
            }
        }