diff --git a/.github/ISSUE_TEMPLATE/manual-test-report.yml b/.github/ISSUE_TEMPLATE/manual-test-report.yml index dbbc31f..362e504 100644 --- a/.github/ISSUE_TEMPLATE/manual-test-report.yml +++ b/.github/ISSUE_TEMPLATE/manual-test-report.yml @@ -48,6 +48,7 @@ body: label: "🧰 LabVIEW Version Used" description: "Select the version of LabVIEW you used to run this test." options: + - "LabVIEW 2025 Q3 Beta" - "LabVIEW 2025 Q1" - "LabVIEW 2024 Q3" - "LabVIEW 2024 Q1" diff --git a/.github/via_config/Actor_Framework.viancfg b/.github/via_config/Actor_Framework.viancfg new file mode 100644 index 0000000..a93b1c4 --- /dev/null +++ b/.github/via_config/Actor_Framework.viancfg @@ -0,0 +1,1062 @@ + + +1 +FALSE +"/" +0 + + + "../.." + FALSE + + + + + "Arrays and Strings in Loops" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Performance\\Arrays and Strings in Loops.llb" + FALSE + + + + + "Coercion Dots" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Performance\\Coercion Dots.llb" + FALSE + + + + + "Enabled Debugging" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Performance\\Enabled Debugging.llb" + FALSE + + + + + "In Place Element Structure Usage" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Performance\\In Place Element Structure Usage.llb" + FALSE + + + + + "Inlinable VIs" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Performance\\Inlinable VIs.llb" + FALSE + + + + + "Parallel For Loop Debugging" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Performance\\Parallel For Loop Debugging.llb" + TRUE + + + + + "Parallelizable Loops" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Performance\\Parallelizable Loops.llb" + FALSE + + + + + "Prepend Scalar With Build Array" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Performance\\Prepend Scalar With Build Array.llb" + FALSE + + + + + "Redundant Boolean Operations" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Performance\\Redundant Boolean Operations.llb" + TRUE + + + + + "Value Property Usage" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Performance\\Value Property Usage.llb" + TRUE + + + + + "Wait in While Loop" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Performance\\Wait in While Loop.llb" + TRUE + + + + + "Wired Terminals in Subdiagrams" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Performance\\Wired Terminals in Subdiagrams.llb" + FALSE + + + + + "Array Constant Style" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Style\\Array Constant Style.llb" + FALSE + + + + + "Backwards Wires" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Style\\Backwards Wires.llb" + FALSE + + + + + "Case Structure Default Frame" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Style\\Case Structure Default Frame.llb" + FALSE + + + + + "Code Simplification" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Style\\Code Simplification.llb" + FALSE + + + + + "Control Terminal Label Visible" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Style\\Control Terminal Label Visible.llb" + FALSE + + + + + "Control Terminal Wiring" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Style\\Control Terminal Wiring.llb" + FALSE + + + + + "Diagram Disable Structures" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Style\\Diagram Disable Structures.llb" + FALSE + + + + + "Mixed Terminal Styles" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Style\\Mixed Terminal Styles.llb" + FALSE + + + + + "Poor Names of Enum Items" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Style\\Poor Names of Enum Items.llb" + TRUE + + + + + "Sequence Structure Usage" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Style\\Sequence Structure Usage.llb" + TRUE + + + + + "String Constant Style" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Style\\String Constant Style.llb" + FALSE + + + + + "Tunnel Position" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Style\\Tunnel Position.llb" + FALSE + + + + + "Unused Code" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Style\\Unused Code.llb" + FALSE + + + + + "Wire Bends" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Style\\Wire Bends.llb" + FALSE + + + + + "Wire Crossings" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Style\\Wire Crossings.llb" + FALSE + + + + + "Wires Under Objects" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Style\\Wires Under Objects.llb" + FALSE + + + + + "Adding Array Size Elements" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\Adding Array Size Elements.llb" + TRUE + + + + + "Array Sum and Product Overflow" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\Array Sum and Product Overflow.llb" + TRUE + + + + + "Breakpoint Detection" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\Breakpoint Detection.llb" + TRUE + + + + + "Bundling Duplicate Names" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\Bundling Duplicate Names.llb" + TRUE + + + + + "Case Structure with String Range" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\Case Structure with String Range.llb" + TRUE + + + + + "Error Cluster Wired" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\Error Cluster Wired.llb" + FALSE + + + + + "Find Deprecated Items" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\Find Deprecated Items.llb" + TRUE + + + + + "For Loop Error Handling" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\For Loop Error Handling.llb" + FALSE + + + + + "For Loop Iteration Count" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\For Loop Iteration Count.llb" + TRUE + + + + + "For Loop Reference Handling" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\For Loop Reference Handling.llb" + FALSE + + + + + "Globals and Locals" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\Globals and Locals.llb" + FALSE + + + + + "Hidden Objects in Structures" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\Hidden Objects in Structures.llb" + TRUE + + + + + "Hidden Tunnels" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\Hidden Tunnels.llb" + FALSE + + + + + "Indexer Datatype" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\Indexer Datatype.llb" + TRUE + + + + + "Pattern Label" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\Pattern Label.llb" + FALSE + + + + + "Reentrant VI Issues" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\Reentrant VI Issues.llb" + FALSE + + + + + "Type Casting References" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\Type Casting References.llb" + TRUE + + + + + "Unwired I32 Error" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Block Diagram\\Warnings\\Unwired I32 Error.llb" + TRUE + + + + + "Cyclomatic Complexity" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Complexity Metrics\\Cyclomatic Complexity.llb" + TRUE + + + + + "Depth of Nesting of Structures" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Complexity Metrics\\Depth of Nesting of Structures.llb" + FALSE + + + + + "Fan In" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Complexity Metrics\\Fan In.llb" + FALSE + + + + + "Fan Out" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Complexity Metrics\\Fan Out.llb" + FALSE + + + + + "Modularity Index" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Complexity Metrics\\Modularity Index.llb" + FALSE + + + + + "Approved Bookmark Tags" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Documentation\\Developer\\Approved Bookmark Tags.llb" + TRUE + + + "Approved Bookmark Tags" + "1D String" + "#CodeRecommended", "#via_ignore" + + + + + "Comment Usage" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Documentation\\Developer\\Comment Usage.llb" + FALSE + + + + + "Label Call Library Nodes" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Documentation\\Developer\\Label Call Library Nodes.llb" + TRUE + + + + + "Revision History" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Documentation\\Developer\\Revision History.llb" + TRUE + + + + + "Spell Check" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Documentation\\User\\Spell Check.llb" + FALSE + + + + + "VI Documentation" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Documentation\\User\\VI Documentation.llb" + FALSE + + + + + "Array Default Values" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Front Panel\\SubVI\\Array Default Values.llb" + TRUE + + + + + "Cluster Sized to Fit" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Front Panel\\SubVI\\Cluster Sized to Fit.llb" + FALSE + + + + + "Control Alignment" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Front Panel\\SubVI\\Control Alignment.llb" + FALSE + + + + + "Alignment Grid Setting" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Front Panel\\User Interface\\Alignment Grid Setting.llb" + FALSE + + + + + "Clipped Text" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Front Panel\\User Interface\\Clipped Text.llb" + FALSE + + + + + "Dialog Controls" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Front Panel\\User Interface\\Dialog Controls.llb" + FALSE + + + + + "Duplicate Control Labels" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Front Panel\\User Interface\\Duplicate Control Labels.llb" + FALSE + + + + + "Empty List Items" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Front Panel\\User Interface\\Empty List Items.llb" + TRUE + + + + + "Font Usage" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Front Panel\\User Interface\\Font Usage.llb" + TRUE + + + + + "Overlapping Controls" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Front Panel\\User Interface\\Overlapping Controls.llb" + FALSE + + + + + "Panel Size and Position" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Front Panel\\User Interface\\Panel Size and Position.llb" + FALSE + + + + + "Scalar Chart Updates" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Front Panel\\User Interface\\Scalar Chart Updates.llb" + TRUE + + + + + "Synchronous Display" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Front Panel\\User Interface\\Synchronous Display.llb" + TRUE + + + + + "Transparent Labels" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\Front Panel\\User Interface\\Transparent Labels.llb" + TRUE + + + + + "SubVI and TypeDef Locations" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\File Properties\\SubVI and TypeDef Locations.llb" + TRUE + + + + + "VI Extension" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\File Properties\\VI Extension.llb" + TRUE + + + + + "VI Name" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\File Properties\\VI Name.llb" + TRUE + + + + + "VI Saved Version" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\File Properties\\VI Saved Version.llb" + FALSE + + + + + "VI Size" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\File Properties\\VI Size.llb" + TRUE + + + + + "Connector Pane Alignment" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\Icon and Connector Pane\\Connector Pane Alignment.llb" + TRUE + + + + + "Connector Pane Pattern" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\Icon and Connector Pane\\Connector Pane Pattern.llb" + TRUE + + + + + "Default Icon" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\Icon and Connector Pane\\Default Icon.llb" + FALSE + + + + + "Error Style" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\Icon and Connector Pane\\Error Style.llb" + TRUE + + + + + "Full Connector Pane" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\Icon and Connector Pane\\Full Connector Pane.llb" + FALSE + + + + + "Icon Size and Border" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\Icon and Connector Pane\\Icon Size and Border.llb" + TRUE + + + + + "Polymorphic Terminals" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\Icon and Connector Pane\\Polymorphic Terminals.llb" + TRUE + + + + + "Terminal Connection Type" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\Icon and Connector Pane\\Terminal Connection Type.llb" + TRUE + + + + + "Terminal Positions" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\Icon and Connector Pane\\Terminal Positions.llb" + TRUE + + + + + "Auto Error Handling Enabled" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\VI Properties\\Auto Error Handling Enabled.llb" + FALSE + + + + + "Broken VI" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\VI Properties\\Broken VI.llb" + TRUE + + + + + "Built Application Compatibility" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\VI Properties\\Built Application Compatibility.llb" + FALSE + + + + + "Control VI Type" + 1 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\VI Properties\\Control VI Type.llb" + FALSE + + + + + "Driver Usage" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\VI Properties\\Driver Usage.llb" + FALSE + + + + + "Platform Portability" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\VI Properties\\Platform Portability.llb" + FALSE + + + + + "Removed Diagram" + 2 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\VI Properties\\Removed Diagram.llb" + TRUE + + + + + "Separate Compiled Code Setting" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\VI Properties\\Separate Compiled Code Setting.llb" + FALSE + + + + + "Toolkit Usage" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\VI Properties\\Toolkit Usage.llb" + TRUE + + + + + "VI Lock State" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\General\\VI Properties\\VI Lock State.llb" + FALSE + + + + + "Connector Inputs and Outputs" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\VI Metrics\\Connector Inputs and Outputs.llb" + FALSE + + + + + "Controls and Indicators" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\VI Metrics\\Controls and Indicators.llb" + TRUE + + + + + "Diagram Count" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\VI Metrics\\Diagram Count.llb" + TRUE + + + + + "Diagram Size" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\VI Metrics\\Diagram Size.llb" + FALSE + + + + + "Node Count" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\VI Metrics\\Node Count.llb" + FALSE + + + + + "Property Reads and Writes" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\VI Metrics\\Property Reads and Writes.llb" + TRUE + + + + + "Shared Library Calls" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\VI Metrics\\Shared Library Calls.llb" + TRUE + + + + + "Structure Count" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\VI Metrics\\Structure Count.llb" + TRUE + + + + + "Wire Sources" + 0 + 5 + "LabVIEW" + "project\\_VI Analyzer\\_tests\\VI Metrics\\Wire Sources.llb" + FALSE + + + + + + + \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..6b0c99a --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,215 @@ +name: CI Pipeline +run-name: "CI ${{ github.sha }} (#${{ github.run_id }}.${{ github.run_attempt }})" + +env: + LABVIEW_IMAGE: nationalinstruments/labview:latest-windows + +concurrency: + group: ci-pipeline-${{ github.repository }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +on: + pull_request: + branches: + - main + - develop + - release/* + - feature/* + - hotfix/* + types: + - opened + - synchronize + - reopened + - ready_for_review + + push: + branches: + - main + - develop + - release/* + - hotfix/* + - feature/* + + workflow_dispatch: + +jobs: + via-tests: + name: Run VI Analyzer tests + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v5 + with: + fetch-depth: 0 + + - name: Run VI Analyzer tests + uses: ni/open-source/via-lv-docker@actions + with: + config_path: ${{ github.event_name == 'workflow_dispatch' && '.github/via_config/Actor_Framework.viancfg' || '' }} + base_branch: origin/${{ github.event.pull_request.base.ref || 'develop' }} + labview_version: 'latest-linux' + + - name: Upload VI Analyzer Report + uses: actions/upload-artifact@v6 + if: always() + with: + name: vi-analyzer-report + path: vi-analyzer-report.htm + retention-days: 7 + + create-artifact: + name: Create distribution artifact + needs: via-tests + uses: ./.github/workflows/create-distribution-artifact.yml + with: + upload-artifact: true + + install-into-labview: + name: Mass Compile Actor Framework VIs + needs: create-artifact + runs-on: windows-latest + + steps: + - name: Download distribution artifact + uses: actions/download-artifact@v7 + with: + name: actor-framework-distribution + path: distribution + + - name: Show downloaded artifact contents + shell: pwsh + run: | + Get-ChildItem -Path "${{ github.workspace }}\distribution" -Recurse + + - name: Pull LabVIEW container image + shell: pwsh + run: | + docker pull $env:LABVIEW_IMAGE + + - name: Resolve LabVIEW image metadata + shell: pwsh + run: | + $imageEnv = docker image inspect --format '{{json .Config.Env}}' $env:LABVIEW_IMAGE | ConvertFrom-Json + $lvYearEntry = $imageEnv | Where-Object { $_ -like 'LV_YEAR=*' } | Select-Object -First 1 + + if (-not $lvYearEntry) { + throw "LV_YEAR was not found in image metadata for $env:LABVIEW_IMAGE" + } + + $lvYear = $lvYearEntry.Substring("LV_YEAR=".Length) + $containerName = "af-lv$lvYear" + + "LV_YEAR=$lvYear" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + "AF_CONTAINER_NAME=$containerName" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + + Write-Host "Resolved LV_YEAR=$lvYear" + Write-Host "Resolved AF_CONTAINER_NAME=$containerName" + + - name: Create and start container + shell: pwsh + run: | + docker create --name $env:AF_CONTAINER_NAME ` + $env:LABVIEW_IMAGE ` + powershell -NoLogo -NoProfile -Command "Start-Sleep -Seconds 3600" + + docker start $env:AF_CONTAINER_NAME + + - name: Copy distribution into container + shell: pwsh + run: | + docker cp "${{ github.workspace }}\distribution" "$($env:AF_CONTAINER_NAME):C:\staging" + + - name: Overlay files into LabVIEW directory and mass compile + shell: pwsh + run: | + $script = @' + $lvRoot = "C:\Program Files\National Instruments\LabVIEW $env:LV_YEAR" + $labviewCli = "C:\Program Files (x86)\National Instruments\Shared\LabVIEW CLI\LabVIEWCLI.exe" + $stagingRoot = "C:\staging" + $logRoot = "C:\mass-compile-logs" + $overlayFolders = @("menus", "vi.lib", "resource") + + # Only these folders will be mass compiled + $compileTargets = @( + "vi.lib\ActorFramework" + ) + + if (-not (Test-Path $lvRoot)) { + throw "LabVIEW root not found at: $lvRoot" + } + + if (-not (Test-Path $labviewCli)) { + throw "LabVIEWCLI not found at: $labviewCli" + } + + New-Item -ItemType Directory -Path $logRoot -Force | Out-Null + + foreach ($folder in $overlayFolders) { + $source = Join-Path $stagingRoot $folder + $destination = Join-Path $lvRoot $folder + + if (Test-Path $source) { + Write-Host "Overlaying $source -> $destination" + New-Item -ItemType Directory -Path $destination -Force | Out-Null + Copy-Item -Path (Join-Path $source '*') -Destination $destination -Recurse -Force + } + } + + # Mass compile only selected folders + foreach ($relativeTarget in $compileTargets) { + $targetPath = Join-Path $lvRoot $relativeTarget + if (-not (Test-Path $targetPath)) { + Write-Warning "Mass compile target not found, skipping: $targetPath" + continue + } + + $safeName = $relativeTarget -replace '[\\/:*?""<>|]', '_' + $logFile = Join-Path $logRoot "$safeName-masscompile.log" + + Write-Host "Mass compiling $targetPath" + & $labviewCli ` + -OperationName MassCompile ` + -DirectoryToCompile $targetPath ` + -MassCompileLogFile $logFile ` + -Headless + + if ($LASTEXITCODE -ne 0) { + throw "Mass compile failed for $targetPath with exit code $LASTEXITCODE" + } + } + '@ + + $tempScript = Join-Path $env:RUNNER_TEMP "copy-and-masscompile.ps1" + Set-Content -Path $tempScript -Value $script + docker cp $tempScript "$($env:AF_CONTAINER_NAME):C:\copy-and-masscompile.ps1" + + if ($LASTEXITCODE -ne 0) { + throw "Failed to copy script into container" + } + + docker exec ` + -e LV_YEAR="$env:LV_YEAR" ` + $env:AF_CONTAINER_NAME ` + powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -File C:\copy-and-masscompile.ps1 + + - name: Copy mass compile logs from container + if: always() + shell: pwsh + run: | + New-Item -ItemType Directory -Path "${{ github.workspace }}\mass-compile-logs" -Force | Out-Null + docker cp "$($env:AF_CONTAINER_NAME):C:\mass-compile-logs" "${{ github.workspace }}\mass-compile-logs" + + - name: Upload mass compile logs + if: always() + uses: actions/upload-artifact@v6 + with: + name: mass-compile-logs + path: mass-compile-logs + retention-days: 7 + + - name: Cleanup container + if: always() + shell: pwsh + run: | + docker rm -f $env:AF_CONTAINER_NAME \ No newline at end of file diff --git a/.github/workflows/coding-hours.yml b/.github/workflows/coding-hours.yml new file mode 100644 index 0000000..2ec6b8d --- /dev/null +++ b/.github/workflows/coding-hours.yml @@ -0,0 +1,249 @@ +name: Coding‑hours report + +on: + schedule: + - cron: '0 0 * * 1' # every MondayΒ 00:00Β UTC + workflow_dispatch: + inputs: + window_start: + description: 'Report since YYYY‑MM‑DD' + required: false + +permissions: + contents: write + pages: write + id-token: write + +jobs: +############################################################################### +# JobΒ 1 – run git‑hours (Go), build badge, commit to `metrics` +############################################################################### + report: + if: github.ref == 'refs/heads/develop' + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: { fetch-depth: 0 } + + - uses: actions/setup-go@v4 + with: { go-version: '1.24' } + + - name: Install git‑hours v0.1.2 + run: | + git clone --depth 1 --branch v0.1.2 https://github.com/trinhminhtriet/git-hours.git git-hours-src + sed -i 's/go 1.24.1/go 1.24/' git-hours-src/go.mod + (cd git-hours-src && go install .) + # v0.1.2 has no --version flag; show help header instead + git-hours -h | head -n 1 + + - name: Generate raw report + run: | + ARGS="" + if [ -n "${{ github.event.inputs.window_start }}" ]; then + ARGS+=" -since ${{ github.event.inputs.window_start }}" + fi + git-hours $ARGS > raw.txt + cat raw.txt + + # ──────────────────────────── PATCH β‘  auto‑detect JSON vs table ── + - name: Convert to JSON + run: | + python - <<'PY' + import json, re, pathlib + raw_text = pathlib.Path('raw.txt').read_text().lstrip() + + def table_to_json(lines): + obj, th, tc = {}, 0, 0 + for line in lines: + if not line or line.lower().startswith(('author','name','user','----','total')): + continue + parts = re.split(r'\s+', line.strip()) + if len(parts) < 3: + continue + commits = int(parts[-1]) + hours = int(parts[-2]) + email = ' '.join(parts[:-2]) + obj[email] = {"name": email, "hours": hours, "commits": commits} + th += hours; tc += commits + obj["total"] = {"name":"", "hours": th, "commits": tc} + return obj + + try: # already JSON? + data = json.loads(raw_text) + if "total" not in data: + th = sum(v["hours"] for v in data.values()) + tc = sum(v["commits"] for v in data.values()) + data["total"] = {"name":"", "hours": th, "commits": tc} + except json.JSONDecodeError: + data = table_to_json(raw_text.splitlines()) + + pathlib.Path('git-hours.json').write_text(json.dumps(data, indent=2)) + PY + # ──────────────────────────────────────────────────────────────── + + - name: Install jq + run: sudo apt-get update -y && sudo apt-get install -y jq + + - name: Build badge.json + run: | + HOURS=$(jq '.total.hours' git-hours.json) + cat > badge.json <> "$GITHUB_STEP_SUMMARY" + jq -r ' + to_entries + | map(select(.key!="total")) + | sort_by(-.value.hours) + | (["Contributor","Hours","Commits"] + , (map([.key, (.value.hours|tostring), (.value.commits|tostring)]))) + | @tsv' git-hours.json | column -t -s $'\t' >> "$GITHUB_STEP_SUMMARY" + + - uses: actions/upload-artifact@v4 + with: + name: git-hours-json + path: git-hours.json + retention-days: 30 + + # ──────────────────────────── PATCH β‘’ safer push logic ─────────── + - name: Push to metrics branch + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + git config --global user.name "git-hours bot" + git config --global user.email "bot@github.com" + + # Stash everything (tracked + untracked) so checkout can’t complain. + git stash push --include-untracked --quiet + + # Ensure we have the latest metrics from remote, if it exists. + git fetch origin metrics || true + if git show-ref --quiet refs/remotes/origin/metrics; then + git switch --quiet metrics || git switch -c metrics origin/metrics + git pull --ff-only origin metrics || true + else + git switch --orphan metrics + git reset --hard + fi + + # Restore stashed badge.json + reports/ + git stash pop --quiet || true + + mkdir -p reports + cp git-hours.json "reports/git-hours-$(date +%F).json" + git add reports badge.json + git commit -m "chore(metrics): report $(date +%F)" || echo "No change" + + git push https://x-access-token:${GITHUB_TOKEN}@github.com/${{ github.repository }} metrics \ + || git push --force-with-lease https://x-access-token:${GITHUB_TOKEN}@github.com/${{ github.repository }} metrics + + +############################################################################### +# JobΒ 2 – build Site & upload Pages artifact +############################################################################### + build-site: + needs: report + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: actions/download-artifact@v4 + with: { name: git-hours-json, path: tmp } + + - name: Build KPIs site + run: | + DATE=$(date +%F) + mkdir -p site/data + cp tmp/git-hours.json "site/data/git-hours-${DATE}.json" + cp tmp/git-hours.json site/git-hours-latest.json + + # (HTML generator unchanged) + + python - <<'PY' + import json, datetime, pathlib, html, textwrap + data = json.load(open('tmp/git-hours.json')) + total = data['total'] + labels = [html.escape(k) for k in data if k != 'total'] + rows = "\n".join( + f"{l}{data[l]['hours']}{data[l]['commits']}" + for l in labels) + + page = f""" + + + Collaborator KPIs + + + + +
+

Collaborator KPIs

+

Last updated {datetime.datetime.utcnow():%Y‑%m‑%dΒ %H:%Mβ€―UTC}

+ +

Totals

+ + +

Hours per contributor

+ + +

Detail table

+ + + {rows} +
ContributorHoursCommits
+ +

Historical JSON snapshots live in /data.

+ + +
+ """ + pathlib.Path('site/index.html').write_text(textwrap.dedent(page)) + PY + + # ───────────────────── PATCH β‘‘ bump to v3 (uses artifact@v4) ────── + - uses: actions/upload-pages-artifact@v3 + with: { path: site } + # ─────────────────────────────────────────────────────────────────── + +############################################################################### +# JobΒ 3 – deploy to GitHubΒ Pages +############################################################################### + deploy-pages: + needs: build-site + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + steps: + - id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/create-distribution-artifact.yml b/.github/workflows/create-distribution-artifact.yml new file mode 100644 index 0000000..35486ae --- /dev/null +++ b/.github/workflows/create-distribution-artifact.yml @@ -0,0 +1,38 @@ +name: Create Distribution Artifact + +on: + workflow_dispatch: + inputs: + upload-artifact: + description: 'Upload as GitHub artifact' + required: false + type: boolean + default: true + workflow_call: + inputs: + upload-artifact: + description: 'Upload as GitHub artifact' + required: false + type: boolean + default: false + +jobs: + create-artifact: + runs-on: windows-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Create framework artifact structure + shell: pwsh + run: | + & "${{ github.workspace }}\pipeline\scripts\Create_Distribution_Artifact.ps1" + + - name: Upload artifact + if: ${{ inputs.upload-artifact }} + uses: actions/upload-artifact@v6 + with: + name: actor-framework-distribution + path: artifact-staging/ + retention-days: 7 \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..66ce201 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,34 @@ +name: Create Release + +on: + push: + tags: + - 'v*.*.*' + +jobs: + create-artifact: + uses: ./.github/workflows/create-distribution-artifact.yml + with: + upload-artifact: true + + create-release: + needs: create-artifact + runs-on: windows-latest + + steps: + - name: Download artifact + uses: actions/download-artifact@v7 + with: + name: actor-framework-distribution + path: artifact-staging + + - name: Create actor-framework-distribution.zip + shell: pwsh + run: | + Compress-Archive -Path artifact-staging\* -DestinationPath actor-framework-distribution.zip + + - name: Create Release + uses: softprops/action-gh-release@v2 + with: + files: actor-framework-distribution.zip + generate_release_notes: true \ No newline at end of file diff --git a/.github/workflows/run-via-tests.yml b/.github/workflows/run-via-tests.yml new file mode 100644 index 0000000..f7870ae --- /dev/null +++ b/.github/workflows/run-via-tests.yml @@ -0,0 +1,30 @@ +name: Run VIA tests + +on: + workflow_dispatch: + +jobs: + run-via-tests: + name: Run VI Analyzer tests + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v5 + with: + fetch-depth: 0 # Fetch all history + + - name: Run VI Analyzer tests + uses: ni/open-source/via-lv-docker@actions + with: + config_path: ${{ github.event_name == 'workflow_dispatch' && '.github/via_config/Actor_Framework.viancfg' || '' }} + base_branch: origin/${{ github.event.pull_request.base.ref || 'develop' }} + labview_version: 'latest-linux' + + - name: Upload VI Analyzer Report + uses: actions/upload-artifact@v6 + if: always() + with: + name: vi-analyzer-report + path: vi-analyzer-report.htm + retention-days: 7 \ No newline at end of file diff --git a/.tgitconfig b/.tgitconfig new file mode 100644 index 0000000..e69de29 diff --git a/Builds/actor_framework_2024_for_2020-2.0.0.23.vip b/Builds/actor_framework_2024_for_2020-2.0.0.23.vip new file mode 100644 index 0000000..56bc249 Binary files /dev/null and b/Builds/actor_framework_2024_for_2020-2.0.0.23.vip differ diff --git a/Core/Actor Framework 2024 for 2020.vipb b/Core/Actor Framework 2024 for 2020.vipb index 6ffb656..ae2065b 100644 --- a/Core/Actor Framework 2024 for 2020.vipb +++ b/Core/Actor Framework 2024 for 2020.vipb @@ -1,14 +1,14 @@ - + Actor_Framework_2024_for_2020 - 1.0.1.12 + 2.0.0.24 false . ..\Builds justACS MIT - 20.0 (64-bit) + 20.0 true 00000D7E002800000C9A00000400000200020022002200080000000000FFFFFF00FF80000000FFFFFFFFFFFF0000FFFFFFFFCCCC0000FFFFFFFF99990000FFFFFFFF66660000FFFFFFFF33330000FFFFFFFF00000000FFFFCCCCFFFF0000FFFFCCCCCCCC0000FFFFCCCC99990000FFFFCCCC66660000FFFFCCCC33330000FFFFCCCC00000000FFFF9999FFFF0000FFFF9999CCCC0000FFFF999999990000FFFF999966660000FFFF999933330000FFFF999900000000FFFF6666FFFF0000FFFF6666CCCC0000FFFF666699990000FFFF666666660000FFFF666633330000FFFF666600000000FFFF3333FFFF0000FFFF3333CCCC0000FFFF333399990000FFFF333366660000FFFF333333330000FFFF333300000000FFFF0000FFFF0000FFFF0000CCCC0000FFFF000099990000FFFF000066660000FFFF000033330000FFFF000000000000CCCCFFFFFFFF0000CCCCFFFFCCCC0000CCCCFFFF99990000CCCCFFFF66660000CCCCFFFF33330000CCCCFFFF00000000CCCCCCCCFFFF0000CCCCCCCCCCCC0000CCCCCCCC99990000CCCCCCCC66660000CCCCCCCC33330000CCCCCCCC00000000CCCC9999FFFF0000CCCC9999CCCC0000CCCC999999990000CCCC999966660000CCCC999933330000CCCC999900000000CCCC6666FFFF0000CCCC6666CCCC0000CCCC666699990000CCCC666666660000CCCC666633330000CCCC666600000000CCCC3333FFFF0000CCCC3333CCCC0000CCCC333399990000CCCC333366660000CCCC333333330000CCCC333300000000CCCC0000FFFF0000CCCC0000CCCC0000CCCC000099990000CCCC000066660000CCCC000033330000CCCC0000000000009999FFFFFFFF00009999FFFFCCCC00009999FFFF999900009999FFFF666600009999FFFF333300009999FFFF000000009999CCCCFFFF00009999CCCCCCCC00009999CCCC999900009999CCCC666600009999CCCC333300009999CCCC0000000099999999FFFF000099999999CCCC0000999999999999000099999999666600009999999933330000999999990000000099996666FFFF000099996666CCCC0000999966669999000099996666666600009999666633330000999966660000000099993333FFFF000099993333CCCC0000999933339999000099993333666600009999333333330000999933330000000099990000FFFF000099990000CCCC000099990000999900009999000066660000999900003333000099990000000000006666FFFFFFFF00006666FFFFCCCC00006666FFFF999900006666FFFF666600006666FFFF333300006666FFFF000000006666CCCCFFFF00006666CCCCCCCC00006666CCCC999900006666CCCC666600006666CCCC333300006666CCCC0000000066669999FFFF000066669999CCCC0000666699999999000066669999666600006666999933330000666699990000000066666666FFFF000066666666CCCC0000666666669999000066666666666600006666666633330000666666660000000066663333FFFF000066663333CCCC0000666633339999000066663333666600006666333333330000666633330000000066660000FFFF000066660000CCCC000066660000999900006666000066660000666600003333000066660000000000003333FFFFFFFF00003333FFFFCCCC00003333FFFF999900003333FFFF666600003333FFFF333300003333FFFF000000003333CCCCFFFF00003333CCCCCCCC00003333CCCC999900003333CCCC666600003333CCCC333300003333CCCC0000000033339999FFFF000033339999CCCC0000333399999999000033339999666600003333999933330000333399990000000033336666FFFF000033336666CCCC0000333366669999000033336666666600003333666633330000333366660000000033333333FFFF000033333333CCCC0000333333339999000033333333666600003333333333330000333333330000000033330000FFFF000033330000CCCC000033330000999900003333000066660000333300003333000033330000000000000000FFFFFFFF00000000FFFFCCCC00000000FFFF999900000000FFFF666600000000FFFF333300000000FFFF000000000000CCCCFFFF00000000CCCCCCCC00000000CCCC999900000000CCCC666600000000CCCC333300000000CCCC0000000000009999FFFF000000009999CCCC0000000099999999000000009999666600000000999933330000000099990000000000006666FFFF000000006666CCCC0000000066669999000000006666666600000000666633330000000066660000000000003333FFFF000000003333CCCC0000000033339999000000003333666600000000333333330000000033330000000000000000FFFF000000000000CCCC0000000000009999000000000000666600000000000033330000EEEE000000000000DDDD000000000000BBBB000000000000AAAA0000000000008888000000000000777700000000000055550000000000004444000000000000222200000000000011110000000000000000EEEE000000000000DDDD000000000000BBBB000000000000AAAA0000000000008888000000000000777700000000000055550000000000004444000000000000222200000000000011110000000000000000EEEE000000000000DDDD000000000000BBBB000000000000AAAA0000000000008888000000000000777700000000000055550000000000004444000000000000222200000000000011110000EEEEEEEEEEEE0000DDDDDDDDDDDD0000BBBBBBBBBBBB0000AAAAAAAAAAAA0000888888888888000077777777777700005555555555550000444444444444000022222222222200001111111111110000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0AFFFF0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0AFFFF0A0A0A0A0A0AFFFF0A0A0A0AFF0A0AFF0AFFFF0A0A0AFF0A0A0A0A0A0A0AFFFF0A0A0A0A0A0A0A0AFF0A0AFFFF0A0AFF0A0A0AFF0AFF0AFF0A0A0A0A0A0AFFFF0A0A0A0A0A0A0AFF0A0AFF0AFF0AFFFF0A0AFF0A0AFF0AFF0A0A0A0A0A0AFFFF0A0A0A0A0A0AFF0A0A0AFFFFFF0AFF0A0AFF0A0A0AFF0AFF0A0A0A0A0A0AFFFF0A0A0A0A0A0AFFFFFF0A0A0AFF0AFF0A0AFFFFFF0A0AFF0A0A0A0A0A0A0AFFFF0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0AFFFF0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0AFFFF0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000FA8100000000000000000000000000000000FFFF000000000000000000FA0000FAFA00818100000000000000000000000000FFFF000000000000000081FAFAFAFA8181FAFA00000000000000000000000000FFFF000000000000000000FAFAFAFAFAFAFAFA00810000000000000000000000FFFF00000000000081FAFAFAFA56FA5656FAFAFAFAFA00000000000000000000FFFF00000000000081FAFAFA560000000056FAFAFA0000000000000000000000FFFF0000000000000081FA5600000000000056FAFA0000000000000000000000FFFF000000000081FA81FA56000000000000FAFAFAFAFA000000000000000000FFFF0000000000FAFAFAFAFA00000000000056FA81FA81000000000000000000FFFF00000000000000FAFA5600000000000056FA810000000000000000000000FFFF00000000000000FAFAFA560000000056FAFAFA810081FA00000000000000FFFF000000000000FAFAFAFAFA5656FA56FAFAFA2BFC00818100FC2B00000000FFFF000000000000008100FAFAFAFAFAFAFAFA00818181818181818100000000FFFF000000000000000000FAFA8181FAFAFAFA81008181000081810000000000FFFF000000000000000000818100FAFA0000FAFA818100000000818181000000FFFF00000000000000000000000081FA000000818181000000008181FA000000FFFF000000000000000000000000000000000000008181000081810000000000FFFF000000000000000000000000000000000000818181818181818100000000FFFF0000000000000000000000000000000000002BFC00818100FC2B00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF002900000012000000020000000D01000000000100000000000A000000080000000000240024002900000012000000020000000D00B2B2B900010000000000100000001000000002002300000000000000000023002900000012000000020000000D00FCFCFD00010000000000100000001000000002002200010001000100010022002900000012000000020000000D00B2B2B900010000000000100000001000000002000000240024002400240000002900000012000000020000000D0080808A00010000000000100000001000000002000100230023002300230001 Actor Framework 2024 for 2020 @@ -27,12 +27,34 @@ Actor Framework 2024 for 2020.vipc - Backport of Actor Framework 2024 for 2020 and later. - + Actor Framework reorganized for improved PPL builds. + This product updates the core Actor Framework libraries that ship with LabVIEW - Actor Framework.lvlib and AF Debug.lvlib. + +The versions of these libraries that ship with LabVIEW 2024 Q3 have been backported for use with LabVIEW 2020 or later. If you are working in one of these earlier versions, you can now take advantage of Uninit.vi, a new dynamic dispatch member of Actor.lvclass, plus a small number of minor bug fixes. + +In addition, this version contains a major reorganization of the Actor Framework core libraries to facilitate PPL builds, with minimal changes to functionality. Developers should be able to seamlessly update to this version of the framework, and then leverage its features and changes at their convenience. + +Finally, we have added a protected method to Actor.lvclass that sends a Normal Stop to its nested autostop actors, and we have added a few productivity and test support items to the palettes. Please see the Release Notes for details. + +As a pre-install action, this package will archive your existing core libraries and palettes. Should you wish to uninstall this package, your original libraries will be restored. The archive is stored in a filed called AF.zip, which you can find in vi.lib. Please do not delete this file, as you will lose the ability to restore the original files. + +This version DOES NOT update the Actor Framework project providers. Updated project providers will be made available in a separate package, with its own update cadence. Copyright (c) 2024, NI Allen C Smith - 1.0.1.10 - Restored "Casting Utility For Actors.vim" + 1. Almost all of the contents of AF Debug.lvlib have been moved into Actor Framework.lvlib. AF Debug.lvlib now only contains the code that sends traces to Desktop Execution Trace Toolkit and a few compatibility remnants. DETT trace code is now encapsulated in a class (DETT Format.lvclass) that inherits from an interface (Trace Format.lvlcass) that resides in Actor Framework.lvlib. + +2. Generate Trace.vi now dynamically loads a trace format. If no trace format is specified, Generate Trace.vi will load DETT Format.lvclass as the default. If users add the token AFDebugTraceFormat to their LabVIEW INI file, Generate Trace.vi will load that format instead. AFDebugTraceFormat is a path saved as a string. + +3. Actor registration has been streamlined; Actor.vi no longer has to send Register Actor Msg.lvclass to the new actor to complete registration. Registration is performed directly in Actor Core.vi, just before message handling starts. + +4. Stop Autostop Nested Actors.vi has been added. Use this protected method to stop all of your autostop nested actors without stopping the actor. + +5. Items have been added to a new subpalette to support automated testing of your actors. These include the original Launch Actor.vi, Init Actor Queues FOR TESTING ONLY.vi, and a new VI, Test Launch for Nested Actor Without Caller.vi, useful for testing actors that run and then shut themselves down. + +6. Enqueuer and Last Ack controls and constants have been added to the Functions and Controls palettes. + +7. To improve the PPL build experience, the specialty messages (Batch, Reply, Report Error, and Self-Addressed) have been copied to new locations on disk, and the copies moved into libraries. The copies of Report Error Msg and Self-Addressed Msg are now part of Actor Framework.lvlib. The copies of Batch Msg and Reply Msg are members of a new library, AF Specialty Messages.lvlib. To avoid breaking existing code, the original versions of these messages remain on disk, but are now DEPRECATED, and marked accordingly. Developers are encouraged to migrate to the new library versions of these messages at their earliest convenience. @@ -105,6 +127,12 @@ true <vi.lib>\ActorFramework + + Palettes + false + true + <menus> + @@ -131,6 +159,24 @@ true 1 + + Menus + 0 + false + 0 + + + Menus/Categories + 0 + true + 2 + + + Menus/Controls + 0 + true + 2 + . @@ -141,26 +187,20 @@ Prefix - - _actorframework_experttools.mnu - - - _actorframework_msgqueuepair.mnu - Actor Framework Core.lvproj - actorframework.mnu + Testing - Install Support/Populate Zip File.vi + AF PPL Build.lvproj - Install Support/Restore Framework.vi + builds - Install Support/Stash Framework.vi + AF Debug PPL Build.lvproj @@ -194,9 +234,9 @@ - Functions - <menus>\Categories - + Functions\Data Communication + <menus>\Categories\Data Communication + <menus>\Categories\Data Communication\dir.mnu false false @@ -221,7 +261,6 @@ false false false - false false diff --git a/Core/Actor Framework Core.aliases b/Core/Actor Framework Core.aliases index e7d35c3..fde70f2 100644 --- a/Core/Actor Framework Core.aliases +++ b/Core/Actor Framework Core.aliases @@ -1,2 +1,2 @@ [My Computer] -My Computer = "10.0.2.15" +My Computer = "192.168.50.171" diff --git a/Core/Actor Framework.vipb b/Core/Actor Framework.vipb deleted file mode 100644 index 2e98f5e..0000000 --- a/Core/Actor Framework.vipb +++ /dev/null @@ -1,235 +0,0 @@ - - - ni_actor_framework - 1.1.0.2 - false - . - ..\Builds - Acme Corporation - - MIT - 20.0 (64-bit) - true - 00000D7E002800000C9A00000400000200020022002200080000000000FFFFFF00FF80000000FFFFFFFFFFFF0000FFFFFFFFCCCC0000FFFFFFFF99990000FFFFFFFF66660000FFFFFFFF33330000FFFFFFFF00000000FFFFCCCCFFFF0000FFFFCCCCCCCC0000FFFFCCCC99990000FFFFCCCC66660000FFFFCCCC33330000FFFFCCCC00000000FFFF9999FFFF0000FFFF9999CCCC0000FFFF999999990000FFFF999966660000FFFF999933330000FFFF999900000000FFFF6666FFFF0000FFFF6666CCCC0000FFFF666699990000FFFF666666660000FFFF666633330000FFFF666600000000FFFF3333FFFF0000FFFF3333CCCC0000FFFF333399990000FFFF333366660000FFFF333333330000FFFF333300000000FFFF0000FFFF0000FFFF0000CCCC0000FFFF000099990000FFFF000066660000FFFF000033330000FFFF000000000000CCCCFFFFFFFF0000CCCCFFFFCCCC0000CCCCFFFF99990000CCCCFFFF66660000CCCCFFFF33330000CCCCFFFF00000000CCCCCCCCFFFF0000CCCCCCCCCCCC0000CCCCCCCC99990000CCCCCCCC66660000CCCCCCCC33330000CCCCCCCC00000000CCCC9999FFFF0000CCCC9999CCCC0000CCCC999999990000CCCC999966660000CCCC999933330000CCCC999900000000CCCC6666FFFF0000CCCC6666CCCC0000CCCC666699990000CCCC666666660000CCCC666633330000CCCC666600000000CCCC3333FFFF0000CCCC3333CCCC0000CCCC333399990000CCCC333366660000CCCC333333330000CCCC333300000000CCCC0000FFFF0000CCCC0000CCCC0000CCCC000099990000CCCC000066660000CCCC000033330000CCCC0000000000009999FFFFFFFF00009999FFFFCCCC00009999FFFF999900009999FFFF666600009999FFFF333300009999FFFF000000009999CCCCFFFF00009999CCCCCCCC00009999CCCC999900009999CCCC666600009999CCCC333300009999CCCC0000000099999999FFFF000099999999CCCC0000999999999999000099999999666600009999999933330000999999990000000099996666FFFF000099996666CCCC0000999966669999000099996666666600009999666633330000999966660000000099993333FFFF000099993333CCCC0000999933339999000099993333666600009999333333330000999933330000000099990000FFFF000099990000CCCC000099990000999900009999000066660000999900003333000099990000000000006666FFFFFFFF00006666FFFFCCCC00006666FFFF999900006666FFFF666600006666FFFF333300006666FFFF000000006666CCCCFFFF00006666CCCCCCCC00006666CCCC999900006666CCCC666600006666CCCC333300006666CCCC0000000066669999FFFF000066669999CCCC0000666699999999000066669999666600006666999933330000666699990000000066666666FFFF000066666666CCCC0000666666669999000066666666666600006666666633330000666666660000000066663333FFFF000066663333CCCC0000666633339999000066663333666600006666333333330000666633330000000066660000FFFF000066660000CCCC000066660000999900006666000066660000666600003333000066660000000000003333FFFFFFFF00003333FFFFCCCC00003333FFFF999900003333FFFF666600003333FFFF333300003333FFFF000000003333CCCCFFFF00003333CCCCCCCC00003333CCCC999900003333CCCC666600003333CCCC333300003333CCCC0000000033339999FFFF000033339999CCCC0000333399999999000033339999666600003333999933330000333399990000000033336666FFFF000033336666CCCC0000333366669999000033336666666600003333666633330000333366660000000033333333FFFF000033333333CCCC0000333333339999000033333333666600003333333333330000333333330000000033330000FFFF000033330000CCCC000033330000999900003333000066660000333300003333000033330000000000000000FFFFFFFF00000000FFFFCCCC00000000FFFF999900000000FFFF666600000000FFFF333300000000FFFF000000000000CCCCFFFF00000000CCCCCCCC00000000CCCC999900000000CCCC666600000000CCCC333300000000CCCC0000000000009999FFFF000000009999CCCC0000000099999999000000009999666600000000999933330000000099990000000000006666FFFF000000006666CCCC0000000066669999000000006666666600000000666633330000000066660000000000003333FFFF000000003333CCCC0000000033339999000000003333666600000000333333330000000033330000000000000000FFFF000000000000CCCC0000000000009999000000000000666600000000000033330000EEEE000000000000DDDD000000000000BBBB000000000000AAAA0000000000008888000000000000777700000000000055550000000000004444000000000000222200000000000011110000000000000000EEEE000000000000DDDD000000000000BBBB000000000000AAAA0000000000008888000000000000777700000000000055550000000000004444000000000000222200000000000011110000000000000000EEEE000000000000DDDD000000000000BBBB000000000000AAAA0000000000008888000000000000777700000000000055550000000000004444000000000000222200000000000011110000EEEEEEEEEEEE0000DDDDDDDDDDDD0000BBBBBBBBBBBB0000AAAAAAAAAAAA0000888888888888000077777777777700005555555555550000444444444444000022222222222200001111111111110000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0AFFFF0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0AFFFF0A0A0A0A0A0AFFFF0A0A0A0AFF0A0AFF0AFFFF0A0A0AFF0A0A0A0A0A0A0AFFFF0A0A0A0A0A0A0A0AFF0A0AFFFF0A0AFF0A0A0AFF0AFF0AFF0A0A0A0A0A0AFFFF0A0A0A0A0A0A0AFF0A0AFF0AFF0AFFFF0A0AFF0A0AFF0AFF0A0A0A0A0A0AFFFF0A0A0A0A0A0AFF0A0A0AFFFFFF0AFF0A0AFF0A0A0AFF0AFF0A0A0A0A0A0AFFFF0A0A0A0A0A0AFFFFFF0A0A0AFF0AFF0A0AFFFFFF0A0AFF0A0A0A0A0A0A0AFFFF0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0AFFFF0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0AFFFF0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000FA8100000000000000000000000000000000FFFF000000000000000000FA0000FAFA00818100000000000000000000000000FFFF000000000000000081FAFAFAFA8181FAFA00000000000000000000000000FFFF000000000000000000FAFAFAFAFAFAFAFA00810000000000000000000000FFFF00000000000081FAFAFAFA56FA5656FAFAFAFAFA00000000000000000000FFFF00000000000081FAFAFA560000000056FAFAFA0000000000000000000000FFFF0000000000000081FA5600000000000056FAFA0000000000000000000000FFFF000000000081FA81FA56000000000000FAFAFAFAFA000000000000000000FFFF0000000000FAFAFAFAFA00000000000056FA81FA81000000000000000000FFFF00000000000000FAFA5600000000000056FA810000000000000000000000FFFF00000000000000FAFAFA560000000056FAFAFA810081FA00000000000000FFFF000000000000FAFAFAFAFA5656FA56FAFAFA2BFC00818100FC2B00000000FFFF000000000000008100FAFAFAFAFAFAFAFA00818181818181818100000000FFFF000000000000000000FAFA8181FAFAFAFA81008181000081810000000000FFFF000000000000000000818100FAFA0000FAFA818100000000818181000000FFFF00000000000000000000000081FA000000818181000000008181FA000000FFFF000000000000000000000000000000000000008181000081810000000000FFFF000000000000000000000000000000000000818181818181818100000000FFFF0000000000000000000000000000000000002BFC00818100FC2B00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF002900000012000000020000000D01000000000100000000000A000000080000000000240024002900000012000000020000000D00B2B2B900010000000000100000001000000002002300000000000000000023002900000012000000020000000D00FCFCFD00010000000000100000001000000002002200010001000100010022002900000012000000020000000D00B2B2B900010000000000100000001000000002000000240024002400240000002900000012000000020000000D0080808A00010000000000100000001000000002000100230023002300230001 - Actor Framework - true - LabVIEW - - - - - - - Install Support\Pre-Install Custom Action.vi - - - Install Support\Post-Uninstall Custom Action.vi - - Actor Framework.vipc - - Backport of Actor Framework 2024 for 2020 and later. - - Copyright (c) 2024, NI - John Doe (Acme Corp) - - - - - - false - true - <vi.lib> - - - false - true - - - - false - true - - - - true - - - - true - - - - false - true - - - - false - true - - - - false - true - - - - false - true - - - - false - true - - - - false - true - - - - false - true - - - - Debug - false - true - <resource> - - - Install Support - false - true - <vi.lib>\ActorFramework - - - - - . - 0 - false - 0 - - - ActorFramework - 0 - false - 0 - - - AFDebug - 0 - true - 0 - - - Install Support - 0 - true - 1 - - - . - - false - - - . - Prefix - - - - _actorframework_experttools.mnu - - - _actorframework_msgqueuepair.mnu - - - Actor Framework Core.lvproj - - - actorframework.mnu - - - Install Support/Populate Zip File.vi - - - Install Support/Restore Framework.vi - - - Install Support/Stash Framework.vi - - - - - - ..\LICENSE.txt - - - - false - - - - - - <random:32> - false - - - - false - - - Default - false - justACS - 000004DA002900000012000000020000000D00FFFFFF000100000000000A0000000800000000002000200028000002410000020D000000040007001D00180000000000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF000000FFFFFF000000FFFFFFFFFFFF000000000000FFFFFF000000000000000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000000000FFFFFF000000FFFFFF000000FFFFFF000000FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFF000000FFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFF000000FFFFFF000000FFFFFF000000000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000000000000000FFFFFF000000FFFFFFFFFFFF000000000000FFFFFFFFFFFF000000FFFFFF000000FFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFF000000FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000FFFFFF000000000000000000FFFFFF000000000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFF000000FFFFFFFFFFFF000000FFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000007F54DC89FF5509527F5589D37F544950FFDD894B7F0000007F002900000012000000020000000D00CCCCFF000100000000000A0000000800190000002000200028000002410000020D001900040020001D00180000000000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C0000FFFFFF6C0000FFFFFF6C0000FFFFFFFFFFFF6C00006C0000FFFFFF6C00006C00006C0000FFFFFFFFFFFF6C0000FFFFFFFFFFFFFFFFFF6C0000FFFFFFFFFFFF6C00006C0000FFFFFF6C0000FFFFFF6C0000FFFFFF6C0000FFFFFF6C0000FFFFFFFFFFFFFFFFFFFFFFFF6C0000FFFFFFFFFFFF6C0000FFFFFF6C0000FFFFFF6C0000FFFFFFFFFFFF6C0000FFFFFFFFFFFFFFFFFF6C0000FFFFFF6C0000FFFFFF6C0000FFFFFF6C00006C0000FFFFFFFFFFFFFFFFFF6C0000FFFFFFFFFFFF6C00006C00006C0000FFFFFF6C0000FFFFFFFFFFFF6C00006C0000FFFFFFFFFFFF6C0000FFFFFF6C0000FFFFFF6C0000FFFFFFFFFFFFFFFFFF6C0000FFFFFFFFFFFF6C0000FFFFFFFFFFFF6C0000FFFFFF6C0000FFFFFF6C0000FFFFFFFFFFFFFFFFFFFFFFFF6C00006C00006C0000FFFFFF6C00006C00006C0000FFFFFF6C00006C0000FFFFFFFFFFFFFFFFFF6C0000FFFFFFFFFFFF6C0000FFFFFF6C0000FFFFFFFFFFFF6C0000FFFFFF6C00006C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000007F54DC89FF5509527F5589D37F544950FFDD894B7F0000007F - - Controls - <menus>\Controls - - - - Functions - <menus>\Categories - - - false - false - - - - true - true - true - true - true - true - false - true - true - true - true - true - true - - - false - false - false - false - - - false - {product_name} {version_number} -{author_name} - {company_name} -{copyright} - - - - - \ No newline at end of file diff --git a/Core/Menus/Categories/Data Communication/_actorframework_experttools.mnu b/Core/Menus/Categories/Data Communication/_actorframework_experttools.mnu new file mode 100644 index 0000000..b46496a Binary files /dev/null and b/Core/Menus/Categories/Data Communication/_actorframework_experttools.mnu differ diff --git a/Core/_actorframework_msgqueuepair.mnu b/Core/Menus/Categories/Data Communication/_actorframework_msgqueuepair.mnu similarity index 100% rename from Core/_actorframework_msgqueuepair.mnu rename to Core/Menus/Categories/Data Communication/_actorframework_msgqueuepair.mnu diff --git a/Core/Menus/Categories/Data Communication/_actorframework_testsupport.mnu b/Core/Menus/Categories/Data Communication/_actorframework_testsupport.mnu new file mode 100644 index 0000000..0279eb8 Binary files /dev/null and b/Core/Menus/Categories/Data Communication/_actorframework_testsupport.mnu differ diff --git a/Core/Menus/Categories/Data Communication/actorframework.mnu b/Core/Menus/Categories/Data Communication/actorframework.mnu new file mode 100644 index 0000000..25906d2 Binary files /dev/null and b/Core/Menus/Categories/Data Communication/actorframework.mnu differ diff --git a/Core/Menus/Categories/Data Communication/readonly.txt b/Core/Menus/Categories/Data Communication/readonly.txt new file mode 100644 index 0000000..e69de29 diff --git a/Core/Menus/Controls/actorframework_controls.mnu b/Core/Menus/Controls/actorframework_controls.mnu new file mode 100644 index 0000000..1941146 Binary files /dev/null and b/Core/Menus/Controls/actorframework_controls.mnu differ diff --git a/Core/_actorframework_experttools.mnu b/Core/_actorframework_experttools.mnu deleted file mode 100644 index 479f483..0000000 Binary files a/Core/_actorframework_experttools.mnu and /dev/null differ diff --git a/Core/actorframework.mnu b/Core/actorframework.mnu deleted file mode 100644 index 8a8a7d6..0000000 Binary files a/Core/actorframework.mnu and /dev/null differ diff --git a/Documentation/Manual Test Scripts/Manual Test Script for Actor Framework Project Providers.docx b/Documentation/Manual Test Scripts/Manual Test Script for Actor Framework Project Providers.docx index ecb1c10..972b642 100644 Binary files a/Documentation/Manual Test Scripts/Manual Test Script for Actor Framework Project Providers.docx and b/Documentation/Manual Test Scripts/Manual Test Script for Actor Framework Project Providers.docx differ diff --git a/Documentation/Workflows/releases-and-artifacts.md b/Documentation/Workflows/releases-and-artifacts.md new file mode 100644 index 0000000..7f9578c --- /dev/null +++ b/Documentation/Workflows/releases-and-artifacts.md @@ -0,0 +1,229 @@ +# Actor Framework Release Workflows + +This document contains information used to create the release artifacts using GitHub Actions workflows for the Actor Framework repository. + +## Workflows + +### 1. Create Distribution Artifact (`create-distribution-artifact.yml`) + +Creates a structured artifact containing Actor Framework files organized in the correct directory layout for LabVIEW installation. The workflow yml can be found [here](/.github/workflows/create-distribution-artifact.yml). + +**Triggers:** +- Manual dispatch via GitHub Actions UI +- Reusable workflow (called by other workflows) + +**Artifact Structure:** +``` +/ +β”œβ”€β”€ vi.lib/ +β”‚ └── ActorFramework/ # From Core/ActorFramework/ +β”œβ”€β”€ resource/ +β”‚ β”œβ”€β”€ AFDebug/ # From Core/AFDebug/ +β”‚ └── Framework/ +β”‚ └── Providers/ # From Providers/ +└── menus/ # From Core/Menus/ +``` + +**Excluded Files:** +- `*.lvproj` - LabVIEW project files +- `*.vipb` - VI Package Builder files +- `*.aliases` - LabVIEW aliases files +- `*.lvlps` - LabVIEW project settings +- Paths listed in [`pipeline/config/artifact-exclusions.txt`](../../pipeline/config/artifact-exclusions.txt) + +**Manual Usage:** +1. Go to Actions tab in GitHub +2. Select "Create Distribution Artifact" workflow +3. Click "Run workflow" +4. Download the `actor-framework-distribution` artifact + +**Reusable Workflow Inputs:** +- `upload-artifact` (boolean, default: false) - Whether to upload as GitHub artifact + +### 2. Create Release (`release.yml`) + +Automatically creates a GitHub release with the distribution artifact when a version tag is pushed. The workflow yml can be found [here](/.github/workflows/release.yml). + +**Triggers:** +- Push of tags matching pattern `v*.*.*` (e.g., `v2.0.0`, `v1.0.1`, `v2.0.0.5`, `v1.0.0.0-rc`) + +**Process:** +1. Calls `create-distribution-artifact.yml` workflow +2. Downloads the created artifact +3. Compresses it into `actor-framework-distribution.zip` +4. Creates a GitHub release with: + - The ZIP file as release asset + - Auto-generated release notes + +**Usage:** +```bash +# Create and push a version tag +git tag v2.0.0.18 +git push origin v2.0.0.18 + +# The workflow runs automatically and creates the release +``` + +**Release Assets:** +- `actor-framework-distribution.zip` - Contains the complete framework in proper directory structure + +## Configuration Files + +### `pipeline/config/artifact-exclusions.txt` + +Text file containing paths to exclude from the distribution artifact. See the file [here](../../pipeline/config/artifact-exclusions.txt). + +**Format:** +- One path per line (relative to repository root) +- Lines starting with `#` are comments +- Empty lines are ignored +- Use backslashes for Windows paths: `Providers\Install Support` + +**Example:** +```text +# Installation support files +Providers\Install Support + +# Example exclusions (commented out) +# Examples\TestData +# Core\DeprecatedFeatures +``` + +**To add new exclusions:** +1. Edit `pipeline/config/artifact-exclusions.txt` +2. Add the path on a new line +3. Commit and push changes +4. Next workflow run will use updated exclusions + +## Scripts + +### `pipeline/scripts/Create_Distribution_Artifact.ps1` + +PowerShell script that handles the actual file copying and artifact structure creation. See the script [here](../../pipeline/scripts/Create_Distribution_Artifact.ps1). + +**Parameters:** +- `ExclusionFile` (string, optional) - Path to file containing exclusion patterns + - Default: `$PSScriptRoot\..\config\artifact-exclusions.txt` + +**Example:** +```powershell +# Use default exclusion file +.\pipeline\scripts\Create_Distribution_Artifact.ps1 + +# Use custom exclusion file +.\pipeline\scripts\Create_Distribution_Artifact.ps1 -ExclusionFile "path\to\custom-exclusions.txt" +``` + +**Logic:** +1. Reads exclusion paths from configuration file +2. Creates staging directory structure +3. Copies files from source directories +4. Excludes files based on: + - File extensions: `*.lvproj`, `*.vipb`, `*.aliases`, `*.lvlps` + - Paths listed in exclusion file +5. Maintains relative directory structure within each target location +6. Logs all excluded files and paths for troubleshooting + +## Development Guidelines + +### Adding New Exclusions + +**Recommended Method:** Edit the exclusion configuration file + +1. Open `pipeline/config/artifact-exclusions.txt` +2. Add new paths (one per line): + ```text + # Your comment explaining why + Path\To\Exclude + ``` +3. Commit and push changes + +**Alternative Method:** Override in workflow (not recommended for permanent exclusions) + +```yaml +- name: Create framework artifact structure + shell: pwsh + run: | + & "${{ github.workspace }}\pipeline\scripts\Create_Distribution_Artifact.ps1" -ExclusionFile "custom-exclusions.txt" +``` + +### Adding New File Extension Exclusions + +Edit `Create_Distribution_Artifact.ps1` and add to `$excludeExtensions`: + +```powershell +$excludeExtensions = @('*.lvproj', '*.vipb', '*.aliases', '*.lvlps', '*.your-extension') +``` + +### Adding New Source Directories + +Update `Create_Distribution_Artifact.ps1`: + +```powershell +# Add new directory creation +New-Item -ItemType Directory -Force -Path "$stagingDir\your\target\path" + +# Add copy operation +Copy-WithExclusions -SourcePath "Source\Path" -DestPath "$stagingDir\your\target\path" -Label "Description" +``` + +### Testing Changes + +Before pushing changes: + +1. **Test locally:** + ```powershell + cd c:\dev\actor-framework + .\pipeline\scripts\Create_Distribution_Artifact.ps1 + # Inspect artifact-staging/ directory + ``` + +2. **Test via workflow:** + - Go to Actions β†’ "Create Distribution Artifact" + - Click "Run workflow" + - Download and verify artifact contents + +3. **Test release workflow (use test tag):** + ```bash + git tag v0.0.0-test + git push origin v0.0.0-test + # Delete after testing: git push --delete origin v0.0.0-test + ``` + +## Troubleshooting + +### Artifact is missing files +- Check workflow logs for exclusion warnings +- Verify source directories exist and contain expected files +- Review `pipeline/config/artifact-exclusions.txt` for unintended exclusions +- Ensure file extensions aren't in the `$excludeExtensions` list + +### Exclusions not working +- Verify exclusion file path is correct +- Check for typos in paths (case-sensitive on some systems) +- Ensure paths use backslashes: `Providers\Install Support` +- Review workflow logs for "Loaded X exclusion path(s)" message + +### Release workflow not triggering +- Verify tag matches pattern `v*.*.*` +- Check that tag was pushed to remote: `git push origin ` +- Review Actions tab for any errors +- Ensure you have permissions to create releases + +### Path issues on Windows +- The script normalizes paths (`/` β†’ `\`) +- Use backslashes in exclusion file: `Providers\Install Support` +- Paths are relative to repository root +- Wildcards are supported in path matching + +### Script fails to find exclusion file +- Default location: `pipeline\config\artifact-exclusions.txt` +- Verify file exists and is committed to repository +- Check file is not excluded by `.gitignore` +- Use `-ExclusionFile` parameter to specify custom path + +## Related Documentation + +- [GitHub Actions Documentation](https://docs.github.com/en/actions) +- [Reusable Workflows](https://docs.github.com/en/actions/using-workflows/reusing-workflows) +- [Creating Releases](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository) \ No newline at end of file diff --git a/Providers/AFPP 2024 for 2020.lvproj b/Providers/AFPP 2024 for 2020.lvproj index 3244055..1161c01 100644 --- a/Providers/AFPP 2024 for 2020.lvproj +++ b/Providers/AFPP 2024 for 2020.lvproj @@ -99,18 +99,19 @@ - + + @@ -134,6 +135,7 @@ + @@ -168,10 +170,12 @@ + + @@ -183,6 +187,8 @@ + + @@ -224,6 +230,9 @@ + + true + diff --git a/Providers/AddActorInterface/CreateNewWizard_IncludeItem.vi b/Providers/AddActorInterface/CreateNewWizard_IncludeItem.vi index ad2eb33..6b2676f 100644 Binary files a/Providers/AddActorInterface/CreateNewWizard_IncludeItem.vi and b/Providers/AddActorInterface/CreateNewWizard_IncludeItem.vi differ diff --git a/Providers/MessageMakerProvider/AFPP Shared/AFPP Shared.lvlib b/Providers/MessageMakerProvider/AFPP Shared/AFPP Shared.lvlib index 41875e0..335757d 100644 --- a/Providers/MessageMakerProvider/AFPP Shared/AFPP Shared.lvlib +++ b/Providers/MessageMakerProvider/AFPP Shared/AFPP Shared.lvlib @@ -1,7 +1,6 @@ ο»Ώ )!#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!)`!!!*Q(C=\>7^41."%)<B\R!"K4N!DJ"-.CWY"<=Q,4CV*1)81$)NO!5X1$#C!]=1O18T\HKQE0AR%C!)O'0A`/XN\O/^V3(VYU)[V`\5-@HQ_(2\OWCD\:]PXGK@^.J0[PJ&_S&_\PK[@Z>7`W0H6`X@<``S^XOX`=3B`_0`_.VD=8+4`PC?(>2?2&2314FF;F0NETT*ETT*ETT*ATT)ATT)ATT)H>T*H>T*H>T*D>T)D>T)D>T)_UEO=J',(&)S?4*2-GAS1()T&#7`%E`C34S*BY^+0)EH]33?R--N3DS**`%EHM2$.S7?R*.Y%E`C9;AOS8[3YUE]$+`!%XA#4_!*0%SJQ"-!AMG#A9."9#BI$#Y#4_!*0&QK]!3?Q".Y!A`.#DS"*`!%HM"$F\YKU48N*-@$-()]DM@R/"\(Q^"S0)\(]4A?R].U=DS/RU%Y%TK$1Z$4S<H"_?"Y(!^`Z(A=D_.R0)[(JP[%P+^-U\34()`B-4S'R`!9(I;1Y4%]BM@Q'"['F?%R0)<(]"A?JJ,B-4S'RY!9ET+^D-'-DM:.2G"Y_/G\R@J4CC[R@EKV?67<5L8:6*N)N4F5$VXV-&503<8YKE66,::K%62@4I679634K$KX'\8D^Z<;5'NK2=WJ'47FRN3I>@XG'X?\H<<<L4;<D><LN6;LF?<TO7;TG;<4K=<DM5;DU@%V=-FZ@#%=XEM,LHP>0QS,O^PF]PJB7$\?$-OLG_(92PX1`^)`]'\5G6[/SRI^!=(HA&M!!!!! - 536903680 1.0.0.0 true 49 53 48 48 56 48 50 57 13 0 0 0 0 1 23 21 76 111 97 100 32 38 32 85 110 108 111 97 100 46 108 118 99 108 97 115 115 0 0 1 0 0 0 0 0 9 0 0 13 38 1 100 1 100 80 84 72 48 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 15 13 76 97 121 101 114 46 108 118 99 108 97 115 115 0 0 1 0 0 0 0 0 7 0 0 12 182 0 0 0 0 0 0 0 0 0 0 12 158 0 40 0 0 12 152 0 0 12 0 0 0 0 0 0 32 0 32 0 24 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 0 0 0 0 0 0 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 0 0 0 0 0 0 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 0 0 0 0 0 0 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 0 0 0 0 0 0 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 0 0 0 0 0 0 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 0 0 0 0 0 0 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 0 0 0 0 0 0 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 0 0 0 0 0 0 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 0 0 0 0 0 0 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 70 105 108 108 100 1 0 2 0 0 0 4 65 70 80 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 83 109 97 108 108 32 70 111 110 116 115 0 1 8 1 0 @@ -13,6 +12,7 @@ + diff --git a/Providers/MessageMakerProvider/AFPP Shared/Root Actor Class Is Loaded.vi b/Providers/MessageMakerProvider/AFPP Shared/Root Actor Class Is Loaded.vi new file mode 100644 index 0000000..6072bba Binary files /dev/null and b/Providers/MessageMakerProvider/AFPP Shared/Root Actor Class Is Loaded.vi differ diff --git a/Providers/MessageMakerProvider/_Message Maker/_support/Is Actor Class or Interface.vi b/Providers/MessageMakerProvider/_Message Maker/_support/Is Actor Class or Interface.vi index e45fe1b..cfd1311 100644 Binary files a/Providers/MessageMakerProvider/_Message Maker/_support/Is Actor Class or Interface.vi and b/Providers/MessageMakerProvider/_Message Maker/_support/Is Actor Class or Interface.vi differ diff --git a/Providers/MessageMakerProvider/_Message Maker/_support/Root Actor Class Is Loaded.vi b/Providers/MessageMakerProvider/_Message Maker/_support/Root Actor Class Is Loaded.vi deleted file mode 100644 index ea122e2..0000000 Binary files a/Providers/MessageMakerProvider/_Message Maker/_support/Root Actor Class Is Loaded.vi and /dev/null differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..1be45c0 --- /dev/null +++ b/README.md @@ -0,0 +1,108 @@ +[![Discord](https://img.shields.io/discord/1319915996789739540?label=chat&logo=discord&style=flat)](https://discord.gg/q4d3ggrFVA) +![CodingΒ hours](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/ni/actor-framework/metrics/badge.json) + +# 🧩 Actor Framework + + + + + +> **Actor Framework 2.0.0.18 Β· Released 24 Apr 2025**\ +> *Back-ported from LabVIEW 2024 Q3 for LabVIEW 2020 or later* + +## ✨ What’s New + +| # | Feature | Why it matters | +| -- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | +| 1 | **AF Debug.lvlib merged into Actor Framework.lvlib** β€” DETT tracing is now encapsulated in `DETT Format.lvclass` implementing `Trace Format.lvclass`. | Consolidates debug utilities into a single library and makes it easier to extend trace formats. | +| 2 | **`Generate Trace.vi`**\*\* loads trace formats dynamically\*\* (defaults to `DETT Format.lvclass`; override via `AFDebugTraceFormat` INI token). | Plug-in architecture lets you swap in custom trace sinks without recompiling the framework. | +| 3 | **Automatic actor registration** β€” `Actor.vi` no longer sends *Register Actor Msg*; registration is performed inside `Actor Core.vi` just before message handling begins. | Removes boilerplate and speeds up actor startup. | +| 4 | **`Stop Autostop Nested Actors.vi`** (protected) | Gives parent actors a β€œrogue-child panic button” to halt all autostop children while the parent keeps running. | +| 5 | **Testing Support Palette** β€” Adds `Launch Actor.vi`, `Init Actor Queues FOR TESTING ONLY.vi`, and `Test Launch for Nested Actor Without Caller.vi`. | Enables fast, headless unit testing of actors in CI pipelines. | +| 6 | **Enqueuer / Last-Ack controls & constants now on palettes** | Makes common datatype constants drag-and-drop accessible in development. | +| 7 | **Improved PPL build experience** β€” Specialty messages (Batch, Reply, Report Error, Self-Addressed) are now inside libraries; legacy copies are deprecated. | Simplifies PPL builds and avoids duplicate symbol errors. | + +*For expanded notes, and a list of breaking changes, see the full [2.0.0.18 release page](https://github.com/ni/actor-framework/releases/tag/v2.0.0.18).* + +--- + +## Overview + +Actor Framework (AF) is NI’s reference implementation of the Actor Model in LabVIEW. It enables large-scale, message-oriented applications with asynchronous actors that can be launched, monitored, and shut down predictably. This repo is the **canonical upstream** for AF beginning with v2.x and is maintained under the MIT license. + +- **Primary LabVIEW target:** 2020 SP1 or later (32- & 64-bit) +- **Package format:** VIPM (`.vip`) built by GitHub Actions for every merge to `main` and tagged release. + +--- + +## Getting Started + +1. **Install the latest package** from the [Releases](https://github.com/ni/actor-framework/releases) page or drag-and-drop the `.vip` onto VIPM. +2. Open `Examples/Actor Framework/` in LabVIEW to explore sample projects. +3. For IDE palette integration, restart LabVIEW after installation. + +--- + +## Contributing + +We welcome both code and non-code contributions – everything from bug fixes and performance tweaks to documentation, testing, and discussion. + +### Contributor License Agreement (CLA) + +External contributors must sign NI’s CLA once per GitHub account. A bot will prompt you on your first pull request; if not, NI staff will reach out directly. + +### Standard Feature Workflow + +1. **Check or Create an Issue**\ + β€’ Discuss ideas on [Discord](https://discord.gg/q4d3ggrFVA) or [open a GitHub Discussion](https://github.com/ni/actor-framework/discussions).\ + β€’ Once approved, the Steering Committee applies the label **[`Workflow: Open to contribution`](issues?q=is%3Aopen+label%3A%22Workflow%3A+Open+to+contribution%22)**. +2. **Assignment**\ + β€’ Comment on any issue labeled [Workflow: Open to Contribution](https://github.com/ni/actor-framework/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22Workflow%3A%20Open%20to%20contribution%22).\ + β€’ A maintainer assigns you and NI creates the feature branch. +3. **First-Time Setup**\ + β€’ Follow the steps in [`docs/self-hosted-runner.md`](docs/self-hosted-runner.md) *(in progress)* to register a self-hosted runner if you need one.\ + β€’ Fork the repository to your GitHub account. +4. **Feature Development**\ + β€’ Clone (or sync) your fork.\ + β€’ Implement changes and push to **`develop`** in your fork. +5. **Build**\ + β€’ CI builds a `.vip` and posts it as a **pre-release** on *your fork’s* Releases page. +6. **Test**\ + β€’ Install the pre-release package and verify the issue is resolved.\ + β€’ *Note: the company name of your package will show the fork’s owner instead of β€œNI”.* +7. **Pull Request**\ + β€’ Open a PR targeting the feature branch in the upstream repo.\ + β€’ Sign the CLA if the contribution is intended to ship with LabVIEW.\ + β€’ The Steering Committee and maintainers review, test, and iterate. +8. **Merge & Release**\ + β€’ After approval, the PR is eventually merged into **`main`**.\ + β€’ The functionality appears in the next LabVIEW release, and the GitHub release stream provides interim bug-fix and feature drops. + +### Other Ways to Help + +- **[Test Actor Framework 2.0](https://github.com/ni/actor-framework/discussions/100)** +- **Improve Docs** – README, [`CONTRIBUTING.md`](CONTRIBUTING.md), Wiki. + +--- + +## Governance & Communication & Communication + +Actor Framework follows the same open-governance model as the LabVIEW Icon Editor: + +- **Technical Steering Committee (SteerCo):** NI staff & community architects oversee roadmap and reviews. +- **BDFL:** NI retains final decision power for major direction changes. +- **Discord:** Join the **NI Open Source Discord** for real-time chat. + +--- + +## License + +This project is licensed under the **MIT License**. By contributing, you agree to license your work under these terms so NI and the LabVIEW community can incorporate it into future LabVIEW distributions. + +--- + +## Acknowledgements + +We thank the LabVIEW community & the contributors who made Actor Framework 2.0 possible. Special thanks to @niACS, @CaseyZS, for leading the 2024 Q3 back-port initiative. + +--- diff --git a/badge.json b/badge.json new file mode 100644 index 0000000..6212a28 --- /dev/null +++ b/badge.json @@ -0,0 +1,6 @@ +{ + "schemaVersion": 1, + "label": "Coding hours", + "message": "130h", + "color": "informational" +} diff --git a/pipeline/config/artifact-exclusions.txt b/pipeline/config/artifact-exclusions.txt new file mode 100644 index 0000000..5e580a1 --- /dev/null +++ b/pipeline/config/artifact-exclusions.txt @@ -0,0 +1,9 @@ +# Artifact Exclusion List +# One path per line, relative to repository root +# Lines starting with # are comments + +# Installation support files +Providers\Install Support + +# Add future exclusions here +# Examples\TestData \ No newline at end of file diff --git a/pipeline/scripts/Create_Distribution_Artifact.ps1 b/pipeline/scripts/Create_Distribution_Artifact.ps1 new file mode 100644 index 0000000..401e5f5 --- /dev/null +++ b/pipeline/scripts/Create_Distribution_Artifact.ps1 @@ -0,0 +1,95 @@ +param( + [string]$ExclusionFile = "$PSScriptRoot\..\config\artifact-exclusions.txt" +) + +# Create artifact staging directory +$stagingDir = "artifact-staging" +New-Item -ItemType Directory -Force -Path $stagingDir +New-Item -ItemType Directory -Force -Path "$stagingDir\vi.lib\ActorFramework" +New-Item -ItemType Directory -Force -Path "$stagingDir\resource\AFDebug" +New-Item -ItemType Directory -Force -Path "$stagingDir\resource\Framework\Providers" +New-Item -ItemType Directory -Force -Path "$stagingDir\menus" + +# Define exclusion patterns +$excludeExtensions = @('*.lvproj', '*.vipb', '*.aliases', '*.lvlps') + +# Parse path exclusions from file +$excludePathsList = @() +if (Test-Path $ExclusionFile) { + Write-Host "Reading exclusions from: $ExclusionFile" + $excludePathsList = Get-Content $ExclusionFile | + Where-Object { $_ -notmatch '^\s*#' -and $_ -notmatch '^\s*$' } | + ForEach-Object { $_.Trim() } + + Write-Host "Loaded $($excludePathsList.Count) exclusion path(s)" +} else { + Write-Warning "Exclusion file not found: $ExclusionFile" +} + +# Helper function to check if path should be excluded +function Test-PathExcluded { + param($FilePath) + + foreach ($excludePath in $excludePathsList) { + $normalizedExclude = $excludePath -replace '/', '\' + if ($FilePath -like "*$normalizedExclude*") { + return $true + } + } + return $false +} + +# Helper function to copy files with exclusions +function Copy-WithExclusions { + param($SourcePath, $DestPath, $Label) + + Write-Host "Copying $Label" + Get-ChildItem -Path $SourcePath -Recurse -File | ForEach-Object { + $excluded = $false + + # Check file extension exclusions + foreach ($pattern in $excludeExtensions) { + if ($_.Name -like $pattern) { + Write-Warning "Excluding file: $($_.FullName)" + $excluded = $true + break + } + } + + # Check path exclusions + if (-not $excluded -and (Test-PathExcluded -FilePath $_.FullName)) { + Write-Warning "Excluding path: $($_.FullName)" + $excluded = $true + } + + if (-not $excluded) { + $relativePath = $_.FullName.Substring((Resolve-Path $SourcePath).Path.Length + 1) + $destFilePath = Join-Path $DestPath $relativePath + $destDir = Split-Path -Parent $destFilePath + + if (-not (Test-Path $destDir)) { + New-Item -ItemType Directory -Force -Path $destDir | Out-Null + } + + Copy-Item -Path $_.FullName -Destination $destFilePath -Force + Write-Host "Copied: $relativePath" + } + } +} + +# Copy Core\ActorFramework\ to vi.lib\ActorFramework\ +Copy-WithExclusions -SourcePath "Core\ActorFramework" -DestPath "$stagingDir\vi.lib\ActorFramework" -Label "Core\ActorFramework\ to vi.lib\ActorFramework\" + +# Copy Core\AFDebug\ to resource\AFDebug\ +Write-Host "`n" +Copy-WithExclusions -SourcePath "Core\AFDebug" -DestPath "$stagingDir\resource\AFDebug" -Label "Core\AFDebug\ to resource\AFDebug\" + +# Copy Core\Menus\ to menus\ +Write-Host "`n" +Copy-WithExclusions -SourcePath "Core\Menus" -DestPath "$stagingDir\menus" -Label "Core\Menus\ to menus\" + +# Copy Providers\ to resource\Framework\Providers\ +Write-Host "`n" +Copy-WithExclusions -SourcePath "Providers" -DestPath "$stagingDir\resource\Framework\Providers" -Label "Providers\ to resource\Framework\Providers\" + +Write-Host "`nArtifact preparation complete" \ No newline at end of file diff --git a/reports/git-hours-2025-07-24.txt b/reports/git-hours-2025-07-24.txt new file mode 100644 index 0000000..38749bd --- /dev/null +++ b/reports/git-hours-2025-07-24.txt @@ -0,0 +1,37 @@ +{ + "156447188+svelderrainruiz@users.noreply.github.com": { + "name": "156447188+svelderrainruiz@users.noreply.github.com", + "hours": 20, + "commits": 17 + }, + "Elijah.Kerry@gmail.com": { + "name": "Elijah.Kerry@gmail.com", + "hours": 0, + "commits": 1 + }, + "allencsmith149@yahoo.com": { + "name": "allencsmith149@yahoo.com", + "hours": 44, + "commits": 38 + }, + "niACS@users.noreply.github.com": { + "name": "niACS@users.noreply.github.com", + "hours": 0, + "commits": 1 + }, + "sergio.velderrain@emerson.com": { + "name": "sergio.velderrain@emerson.com", + "hours": 16, + "commits": 14 + }, + "sergio.velderrain@ni.com": { + "name": "sergio.velderrain@ni.com", + "hours": 50, + "commits": 103 + }, + "total": { + "name": "", + "hours": 130, + "commits": 174 + } +}