Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 32 additions & 8 deletions src/pkgchk-cli/Commands.fs
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,16 @@ type PackageCheckCommandSettings() =
[<DefaultValue("")>]
member val GithubPrId = "" with get, set

[<CommandOption("--pass-img", IsHidden = true)>]
[<Description("URI of an image for successful scans.")>]
[<DefaultValue("")>]
member val GoodImageUri = "" with get, set

[<CommandOption("--fail-img", IsHidden = true)>]
[<Description("URI of an image for failed scans.")>]
[<DefaultValue("")>]
member val BadImageUri = "" with get, set

[<ExcludeFromCodeCoverage>]
type PackageCheckCommand(nuget: Tk.Nuget.INugetClient) =
inherit Command<PackageCheckCommandSettings>()
Expand Down Expand Up @@ -145,9 +155,9 @@ type PackageCheckCommand(nuget: Tk.Nuget.INugetClient) =

let getHits = liftHits >> sortHits >> List.ofSeq

let rec genComment trace (settings: PackageCheckCommandSettings, hits, errorHits, hitCounts) attempt =
let rec genComment trace (settings: PackageCheckCommandSettings, hits, errorHits, hitCounts, imageUri) attempt =
let markdown =
(hits, errorHits, hitCounts, settings.SeverityLevels)
(hits, errorHits, hitCounts, settings.SeverityLevels, imageUri)
|> Markdown.generate
|> String.joinLines

Expand All @@ -159,16 +169,25 @@ type PackageCheckCommand(nuget: Tk.Nuget.INugetClient) =
if attempt >= 1 then
GithubComment.create settings.GithubSummaryTitle "_The report's too big for Github - Please check logs_"
else
genComment trace (settings, [], errorHits, hitCounts) (attempt + 1)
genComment trace (settings, [], errorHits, hitCounts, imageUri) (attempt + 1)

let returnCode (hits: ScaHit list) =
let isSuccessScan (hits: ScaHit list) =
match hits with
| [] -> ReturnCodes.validationOk
| [] -> true
| _ -> false

let returnCode (hits: ScaHit list) =
match isSuccessScan hits with
| true -> ReturnCodes.validationOk
| _ -> ReturnCodes.validationFailed

let reportFile outDir =
outDir |> Io.toFullPath |> Io.combine "pkgchk.md" |> Io.normalise

let cleanSettings (settings: PackageCheckCommandSettings) =
settings.SeverityLevels <- settings.SeverityLevels |> Array.filter String.isNotEmpty
settings

let validateSettings (settings: PackageCheckCommandSettings) =
if String.isNotEmpty settings.GithubPrId then
if String.isEmpty settings.GithubToken then
Expand All @@ -191,7 +210,7 @@ type PackageCheckCommand(nuget: Tk.Nuget.INugetClient) =
override _.Execute(context, settings) =
let trace = trace settings.TraceLogging

settings.SeverityLevels <- settings.SeverityLevels |> Array.filter String.isNotEmpty
let settings = cleanSettings settings

if settings.NoBanner |> not then
nuget |> App.banner |> console
Expand Down Expand Up @@ -240,11 +259,16 @@ type PackageCheckCommand(nuget: Tk.Nuget.INugetClient) =

renderables |> renderTables

let reportImg =
match isSuccessScan errorHits with
| true -> settings.GoodImageUri
| false -> settings.BadImageUri

if settings.OutputDirectory <> "" then
trace "Building reports..."

let reportFile =
(hits, errorHits, hitCounts, settings.SeverityLevels)
(hits, errorHits, hitCounts, settings.SeverityLevels, reportImg)
|> Markdown.generate
|> Io.writeFile (reportFile settings.OutputDirectory)

Expand All @@ -262,7 +286,7 @@ type PackageCheckCommand(nuget: Tk.Nuget.INugetClient) =
let repo = Github.repo settings.GithubRepo
let client = Github.client settings.GithubToken

let comment = genComment trace (settings, hits, errorHits, hitCounts) 0
let comment = genComment trace (settings, hits, errorHits, hitCounts, reportImg) 0

trace $"Posting {comment.title} report to Github repo {repo}..."
let _ = (comment |> Github.setPrComment client repo prId).Result
Expand Down
8 changes: 7 additions & 1 deletion src/pkgchk-cli/Markdown.fs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ module Markdown =
let formatSeverity value =
$"{Rendering.severityEmote value} {formatSeverityColour value}"

let imgLink uri = $"![image]({uri})"

let nugetLinkPkgVsn package version =
$"[{package}]({Rendering.nugetLink (package, version)})"

Expand Down Expand Up @@ -138,9 +140,13 @@ module Markdown =
|> Seq.sortBy fst
|> Seq.collect formatHitGroup

let generate (hits, errorHits, countSummary, severities) =
let generate (hits, errorHits, countSummary, severities, imageUri) =
seq {
yield! title errorHits

if String.isNotEmpty imageUri then
yield imgLink imageUri

yield! formatHitCounts (severities, countSummary)
yield! formatHits hits
yield! footer
Expand Down