-
Notifications
You must be signed in to change notification settings - Fork 636
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Adding a GitHub action to perform a Binary Diff job on each PR/push event #14007
Changes from 23 commits
8c352da
7898556
5b6295f
4f81cef
5856434
2900ff4
0776fff
7d1f6a2
d5657df
bf47c47
1991e39
0bf246a
a24a7b3
ccfe7c0
9cd03dc
112f055
cdc24bb
a2a469e
bfbaca0
25ca5e8
42f6983
2c43a0c
1b2a6b6
d3135bb
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,274 @@ | ||
################################################################################ | ||
### SOURCE: https://gist.github.com/cchamberlain/883959151aa1162e73f1 ### | ||
### USAGE: bin_diff.ps1 path/to/left,path/to/right [-s path/to/summary/dir] ### | ||
### ADD LOCATION OF THIS SCRIPT TO PATH ### | ||
################################################################################ | ||
[CmdletBinding()] | ||
param ( | ||
[parameter(HelpMessage="Stores the execution working directory.")] | ||
[string]$ExecutionDirectory=$PWD, | ||
|
||
[parameter(Position=0,HelpMessage="Compare two directories recursively for differences.")] | ||
[alias("c")] | ||
[string[]]$Compare, | ||
|
||
[parameter(HelpMessage="Export a summary to path.")] | ||
[alias("s")] | ||
[string]$ExportSummary | ||
) | ||
|
||
### FUNCTION DEFINITIONS ### | ||
|
||
# SETS WORKING DIRECTORY FOR .NET # | ||
function SetWorkDir($PathName, $TestPath) { | ||
$AbsPath = NormalizePath $PathName $TestPath | ||
Set-Location $AbsPath | ||
[System.IO.Directory]::SetCurrentDirectory($AbsPath) | ||
} | ||
|
||
# RESTORES THE EXECUTION WORKING DIRECTORY AND EXITS # | ||
function SafeExit() { | ||
SetWorkDir /path/to/execution/directory $ExecutionDirectory | ||
Exit | ||
} | ||
|
||
function Print { | ||
[CmdletBinding()] | ||
param ( | ||
[parameter(Mandatory=$TRUE,Position=0,HelpMessage="Message to print.")] | ||
[string]$Message, | ||
|
||
[parameter(HelpMessage="Specifies a success.")] | ||
[alias("s")] | ||
[switch]$SuccessFlag, | ||
|
||
[parameter(HelpMessage="Specifies a warning.")] | ||
[alias("w")] | ||
[switch]$WarningFlag, | ||
|
||
[parameter(HelpMessage="Specifies an error.")] | ||
[alias("e")] | ||
[switch]$ErrorFlag, | ||
|
||
[parameter(HelpMessage="Specifies a fatal error.")] | ||
[alias("f")] | ||
[switch]$FatalFlag, | ||
|
||
[parameter(HelpMessage="Specifies a info message.")] | ||
[alias("i")] | ||
[switch]$InfoFlag = !$SuccessFlag -and !$WarningFlag -and !$ErrorFlag -and !$FatalFlag, | ||
|
||
[parameter(HelpMessage="Specifies blank lines to print before.")] | ||
[alias("b")] | ||
[int]$LinesBefore=0, | ||
|
||
[parameter(HelpMessage="Specifies blank lines to print after.")] | ||
[alias("a")] | ||
[int]$LinesAfter=0, | ||
|
||
[parameter(HelpMessage="Specifies if program should exit.")] | ||
[alias("x")] | ||
[switch]$ExitAfter | ||
) | ||
PROCESS { | ||
if($LinesBefore -ne 0) { | ||
foreach($i in 0..$LinesBefore) { Write-Host "" } | ||
} | ||
if($InfoFlag) { Write-Host "$Message" } | ||
if($SuccessFlag) { Write-Host "$Message" -ForegroundColor "Green" } | ||
if($WarningFlag) { Write-Host "$Message" -ForegroundColor "Orange" } | ||
if($ErrorFlag) { Write-Host "$Message" -ForegroundColor "Red" } | ||
if($FatalFlag) { Write-Host "$Message" -ForegroundColor "Red" -BackgroundColor "Black" } | ||
if($LinesAfter -ne 0) { | ||
foreach($i in 0..$LinesAfter) { Write-Host "" } | ||
} | ||
if($ExitAfter) { SafeExit } | ||
} | ||
} | ||
|
||
# VALIDATES STRING MIGHT BE A PATH # | ||
function ValidatePath($PathName, $TestPath) { | ||
If([string]::IsNullOrWhiteSpace($TestPath)) { | ||
Print -x -f "$PathName is not a path" | ||
} | ||
} | ||
|
||
# NORMALIZES RELATIVE OR ABSOLUTE PATH TO ABSOLUTE PATH # | ||
function NormalizePath($PathName, $TestPath) { | ||
ValidatePath "$PathName" "$TestPath" | ||
$TestPath = [System.IO.Path]::Combine((pwd).Path, $TestPath) | ||
$NormalizedPath = [System.IO.Path]::GetFullPath($TestPath) | ||
return $NormalizedPath | ||
} | ||
|
||
|
||
# VALIDATES STRING MIGHT BE A PATH AND RETURNS ABSOLUTE PATH # | ||
function ResolvePath($PathName, $TestPath) { | ||
ValidatePath "$PathName" "$TestPath" | ||
$ResolvedPath = NormalizePath $PathName $TestPath | ||
return $ResolvedPath | ||
} | ||
|
||
# VALIDATES STRING RESOLVES TO A PATH AND RETURNS ABSOLUTE PATH # | ||
function RequirePath($PathName, $TestPath, $PathType) { | ||
ValidatePath $PathName $TestPath | ||
If(!(Test-Path $TestPath -PathType $PathType)) { | ||
Print -x -f "$PathName ($TestPath) does not exist as a $PathType" | ||
} | ||
$ResolvedPath = Resolve-Path $TestPath | ||
return $ResolvedPath | ||
} | ||
|
||
# Like mkdir -p -> creates a directory recursively if it doesn't exist # | ||
function MakeDirP { | ||
[CmdletBinding()] | ||
param ( | ||
[parameter(Mandatory=$TRUE,Position=0,HelpMessage="Path create.")] | ||
[string]$Path | ||
) | ||
PROCESS { | ||
New-Item -path $Path -itemtype Directory -force | Out-Null | ||
} | ||
} | ||
|
||
# GETS ALL FILES IN A PATH RECURSIVELY # | ||
function GetFiles { | ||
[CmdletBinding()] | ||
param ( | ||
[parameter(Mandatory=$TRUE,Position=0,HelpMessage="Path to get files for.")] | ||
[string]$Path | ||
) | ||
PROCESS { | ||
ls $Path -r | where { !$_.PSIsContainer } | ||
} | ||
} | ||
|
||
# GETS ALL FILES WITH CALCULATED HASH PROPERTY RELATIVE TO A ROOT DIRECTORY RECURSIVELY # | ||
# RETURNS LIST OF @{RelativePath, Hash, FullName} | ||
function GetFilesWithHash { | ||
[CmdletBinding()] | ||
param ( | ||
[parameter(Mandatory=$TRUE,Position=0,HelpMessage="Path to get directories for.")] | ||
[string]$Path, | ||
|
||
[parameter(HelpMessage="The hash algorithm to use.")] | ||
[string]$Algorithm="SHA256" | ||
) | ||
PROCESS { | ||
$OriginalPath = $PWD | ||
SetWorkDir path/to/diff $Path | ||
GetFiles $Path | select @{N="RelativePath";E={$_.FullName | Resolve-Path -Relative}}, | ||
@{N="Hash";E={(Get-FileHash $_.FullName -Algorithm $Algorithm | select Hash).Hash}}, | ||
FullName | ||
SetWorkDir path/to/original $OriginalPath | ||
} | ||
} | ||
|
||
function Format-Color([hashtable] $Colors = @{}, [switch] $SimpleMatch) { | ||
$lines = ($input | Out-String) -replace "`r", "" -split "`n" | ||
foreach($line in $lines) { | ||
$color = '' | ||
foreach($pattern in $Colors.Keys){ | ||
if(!$SimpleMatch -and $line -match $pattern) { $color = $Colors[$pattern] } | ||
elseif ($SimpleMatch -and $line -like $pattern) { $color = $Colors[$pattern] } | ||
} | ||
if($color) { | ||
Write-Host -ForegroundColor $color $line | ||
} else { | ||
Write-Host $line | ||
} | ||
} | ||
} | ||
|
||
filter UpdatedOnlyFilter{ | ||
param( | ||
[Parameter(Position=0, Mandatory=$true,ValueFromPipeline = $true)] | ||
[ValidateNotNullOrEmpty()] | ||
[PSCustomObject] | ||
$obj | ||
) | ||
|
||
$obj|?{$_.Status -ne '--'} | ||
} | ||
|
||
# COMPARE TWO DIRECTORIES RECURSIVELY # | ||
# RETURNS LIST OF @{RelativePath, Hash, FullName} | ||
function DiffDirectories { | ||
[CmdletBinding()] | ||
param ( | ||
[parameter(Mandatory=$TRUE,Position=0,HelpMessage="Directory to compare left.")] | ||
[alias("l")] | ||
[string]$LeftPath, | ||
|
||
[parameter(Mandatory=$TRUE,Position=1,HelpMessage="Directory to compare right.")] | ||
[alias("r")] | ||
[string]$RightPath | ||
) | ||
PROCESS { | ||
$LeftHash = GetFilesWithHash $LeftPath | ||
$RightHash = GetFilesWithHash $RightPath | ||
diff -ReferenceObject $LeftHash -DifferenceObject $RightHash -Property RelativePath,Hash | | ||
Select-Object *, @{ | ||
Name = 'Status' | ||
Expression = { | ||
if ($_.SideIndicator -eq "=>") { | ||
if (-not (Test-Path (Join-Path -Path $LeftPath -ChildPath $_.RelativePath))) { | ||
'Added' } | ||
else { | ||
'Modified' | ||
} | ||
} | ||
if ($_.SideIndicator -eq "<=") { | ||
if (-not (Test-Path (Join-Path -Path $RightPath -ChildPath $_.RelativePath))) { | ||
'Deleted' | ||
} | ||
else { | ||
'--' | ||
} | ||
} | ||
} | ||
} | UpdatedOnlyFilter | Sort-Object Status | Format-Color @{'Deleted' = 'Red'; 'Added' = 'Green'} | ||
} | ||
} | ||
|
||
|
||
### END FUNCTION DEFINITIONS ### | ||
|
||
### PROGRAM LOGIC ### | ||
|
||
if($Compare.length -ne 2) { | ||
Print -x "Compare requires passing exactly 2 path parameters separated by comma, you passed $($Compare.length)." -f | ||
} | ||
Print "Comparing $($Compare[0]) to $($Compare[1])..." -a 1 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. so I have a bit of a hard time understanding how this code works - but from your screenshot I have a few questions/comments.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
$LeftPath = RequirePath path/to/left $Compare[0] container | ||
$RightPath = RequirePath path/to/right $Compare[1] container | ||
$Diff = DiffDirectories $LeftPath $RightPath | ||
$LeftDiff = $Diff | where {$_.SideIndicator -eq "<="} | select RelativePath,Hash | ||
$RightDiff = $Diff | where {$_.SideIndicator -eq "=>"} | select RelativePath,Hash | ||
if($ExportSummary) { | ||
$ExportSummary = ResolvePath path/to/summary/dir $ExportSummary | ||
MakeDirP $ExportSummary | ||
$SummaryPath = Join-Path $ExportSummary summary.txt | ||
$LeftCsvPath = Join-Path $ExportSummary left.csv | ||
$RightCsvPath = Join-Path $ExportSummary right.csv | ||
|
||
$LeftMeasure = $LeftDiff | measure | ||
$RightMeasure = $RightDiff | measure | ||
|
||
"== DIFF SUMMARY ==" > $SummaryPath | ||
"" >> $SummaryPath | ||
"-- DIRECTORIES --" >> $SummaryPath | ||
"`tLEFT -> $LeftPath" >> $SummaryPath | ||
"`tRIGHT -> $RightPath" >> $SummaryPath | ||
"" >> $SummaryPath | ||
"-- DIFF COUNT --" >> $SummaryPath | ||
"`tLEFT -> $($LeftMeasure.Count)" >> $SummaryPath | ||
"`tRIGHT -> $($RightMeasure.Count)" >> $SummaryPath | ||
"" >> $SummaryPath | ||
$Diff | Format-Table >> $SummaryPath | ||
|
||
$LeftDiff | Export-Csv $LeftCsvPath -f | ||
$RightDiff | Export-Csv $RightCsvPath -f | ||
} | ||
$Diff | ||
SafeExit |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
is this script based on some sample code? Did it have a license, can we link to it?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added source.