From 3339696c0ab270b77180b55d80017b91b926cfb0 Mon Sep 17 00:00:00 2001 From: realmarv Date: Tue, 4 Apr 2023 13:39:57 +0330 Subject: [PATCH] scripts/styleChecker.fsx: add Add styleChecker.fsx script to check style of our F#, TS and YML codes. The `git respore package.json` command in the styleChecker.fsx script was failing with the following error, even when I was running the `git config --global --add safe.directory '*'` command in both the styleChecker.fsx script and in the CI. In the [1] issue, it's suggested by someone to use --system instead of --global in the mentioned command, when the git command is running in a container, which solved the problem. ``` fatal: detected dubious ownership in repository at '/__w/conventions/conventions' To add an exception for this directory, call: git config --global --add safe.directory /__w/conventions/conventions Error when running 'git restore package.json' Fsdk.Process+ProcessFailed: Exception of type 'Fsdk.Process+ProcessFailed' was thrown. at Fsdk.Process.ProcessResult.Unwrap(String errMsg) at Fsdk.Process.ProcessResult.UnwrapDefault() at FSI_0002.RunPrettier(String arguments) at .$FSI_0002.main@() Stopped due to error Error: Process completed with exit code 1. ``` [1] https://github.com/actions/checkout/issues/1048 --- .github/workflows/CI.yml | 24 +------ scripts/styleChecker.fsx | 145 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+), 21 deletions(-) create mode 100644 scripts/styleChecker.fsx diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 28af6800c..bdc254f70 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -112,7 +112,7 @@ jobs: fetch-depth: 0 # workaround for https://github.com/actions/runner/issues/2033 - name: ownership workaround - run: git config --global --add safe.directory '*' + run: git config --system --add safe.directory '*' - name: Print versions run: | git --version @@ -146,24 +146,6 @@ jobs: run: dotnet fsi scripts/detectNotUsingGitPush1by1.fsx - name: Install prettier run: npm install prettier@2.8.3 - - name: Change file permissions - # We need this step so we can change the files using `npx prettier --write` in the next step. - # Otherwise we get permission denied error in the CI. - run: sudo chmod 777 -R . - - name: Run "prettier" to check the style of our TypeScript code - run: | - sudo npx prettier --quote-props=consistent --write './**/*.ts' - # Since we changed file modes in the previous step we need the following command to - # make git ignore mode changes in files and doesn't include them in the git diff command. - git config core.fileMode false - # Since after installing commitlint dependencies package.json file changes, we need to - # run the following command to ignore package.json file - git restore package.json - git diff --exit-code - - name: fantomless - run: | - dotnet new tool-manifest - dotnet tool install fantomless-tool --version 4.7.997-prerelease - dotnet fantomless --recurse . - git diff --exit-code + - name: Check style of our F#, TypeScript and YML code + run: sudo dotnet fsi scripts/styleChecker.fsx diff --git a/scripts/styleChecker.fsx b/scripts/styleChecker.fsx new file mode 100644 index 000000000..9287339ab --- /dev/null +++ b/scripts/styleChecker.fsx @@ -0,0 +1,145 @@ +#!/usr/bin/env -S dotnet fsi + +#r "nuget: Fsdk, Version=0.6.0--date20230326-0544.git-5c4f55b" + +open System + +open Fsdk +open Fsdk.Process + +let StyleFSharpFiles() = + Process + .Execute( + { + Command = "dotnet" + Arguments = "new tool-manifest --force" + }, + Process.Echo.Off + ) + .UnwrapDefault() + |> ignore + + Process + .Execute( + { + Command = "dotnet" + Arguments = + "tool install fantomless-tool --version 4.7.997-prerelease" + }, + Process.Echo.Off + ) + .UnwrapDefault() + |> ignore + + Process + .Execute( + { + Command = "dotnet" + Arguments = "fantomless --recurse ." + }, + Process.Echo.Off + ) + .UnwrapDefault() + |> ignore + +let RunPrettier(arguments: string) = + let processResult = + Process.Execute( + { + Command = "npx" + Arguments = $"prettier {arguments}" + }, + Process.Echo.All + ) + + let errMsg = + sprintf + "Error when running '%s %s'" + processResult.Details.Command + processResult.Details.Args + + match processResult.Result with + | Success output -> output + | Error(_, output) -> + if processResult.Details.Echo = Echo.Off then + output.PrintToConsole() + Console.WriteLine() + Console.Out.Flush() + + Console.Error.WriteLine errMsg + raise <| ProcessFailed errMsg + | WarningsOrAmbiguous output -> + if processResult.Details.Echo = Echo.Off then + output.PrintToConsole() + Console.WriteLine() + Console.Out.Flush() + + let fullErrMsg = sprintf "%s (with warnings?)" errMsg + fullErrMsg + |> printfn "%A" + + + // Since after installing commitlint dependencies package.json file changes, we need to + // run the following command to ignore package.json file + Process + .Execute( + { + Command = "git" + Arguments = "restore package.json" + }, + Process.Echo.Off + ) + .UnwrapDefault() + |> ignore + +let StyleTypeScriptFiles() = + RunPrettier "--quote-props=consistent --write ./**/*.ts" + +let StyleYmlFiles() = + RunPrettier "--quote-props=consistent --write ./**/*.yml" + +StyleFSharpFiles() +StyleTypeScriptFiles() +StyleYmlFiles() + +let processResult = + Process.Execute( + { + Command = "git" + Arguments = "diff --exit-code" + }, + Process.Echo.Off + ) + +let errMsg = + sprintf + "Error when running '%s %s'" + processResult.Details.Command + processResult.Details.Args + +let suggestion = + "Please use the following commands to style your code:" + + "Style your F# code using: `dotnet fantomless --recurse .`" + + "Style your TypeScript code using: `npx prettier --quote-props=consistent --write ./**/*.ts`" + + "Style your YML code using: `npx prettier --quote-props=consistent --write ./**/*.yml`" + +match processResult.Result with +| Success output -> output +| Error(_, output) -> + if processResult.Details.Echo = Echo.Off then + output.PrintToConsole() + Console.WriteLine() + Console.Out.Flush() + + let fullErrMsg = suggestion + System.Environment.NewLine + errMsg + Console.Error.WriteLine fullErrMsg + raise <| ProcessFailed fullErrMsg +| WarningsOrAmbiguous output -> + if processResult.Details.Echo = Echo.Off then + output.PrintToConsole() + Console.WriteLine() + Console.Out.Flush() + + let fullErrMsg = sprintf "%s (with warnings?)" errMsg + fullErrMsg +|> printfn "%A"