Esempio n. 1
0
        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));
        }