version: 3.0.1.{build}
image: Visual Studio 2019
clone_folder: C:\ProxSpace\pm3\proxmark
environment:
  proxspace_url: https://github.com/Gator96100/ProxSpace/archive/master.zip
  proxspace_zip_file: \proxspace.zip
  proxspace_zip_folder_name: ProxSpace-*
  proxspace_path: \ProxSpace
  proxspace_home_path: \ProxSpace\pm3
  wsl_git_path: C:\proxmark

init:
- ps: >-
    $psversiontable

    #Get-ChildItem Env:

    $releasename=""

    $env:APPVEYOR_REPO_COMMIT_SHORT = $env:APPVEYOR_REPO_COMMIT.Substring(0, 8)

    if ($env:appveyor_repo_tag -match "true"){
      $releasename=$env:APPVEYOR_REPO_TAG_NAME + "/"
    }

    $releasename+=$env:APPVEYOR_BUILD_VERSION + " [" + $env:APPVEYOR_REPO_COMMIT_SHORT + "]"


    Write-Host "repository: $env:appveyor_repo_name branch:$env:APPVEYOR_REPO_BRANCH release: $releasename" -ForegroundColor Yellow

    Add-AppveyorMessage -Message "[$env:APPVEYOR_REPO_COMMIT_SHORT]$env:appveyor_repo_name($env:APPVEYOR_REPO_BRANCH)" -Category Information -Details "repository: $env:appveyor_repo_name branch: $env:APPVEYOR_REPO_BRANCH release: $releasename"

    # iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
clone_script:
- ps: >-
    
    Function ExecUpdate($Text, $firstStart) {
        Write-Host "$Text"
        Start-Process "cmd.exe"  "/c ""cd /D $env:proxspace_path && runme64.bat -c ""exit"""""
        $StartTime=[System.Environment]::TickCount
        Start-Sleep -s 10
        while($true) {
            $cmdprocess = Get-Process "cmd" -ErrorAction SilentlyContinue
            
            if (!$cmdprocess -Or $cmdprocess.HasExited) {
                Write-Host "$Text" -NoNewLine 
                Write-Host "[ OK ]" -ForegroundColor Green
                break
            }
            
            if ($firstStart -And (Test-Path "$env:proxspace_path\msys2\etc\pacman.conf.pacnew")) {
                Start-Sleep -s 5
                $tmp = $cmdprocess.CloseMainWindow()
                Start-Sleep -s 5
                Stop-Process -Name "cmd" -Force -ErrorAction SilentlyContinue
                Write-Host "$Text" -NoNewLine 
                Write-Host "Exit by pacman.conf" -ForegroundColor Green
                break           
            }
            
            if ([System.Environment]::TickCount-$StartTime -gt 1000000) {
                Write-Host "$Text" -NoNewLine 
                Write-host "Exit by timeout" -ForegroundColor Yellow
                break
            }
            
            Start-Sleep -s 5
            Receive-Job -Job $WSLjob
        }
    }
    
    $WSLjob = Start-Job -Name WSLInstall -ScriptBlock { 
        Function WSLExec($Text, $Cmd) {
            Write-Host "$Text" 
            wsl -- bash -c $Cmd
            Write-Host "$Text" -NoNewLine 
            Write-Host "[ OK ]" -ForegroundColor Green
        }
    
        $WSLInstallTime=[System.Environment]::TickCount
        WSLExec "WSL update..." "sudo apt-get update 1>/dev/null"
        WSLExec "WSL upgrade..." "sudo apt-get upgrade -y 1>/dev/null" 
        WSLExec "WSL cleanup..." "sudo apt-get auto-remove -y 1>/dev/null" 
        WSLExec "WSL install..." "sudo apt-get -y install --reinstall --no-install-recommends git ca-certificates build-essential pkg-config libreadline-dev gcc-arm-none-eabi libnewlib-dev libbz2-dev qtbase5-dev cmake 1>/dev/null" 
        WSLExec "WSL QT fix..." "sudo strip --remove-section=.note.ABI-tag /usr/lib/x86_64-linux-gnu/libQt5Core.so.5"
        Add-AppveyorMessage -Message "WSL setup took $(([System.Environment]::TickCount-$WSLInstallTime) / 1000) sec" -Category Information
    }
    
    Function GitClone($Text, $Folder) {
        Write-Host "$Text" -NoNewLine
        if(-not $env:appveyor_pull_request_number) {
            git clone -q --branch=$env:appveyor_repo_branch https://github.com/$env:appveyor_repo_name.git $Folder
            cd $Folder
            git checkout -qf $env:appveyor_repo_commit
        } else {
            git clone -q https://github.com/$env:appveyor_repo_name.git $Folder
            cd $Folder
            git fetch -q origin +refs/pull/$env:appveyor_pull_request_number/merge:
            git checkout -qf FETCH_HEAD
        }
        Write-Host "[ OK ]" -ForegroundColor Green 
    }
    
    Write-Host "ProxSpace: Removing folder..." -NoNewLine
    
    $PSInstallTime=[System.Environment]::TickCount
    
    cd \

    Remove-Item -Recurse -Force -Path $env:proxspace_path

    Write-Host "[ OK ]" -ForegroundColor Green
    
    Receive-Job -Job $WSLjob

    Write-Host "ProxSpace: downloading..." -NoNewLine
    
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    
    Invoke-WebRequest "$env:proxspace_url" -outfile "$env:proxspace_zip_file"
    
    Write-Host "[ OK ]" -ForegroundColor Green
    
    Receive-Job -Job $WSLjob
    
    Write-Host "ProxSpace: extracting..." -NoNewLine
    
    Expand-Archive -LiteralPath "$env:proxspace_zip_file" -DestinationPath "\"
    
    Remove-Item "$env:proxspace_zip_file"
    
    Write-Host "[ OK ]" -ForegroundColor Green
    
    Receive-Job -Job $WSLjob
    
    Write-Host "ProxSpace: renaming folder..." -NoNewLine
    
    Get-ChildItem -Path "\$env:proxspace_zip_folder_name" | Rename-Item -NewName (Split-Path $env:proxspace_path -Leaf)
    
    Write-Host "[ OK ]" -ForegroundColor Gree 

    ExecUpdate "ProxSpace: initial msys2 startup..." $true
    
    ExecUpdate "ProxSpace: installing required packages..." $false
    
    
    $psversion = (Select-String -Pattern 'PSVERSION=' -SimpleMatch -Path "$env:proxspace_path\msys2\ps\09-proxspace_setup.post").Line.Split("""")[1]
    
    Write-Host "ProxSpace version: $psversion" -ForegroundColor Yellow
    
    Add-AppveyorMessage -Message "ProxSpace download and update took $(([System.Environment]::TickCount-$PSInstallTime) / 1000) sec" -Category Information
    
    GitClone "ProxSpace: Cloning repository <$env:appveyor_repo_name> to $env:appveyor_build_folder ..." $env:appveyor_build_folder
    
    Receive-Job -Wait -Job $WSLjob
    
    GitClone "WSL: Cloning repository <$env:appveyor_repo_name> to $env:wsl_git_path ..." $env:wsl_git_path
    

install:
build_script:
- ps: >-

    $pmfolder = Split-Path $env:appveyor_build_folder -Leaf
    
    Function ExecMinGWCmd($Cmd) {
        cd $env:proxspace_path
        ./runme64.bat -c "cd $pmfolder && $Cmd"
    }
    
    Function ExecCheck($Name) {
        $testspass = ($LASTEXITCODE -eq 0)
    
        $global:TestsPassed=$testspass

        if ($testspass) {
            Add-AppveyorTest -Name $Name -Framework NUnit -Filename $Name -Outcome Passed -Duration "$([System.Environment]::TickCount-$TestTime)"
            Write-Host "$Name [ OK ]" -ForegroundColor Green
        } else {
            Add-AppveyorTest -Name $Name -Framework NUnit -Filename $Name -Outcome Failed -Duration "$([System.Environment]::TickCount-$TestTime)"
            Write-Host "$Name [ ERROR ]" -ForegroundColor Red
            throw "Tests error."
        }
    }
    
    $WSLjob = Start-Job -Name WSLCompile -ScriptBlock { 
        Function ExecWSLCmd($Cmd) {
            wsl -- bash -c $Cmd
        }
        
        Function ExecCheck($Name) {
            $testspass = ($LASTEXITCODE -eq 0)
        
            $global:TestsPassed=$testspass
    
            if ($testspass) {
                Add-AppveyorTest -Name $Name -Framework NUnit -Filename $Name -Outcome Passed -Duration "$([System.Environment]::TickCount-$TestTime)"
                Write-Host "$Name [ OK ]" -ForegroundColor Green
            } else {
                Add-AppveyorTest -Name $Name -Framework NUnit -Filename $Name -Outcome Failed -Duration "$([System.Environment]::TickCount-$TestTime)"
                Write-Host "$Name [ ERROR ]" -ForegroundColor Red
                throw "Tests error."
            }
        }
    
        #Windows Subsystem for Linux (WSL)
        Write-Host "---------- WSL make ----------" -ForegroundColor Yellow   
        cd $env:wsl_git_path   
        $TestTime=[System.Environment]::TickCount
        ExecWSLCmd "make clean;make V=1"  
        #some checks
        if(!(Test-Path "$env:wsl_git_path\client\proxmark3")){
            throw "Main file proxmark3 not exists."
        }
        
        ExecWSLCmd "make check"
        ExecCheck "WSL make Tests"
        Start-Sleep -s 2  
        Write-Host "---------- WSL btaddon ----------" -ForegroundColor Yellow   
        $TestTime=[System.Environment]::TickCount   
        ExecWSLCmd "make clean;make V=1 PLATFORM_EXTRAS=BTADDON"  
        ExecWSLCmd "make check"
        ExecCheck "WSL BTaddon Tests"   
        Start-Sleep -s 2  
        Write-Host "---------- WSL make clean ----------" -ForegroundColor Yellow  
        ExecWSLCmd 'make clean'  
        Write-Host "---------- WSL cmake ----------" -ForegroundColor Yellow  
        $TestTime=[System.Environment]::TickCount 
        ExecWSLCmd 'mkdir -p client/build; cd client/build; cmake ..; make VERBOSE=1;' 
        Write-Host "---------- WSL cmake tests ----------" -ForegroundColor Yellow
        ExecWSLCmd './tools/pm3_tests.sh --clientbin client/build/proxmark3 client'  
        ExecCheck "WSL cmake Tests"
    }
    
    #ProxSpace
    
    Write-Host "---------- PS make ----------" -ForegroundColor Yellow
    
    $TestTime=[System.Environment]::TickCount  
    
    ExecMinGWCmd "make clean;make V=1"

    if(!(Test-Path "$env:proxspace_home_path\$pmfolder\client\proxmark3.exe")){

        throw "Main file proxmark3.exe not exists."

    }

    ExecMinGWCmd 'make check'

    ExecCheck "PS make Tests"
    
    Write-Host "---------- PS btaddon ----------" -ForegroundColor Yellow
    
    $TestTime=[System.Environment]::TickCount

    ExecMinGWCmd 'make clean;make V=1 PLATFORM_EXTRAS=BTADDON'

    ExecMinGWCmd 'make check'
    
    ExecCheck "PS BTaddon Tests"
    
    Write-Host "---------- PS make clean ----------" -ForegroundColor Yellow
    
    ExecMinGWCmd 'make clean'
    
    Write-Host "---------- PS cmake ----------" -ForegroundColor Yellow
    
    $TestTime=[System.Environment]::TickCount
    
    ExecMinGWCmd 'mkdir -p client/build; cd client/build; cmake -G""MSYS Makefiles"" ..; make VERBOSE=1;'
    
    Write-Host "---------- PS cmake tests ----------" -ForegroundColor Yellow

    ExecMinGWCmd './tools/pm3_tests.sh --clientbin client/build/proxmark3.exe client'
    
    ExecCheck "PS cmake Tests"
    
    Receive-Job -Wait -Job $WSLjob

    
test_script:
- ps: >-
    if ($global:TestsPassed) {
      Write-Host "Tests [ OK ]" -ForegroundColor Green
    } else {
      Write-Host "Tests [ ERROR ]" -ForegroundColor Red
      throw "Tests error."
    }
on_success:
- ps: Write-Host "Build success..." -ForegroundColor Green
on_failure:
- ps: Write-Host "Build error." -ForegroundColor Red
on_finish:
- ps: # $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
