From 6a8c9f45a5159ed5bc403b6f022d79cf9dae0b5d Mon Sep 17 00:00:00 2001 From: Steve Gilham Date: Fri, 16 Nov 2018 18:33:33 +0000 Subject: [PATCH 1/8] Fix release notes --- ReleaseNotes.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 63b2d45..6cbbd2b 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,8 +1,2 @@ # 5.9.3.7 -* Make naming systematic - -# 5.9.3.6 -* Work around the sunsetting of cdn.rawgit.com - -# 5.9.3.5 * [NEW PACKAGE] `AltCode.Fake.DotNet.Gendarme` containing Gendarme task helper types for FAKE scripts (v5.9.3 or later) : see Wiki entry [The `AltCode.Fake.DotNet.Gendarme` package](https://github.com/SteveGilham/altcode.Fake/wiki/The-AltCode.Fake.DotNet.Gendarme-package) \ No newline at end of file From ff724ce12817bbb3febc5f6daab96665d0deff7f Mon Sep 17 00:00:00 2001 From: Steve Gilham Date: Fri, 16 Nov 2018 19:19:06 +0000 Subject: [PATCH 2/8] [Skip CI] Fix badges --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a3f5e4f..791f8a8 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ For FAKE >= 5.9.3 or later for .net framework and .net core | **Build** | AppVeyor [![Build status](https://img.shields.io/appveyor/ci/SteveGilham/altcode-fake/master.svg)](https://ci.appveyor.com/project/SteveGilham/altcode-fake) ![Build history](https://buildstats.info/appveyor/chart/SteveGilham/altcode-fake?branch=master) | Travis [![Build status](https://travis-ci.com/SteveGilham/altcode.fake.svg?branch=master)](https://travis-ci.com/SteveGilham/altcode.fake#) [![Build history](https://buildstats.info/travisci/chart/SteveGilham/altcode.fake?branch=master)](https://travis-ci.com/SteveGilham/altcode.fake/builds)| | **Unit Test coverage** | Coveralls [![Coverage Status](https://coveralls.io/repos/github/SteveGilham/altcode.fake/badge.svg?branch=master)](https://coveralls.io/github/SteveGilham/altcode.fake?branch=master) | | **Nuget** | | -| Gendarme | [![Nuget](https://buildstats.info/nuget/altcode.fake.dotnet.gendarme)](http://nuget.org/packages/altcode.fake.dotnet.gendarme) [![Nuget](https://img.shields.io/nuget/vpre/altcode.fake.svg)](http://nuget.org/packages/altcode.fake.dotnet.gendarme) | +| Gendarme | [![Nuget](https://buildstats.info/nuget/AltCode.Fake.DotNet.Gendarme)](http://nuget.org/packages/altcode.fake.dotnet.gendarme) [![Nuget](https://img.shields.io/nuget/vpre/AltCode.Fake.DotNet.Gendarme.svg)](http://nuget.org/packages/altcode.fake.dotnet.gendarme) | ## Usage From e776b47e1beb27ce75b1eba4c3b837cbda8f24d2 Mon Sep 17 00:00:00 2001 From: Steve Gilham Date: Fri, 16 Nov 2018 19:30:40 +0000 Subject: [PATCH 3/8] [Skip CI] Fix wiki link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 791f8a8..f4a399a 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ For FAKE >= 5.9.3 or later for .net framework and .net core ## Usage -See the [Wiki page](https://github.com/SteveGilham/altcode.fake/wiki/Usage) for details +See the [Wiki page](https://github.com/SteveGilham/altcode.fake/wiki) for details ## Building From 1a69ea12e3b19b19fe44d63628e5c7aa5ac24157 Mon Sep 17 00:00:00 2001 From: Steve Gilham Date: Sat, 17 Nov 2018 10:11:42 +0000 Subject: [PATCH 4/8] Work around Fake issue #2204 until I can fix that --- Build/targets.fsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Build/targets.fsx b/Build/targets.fsx index 399bab2..ef6159e 100644 --- a/Build/targets.fsx +++ b/Build/targets.fsx @@ -195,6 +195,15 @@ _Target "Gendarme" (fun _ -> // Needs debug because release is compiled --standa _Target "FxCop" (fun _ -> // Needs debug because release is compiled --standalone which contaminates everything Directory.ensure "./_Reports" + let installPath () = + use hklmKey = + Microsoft.Win32.RegistryKey.OpenBaseKey + (Microsoft.Win32.RegistryHive.LocalMachine, Microsoft.Win32.RegistryView.Registry32) + use key = hklmKey.OpenSubKey(@"SOFTWARE\Microsoft\VisualStudio\SxS\VS7") + key.GetValue("15.0", String.Empty) :?> string + + let toolPath = installPath() @@ "Team Tools/Static Analysis Tools/FxCop/FxCopCmd.exe" + [ ([ "_Binaries/AltCode.Fake.DotNet.Gendarme/Debug+AnyCPU/AltCode.Fake.DotNet.Gendarme.dll" ], [], [ @@ -205,6 +214,7 @@ _Target "FxCop" (fun _ -> // Needs debug because release is compiled --standalon |> Seq.iter (fun (files, types, ruleset) -> files |> FxCop.run { FxCop.Params.Create() with WorkingDirectory = "." + ToolPath = toolPath UseGAC = true Verbose = false ReportFileName = From ca9ad02c372b36142d47cd96d76599514b09c586 Mon Sep 17 00:00:00 2001 From: Steve Gilham Date: Sat, 17 Nov 2018 10:36:43 +0000 Subject: [PATCH 5/8] "--limit 0" means "report nothing" not "report all" -- make zero limit emit nothing to the command line -- suppress all the issues revealed arising from F# compiler generated code --- .../AltCode.Fake.DotNet.Gendarme.fs | 24 +++-- Build/Gendarme.fs | 13 +-- Build/rules-fake.xml | 88 ++++++++++--------- ReleaseNotes.md | 3 + 4 files changed, 68 insertions(+), 60 deletions(-) diff --git a/AltCode.Fake.Tests/AltCode.Fake.DotNet.Gendarme.fs b/AltCode.Fake.Tests/AltCode.Fake.DotNet.Gendarme.fs index 29c2084..56bde57 100644 --- a/AltCode.Fake.Tests/AltCode.Fake.DotNet.Gendarme.fs +++ b/AltCode.Fake.Tests/AltCode.Fake.DotNet.Gendarme.fs @@ -16,7 +16,7 @@ let testCases = let args = Gendarme.getArguments p Expect.isTrue (p.Console) "A field should have non-default value for a bool" Expect.equal args - [ "--limit"; "0"; "--console"; "--severity"; "medium+"; "--confidence"; "normal+" ] + [ "--console"; "--severity"; "medium+"; "--confidence"; "normal+" ] "The defaults should be simple" testCase "Test that string arguments are processed as expected" <| fun _ -> let config = Guid.NewGuid().ToString() @@ -49,8 +49,6 @@ let testCases = ignore |> Seq.head "--ignore" ignore |> Seq.last - "--limit" - "0" "--console" "--severity" "medium+" @@ -70,7 +68,7 @@ let testCases = let args = Gendarme.getArguments p Expect.equal args - [ name; log; "--limit"; "0"; "--console"; "--severity"; "medium+"; + [ name; log; "--console"; "--severity"; "medium+"; "--confidence"; "normal+" ] ("The log kind should be " + name)) testCase "Test that limit arguments are processed as expected" <| fun _ -> @@ -88,21 +86,21 @@ let testCases = let p = { Gendarme.Params.Create() with Console = false } let args = Gendarme.getArguments p Expect.equal args - [ "--limit"; "0"; "--severity"; "medium+"; "--confidence"; "normal+" ] + [ "--severity"; "medium+"; "--confidence"; "normal+" ] "The console should be gone" testCase "Test that output may be hushed" <| fun _ -> let p = { Gendarme.Params.Create() with Quiet = true } let args = Gendarme.getArguments p Expect.equal args - [ "--limit"; "0"; "--console"; "--quiet"; "--severity"; "medium+"; "--confidence"; + [ "--console"; "--quiet"; "--severity"; "medium+"; "--confidence"; "normal+" ] "The output should be quieted" testProperty "Test that verbosity may be set" <| fun (x : uint8) -> let p = { Gendarme.Params.Create() with Verbosity = x } let args = Gendarme.getArguments p Expect.equal args - ([ "--limit"; "0"; "--console"; "--severity"; "medium+"; "--confidence"; "normal+" ] + ([ "--console"; "--severity"; "medium+"; "--confidence"; "normal+" ] @ (Seq.initInfinite (fun _ -> "--v") |> Seq.take (int x) |> Seq.toList)) "The verbosity should be set" @@ -129,7 +127,7 @@ let testCases = let p = { Gendarme.Params.Create() with Severity = s } let args = Gendarme.getArguments p Expect.equal args - [ "--limit"; "0"; "--console"; "--severity"; m; "--confidence"; "normal+" ] + [ "--console"; "--severity"; m; "--confidence"; "normal+" ] ("The severity should be " + m)) testCase "Test that confidence may be set" <| fun _ -> @@ -151,7 +149,7 @@ let testCases = let p = { Gendarme.Params.Create() with Confidence = c } let args = Gendarme.getArguments p Expect.equal args - [ "--limit"; "0"; "--console"; "--severity"; "medium+"; "--confidence"; m ] + [ "--console"; "--severity"; "medium+"; "--confidence"; m ] ("The severity should be " + m)) testCase "Test that command arguments are processed as expected" <| fun _ -> @@ -166,7 +164,7 @@ let testCases = BindingFlags.Instance ||| BindingFlags.NonPublic) let w = info.GetValue(proc) :?> string option Expect.equal proc.CommandLine - (fake + " --limit 0 --console --severity medium+ --confidence normal+") + (fake + " --console --severity medium+ --confidence normal+") "The defaults should be simple" Expect.equal w None "Default working directory should be empty" @@ -176,7 +174,7 @@ let testCases = let args = Gendarme.getArguments p let proc = Gendarme.createProcess args p Expect.equal proc.CommandLine - (fake + " --limit 0 --console --severity medium+ --confidence normal+") + (fake + " --console --severity medium+ --confidence normal+") "The toolpath should match" testCase "Test that working directory is processed as expected" <| fun _ -> @@ -210,7 +208,7 @@ let testCases = Expect.throwsC (fun () -> Gendarme.run args) (fun ex -> Expect.equal ex.Message - ("Gendarme --limit 0 --console --severity medium+ --confidence normal+ " + fake + ("Gendarme --console --severity medium+ --confidence normal+ " + fake + ".nonesuch failed.") "Message should reflect inputs") testCase "Test that null arguments are processed as expected" <| fun _ -> @@ -223,7 +221,7 @@ let testCases = let args = Gendarme.getArguments p Expect.equal args - [ "--limit"; "0"; "--console"; "--severity"; "medium+"; "--confidence"; "normal+" ] + [ "--console"; "--severity"; "medium+"; "--confidence"; "normal+" ] "The defaults should be simple" ] [] diff --git a/Build/Gendarme.fs b/Build/Gendarme.fs index 06a66d0..ed969dd 100644 --- a/Build/Gendarme.fs +++ b/Build/Gendarme.fs @@ -127,7 +127,9 @@ let internal getArguments parameters = | Xml -> Item "--xml" | _ -> Item "--html") parameters.Log ItemList "--ignore" parameters.Ignore - Item "--limit" <| parameters.Limit.ToString(CultureInfo.InvariantCulture) + (if parameters.Limit > 0uy then + Item "--limit" <| parameters.Limit.ToString(CultureInfo.InvariantCulture) + else []) Flag "--console" parameters.Console Flag "--quiet" parameters.Quiet @@ -143,21 +145,22 @@ let internal getArguments parameters = |> Seq.map (fun _ -> "--v") |> Seq.toList else []) + ((ItemList String.Empty parameters.Targets) |> List.filter (String.isNullOrWhiteSpace >> not)) ] |> List.concat let internal createProcess args parameters = - CreateProcess.fromRawCommand parameters.ToolPath args - |> if String.IsNullOrWhiteSpace parameters.WorkingDirectory then id - else CreateProcess.withWorkingDirectory parameters.WorkingDirectory + CreateProcess.fromRawCommand parameters.ToolPath args + |> if String.IsNullOrWhiteSpace parameters.WorkingDirectory then id + else CreateProcess.withWorkingDirectory parameters.WorkingDirectory /// Uses ILMerge to merge .NET assemblies. /// ## Parameters /// /// - `parameters` - A Gendarme.Params value with your required settings. let run parameters = - use __ = Trace.traceTask "Gendarme" "" + use __ = Trace.traceTask "Gendarme" String.Empty let args = getArguments parameters let run = diff --git a/Build/rules-fake.xml b/Build/rules-fake.xml index c5f4b0b..a6232b9 100644 --- a/Build/rules-fake.xml +++ b/Build/rules-fake.xml @@ -1,44 +1,48 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 6cbbd2b..d6bc9fe 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,2 +1,5 @@ +# 5.9.3.xxx +* [BUGFIX] As "--limit 0" means "report nothing" not "report all", make zero limit emit nothing to the command line + # 5.9.3.7 * [NEW PACKAGE] `AltCode.Fake.DotNet.Gendarme` containing Gendarme task helper types for FAKE scripts (v5.9.3 or later) : see Wiki entry [The `AltCode.Fake.DotNet.Gendarme` package](https://github.com/SteveGilham/altcode.Fake/wiki/The-AltCode.Fake.DotNet.Gendarme-package) \ No newline at end of file From b19bbe80421bd06fb08def1faac3c227a2044be9 Mon Sep 17 00:00:00 2001 From: Steve Gilham Date: Sat, 17 Nov 2018 10:51:11 +0000 Subject: [PATCH 6/8] [Enhancement] `FailBuildOnDefect` parameter, default `true`, to determine if defect detection will fail the build --- .../AltCode.Fake.DotNet.Gendarme.fs | 28 +++++++++++-------- Build/Gendarme.fs | 11 ++++++-- ReleaseNotes.md | 1 + 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/AltCode.Fake.Tests/AltCode.Fake.DotNet.Gendarme.fs b/AltCode.Fake.Tests/AltCode.Fake.DotNet.Gendarme.fs index 56bde57..c17d5f1 100644 --- a/AltCode.Fake.Tests/AltCode.Fake.DotNet.Gendarme.fs +++ b/AltCode.Fake.Tests/AltCode.Fake.DotNet.Gendarme.fs @@ -68,9 +68,8 @@ let testCases = let args = Gendarme.getArguments p Expect.equal args - [ name; log; "--console"; "--severity"; "medium+"; - "--confidence"; "normal+" ] ("The log kind should be " + name)) - + [ name; log; "--console"; "--severity"; "medium+"; "--confidence"; "normal+" ] + ("The log kind should be " + name)) testCase "Test that limit arguments are processed as expected" <| fun _ -> let p = { Gendarme.Params.Create() with Limit = uint8 (23 + DateTime.Now.Second) } let args = Gendarme.getArguments p @@ -85,16 +84,15 @@ let testCases = testCase "Test that console may be switched off" <| fun _ -> let p = { Gendarme.Params.Create() with Console = false } let args = Gendarme.getArguments p - Expect.equal args - [ "--severity"; "medium+"; "--confidence"; "normal+" ] + Expect.equal args [ "--severity"; "medium+"; "--confidence"; "normal+" ] "The console should be gone" testCase "Test that output may be hushed" <| fun _ -> let p = { Gendarme.Params.Create() with Quiet = true } let args = Gendarme.getArguments p Expect.equal args - [ "--console"; "--quiet"; "--severity"; "medium+"; "--confidence"; - "normal+" ] "The output should be quieted" + [ "--console"; "--quiet"; "--severity"; "medium+"; "--confidence"; "normal+" ] + "The output should be quieted" testProperty "Test that verbosity may be set" <| fun (x : uint8) -> let p = { Gendarme.Params.Create() with Verbosity = x } @@ -126,8 +124,7 @@ let testCases = (fun (s, m) -> let p = { Gendarme.Params.Create() with Severity = s } let args = Gendarme.getArguments p - Expect.equal args - [ "--console"; "--severity"; m; "--confidence"; "normal+" ] + Expect.equal args [ "--console"; "--severity"; m; "--confidence"; "normal+" ] ("The severity should be " + m)) testCase "Test that confidence may be set" <| fun _ -> @@ -148,8 +145,7 @@ let testCases = (fun (c, m) -> let p = { Gendarme.Params.Create() with Confidence = c } let args = Gendarme.getArguments p - Expect.equal args - [ "--console"; "--severity"; "medium+"; "--confidence"; m ] + Expect.equal args [ "--console"; "--severity"; "medium+"; "--confidence"; m ] ("The severity should be " + m)) testCase "Test that command arguments are processed as expected" <| fun _ -> @@ -198,6 +194,16 @@ let testCases = Targets = [ fake ] } Expect.equal (Gendarme.run args) () "Should be silent" + testCase "A non-failing run should proceed as expected" <| fun _ -> + let here = Assembly.GetExecutingAssembly().Location |> Path.GetDirectoryName + let fake = Path.Combine(here, "AltCode.Nuget.Placeholder.exe") + + let args = + { Gendarme.Params.Create() with ToolPath = fake + Targets = [ fake + ".nonesuch" ] + FailBuildOnDefect = false } + Expect.equal (Gendarme.run args) () "Should be silent" + testCase "A bad run should proceed as expected" <| fun _ -> let here = Assembly.GetExecutingAssembly().Location |> Path.GetDirectoryName let fake = Path.Combine(here, "AltCode.Nuget.Placeholder.exe") diff --git a/Build/Gendarme.fs b/Build/Gendarme.fs index ed969dd..f24949a 100644 --- a/Build/Gendarme.fs +++ b/Build/Gendarme.fs @@ -76,7 +76,10 @@ type Params = Severity : Severity /// Filter defects for the specified confidence levels. /// Default is 'normal+' - Confidence : Confidence } + Confidence : Confidence + /// Fail the build if a defect is reported + /// Default is true + FailBuildOnDefect : bool } /// ILMerge default parameters. Tries to automatically locate ilmerge.exe in a subfolder. static member Create() = { ToolPath = Tools.findToolInSubPath "gendarme.exe" <| Shell.pwd() @@ -98,7 +101,8 @@ type Params = Severity = Severity.Medium Grade.Plus /// Filter defects for the specified confidence levels. /// Default is 'normal+' - Confidence = Confidence.Normal Grade.Plus } + Confidence = Confidence.Normal Grade.Plus + FailBuildOnDefect = true } /// Builds the arguments for the Gendarme task /// [omit] @@ -167,5 +171,6 @@ let run parameters = createProcess args parameters |> CreateProcess.withFramework |> Proc.run - if 0 <> run.ExitCode then failwithf "Gendarme %s failed." (String.separated " " args) + if 0 <> run.ExitCode && parameters.FailBuildOnDefect then + failwithf "Gendarme %s failed." (String.separated " " args) __.MarkSuccess() \ No newline at end of file diff --git a/ReleaseNotes.md b/ReleaseNotes.md index d6bc9fe..e1818db 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,5 +1,6 @@ # 5.9.3.xxx * [BUGFIX] As "--limit 0" means "report nothing" not "report all", make zero limit emit nothing to the command line +* [Enhancement] `FailBuildOnDefect` parameter, default `true`, to determine if defect detection will fail the build # 5.9.3.7 * [NEW PACKAGE] `AltCode.Fake.DotNet.Gendarme` containing Gendarme task helper types for FAKE scripts (v5.9.3 or later) : see Wiki entry [The `AltCode.Fake.DotNet.Gendarme` package](https://github.com/SteveGilham/altcode.Fake/wiki/The-AltCode.Fake.DotNet.Gendarme-package) \ No newline at end of file From 4318dd7025cf678844fcaa0bef0a91cb6cb7ea11 Mon Sep 17 00:00:00 2001 From: Steve Gilham Date: Sat, 17 Nov 2018 11:55:30 +0000 Subject: [PATCH 7/8] Gendarme on mono doesn't into .pdb files --- Build/targets.fsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Build/targets.fsx b/Build/targets.fsx index ef6159e..87f2009 100644 --- a/Build/targets.fsx +++ b/Build/targets.fsx @@ -181,7 +181,20 @@ _Target "Lint" (fun _ -> _Target "Gendarme" (fun _ -> // Needs debug because release is compiled --standalone which contaminates everything Directory.ensure "./_Reports" - [ ("./Build/rules-fake.xml", + + let baseRules = Path.getFullName "./Build/rules-fake.xml" + let rules = + if Environment.isWindows then baseRules + else + // Gendarme mono doesn't into .pdb files + let lines = baseRules + |> File.ReadAllLines + |> Seq.map (fun l -> l.Replace ("AvoidSwitchStatementsRule", "AvoidSwitchStatementsRule | AvoidLongMethodsRule")) + let fixup = Path.getFullName "./_Generated/rules-fake.xml" + File.WriteAllLines(fixup, lines) + fixup + + [ (rules, [ "_Binaries/AltCode.Fake.DotNet.Gendarme/Debug+AnyCPU/AltCode.Fake.DotNet.Gendarme.dll" ]) ] |> Seq.iter (fun (ruleset, files) -> Gendarme.run { Gendarme.Params.Create() with WorkingDirectory = "." From d25f5ec8219734c842159495f0c9d6f5db9c0d41 Mon Sep 17 00:00:00 2001 From: Steve Gilham Date: Sat, 17 Nov 2018 12:19:25 +0000 Subject: [PATCH 8/8] [Skip CI] ready for a new release --- ReleaseNotes.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index e1818db..06f7570 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,6 +1,7 @@ -# 5.9.3.xxx +# 5.9.3.10 * [BUGFIX] As "--limit 0" means "report nothing" not "report all", make zero limit emit nothing to the command line -* [Enhancement] `FailBuildOnDefect` parameter, default `true`, to determine if defect detection will fail the build +* [Enhancement] `FailBuildOnDefect` parameter, default `true`, to determine if defect detection will fail the build. +* **NOTE** whether --limit is set > 0 or omitted, if there are > 0 defects reported Gendarme exits with return code 1. It limit is set zero, or there are no defects against the rules engaged, then it returns 0. Failing the build on >= N defects for N > 0 does not come for free, but would require parsing one form of output or another, and no form of output is guaranteed -- they can all be switched off. # 5.9.3.7 * [NEW PACKAGE] `AltCode.Fake.DotNet.Gendarme` containing Gendarme task helper types for FAKE scripts (v5.9.3 or later) : see Wiki entry [The `AltCode.Fake.DotNet.Gendarme` package](https://github.com/SteveGilham/altcode.Fake/wiki/The-AltCode.Fake.DotNet.Gendarme-package) \ No newline at end of file