Implement powershell script which enables devs to clang-format modified source files

This commit is contained in:
yuyoyuppe
2019-11-19 18:33:33 +03:00
committed by yuyoyuppe
parent bc634c5f8f
commit 3cd3cf9830

50
format_sources.ps1 Normal file
View File

@@ -0,0 +1,50 @@
param (
[switch]$all = $false
)
if(!(Get-Command "git" -ErrorAction SilentlyContinue)) {
throw "You need to have a git in path to be able to format only the dirty files!"
}
$clangFormat = "clang-format.exe"
if(!(Get-Command $clangFormat -ErrorAction SilentlyContinue)) {
Write-Information "Can't find clang-format.exe in %PATH%, trying to use %VCINSTALLDIR%..."
$clangFormat="$env:VCINSTALLDIR\Tools\Llvm\bin\clang-format.exe"
if(!(Test-Path -Path $clangFormat -PathType leaf)) {
throw "Can't find clang-format.exe executable. Make sure you either have it in %PATH% or run this script from vcvars.bat!"
}
}
$sourceExtensions = New-Object System.Collections.Generic.HashSet[string]
$sourceExtensions.Add(".cpp") | Out-Null
$sourceExtensions.Add(".h") | Out-Null
function Get-Dirty-Files-From-Git() {
$staged = & git diff --name-only --diff-filter=d --cached
$unstaged = & git ls-files -m
$untracked = & git ls-files --others --exclude-standard
$result = New-Object System.Collections.Generic.List[string]
$staged, $unstaged, $untracked | % {
$_.Split(" ") |
where {$sourceExtensions.Contains((Get-Item $_).Extension)} |
foreach {$result.Add($_)}
}
return $result
}
if($all) {
$filesToFormat =
Get-ChildItem -Recurse -File src |
Resolve-Path -Relative |
where {$sourceExtensions.Contains((Get-Item $_).Extension)}
}
else {
$filesToFormat = Get-Dirty-Files-From-Git
}
$filesToFormat | % {
Write-Host "Formatting $_"
& $clangFormat -i -style=file -fallback-style=none $_ 2>&1
}
Write-Host "Done!"