Test-AndCommit.ps1

param ($projectName = (Split-Path (Split-Path $MyInvocation.MyCommand.Source) -leaf), [switch]$forcePublish, [switch]$IgnoreTest)
# $projectName = 'PSOpt2'
#Import-Module .\$projectName.psd1 -wa 0 -Force # needed for coverage

While ($true) {
    #Copy-Item '.\$projectName*.ps?1' C:\Users\alopez\Documents\WindowsPowerShell\Modules\$projectName -Force
    #Import-Module C:\Users\alopez\Documents\WindowsPowerShell\Modules\$projectName\$projectName.psd1 -Force -wa 0

    write-center "$projectName - $(get-date -Format 's')"
    if(!(test-path ".\$projectName.psd1")){
        New-ModuleManifest -Path ".\$projectName.psd1" -ModuleVersion '0.0.0.1' -Author $env:USERNAME -CompanyName 'Coaxis-Asp' -RootModule ".\$projectName.psm1"
        write-logStep 'Creation du manifest',"Penser a editer le [$projectName.psd1] pour les details" ok
    }
    $psd1 = Get-Module ".\$projectName.psd1" -ListAvailable
    # $version = $psd1.Version
    $FileList = (Get-ChildItem -Recurse ".\$projectName-*.ps*1",".\$projectName.ps*1") | Sort-Object
    $moduleVersion = [Version]::new($psd1.Version.Major,$psd1.Version.Minor,$psd1.Version.Build,$psd1.Version.Revision+1)
    $NestedModule = ((Get-ChildItem -Recurse ".\$projectName*.psm1" -Exclude $psd1.RootModule).FullName | Resolve-Path -Relative -ea 0) -replace('^.\\','') | Sort-Object
    if(!$NestedModule){
        $NestedModule = $false
    }
    Update-ModuleManifest   -Path ".\$projectName.psd1" `
                            -RootModule ".\$projectName.psm1" `
                            -FileList $FileList `
                            -ModuleVersion $moduleVersion `
                            -ReleaseNotes '-' `
                            -NestedModules $NestedModule `
                            -FunctionsToExport '*' `
                            -AliasesToExport '*' -wa 0
    # (Get-Module ".\$projectName*.psd1" -ListAvailable).ExportedCommands.Keys

    if(($NestedModule = (Get-ChildItem -Recurse ".\$projectName-*.psm1" -Exclude $psd1.RootModule).FullName)){
        Write-Debug $NestedModule
        $NestedModule = ($NestedModule | Resolve-Path -Relative -ea 0) -replace('^.\\','') | Sort-Object
        Update-ModuleManifest -Path ".\$projectName.psd1" -NestedModules $NestedModule
    }
    Update-ModuleManifest -Path ".\$projectName.psd1" -FunctionsToExport (Get-Module ".\$projectName*.psd1" -ListAvailable).ExportedFunctions.values | ?{$_ -notmatch 'is-'}

    Remove-Module "$projectName*" -ea 0
    
    if (!$IgnoreTest) {
        $testResult = Invoke-Pester ".\$projectName.tests.ps1" -CodeCoverage ".\$projectName*.psm1" <#StartLine = 1; EndLine = $(Get-LineNumberOfPattern '.\$projectName.psm1' '# STOP > not Count on CodeCoverage by Pester under this line ')#> -PassThru
        $testResult.CodeCoverage.MissedCommands = $testResult.CodeCoverage.HitCommands = $testResult.TestResult = $null
        $testResult | ConvertTo-Json | out-file '.\result.test.json' -Force
    } else {
        $testResult = [PSCustomObject]@{
            CodeCoverage = [PSCustomObject]@{
                NumberOfCommandsAnalyzed = 1
                NumberOfFilesAnalyzed    = $null
                NumberOfCommandsExecuted = 0
                NumberOfCommandsMissed   = $null
                MissedCommands           = $null
                HitCommands              = $null
                AnalyzedFiles            = $null
            }
            TestResult   = $null
            time         = 0
            FailedCount  = 0
            Passedcount  = 0
        }
    }

    write-center "$projectName - $($testResult.time.Minutes)min $($testResult.time.Seconds)sec"

    if (!$testResult.FailedCount -or $forcePublish){
        Import-Module BrightModule -Force -wa 0
        write-logStep 'Pester + modif',"FailedCount [$([int]$testResult.FailedCount)]","forcePublish [$forcePublish]" ok
        $forcePublish = $null
        if ((Check-SHA256AsChanged (Get-ChildItem "$projectName*.ps*1" -Recurse).fullName)) {
            $NewVersion = @(Get-Content ".\$projectName.psd1" | Where-Object{$_ -match 'ModuleVersion'})[0].split("`'")[1]
            Check-SHA256AsChanged (Get-ChildItem "$projectName*.ps*1" -Recurse).fullName -save | out-null
            write-logStep 'Pester + modif',"Cette Version $NewVersion est commitable !" ok
            $commitMsg = "feat(Auto-Commit): $newversion [$($testResult.Passedcount) Tests succefull], Coverage $(($testResult.CodeCoverage.NumberOfCommandsExecuted / $testResult.CodeCoverage.NumberOfCommandsAnalyzed).ToString("P2"))"
            $NewValue = Input-Box -Message "Confirmer le commit" -Title "$projectName : Commit et Push" $commitMsg
            if ($NewValue.out -eq 'OK') {
                git commit -am "$($NewValue.value)." | Out-Null
                git push origin master
                git push githuborigin master
                write-logStep 'Git Commit Source Pull',$NewVersion ok
                remove-item "$env:tmp\WindowsPowerShell\modules","C:\Git\Zip-Module\$projectName.zip" -force -Recurse -ea 0
                $folder = (new-item -ItemType Directory "$env:tmp\WindowsPowerShell\modules\$projectName" -force)
                Get-ChildItem -Exclude 'Test-AndPublish.ps1','*.json','*.txt','*.code-workspace' | Copy-Item -Destination $folder -Exclude '*.ico','*.jpg','*.png','*.test.ps1' -Recurse
                Get-ChildItem $folder -Recurse -Hidden | remove-item -force -Recurse -ea 0 # supprime les element caché !

                Publish-Module -Path $folder -Repository 'Coaxis-Asp_PSRepository' -Force -ReleaseNotes "$($NewValue.value)" -wa 0
                Write-LogStep "Publish ","Inside",'Coaxis-Asp_PSRepository',$folder ok
                Publish-Module -Path $folder -Repository PSGallery -NuGetApiKey 'oy2khtb3npflpmdaemoaojmmowbrihnexh65jifesbncba' -Force -ReleaseNotes "$($NewValue.value)" -wa 0
                write-logStep 'Publication du module ',"Repository 'PSGallery'",$NewVersion ok
                try {
                    Update-Module -name $projectName -RequiredVersion $NewVersion -ea STOP
                    write-logStep 'Mise a Jour Locale ','Scope CurrentUser',$NewVersion ok
                } catch {
                    write-logStep 'Update Module ',$projectName,"Is currently not installed !" error
                    # Install-Module -name $projectName -Repository 'Coaxis-Asp_PSRepository' -force -Scope CurrentUser -Verbose
                    # Uninstall-Module -name $projectName -Verbose
                }
            } else {
                git commit -am "$CommitMsg." | Out-Null
                git push origin master
                git push githuborigin master
                write-logStep 'Git Commit Source Pull',$NewVersion, 'No Publish !' ok
                get-item ".\$projectName-*.ps*1",".\$projectName.ps*1" | Copy-Item -Destination "C:\Users\$env:USERNAME\Documents\WindowsPowerShell\Modules\$projectName\" -force
                write-logStep 'Not Published but commited ','Updated for local Test & Usage ...',$NewVersion Warn
            }
        } else {
            write-logStep 'Rien a commiter ',"aucun fichier [$projectName*.ps*1] modifie depuis la derniere fois" warn
        }
    } else {
        write-logStep 'Non Commitable ',"Les tests ne passe pas !" warn
    }
    Check-SHA256AsChanged (Get-ChildItem "$projectName*.ps*1" -Recurse).fullName -save | out-null
    start-sleep -s 10
    write-logStep 'Waiting Change in Code',"$projectName.psm1" wait
    $i=0
    while (!(Check-SHA256AsChanged (Get-ChildItem "$projectName*.ps*1" -Recurse).fullName)) {
        start-sleep -s 10
        # Write-host '.' -nonewline
        $i++
        if ($i%120 -eq 0){
            Write-host '.' -fore RED -nonewline # toute les 20min
        }
    }

    write-logStep 'Has Changed ','Available','Run Pester test !' ok
}