public ParsedData ParseVersionFromCommits(IEnumerable <CommitInfo> commits) { if (commits is null) { throw new ArgumentNullException(nameof(commits)); } VersionData?version = null; var releaseNotes = new ReleaseNotesData(); var firstCommit = true; var firstCommitIsTag = false; var metadata = string.Empty; var commitCount = 0; foreach (var commit in commits) { this._writer.AddIndent(); var parsedCommit = ParseConventionalCommit(commit, firstCommit || !commit.IsTag); if (parsedCommit != null || commit.IsTag) { version = this._versionParser.ParseVersion(version, parsedCommit ?? commit); } if (parsedCommit != null && (firstCommit || !commit.IsTag)) { this._releaseNoteParser.ParseReleaseNotes(releaseNotes, parsedCommit); } this._writer.RemoveIndent(); if (firstCommit) { if (!commit.IsTag && commit.RawText.StartsWith("Merge ", StringComparison.OrdinalIgnoreCase)) { continue; } firstCommitIsTag = commit.IsTag; metadata = commit.Sha; } if (!firstCommit && commit.IsTag) { break; } if (firstCommit || !commit.IsTag) { commitCount++; } firstCommit = false; } if (version?.IsEmpty() != false) { if (!string.IsNullOrEmpty(this.config.Tag)) { version = VersionData.Parse(this.config.NextVersion + "-" + this.config.Tag); if (firstCommitIsTag) { version.Weight = 1; } } else { version = VersionData.Parse(this.config.NextVersion); } } var versionBumped = false; if (!firstCommitIsTag) { versionBumped = ForceNextVersion(version); } else if (version.MajorMinorPatch == "0.0.0") { version.SetNextBump(VersionBump.None, true); versionBumped = ForceNextVersion(version); } version.Metadata = metadata; version.Commits = commitCount; if (!firstCommitIsTag && versionBumped && !string.IsNullOrEmpty(this.config.Tag) && !string.Equals(this.config.Tag, version.PreReleaseLabel, StringComparison.OrdinalIgnoreCase) && string.Compare(this.config.Tag, version.PreReleaseLabel, StringComparison.OrdinalIgnoreCase) > 0) { version.PreReleaseLabel = this.config.Tag; version.Weight = Math.Max(version.Weight ?? 1, 1); } return(new ParsedData(version, releaseNotes)); }