diff --git a/src/Credfeto.ChangeLog/ChangeLogUpdater.cs b/src/Credfeto.ChangeLog/ChangeLogUpdater.cs index 58fba40f..ae52ec00 100644 --- a/src/Credfeto.ChangeLog/ChangeLogUpdater.cs +++ b/src/Credfeto.ChangeLog/ChangeLogUpdater.cs @@ -52,9 +52,7 @@ public static string AddEntry(string changeLog, string type, string message) private static string AddEntryCommon(string changeLog, string type, string message) { - List text = EnsureChangelog(changeLog) - .SplitToLines() - .ToList(); + List text = ChangeLogAsLines(changeLog); string entryText = CreateEntryText(message); int index = FindInsertPosition(changeLog: text, type: type, entryText: entryText); @@ -68,6 +66,13 @@ private static string AddEntryCommon(string changeLog, string type, string messa .Trim(); } + private static List ChangeLogAsLines(string changeLog) + { + return EnsureChangelog(changeLog) + .SplitToLines() + .ToList(); + } + public static string RemoveEntry(string changeLog, string type, string message) { return RemoveEntryCommon(changeLog: changeLog, type: type, message: message); @@ -75,9 +80,7 @@ public static string RemoveEntry(string changeLog, string type, string message) private static string RemoveEntryCommon(string changeLog, string type, string message) { - List text = EnsureChangelog(changeLog) - .SplitToLines() - .ToList(); + List text = ChangeLogAsLines(changeLog); string entryText = CreateEntryText(message); int index = FindRemovePosition(changeLog: text, type: type, entryText: entryText); @@ -120,12 +123,7 @@ private static int FindRemovePosition(List changeLog, string type, strin findSection: false); } - private static int FindMatchPosition(List changeLog, - string type, - Func isMatch, - Func exactMatchAction, - Func emptySectionAction, - bool findSection) + private static int FindMatchPosition(List changeLog, string type, Func isMatch, Func exactMatchAction, Func emptySectionAction, bool findSection) { bool foundUnreleased = false; @@ -205,9 +203,7 @@ public static string CreateRelease(string changeLog, string version, bool pendin private static string CreateReleaseCommon(string changeLog, string version, bool pending) { - List text = EnsureChangelog(changeLog) - .SplitToLines() - .ToList(); + List text = ChangeLogAsLines(changeLog); Dictionary releases = FindReleasePositions(text); @@ -283,7 +279,7 @@ private static void RemoveItems(List text, List removeIndexes) private static string CreateReleaseVersionHeader(string version, bool pending) { string releaseDate = CreateReleaseDate(pending); - string releaseVersionHeader = "## [" + version + "] - " + releaseDate; + string releaseVersionHeader = string.Concat("## [", version, "] - ", releaseDate); return releaseVersionHeader; } @@ -396,9 +392,7 @@ private static string CurrentDate() private static int FindInsertPosition(string releaseVersionToFind, IReadOnlyDictionary releases, int endOfFilePosition) { - string? latestRelease = releases.Keys.Where(x => x != Constants.Unreleased) - .OrderByDescending(x => new Version(x)) - .FirstOrDefault(); + string? latestRelease = GetLatestRelease(releases); int releaseInsertPos; @@ -411,12 +405,12 @@ private static int FindInsertPosition(string releaseVersionToFind, IReadOnlyDict if (latestNumeric == numericalVersion) { - throw new ReleaseAlreadyExistsException($"Release {releaseVersionToFind} already exists"); + return ReleaseAlreadyExists(releaseVersionToFind); } if (latestNumeric > numericalVersion) { - throw new ReleaseTooOldException($"Release {latestRelease} already exists and is newer than {releaseVersionToFind}"); + return ReleaseTooOld(releaseVersionToFind: releaseVersionToFind, latestRelease: latestRelease); } releaseInsertPos = releases[latestRelease]; @@ -429,20 +423,50 @@ private static int FindInsertPosition(string releaseVersionToFind, IReadOnlyDict return releaseInsertPos; } + [DoesNotReturn] + private static int ReleaseTooOld(string releaseVersionToFind, string latestRelease) + { + throw new ReleaseTooOldException($"Release {latestRelease} already exists and is newer than {releaseVersionToFind}"); + } + + [DoesNotReturn] + private static int ReleaseAlreadyExists(string releaseVersionToFind) + { + throw new ReleaseAlreadyExistsException($"Release {releaseVersionToFind} already exists"); + } + + private static string? GetLatestRelease(IReadOnlyDictionary releases) + { + return releases.Keys.Where(x => x != Constants.Unreleased) + .OrderByDescending(x => new Version(x)) + .FirstOrDefault(); + } + private static Dictionary FindReleasePositions(IReadOnlyList text) { - Dictionary releases = text.Select((line, index) => new { line, index }) - .Where(i => IsRelease(i.line)) - .ToDictionary(keySelector: i => ExtractRelease(i.line), elementSelector: i => i.index, comparer: StringComparer.Ordinal); + Dictionary releases = GetReleasePositions(text); if (releases.Count == 0) { - throw new EmptyChangeLogException("Could not find unreleased section"); + return CouldNotFindUnreleasedSection(); } return releases; } + [DoesNotReturn] + private static Dictionary CouldNotFindUnreleasedSection() + { + throw new EmptyChangeLogException("Could not find unreleased section"); + } + + private static Dictionary GetReleasePositions(IReadOnlyList text) + { + return text.Select((line, index) => new { line, index }) + .Where(i => IsRelease(i.line)) + .ToDictionary(keySelector: i => ExtractRelease(i.line), elementSelector: i => i.index, comparer: StringComparer.Ordinal); + } + private static string ExtractRelease(string line) { if (line == Constants.UnreleasedHeader)