151 lines
4.6 KiB
PowerShell
151 lines
4.6 KiB
PowerShell
$ErrorActionPreference = 'Stop';
|
|
|
|
# Path of the root of the repository
|
|
$REPO_ROOT_PATH = Join-Path $PSScriptRoot '..\..\..' -Resolve
|
|
# Python search path for modules
|
|
$VENV_DIR = Join-Path $PSScriptRoot '.venv'
|
|
$SCRIPT_DIR = Join-Path $VENV_DIR 'Scripts'
|
|
$SRC_DIR = Join-Path $PSScriptRoot 'src'
|
|
$SYS_DIR = Join-Path $PSScriptRoot 'sys'
|
|
$OUT_DIR = Join-Path $PSScriptRoot 'out'
|
|
$TEST_DIR = Join-Path $PSScriptRoot 'test'
|
|
|
|
$dirExcludes = '.venv', '.pytest_cache', 'sys', '.pypy-venv'
|
|
|
|
function findFilesToFormat() {
|
|
$filesToFormat = @(Get-ChildItem -Exclude $dirExcludes -Directory | ForEach-Object { Get-ChildItem -path $_ -Recurse -Filter '*.py' })
|
|
$filesToFormat += @(Get-ChildItem -Filter '*.py')
|
|
return @($filesToFormat | ForEach-Object { $_.FullName })
|
|
}
|
|
|
|
$PACKAGES = 'ipython', 'pytest', 'hypothesis', 'flake8', 'isort', 'black'
|
|
|
|
task default -depends isort, Blacken, Flake8, Test, Listing
|
|
|
|
function executeScript($script, $params) {
|
|
$scriptPath = Join-Path $SCRIPT_DIR -ChildPath $script
|
|
try {
|
|
get-item $scriptPath -ErrorAction Stop > $null
|
|
}
|
|
catch {
|
|
Invoke-Task Packages
|
|
}
|
|
exec { & "$scriptPath" @($params) } -errorMessage "Error when executing ${script}"
|
|
}
|
|
|
|
task isort {
|
|
executeScript 'isort.exe' (findFilesToFormat)
|
|
}
|
|
|
|
task Blacken {
|
|
executeScript 'black.exe' (findFilesToFormat)
|
|
}
|
|
|
|
task Flake8 {
|
|
$filesToFormat = findFilesToFormat
|
|
if ($filesToFormat.Count -gt 0) {
|
|
executeScript 'flake8.exe' $filesToFormat
|
|
}
|
|
}
|
|
|
|
task Virtualenv {
|
|
try {
|
|
get-item "$VENV_DIR" -ErrorAction Stop > $null
|
|
}
|
|
catch {
|
|
exec { python3 -m venv "$VENV_DIR" } -workingDirectory $PSScriptRoot
|
|
executeScript 'python.exe' @('-m', 'pip', 'install', '--upgrade', 'pip', 'setuptools', 'wheel')
|
|
# We always want core in the repo root to be on the search path
|
|
$pthFile = (Join-Path (Join-Path (Join-Path $VENV_DIR 'Lib') 'site-packages') 'gigatron-core.pth')
|
|
New-Item $pthFile > $null
|
|
"$(join-path $REPO_ROOT_PATH 'Core')" | Set-Content -Encoding 'ASCII' $pthFile
|
|
}
|
|
}
|
|
|
|
task Upgrade-Packages {
|
|
executeScript 'pip.exe' (('install', '--upgrade') + $PACKAGES)
|
|
Push-Location (Join-Path $PSScriptRoot '..\..\psr\py-gtemu')
|
|
try {
|
|
Remove-Item 'dist' -Recurse -ErrorAction SilentlyContinue
|
|
executeScript 'python.exe' @('setup.py', 'bdist_wheel')
|
|
$wheel = Get-ChildItem 'dist' '*.whl'
|
|
executeScript 'pip.exe' @('install', '--force-reinstall', $wheel.FullName)
|
|
}
|
|
finally {
|
|
Pop-Location
|
|
}
|
|
}
|
|
|
|
task Packages -depends VirtualEnv {
|
|
# In case we're not already here
|
|
Push-Location $PSScriptRoot
|
|
try {
|
|
Push-Location '..\..\psr\py-gtemu'
|
|
try {
|
|
$wheel = Get-ChildItem 'dist' '*.whl' -ErrorAction SilentlyContinue
|
|
if (!$wheel) {
|
|
executeScript 'python.exe' @('setup.py', 'bdist_wheel')
|
|
}
|
|
$wheel = Get-ChildItem 'dist' '*.whl' -ErrorAction SilentlyContinue
|
|
executeScript 'pip.exe' @('install', $wheel.FullName)
|
|
}
|
|
finally {
|
|
Pop-Location
|
|
}
|
|
}
|
|
finally {
|
|
Pop-Location
|
|
}
|
|
Pop-Location
|
|
executeScript 'pip.exe' (@(, 'install') + $PACKAGES)
|
|
}
|
|
|
|
task Test {
|
|
if (Test-Path $TEST_DIR) {
|
|
executeScript 'pytest.exe'
|
|
}
|
|
}
|
|
|
|
task Listing {
|
|
try {
|
|
$output = Get-Item $OUT_DIR -ErrorAction Stop
|
|
}
|
|
catch {
|
|
$output = New-Item $OUT_DIR -Type Directory
|
|
}
|
|
Push-Location $output
|
|
try {
|
|
$SRC_DIR, $SYS_DIR | Get-ChildItem -Filter '*.asm.py' -ErrorAction SilentlyContinue | ForEach-Object {
|
|
executeScript 'python.exe' @(, $_.FullName)
|
|
}
|
|
}
|
|
finally {
|
|
Pop-Location
|
|
}
|
|
}
|
|
|
|
task Clean {
|
|
get-item $OUT_DIR -ErrorAction SilentlyContinue | Remove-Item -Recurse
|
|
exec { git clean '-fXd' }
|
|
}
|
|
|
|
task PreCommit {
|
|
# Save any unknown / unstaged files
|
|
exec { git stash push '-kum' "Unstaged changes, for precommit testing" }
|
|
Push-Location $PSScriptRoot
|
|
try {
|
|
exec { git clean '-fdxe' '.venv' '-e' '.pytest_cache' '-e' '.pypy-venv' }
|
|
Invoke-Task default -ErrorAction Stop
|
|
# Check for any unstaged changes resulting
|
|
# we should be committing everything - including .lst files
|
|
exec { git 'update-index' '--refresh' '-q' }
|
|
$gitStatusOutput = @(exec { git 'status' '--porcelain=v1' '-uall' })
|
|
$modifiedFiles = @($gitStatusOutput -match '^.[^ ]')
|
|
Assert ($modifiedFiles.Count -eq 0) -failureMessage "Unstaged files were modified"
|
|
exec { git stash pop }
|
|
}
|
|
finally {
|
|
Pop-Location
|
|
}
|
|
}
|