From 49c52cd1e56f36a4adc5b80e80f258f0aad398bd Mon Sep 17 00:00:00 2001 From: realmarv Date: Tue, 27 Jun 2023 17:24:34 +0330 Subject: [PATCH] FileConventions: refactor Change DetectInconsistentVersions code so it doesn't use a mutable variable. --- src/FileConventions/Library.fs | 49 +++++++++++++++------------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index 131760753..500be612b 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -246,35 +246,28 @@ let WrapText (text: string) (maxCharsPerLine: int) : string = wrappedParagraphs ) -let DetectInconsistentVersion +let private DetectInconsistentVersions (fileInfos: seq) (versionRegexPattern: string) = let versionRegex = Regex(versionRegexPattern, RegexOptions.Compiled) - - let mutable versionMap: Map> = Map.empty - - - fileInfos - |> Seq.iter(fun fileInfo -> - let fileText = File.ReadAllText fileInfo.FullName - - versionRegex.Matches fileText - |> Seq.iter(fun regexMatch -> - let key = regexMatch.Groups.[1].ToString() - let value = regexMatch.Groups.[2].ToString() - - let addSet (value: string) (maybePrevSet: Option>) = - match maybePrevSet with - | Some prevSet -> Some(Set.add value prevSet) - | None -> None - - if versionMap.ContainsKey key then - versionMap <- versionMap.Change(key, addSet value) - else - versionMap <- versionMap.Add(key, Set.singleton value) - ) - ) + let allFilesTexts = + fileInfos + |> Seq.map(fun fileInfo -> File.ReadAllText fileInfo.FullName) + |> String.concat Environment.NewLine + + let versionMap = + versionRegex.Matches allFilesTexts + |> Seq.fold + (fun acc regexMatch -> + let key = regexMatch.Groups.[1].ToString() + let value = regexMatch.Groups.[2].ToString() + + match Map.tryFind key acc with + | Some prevSet -> Map.add key (Set.add value prevSet) acc + | None -> Map.add key (Set.singleton value) acc + ) + Map.empty versionMap |> Seq.map(fun item -> Seq.length item.Value > 1) @@ -285,12 +278,12 @@ let DetectInconsistentVersionsInGitHubCIWorkflow(fileInfos: seq) = |> Seq.iter(fun fileInfo -> assert (fileInfo.FullName.EndsWith ".yml")) let inconsistentVersionsType1 = - DetectInconsistentVersion + DetectInconsistentVersions fileInfos "\\swith:\\s*([^\\s]*)-version:\\s*([^\\s]*)\\s" let inconsistentVersionsType2 = - DetectInconsistentVersion + DetectInconsistentVersions fileInfos "\\suses:\\s*([^\\s]*)@v([^\\s]*)\\s" @@ -310,7 +303,7 @@ let DetectInconsistentVersionsInNugetRefsInFSharpScripts fileInfos |> Seq.iter(fun fileInfo -> assert (fileInfo.FullName.EndsWith ".fsx")) - DetectInconsistentVersion + DetectInconsistentVersions fileInfos "#r \"nuget:\\s*([^\\s]*)\\s*,\\s*Version\\s*=\\s*([^\\s]*)\\s*\""