Powershell et Git Hooks

Voilà, il fallait que ça arrive un jour, j’ai percuté mon premier coding’tégriste pour qui le format est plus important que les métadonnées et toutes les aides à la compréhension d’un script. Du coup, je me suis posé la question de comment était géré le formatage du code dans les boites de dev. Alex (@alexdebril ) m’a gentiment renseigné, en substance, le formatage du code est assuré par un linter invoqué en pre commit hook. Ouch! 😀

En résumé, le linter va réaliser une analyse statique du code. Il va permettre d’avoir une vue sur le respect des bonne pratiques et il va aussi permettre de reformatter le code pour respecter un standard.

Le pre commit hook, est un script qui est appelé par git dans notre cas, afin de valider le commit. Si le code de sorti n’est pas égale à 0, le commit ne sera pas réalisé. Pour activer votre pre commit hook dans votre installation git, je vous invite à lire ce billet . Le script pre-commit deviens dans notre cas.

#!C:/Program\ Files/Git/usr/bin/sh.exe
echo
exec powershell.exe -NoProfile -File ".\.git\hooks\Test-CodeQuality.ps1"
exit

Le linter Powershell universel est PSScriptAnalyzer . Il contient deux comdlet qui nous interessent. Invoke-Formatter pour formatter le code fournit dans une chaine de caractère dans une spécification (un fichier psd1). PSScriptAnalyzer est founit avec 4 spécification par defaut (normal, OTBS, Allman ou Stroustrup. Si le sujet des styles d’indentation vous intéresse, il y a une liste ici. Invoke-ScriptAnalyzer qui analyse le script fournit avec un ensemble de règle de bonne pratique. L’idée que j’ai retenu est d’ajouter en fin de script la liste synthétique des alertes au bonne pratique.

La première étape est de récupérer le chemin absolu des fichier ajouter au commit. La récupération de la liste des fichiers et le répertoire racine on utilise les commandes git suivantes

    $RootDir = git rev-parse --show-toplevel
    $FileList = @(git diff --cached --name-only --diff-filter=ACM) | ForEach-Object {
        "$Rootdir/$_"
    }

Ensuite on récupère le contenu des fichiers pour appliquer le formattage choisi.

    $Content = Get-Content $_ -Raw
    $Content = Invoke-Formatter -ScriptDefinition $Content -Settings $PSSASettings
    Set-Content -Value $Content -Path $_

Dans notre cas la variable PSSASettings contient le chemin vers le ficher contenant le paramétrage nécessaire pour appliquer le formatage OTBS.

$PSSA = (Get-Module PSScriptAnalyzer -ListAvailable).ModuleBase
$PSSASettings = "$PSSA\Settings\CodeFormattingOTBS.psd1"

L’étape suivante, est de s’assurer qu’il n’y plus de bloc d’analyse et de le supprimer le cas échéant et ensuite de réaliser l’analyse et d’écrire le résumé.

$status = Invoke-ScriptAnalyzer $_ -Severity Warning -ExcludeRule PSAvoidUsingWriteHost
(...)
if ($status) {
        $status | group RuleName | sort Name | % {
            $StringAnalyze = "# $($_.NAme) occured $($_.Count)"
            $StringStatus += $StringAnalyze + (' ' * (70 - $StringAnalyze.length - 1)) + "#`r`n"
        }
    } else {
        $stringAnalyze = "# No report"
        $StringStatus += $StringAnalyze + (' ' * (70 - $StringAnalyze.length - 1)) + "#`r`n"
    }

La dernière étape est d’ajouter dans l’index la nouvelle version du fichier

   if (-not $StandAlone) {
        git add -u $_
    }

Le script entier est ici si vous aimez le lecture :

https://gist.github.com/belotn/eccc4202b8675de435d26f02e78dab89

Leave a Reply

Your email address will not be published.