From 2ca45bc2ccfc7885b2560c4210c1b4fb109587da Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Mon, 20 Oct 2025 11:09:16 -0500 Subject: [PATCH 01/51] Update runlabview.sh changed the VI analyzer config --- runlabview.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runlabview.sh b/runlabview.sh index 1144094..2672acd 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -1,5 +1,5 @@ #!/bin/bash -CONFIG_FILE='/workspace/Test-VIs/viaPassCase.viancfg' +CONFIG_FILE='/workspace/Test-VIs/VIAnalyzerCfgFile.viancfg' LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' REPORT_PATH='/usr/local/natinst/ContainerExamples/Results.txt' MASSCOMPILE_DIR='/workspace/Test-VIs' From 15b38494070afa74c20dce9af4675256e235bda2 Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Tue, 28 Oct 2025 02:30:12 -0500 Subject: [PATCH 02/51] Update vi-analyzer-container.yml update yaml to pull from official ni labview docker image --- .github/workflows/vi-analyzer-container.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/vi-analyzer-container.yml b/.github/workflows/vi-analyzer-container.yml index 7c1e7f4..b94e8bf 100644 --- a/.github/workflows/vi-analyzer-container.yml +++ b/.github/workflows/vi-analyzer-container.yml @@ -15,15 +15,15 @@ jobs: uses: actions/checkout@v3 # Authenticate to Docker Hub - - name: Log in to GitHub Container Registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ secrets.GHCR_UNAME }} - password: ${{ secrets.GHCR_PAT }} + #- name: Log in to GitHub Container Registry + # uses: docker/login-action@v2 + # with: + # registry: ghcr.io + # username: ${{ secrets.GHCR_UNAME }} + #password: ${{ secrets.GHCR_PAT }} - name: Pull Docker Image from Docker Hub - run: docker pull ghcr.io/shivacode-2/labview:2025q3-linux-beta + run: docker pull nationalinstruments/labview:latest-linux - name: Run LabVIEWCLI Operations run: | From c4db1d9976410255923954fe3eff996a2c832b73 Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Tue, 28 Oct 2025 02:33:31 -0500 Subject: [PATCH 03/51] Update vi-analyzer-container.yml update yaml to use public docker image --- .github/workflows/vi-analyzer-container.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/vi-analyzer-container.yml b/.github/workflows/vi-analyzer-container.yml index b94e8bf..c1cf423 100644 --- a/.github/workflows/vi-analyzer-container.yml +++ b/.github/workflows/vi-analyzer-container.yml @@ -29,6 +29,6 @@ jobs: run: | docker run --rm \ -v "${{ github.workspace }}:/workspace" \ - ghcr.io/shivacode-2/labview:2025q3-linux-beta \ + nationalinstruments/labview:latest-linux \ bash -c "cd /workspace && chmod +x runlabview.sh && ./runlabview.sh" From c8de190f37d817241f67816356f7b24acb6159bf Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Tue, 28 Oct 2025 02:55:25 -0500 Subject: [PATCH 04/51] replacing Test config file with passing test --- runlabview.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runlabview.sh b/runlabview.sh index 2672acd..1144094 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -1,5 +1,5 @@ #!/bin/bash -CONFIG_FILE='/workspace/Test-VIs/VIAnalyzerCfgFile.viancfg' +CONFIG_FILE='/workspace/Test-VIs/viaPassCase.viancfg' LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' REPORT_PATH='/usr/local/natinst/ContainerExamples/Results.txt' MASSCOMPILE_DIR='/workspace/Test-VIs' From e9111eb84f62c8bf2370c753573c28be50fbed11 Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Mon, 3 Nov 2025 20:36:11 +0800 Subject: [PATCH 05/51] Update runlabview.sh adding to LVContainer.txt --- runlabview.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/runlabview.sh b/runlabview.sh index 1144094..c547e3d 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -11,6 +11,8 @@ if [ ! -f "$CONFIG_FILE" ]; then fi +echo "1" > /tmp/natinst/LVContainer.txt + echo "Running LabVIEWCLI MassCompile with following parameters:" echo "DirectorytoCompile: $MASSCOMPILE_DIR" From 8fa0305454e880e704703caa082361a082a3985e Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Mon, 3 Nov 2025 20:44:26 +0800 Subject: [PATCH 06/51] Create temporary directory for LabVIEW compilation --- runlabview.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runlabview.sh b/runlabview.sh index c547e3d..f176168 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -10,7 +10,7 @@ if [ ! -f "$CONFIG_FILE" ]; then exit 1 fi - +mkdir -p "/tmp/natinst" echo "1" > /tmp/natinst/LVContainer.txt echo "Running LabVIEWCLI MassCompile with following parameters:" From e9b9e4b6bb6eec2a3c8c7a908c6885d342d978ae Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Mon, 3 Nov 2025 21:01:12 +0800 Subject: [PATCH 07/51] Make LV CLI verbose --- runlabview.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runlabview.sh b/runlabview.sh index f176168..bdfd6fa 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -19,7 +19,8 @@ echo "DirectorytoCompile: $MASSCOMPILE_DIR" OUTPUT_MASSCOMPILE=$(LabVIEWCLI -LogToConsole TRUE \ -OperationName MassCompile \ -DirectoryToCompile $MASSCOMPILE_DIR \ --LabVIEWPath $LABVIEW_PATH) +-LabVIEWPath $LABVIEW_PATH \ +-Verbosity Diagnostic) echo " " echo "Done Running Masscompile Operation" From 2d8dc608c15ec158a26ee1347bb7cad8e8e7323d Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Mon, 3 Nov 2025 21:30:54 +0800 Subject: [PATCH 08/51] Update Docker image version in workflow --- .github/workflows/vi-analyzer-container.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/vi-analyzer-container.yml b/.github/workflows/vi-analyzer-container.yml index c1cf423..293c7d3 100644 --- a/.github/workflows/vi-analyzer-container.yml +++ b/.github/workflows/vi-analyzer-container.yml @@ -23,7 +23,7 @@ jobs: #password: ${{ secrets.GHCR_PAT }} - name: Pull Docker Image from Docker Hub - run: docker pull nationalinstruments/labview:latest-linux + run: docker pull nationalinstruments/labview:2025q3-linux - name: Run LabVIEWCLI Operations run: | From 338ee59de7f34053e0ea5760e8937c69d2e10b7a Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Mon, 3 Nov 2025 21:34:51 +0800 Subject: [PATCH 09/51] Fix syntax error in runlabview.sh --- runlabview.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/runlabview.sh b/runlabview.sh index bdfd6fa..f176168 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -19,8 +19,7 @@ echo "DirectorytoCompile: $MASSCOMPILE_DIR" OUTPUT_MASSCOMPILE=$(LabVIEWCLI -LogToConsole TRUE \ -OperationName MassCompile \ -DirectoryToCompile $MASSCOMPILE_DIR \ --LabVIEWPath $LABVIEW_PATH \ --Verbosity Diagnostic) +-LabVIEWPath $LABVIEW_PATH) echo " " echo "Done Running Masscompile Operation" From e9b37f2dae0cbad5519aebdc4c40c10d645d03ce Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Mon, 3 Nov 2025 21:35:25 +0800 Subject: [PATCH 10/51] Update LabVIEW Docker image version in workflow --- .github/workflows/vi-analyzer-container.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/vi-analyzer-container.yml b/.github/workflows/vi-analyzer-container.yml index 293c7d3..b21ecd0 100644 --- a/.github/workflows/vi-analyzer-container.yml +++ b/.github/workflows/vi-analyzer-container.yml @@ -29,6 +29,6 @@ jobs: run: | docker run --rm \ -v "${{ github.workspace }}:/workspace" \ - nationalinstruments/labview:latest-linux \ + nationalinstruments/labview:2025q3-linux \ bash -c "cd /workspace && chmod +x runlabview.sh && ./runlabview.sh" From b8a50f50f17c81f0d1ca8804a963b08d0ab3b894 Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Tue, 4 Nov 2025 04:35:06 -0600 Subject: [PATCH 11/51] Update Tests Cases to Fail --- runlabview.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/runlabview.sh b/runlabview.sh index f176168..5febf90 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -1,6 +1,5 @@ #!/bin/bash -CONFIG_FILE='/workspace/Test-VIs/viaPassCase.viancfg' -LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' +CONFIG_FILE='/workspace/Test-VIs/VIAnalyzerCfgFile.viancfg' REPORT_PATH='/usr/local/natinst/ContainerExamples/Results.txt' MASSCOMPILE_DIR='/workspace/Test-VIs' From 7a1aa5f807c442de3f812922e54156ecd267d4f2 Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Tue, 4 Nov 2025 04:39:29 -0600 Subject: [PATCH 12/51] Add LABVIEW_PATH variable to runlabview.sh --- runlabview.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/runlabview.sh b/runlabview.sh index 5febf90..dfb35a6 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -2,6 +2,7 @@ CONFIG_FILE='/workspace/Test-VIs/VIAnalyzerCfgFile.viancfg' REPORT_PATH='/usr/local/natinst/ContainerExamples/Results.txt' MASSCOMPILE_DIR='/workspace/Test-VIs' +LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' # Verify that the configuration file exists. if [ ! -f "$CONFIG_FILE" ]; then From 732092981977fb1e72284a63b1a7c8ebddcdea27 Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Tue, 4 Nov 2025 05:40:16 -0600 Subject: [PATCH 13/51] Update configuration file path in runlabview.sh --- runlabview.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runlabview.sh b/runlabview.sh index dfb35a6..503cae2 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -1,5 +1,5 @@ #!/bin/bash -CONFIG_FILE='/workspace/Test-VIs/VIAnalyzerCfgFile.viancfg' +CONFIG_FILE='/workspace/Test-VIs/viaPassCase.viancfg' REPORT_PATH='/usr/local/natinst/ContainerExamples/Results.txt' MASSCOMPILE_DIR='/workspace/Test-VIs' LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' From 007f6e95f652436759173ea8a961fa1d8e8a566b Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Tue, 4 Nov 2025 08:58:36 -0600 Subject: [PATCH 14/51] Update LabVIEW configuration file path --- runlabview.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runlabview.sh b/runlabview.sh index 503cae2..dfb35a6 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -1,5 +1,5 @@ #!/bin/bash -CONFIG_FILE='/workspace/Test-VIs/viaPassCase.viancfg' +CONFIG_FILE='/workspace/Test-VIs/VIAnalyzerCfgFile.viancfg' REPORT_PATH='/usr/local/natinst/ContainerExamples/Results.txt' MASSCOMPILE_DIR='/workspace/Test-VIs' LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' From 337b251bbe0d0bbcd706e6060184b3e661424a61 Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Tue, 4 Nov 2025 09:25:07 -0600 Subject: [PATCH 15/51] Update configuration file path in runlabview.sh --- runlabview.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runlabview.sh b/runlabview.sh index dfb35a6..503cae2 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -1,5 +1,5 @@ #!/bin/bash -CONFIG_FILE='/workspace/Test-VIs/VIAnalyzerCfgFile.viancfg' +CONFIG_FILE='/workspace/Test-VIs/viaPassCase.viancfg' REPORT_PATH='/usr/local/natinst/ContainerExamples/Results.txt' MASSCOMPILE_DIR='/workspace/Test-VIs' LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' From 5dc4d090a5ccca540a967a065219013b874e18f2 Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Tue, 4 Nov 2025 09:33:28 -0600 Subject: [PATCH 16/51] Update LabVIEW configuration file path --- runlabview.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runlabview.sh b/runlabview.sh index 503cae2..dfb35a6 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -1,5 +1,5 @@ #!/bin/bash -CONFIG_FILE='/workspace/Test-VIs/viaPassCase.viancfg' +CONFIG_FILE='/workspace/Test-VIs/VIAnalyzerCfgFile.viancfg' REPORT_PATH='/usr/local/natinst/ContainerExamples/Results.txt' MASSCOMPILE_DIR='/workspace/Test-VIs' LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' From 3ed7fcd609e1fc6b1d2b2054f4330a052876ff43 Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Tue, 4 Nov 2025 09:44:48 -0600 Subject: [PATCH 17/51] Update configuration file path in runlabview.sh --- runlabview.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runlabview.sh b/runlabview.sh index dfb35a6..503cae2 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -1,5 +1,5 @@ #!/bin/bash -CONFIG_FILE='/workspace/Test-VIs/VIAnalyzerCfgFile.viancfg' +CONFIG_FILE='/workspace/Test-VIs/viaPassCase.viancfg' REPORT_PATH='/usr/local/natinst/ContainerExamples/Results.txt' MASSCOMPILE_DIR='/workspace/Test-VIs' LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' From 8f593d2ebefaa6a9b9f8854c9619417000457650 Mon Sep 17 00:00:00 2001 From: Austin Hill Date: Fri, 16 Jan 2026 15:49:46 -0600 Subject: [PATCH 18/51] Update LabVIEW config file path in runlabview.sh --- runlabview.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runlabview.sh b/runlabview.sh index 503cae2..dfb35a6 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -1,5 +1,5 @@ #!/bin/bash -CONFIG_FILE='/workspace/Test-VIs/viaPassCase.viancfg' +CONFIG_FILE='/workspace/Test-VIs/VIAnalyzerCfgFile.viancfg' REPORT_PATH='/usr/local/natinst/ContainerExamples/Results.txt' MASSCOMPILE_DIR='/workspace/Test-VIs' LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' From 73e831577a6b7ac3c77f2e9032ce284f46c6bb90 Mon Sep 17 00:00:00 2001 From: gregr-ni <71788381+gregr-ni@users.noreply.github.com> Date: Fri, 16 Jan 2026 16:01:24 -0600 Subject: [PATCH 19/51] Update configuration file path in runlabview.sh --- runlabview.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runlabview.sh b/runlabview.sh index dfb35a6..503cae2 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -1,5 +1,5 @@ #!/bin/bash -CONFIG_FILE='/workspace/Test-VIs/VIAnalyzerCfgFile.viancfg' +CONFIG_FILE='/workspace/Test-VIs/viaPassCase.viancfg' REPORT_PATH='/usr/local/natinst/ContainerExamples/Results.txt' MASSCOMPILE_DIR='/workspace/Test-VIs' LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' From 8d23bb838332b71ee0ad6f128cf2eb7add648ec6 Mon Sep 17 00:00:00 2001 From: gregr-ni <71788381+gregr-ni@users.noreply.github.com> Date: Tue, 27 Jan 2026 19:18:03 -0600 Subject: [PATCH 20/51] Update configuration file path in runlabview.sh --- runlabview.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runlabview.sh b/runlabview.sh index 503cae2..dfb35a6 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -1,5 +1,5 @@ #!/bin/bash -CONFIG_FILE='/workspace/Test-VIs/viaPassCase.viancfg' +CONFIG_FILE='/workspace/Test-VIs/VIAnalyzerCfgFile.viancfg' REPORT_PATH='/usr/local/natinst/ContainerExamples/Results.txt' MASSCOMPILE_DIR='/workspace/Test-VIs' LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' From 71506ea63e57593caf8aa2a22bd61c54bf2487c8 Mon Sep 17 00:00:00 2001 From: gregr-ni <71788381+gregr-ni@users.noreply.github.com> Date: Wed, 28 Jan 2026 08:15:39 -0600 Subject: [PATCH 21/51] Update configuration file path in runlabview.sh --- runlabview.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runlabview.sh b/runlabview.sh index dfb35a6..503cae2 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -1,5 +1,5 @@ #!/bin/bash -CONFIG_FILE='/workspace/Test-VIs/VIAnalyzerCfgFile.viancfg' +CONFIG_FILE='/workspace/Test-VIs/viaPassCase.viancfg' REPORT_PATH='/usr/local/natinst/ContainerExamples/Results.txt' MASSCOMPILE_DIR='/workspace/Test-VIs' LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' From e94c2a2fed75efbe9c851d5403ce8ad8d2292dac Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Feb 2026 22:21:16 +0000 Subject: [PATCH 22/51] Initial plan From 8dc85b078676a6d9efeb8a068cd1602787ae0621 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Feb 2026 22:23:44 +0000 Subject: [PATCH 23/51] Add vi-compare.yml workflow and runvicompare.sh script Co-authored-by: gregr-ni <71788381+gregr-ni@users.noreply.github.com> --- .github/workflows/vi-compare.yml | 40 ++++++++++++++++++++++ runvicompare.sh | 58 ++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 .github/workflows/vi-compare.yml create mode 100644 runvicompare.sh diff --git a/.github/workflows/vi-compare.yml b/.github/workflows/vi-compare.yml new file mode 100644 index 0000000..cbd80ec --- /dev/null +++ b/.github/workflows/vi-compare.yml @@ -0,0 +1,40 @@ +name: VI Compare + +on: + pull_request: + types: + - opened + - synchronize + - reopened + +jobs: + run-vi-compare: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Compute Changed Files + id: changed-files + run: | + CHANGED=$(git diff --name-only origin/${{ github.base_ref }}...HEAD) + echo "Changed files:" + echo "$CHANGED" + echo "files<> $GITHUB_OUTPUT + echo "$CHANGED" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + - name: Pull Docker Image from Docker Hub + run: docker pull nationalinstruments/labview:2025q3-linux + + - name: Run VICompare on Changed Files + run: | + docker run --rm \ + -e CHANGED_FILES="${{ steps.changed-files.outputs.files }}" \ + -v "${{ github.workspace }}:/workspace" \ + nationalinstruments/labview:2025q3-linux \ + bash -c "cd /workspace && chmod +x runvicompare.sh && ./runvicompare.sh" diff --git a/runvicompare.sh b/runvicompare.sh new file mode 100644 index 0000000..3c0bf8d --- /dev/null +++ b/runvicompare.sh @@ -0,0 +1,58 @@ +#!/bin/bash +# Accepts a newline-separated list of changed files via the CHANGED_FILES env var +# and runs LabVIEWCLI VICompare on each changed .vi file. + +LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' +REPORT_DIR='/usr/local/natinst/ContainerExamples' + +mkdir -p "$REPORT_DIR" +mkdir -p "/tmp/natinst" +echo "1" > /tmp/natinst/LVContainer.txt + +if [ -z "$CHANGED_FILES" ]; then + echo "No changed files provided. Exiting." + exit 0 +fi + +FAILED=0 + +while IFS= read -r file; do + # Only process .vi files + if [[ "$file" != *.vi ]]; then + continue + fi + + VI_PATH="/workspace/$file" + + if [ ! -f "$VI_PATH" ]; then + echo "Warning: File not found: $VI_PATH, skipping." + continue + fi + + REPORT_PATH="$REPORT_DIR/compare_$(basename "$file" .vi).txt" + + echo "Running LabVIEWCLI VICompare for: $VI_PATH" + OUTPUT=$(LabVIEWCLI -LogToConsole TRUE \ + -OperationName VICompare \ + -LabVIEWPath "$LABVIEW_PATH" \ + -VIPath "$VI_PATH" \ + -ReportPath "$REPORT_PATH") + + EXIT_CODE=$? + echo "$OUTPUT" + + if [ $EXIT_CODE -ne 0 ]; then + echo "✖ VICompare failed for $file (exit code $EXIT_CODE)" + FAILED=$((FAILED + 1)) + else + echo "✔ VICompare passed for $file" + fi +done <<< "$CHANGED_FILES" + +if [ $FAILED -gt 0 ]; then + echo "✖ $FAILED file(s) failed VICompare. Exiting with error." + exit 1 +else + echo "✔ All VICompare checks passed." + exit 0 +fi From ddd754fa94635f524bfb79cc6d46c3a85ffee562 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Feb 2026 22:38:10 +0000 Subject: [PATCH 24/51] Switch vi-compare to 2026q1-windows container with CreateComparisonReport Co-authored-by: gregr-ni <71788381+gregr-ni@users.noreply.github.com> --- .github/workflows/vi-compare.yml | 36 ++++++++++------- runvicompare.ps1 | 69 ++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 14 deletions(-) create mode 100644 runvicompare.ps1 diff --git a/.github/workflows/vi-compare.yml b/.github/workflows/vi-compare.yml index cbd80ec..12fd59d 100644 --- a/.github/workflows/vi-compare.yml +++ b/.github/workflows/vi-compare.yml @@ -9,7 +9,7 @@ on: jobs: run-vi-compare: - runs-on: ubuntu-latest + runs-on: windows-latest permissions: contents: read steps: @@ -18,23 +18,31 @@ jobs: with: fetch-depth: 0 - - name: Compute Changed Files + - name: Compute Changed Files and Prepare Base Versions id: changed-files + shell: pwsh run: | - CHANGED=$(git diff --name-only origin/${{ github.base_ref }}...HEAD) - echo "Changed files:" - echo "$CHANGED" - echo "files<> $GITHUB_OUTPUT - echo "$CHANGED" >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT + $changed = git diff --name-only "origin/${{ github.base_ref }}...HEAD" | + Where-Object { $_ -match '\.vi$' } + Write-Host "Changed VI files:" + $changed | ForEach-Object { Write-Host " $_" } + + # Create a git worktree for the base branch so binary .vi files can be + # compared safely without manual extraction. + git worktree add "${{ github.workspace }}\vi-base" "origin/${{ github.base_ref }}" + + # Write the list to a file so the container can read it without + # multiline environment-variable encoding issues. + $changed | Out-File -FilePath "${{ github.workspace }}\changed-files.txt" ` + -Encoding utf8NoBOM - name: Pull Docker Image from Docker Hub - run: docker pull nationalinstruments/labview:2025q3-linux + run: docker pull nationalinstruments/labview:2026q1-windows - name: Run VICompare on Changed Files + shell: pwsh run: | - docker run --rm \ - -e CHANGED_FILES="${{ steps.changed-files.outputs.files }}" \ - -v "${{ github.workspace }}:/workspace" \ - nationalinstruments/labview:2025q3-linux \ - bash -c "cd /workspace && chmod +x runvicompare.sh && ./runvicompare.sh" + docker run --rm ` + -v "${{ github.workspace }}:C:\workspace" ` + nationalinstruments/labview:2026q1-windows ` + powershell -File C:\workspace\runvicompare.ps1 diff --git a/runvicompare.ps1 b/runvicompare.ps1 new file mode 100644 index 0000000..aa5b753 --- /dev/null +++ b/runvicompare.ps1 @@ -0,0 +1,69 @@ +# Reads a list of changed .vi files from changed-files.txt (written by the workflow), +# then uses LabVIEWCLI CreateComparisonReport to compare the base-branch version +# (vi-base\) against the head version and generates an HTML report for each file. + +$CHANGED_FILES_FILE = "C:\workspace\changed-files.txt" +$REPORT_DIR = "C:\workspace\vi-compare-reports" + +New-Item -ItemType Directory -Force -Path $REPORT_DIR | Out-Null + +if (-not (Test-Path $CHANGED_FILES_FILE)) { + Write-Host "No changed-files.txt found. Exiting." + exit 0 +} + +$files = Get-Content $CHANGED_FILES_FILE | + ForEach-Object { $_.Trim() } | + Where-Object { $_ -ne "" -and $_.EndsWith(".vi") } + +if ($files.Count -eq 0) { + Write-Host "No changed .vi files to compare. Exiting." + exit 0 +} + +$FAILED = 0 + +foreach ($file in $files) { + # Use Join-Path to combine base and relative paths, handling any mix of + # forward/backward slashes produced by git on Windows. + $VI1 = Join-Path "C:\workspace\vi-base" $file + $VI2 = Join-Path "C:\workspace" $file + $baseName = [System.IO.Path]::GetFileNameWithoutExtension($file) + $REPORT_PATH = Join-Path $REPORT_DIR "$baseName-diff-report.html" + + if (-not (Test-Path $VI2)) { + Write-Host "Warning: Head version not found: $VI2, skipping." + continue + } + + if (-not (Test-Path $VI1)) { + Write-Host "Warning: Base version not found: $VI1, skipping." + continue + } + + Write-Host "Running LabVIEWCLI CreateComparisonReport for: $file" + + # -o overwrites an existing report file; -c continues if LabVIEW is already open. + & LabVIEWCLI ` + -OperationName CreateComparisonReport ` + -vi1 "$VI1" ` + -vi2 "$VI2" ` + -reportType "HTMLSingleFile" ` + -reportPath "$REPORT_PATH" ` + -o -c + + if ($LASTEXITCODE -ne 0) { + Write-Host "X CreateComparisonReport failed for $file (exit code $LASTEXITCODE)" + $FAILED++ + } else { + Write-Host "✔ CreateComparisonReport succeeded for $file" + } +} + +if ($FAILED -gt 0) { + Write-Host "X $FAILED file(s) failed comparison. Exiting with error." + exit 1 +} else { + Write-Host "✔ All comparison reports generated successfully." + exit 0 +} From 0cba4082a3e239f539f1935997aac76362b6fbda Mon Sep 17 00:00:00 2001 From: gregr-ni <71788381+gregr-ni@users.noreply.github.com> Date: Tue, 24 Feb 2026 16:47:52 -0600 Subject: [PATCH 25/51] update cli command line comments and parameters Updated LabVIEWCLI command options for report generation. --- runvicompare.ps1 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/runvicompare.ps1 b/runvicompare.ps1 index aa5b753..7b21a8f 100644 --- a/runvicompare.ps1 +++ b/runvicompare.ps1 @@ -43,14 +43,15 @@ foreach ($file in $files) { Write-Host "Running LabVIEWCLI CreateComparisonReport for: $file" - # -o overwrites an existing report file; -c continues if LabVIEW is already open. + # -o overwrites an existing report file; -c creates the report directory if necessary. + # -nobdcosm & -nofppos omit non-functional changes from diagram and panel respectively & LabVIEWCLI ` -OperationName CreateComparisonReport ` -vi1 "$VI1" ` -vi2 "$VI2" ` -reportType "HTMLSingleFile" ` -reportPath "$REPORT_PATH" ` - -o -c + -o -c -nobdcosm -nofppos if ($LASTEXITCODE -ne 0) { Write-Host "X CreateComparisonReport failed for $file (exit code $LASTEXITCODE)" From d117d18d5665df197ff30dc1506ac095c6e107c4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 24 Feb 2026 23:13:22 +0000 Subject: [PATCH 26/51] Add separate Linux/Windows vi-compare workflows with artifact upload and PR comments Co-authored-by: gregr-ni <71788381+gregr-ni@users.noreply.github.com> --- .github/workflows/vi-compare-linux.yml | 84 +++++++++++++++++++++ .github/workflows/vi-compare-windows.yml | 93 ++++++++++++++++++++++++ .github/workflows/vi-compare.yml | 48 ------------ runvicompare.ps1 | 16 ++-- runvicompare.sh | 59 ++++++++------- 5 files changed, 218 insertions(+), 82 deletions(-) create mode 100644 .github/workflows/vi-compare-linux.yml create mode 100644 .github/workflows/vi-compare-windows.yml delete mode 100644 .github/workflows/vi-compare.yml diff --git a/.github/workflows/vi-compare-linux.yml b/.github/workflows/vi-compare-linux.yml new file mode 100644 index 0000000..351a063 --- /dev/null +++ b/.github/workflows/vi-compare-linux.yml @@ -0,0 +1,84 @@ +name: VI Compare (Linux) + +on: + pull_request: + types: + - opened + - synchronize + - reopened + +jobs: + run-vi-compare-linux: + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Compute Changed Files and Prepare Base Versions + run: | + CHANGED=$(git diff --name-only "origin/${{ github.base_ref }}...HEAD" | grep '\.vi$' || true) + echo "Changed VI files:" + echo "$CHANGED" + + # Create a git worktree for the base branch so binary .vi files can be + # compared safely without manual extraction. + git worktree add "${{ github.workspace }}/vi-base" "origin/${{ github.base_ref }}" + + # Write the list to a file so the container can read it. + echo "$CHANGED" > "${{ github.workspace }}/changed-files.txt" + + - name: Pull Docker Image from Docker Hub + run: docker pull nationalinstruments/labview:2026q1-linux + + - name: Run CreateComparisonReport on Changed Files + run: | + docker run --rm \ + -v "${{ github.workspace }}:/workspace" \ + nationalinstruments/labview:2026q1-linux \ + bash -c "chmod +x /workspace/runvicompare.sh && /workspace/runvicompare.sh" + + - name: Upload Comparison Reports + id: upload + if: always() + uses: actions/upload-artifact@v4 + with: + name: vi-compare-reports-linux + path: vi-compare-reports/ + if-no-files-found: ignore + + - name: Post PR Comment with Report Links + if: always() && steps.upload.outputs.artifact-url != '' + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs'); + const path = require('path'); + const changedFilesPath = path.join(process.env.GITHUB_WORKSPACE, 'changed-files.txt'); + if (!fs.existsSync(changedFilesPath)) return; + + const changedFiles = fs.readFileSync(changedFilesPath, 'utf8') + .split('\n') + .map(f => f.trim()) + .filter(f => f.endsWith('.vi')); + + if (changedFiles.length === 0) return; + + const artifactUrl = '${{ steps.upload.outputs.artifact-url }}'; + let body = '### VI Comparison Reports (Linux)\n\n'; + body += '| VI File | Report |\n|---------|--------|\n'; + for (const file of changedFiles) { + const baseName = path.basename(file, '.vi'); + body += `| \`${file}\` | [${baseName}-diff-report.html](${artifactUrl}) |\n`; + } + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + body + }); diff --git a/.github/workflows/vi-compare-windows.yml b/.github/workflows/vi-compare-windows.yml new file mode 100644 index 0000000..7b6a1c0 --- /dev/null +++ b/.github/workflows/vi-compare-windows.yml @@ -0,0 +1,93 @@ +name: VI Compare (Windows) + +on: + pull_request: + types: + - opened + - synchronize + - reopened + +jobs: + run-vi-compare-windows: + runs-on: windows-latest + permissions: + contents: read + pull-requests: write + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Compute Changed Files and Prepare Base Versions + shell: pwsh + run: | + $changed = git diff --name-only "origin/${{ github.base_ref }}...HEAD" | + Where-Object { $_ -match '\.vi$' } + Write-Host "Changed VI files:" + $changed | ForEach-Object { Write-Host " $_" } + + # Create a git worktree for the base branch so binary .vi files can be + # compared safely without manual extraction. + git worktree add "${{ github.workspace }}\vi-base" "origin/${{ github.base_ref }}" + + # Write the list to a file so the container can read it without + # multiline environment-variable encoding issues. + if ($null -eq $changed) { + New-Item -ItemType File -Path "${{ github.workspace }}\changed-files.txt" -Force | Out-Null + } else { + $changed | Out-File -FilePath "${{ github.workspace }}\changed-files.txt" ` + -Encoding utf8NoBOM + } + + - name: Pull Docker Image from Docker Hub + run: docker pull nationalinstruments/labview:2026q1-windows + + - name: Run CreateComparisonReport on Changed Files + shell: pwsh + run: | + docker run --rm ` + -v "${{ github.workspace }}:C:\workspace" ` + nationalinstruments/labview:2026q1-windows ` + powershell -File C:\workspace\runvicompare.ps1 + + - name: Upload Comparison Reports + id: upload + if: always() + uses: actions/upload-artifact@v4 + with: + name: vi-compare-reports-windows + path: vi-compare-reports/ + if-no-files-found: ignore + + - name: Post PR Comment with Report Links + if: always() && steps.upload.outputs.artifact-url != '' + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs'); + const path = require('path'); + const changedFilesPath = path.join(process.env.GITHUB_WORKSPACE, 'changed-files.txt'); + if (!fs.existsSync(changedFilesPath)) return; + + const changedFiles = fs.readFileSync(changedFilesPath, 'utf8') + .split('\n') + .map(f => f.trim()) + .filter(f => f.endsWith('.vi')); + + if (changedFiles.length === 0) return; + + const artifactUrl = '${{ steps.upload.outputs.artifact-url }}'; + let body = '### VI Comparison Reports (Windows)\n\n'; + body += '| VI File | Report |\n|---------|--------|\n'; + for (const file of changedFiles) { + const baseName = path.basename(file, '.vi'); + body += `| \`${file}\` | [${baseName}-diff-report.html](${artifactUrl}) |\n`; + } + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + body + }); diff --git a/.github/workflows/vi-compare.yml b/.github/workflows/vi-compare.yml deleted file mode 100644 index 12fd59d..0000000 --- a/.github/workflows/vi-compare.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: VI Compare - -on: - pull_request: - types: - - opened - - synchronize - - reopened - -jobs: - run-vi-compare: - runs-on: windows-latest - permissions: - contents: read - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Compute Changed Files and Prepare Base Versions - id: changed-files - shell: pwsh - run: | - $changed = git diff --name-only "origin/${{ github.base_ref }}...HEAD" | - Where-Object { $_ -match '\.vi$' } - Write-Host "Changed VI files:" - $changed | ForEach-Object { Write-Host " $_" } - - # Create a git worktree for the base branch so binary .vi files can be - # compared safely without manual extraction. - git worktree add "${{ github.workspace }}\vi-base" "origin/${{ github.base_ref }}" - - # Write the list to a file so the container can read it without - # multiline environment-variable encoding issues. - $changed | Out-File -FilePath "${{ github.workspace }}\changed-files.txt" ` - -Encoding utf8NoBOM - - - name: Pull Docker Image from Docker Hub - run: docker pull nationalinstruments/labview:2026q1-windows - - - name: Run VICompare on Changed Files - shell: pwsh - run: | - docker run --rm ` - -v "${{ github.workspace }}:C:\workspace" ` - nationalinstruments/labview:2026q1-windows ` - powershell -File C:\workspace\runvicompare.ps1 diff --git a/runvicompare.ps1 b/runvicompare.ps1 index 7b21a8f..92a068b 100644 --- a/runvicompare.ps1 +++ b/runvicompare.ps1 @@ -26,18 +26,18 @@ $FAILED = 0 foreach ($file in $files) { # Use Join-Path to combine base and relative paths, handling any mix of # forward/backward slashes produced by git on Windows. - $VI1 = Join-Path "C:\workspace\vi-base" $file - $VI2 = Join-Path "C:\workspace" $file + $VI_BASE = Join-Path "C:\workspace\vi-base" $file + $VI_HEAD = Join-Path "C:\workspace" $file $baseName = [System.IO.Path]::GetFileNameWithoutExtension($file) $REPORT_PATH = Join-Path $REPORT_DIR "$baseName-diff-report.html" - if (-not (Test-Path $VI2)) { - Write-Host "Warning: Head version not found: $VI2, skipping." + if (-not (Test-Path $VI_HEAD)) { + Write-Host "Warning: Head version not found: $VI_HEAD, skipping." continue } - if (-not (Test-Path $VI1)) { - Write-Host "Warning: Base version not found: $VI1, skipping." + if (-not (Test-Path $VI_BASE)) { + Write-Host "Warning: Base version not found: $VI_BASE, skipping." continue } @@ -47,8 +47,8 @@ foreach ($file in $files) { # -nobdcosm & -nofppos omit non-functional changes from diagram and panel respectively & LabVIEWCLI ` -OperationName CreateComparisonReport ` - -vi1 "$VI1" ` - -vi2 "$VI2" ` + -vi1 "$VI_BASE" ` + -vi2 "$VI_HEAD" ` -reportType "HTMLSingleFile" ` -reportPath "$REPORT_PATH" ` -o -c -nobdcosm -nofppos diff --git a/runvicompare.sh b/runvicompare.sh index 3c0bf8d..3a0803d 100644 --- a/runvicompare.sh +++ b/runvicompare.sh @@ -1,58 +1,65 @@ #!/bin/bash -# Accepts a newline-separated list of changed files via the CHANGED_FILES env var -# and runs LabVIEWCLI VICompare on each changed .vi file. +# Reads changed .vi files from /workspace/changed-files.txt and generates +# HTML comparison reports using LabVIEWCLI CreateComparisonReport. -LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' -REPORT_DIR='/usr/local/natinst/ContainerExamples' +CHANGED_FILES_FILE='/workspace/changed-files.txt' +REPORT_DIR='/workspace/vi-compare-reports' mkdir -p "$REPORT_DIR" mkdir -p "/tmp/natinst" echo "1" > /tmp/natinst/LVContainer.txt -if [ -z "$CHANGED_FILES" ]; then - echo "No changed files provided. Exiting." +if [ ! -f "$CHANGED_FILES_FILE" ]; then + echo "No changed-files.txt found. Exiting." exit 0 fi FAILED=0 while IFS= read -r file; do - # Only process .vi files - if [[ "$file" != *.vi ]]; then + file="$(echo "$file" | tr -d '\r')" + [[ -z "$file" ]] && continue + [[ "$file" != *.vi ]] && continue + + VI_BASE="/workspace/vi-base/$file" + VI_HEAD="/workspace/$file" + BASE_NAME="$(basename "$file" .vi)" + REPORT_PATH="$REPORT_DIR/$BASE_NAME-diff-report.html" + + if [ ! -f "$VI_HEAD" ]; then + echo "Warning: Head version not found: $VI_HEAD, skipping." continue fi - VI_PATH="/workspace/$file" - - if [ ! -f "$VI_PATH" ]; then - echo "Warning: File not found: $VI_PATH, skipping." + if [ ! -f "$VI_BASE" ]; then + echo "Warning: Base version not found: $VI_BASE, skipping." continue fi - REPORT_PATH="$REPORT_DIR/compare_$(basename "$file" .vi).txt" + echo "Running LabVIEWCLI CreateComparisonReport for: $file" - echo "Running LabVIEWCLI VICompare for: $VI_PATH" - OUTPUT=$(LabVIEWCLI -LogToConsole TRUE \ - -OperationName VICompare \ - -LabVIEWPath "$LABVIEW_PATH" \ - -VIPath "$VI_PATH" \ - -ReportPath "$REPORT_PATH") + # -o overwrites an existing report file; -c continues if LabVIEW is already open. + LabVIEWCLI \ + -OperationName CreateComparisonReport \ + -vi1 "$VI_BASE" \ + -vi2 "$VI_HEAD" \ + -reportType "HTMLSingleFile" \ + -reportPath "$REPORT_PATH" \ + -o -c EXIT_CODE=$? - echo "$OUTPUT" - if [ $EXIT_CODE -ne 0 ]; then - echo "✖ VICompare failed for $file (exit code $EXIT_CODE)" + echo "✖ CreateComparisonReport failed for $file (exit code $EXIT_CODE)" FAILED=$((FAILED + 1)) else - echo "✔ VICompare passed for $file" + echo "✔ CreateComparisonReport succeeded for $file" fi -done <<< "$CHANGED_FILES" +done < "$CHANGED_FILES_FILE" if [ $FAILED -gt 0 ]; then - echo "✖ $FAILED file(s) failed VICompare. Exiting with error." + echo "✖ $FAILED file(s) failed comparison. Exiting with error." exit 1 else - echo "✔ All VICompare checks passed." + echo "✔ All comparison reports generated successfully." exit 0 fi From f846526f78fb82c058e49887df05d38217048e82 Mon Sep 17 00:00:00 2001 From: Greg Richardson Date: Wed, 25 Feb 2026 14:26:31 -0600 Subject: [PATCH 27/51] vi change --- Test-VIs/ArthOps.vi | Bin 4795 -> 5023 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Test-VIs/ArthOps.vi b/Test-VIs/ArthOps.vi index c09928331e072195c0864ee2a647152443d641cb..b6e34e86c1551fa8b621c74a521f50e1fefa2caf 100644 GIT binary patch delta 3007 zcmZvec{tSj7stP2P=;p6Ue=gU5yo;yLKsZ8EFnuI+gOH-FvN^f5(;BWl0AeNYa$|B z_FdUV_N<{ABEQkS_qpBQ?{}W(Jm>Ryo%cD<`RhFAHT;zSbq^wiDF z0f5yS0Kggm00`0E%CwjUkAWjhyK?F~nUc<Yw|{;!A2U(M)c`UbtY9+B@5Q@|&DNg+C@ z%b2%0uYkmHJ)KfRlR@FKL^=Rql$Do4NXf=5o)yYWsT&{0$T|@onj)C=@t=9k1#gcI zdMeK**j;jq})Cs}TZz4G`kUf#&b`R&xrTN}~z#Bt}>SuA>l$7&-Gse5|su8bg^ zCW)D=y%;;Own+*G!paVf@Q=}!6&k{w_^D+`b~e6OmPF}~6!$Q9rog+&FtyKqH%qyb zG9EG%-yaTT>>NQuB``T-7$YZTUwPH#Yr{HPO4;2^y90S!xX%kW$h`EK>N&%Gs zUw2J&stM8ne1eeePG=Ie!hUgwzvF&3fm_0c|7cU+t2m;>s9kXI8=(!WjNIZc!mgsG zXpnh}s>?AW+!b`4nB3L$w@RSb507<>Q6^sHnpSJbTnZ;UtiH2$ZSQz=*By`Nb>zX3 zH&4n*EMkwPoh^Hwy3(>0s7B1{>RC4Z1}^$8IMvA(c)WxFdvM_dQ^UjQ(ae*(X}mXk zMDk<8SV{LZ1uH%TRki=<5!(@Zfnb3|C0Raa%Rk3C5wzMzrD|GjjB76ReF*Q3X(y#K zUniwMg5HaT?`^k-3d%Q1`klhO6n8A?Wx?K8e;x$BQdbo+IC!}xBs&}aB4Gkz`xUCQ7b|02ePq%F?iWTwGkz>{ zbt`(L@4X1~eD!zUBb!^ZR?g1OH%@EKn;|W{5T37YaK6GHAAgtchp4%s*a%hpdUDtO z6{a}(N1E64RiDk7MVt@LaVK!9xlwoh%*)Y2Z~MJqLT`X=uhLbEx}DP8lP7*M4~^wz zZAyO2oZ?yTCMc9OINxD6ChnStS_kc6&L27-8=cYLXMf+x))L`T5`VQkacb8gqlHuc zI1=TJj{b?fP}iQb|3Z0BM)r_ctA^O#WC42r;myV2hBkj~?EaQGAF&wIYL0pNVc7 zdwGJISna;*Le|TRJ?J{{R`uuR?Is=jC+FM4khA0V3DXnoJ+mpZmZz7n4*t{a)#A(t7Iv9G^hrmR!c*P)07`csBd4N^Y1-SW(K6Vlw&&;0&b$Qm{ zH&1Tgm91a;LbX{k-00>f_J0Oc`OvKj6juQ+R!MPCji-M769s^pI7|HQ38jGL8K`#p zpkNnfU_Z;UK8%kTxX(}7h{>?++4}G)epg^9V)12iPr)}i75h8>rh@!gwaXQ8!tbO) zD;GSfV*^t5CxztW%s&(AxvAsxuZ1GgAuf@t0btN%T-UEP1klrh7AcoWgg{$kka_=< z>;xMZzRMgf-H$)Guj*B_xs$g?ZdIX`OyZ&yM9Z_U$5=FH6#81-&bge=!9|KL!?Rhk z_o}#S?63x%il;Ybr57xC;{yNK=Mu}^a)^QRmW(7SBKs0LT+4?%5jbz)ge4dDU@2aH zb19qq`v$8WHo)FJqvr(;1SbeOUJrra&!JH z|9A(Xl^~_0%!9BgTPELaISedZIx;x7mV>`4d?gkd+k%ryxtI3Iy$c1j8&Kud+EQ}h$~PyRIWAMoHr|on1Exj&a%abGo#3+qVMYI1p*6YU3b}%0x#T!>6ln#D-*L;9c%wSjGHo<<)TBnRG9Q8};I<#B zFEmRE<7it+Q&x6=p!7~VRO8OzLP+Ccw1?j%`8% zgJ=^?4W-r5;}-~a5=q-OP~$~DW7BYldgYfBZmaEmWBX;xr647T0m*Ntx=3ou#3eQ(${W=-uqD7|ObsW~w+*`UYrMqZOZ&au` zaF#6yJikC#M4T?7*E}MJQs!yFcQE>Rpcbm>s#j8quwa7CWYB`Ij<27kuVu!Pm3F1> z#YzU7TFqgx-dc@C6(^q(Vo_>N&+9{x$cskr&neo18pw_mkQQxJRzUWlg(@4LEdNW~p8m+4D?aBP+ zAY5l$J>~|%9#66v_}ErP$&76giM^xe9eFXB<6^3~6k5PER;6DXCv|y7q;O;1u^nsI zUDm5nC%7g31UFqDXU7%ju(LB`#|rzc2k^SoI~b9@7onk(eH~}Q_|q>D#Hsw7lG3ZDbNaq0x9&Qu$BMtc zkL2b$s%6j}SJLnuZDCTre%6#2E0_}n$uMaS+kE=cr#PTwg6oQBRKaNDSKG;ck9fA^ zOuJ|KcG6CB(9FZ-D4V*lu+FCQT^AQ0iRu?w`A#Ru+}&E{zrDUUT^=-4($~l2G2CJ`Ql8yUopLmsG`)Yu_e{sTOl5`A4zATBLg`5ERO5y%$(Uwc z<=RDosB)b-xIkirbAzjBX+%rBmonh^)O!crFTcBa(pzBV(-(4XzwUy&TH&b8RjFZt zaCHtR{Mg%Ry)0>{>onHpJG1b!r- zbvrwXz1=lCyTjM0_4SQJu(XV{DJ8ZMyq?^qmiqVs)SAT@gWTRm9pg+kgCN6Ei+N3O z$YVSlqEG=*V@HNSl1}>^;jIc`8G=Y=Rw*<33Xw|a)Gx~x)77##AY`QHWLjmU>4I8V zLeHqRLPFiuTA`tQI;_#`UG|6GtLqpr8UQCV*{w)SFh0ZxFi0EF2!Q<>6bAhHxBRdF zbs`W75CPy$i5YF zF)}2}$TDOJV=F|u)9pUbZ@Hc4IiGXR>%5=O=lpe^Prh7}j11BaX~4w+Fj?B0AuRRn z9RL6l1^`S3005kz=Z^GPAe|zkdcmiSLNdmTncvfPM7iG;q|qC{(4Cv^zy(#>IxK9< zA};JIB<9HQVC49n@g$&{c^MDNTHVu+`mXtIM_Oy}L2|oZ?M!q^tYuYDN~Neoux!To zrpg&uE|i&jALp50Is&Myn)O?iwm}VJ%f>|53hIg(6UOHMwj-yQwx>T z(n(_ML5^As%)a}TtnDHRyLRrsxR zo}J)k-%F@7JT9<$*-rY@r#~NvhnS1#aTdJYT;fQT=PvH{d)us&8T-Uf1?LArzA!~; z;7>+uDxSRxsCq8Hz)2Pt+Y%kM9zd16j`t4?6dS_q<^|5&BO2?c&)2CP8QGOD9R&8J zMC((zg)6Cu5nK3B4@FzR%VJkv%i!cn_ngUxi5QZmM2LcdLfK2fcU;0YvL;StxlwkR zSGs&^9dz+A2fnMWt4i;h8pGXQy+>Y&spNHwd%C?>+k-zS$GHMk%})6Kc9t!K8c}H| zE_RHa3={TnkQFM@vaQpTB5vBI#mjsLXIgAt(=K1d1ZDP7EG?K zRfjLn%@MQhDsHmbn-TVTZ`d?ZE7nBfN<)P=9EYYP&Pv8ta&^ilR_PyGF?NrN5>xdE z3Ev2TVhClpVy#u>!8ztqd&Rnujn~baXIu(hADp}Xac4&@uq&(K?Ydb*xM$}_!qhBJ`74^Mxl!AE|U6XONYiznGx;rZss!KbgNAwc2#n zo8NCK%yZcaEFR%%@7d}KwMHfwnAily+ad1BoMbD4CmWqb9Z44PjoX{W!}c< z$|+7VYN4jA3V6LVZXza*&My_|SidndVO<(+){T{Ld!3QB@HKCXU%4-s#^OuLTUcpK z6A19bW%Rv&Mlp*Db!oTQ2o-k|2)c6#PbJU^m)laxukFvS9@BryM8E=5YF-R5t-Kex zRhC;FpMXVlGxk7s|C4BY;>O;9i1n6;5ME%OZBNLpOo^dBm08q~vl>88LuamI7-(Z+ z?bhq3+O@AAn<>2pYz*%+zE5Y+{HoEuHf4p%WN&O%%AvfRQ2JWWuwd@Ld}B1;B$SMp z==R<`ig9?<5|Z)w_Ia5nh}p+Q$OAxQvuzLq;Vj_r#oHgTMoKj+{kZhM8#NU*03y&KUVXwmfUeQirdgwB{uPM_Ye*2mcS=sJr!2oILtkhxQDQzEbAN2L5 zoAD8u*zC#uqv_pm0|O+$H}h^_F$WqKQ6P9sYw44&V&m_EP__;0Hw4stm}}nXAti@nlpD#q+@oc(uzGOHTMmS{pOgvLN>huP@+&Ed^gm zpYC!gCklPme9W`c>AGGs4lgqGE-f36(_4MWI$f10#>48IWeoWR0gAp^;zs^m@kR?~ z1dlfpfEJUO-_4$(7)~V+h*fy=4pvlxys5(h$w|-=)W!-P zlw29}=j%?NdcMtQZQL`@cUokn?|@-QlU>lf99 z27B!s$xp;Ini%N$ENIshU~V3MuKZ4p8r-RG@?y& zDAlX$13r8z)jq~$kN?=wW*wNkDbH_JEZ<}{j%SG!rBzhu$Z`Ot$?l=>{+tlFY) zQ}EL?@vJ~TvU6vE$3y|%LSwjBWBTEkn8IDvLSc_y(YfG@^&j|i*cNtpOZ;PM=HjM% zsTZ^BZaDZ?RO&!^_`@h9D%MbtE%YVKW%rgak8@M?p5jg0F#GUJk&(gYA5B%<@1dp3 znY(qef6l@Pk-uvAtwbTe@0ssg22Gd;OEX9lKoC(8L4fH8Ww=6*@^okXAp#f)vkYSX z015yY_`>q;-|Ge8b-9`SPhZ!ORATOkHFoE2#)>&sib?C%^sn3 z&Qk&xdW#ReMe}Y^tA`_MQj=rDC*zR>S}3<~vU5KoX=ob}#$zZmXAn_^#0(lX0;4BD zZwPA;QPpu^gg%2U0Qo*B00Dl~PXAY5#se_`{+~Vp&aDFe-~ZclEVl+DjxP9N-{|%u z1I7J>CI5sK{DhVLn{gffn}Pox9RLCV;6D$8b$=o>{Ry-A3B&%w@c(t+>UYMWcQwS< KItT;1hWZO7x6y+D From 165758de0013a95a19bfec88a90794e0ddd490a6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Feb 2026 20:52:52 +0000 Subject: [PATCH 28/51] Fix PS1 syntax error: replace UTF-8 checkmark with ASCII [OK] Co-authored-by: gregr-ni <71788381+gregr-ni@users.noreply.github.com> --- runvicompare.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runvicompare.ps1 b/runvicompare.ps1 index 92a068b..cb842ad 100644 --- a/runvicompare.ps1 +++ b/runvicompare.ps1 @@ -57,7 +57,7 @@ foreach ($file in $files) { Write-Host "X CreateComparisonReport failed for $file (exit code $LASTEXITCODE)" $FAILED++ } else { - Write-Host "✔ CreateComparisonReport succeeded for $file" + Write-Host "[OK] CreateComparisonReport succeeded for $file" } } @@ -65,6 +65,6 @@ if ($FAILED -gt 0) { Write-Host "X $FAILED file(s) failed comparison. Exiting with error." exit 1 } else { - Write-Host "✔ All comparison reports generated successfully." + Write-Host "[OK] All comparison reports generated successfully." exit 0 } From 1708d29b03936060e19b7cc8725c95d4d565ac6f Mon Sep 17 00:00:00 2001 From: gregr-ni <71788381+gregr-ni@users.noreply.github.com> Date: Wed, 25 Feb 2026 14:57:12 -0600 Subject: [PATCH 29/51] Add LabVIEW path variable for report generation --- runvicompare.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/runvicompare.sh b/runvicompare.sh index 3a0803d..0a68c45 100644 --- a/runvicompare.sh +++ b/runvicompare.sh @@ -4,6 +4,7 @@ CHANGED_FILES_FILE='/workspace/changed-files.txt' REPORT_DIR='/workspace/vi-compare-reports' +LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' mkdir -p "$REPORT_DIR" mkdir -p "/tmp/natinst" @@ -39,12 +40,13 @@ while IFS= read -r file; do echo "Running LabVIEWCLI CreateComparisonReport for: $file" # -o overwrites an existing report file; -c continues if LabVIEW is already open. - LabVIEWCLI \ + LabVIEWCLI -LogToConsole TRUE \ -OperationName CreateComparisonReport \ -vi1 "$VI_BASE" \ -vi2 "$VI_HEAD" \ -reportType "HTMLSingleFile" \ -reportPath "$REPORT_PATH" \ + -LabVIEWPath $LABVIEW_PATH) \ -o -c EXIT_CODE=$? From 89a9f6c97d9a2b1097782a95e2d56aa75501ea63 Mon Sep 17 00:00:00 2001 From: gregr-ni <71788381+gregr-ni@users.noreply.github.com> Date: Wed, 25 Feb 2026 15:01:56 -0600 Subject: [PATCH 30/51] Fix LabVIEWPath argument formatting in script --- runvicompare.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runvicompare.sh b/runvicompare.sh index 0a68c45..74a97de 100644 --- a/runvicompare.sh +++ b/runvicompare.sh @@ -46,7 +46,7 @@ while IFS= read -r file; do -vi2 "$VI_HEAD" \ -reportType "HTMLSingleFile" \ -reportPath "$REPORT_PATH" \ - -LabVIEWPath $LABVIEW_PATH) \ + -LabVIEWPath $LABVIEW_PATH \ -o -c EXIT_CODE=$? From e10318dff3cd95ba07a162ef870d630b180f45d7 Mon Sep 17 00:00:00 2001 From: gregr-ni <71788381+gregr-ni@users.noreply.github.com> Date: Wed, 25 Feb 2026 16:26:29 -0600 Subject: [PATCH 31/51] Fix command substitution for LabVIEWCLI output --- runvicompare.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/runvicompare.sh b/runvicompare.sh index 74a97de..c570551 100644 --- a/runvicompare.sh +++ b/runvicompare.sh @@ -40,14 +40,15 @@ while IFS= read -r file; do echo "Running LabVIEWCLI CreateComparisonReport for: $file" # -o overwrites an existing report file; -c continues if LabVIEW is already open. - LabVIEWCLI -LogToConsole TRUE \ + OUTPUT=$(LabVIEWCLI \ + -LabVIEWPath $LABVIEW_PATH \ + -LogToConsole TRUE \ -OperationName CreateComparisonReport \ -vi1 "$VI_BASE" \ -vi2 "$VI_HEAD" \ -reportType "HTMLSingleFile" \ -reportPath "$REPORT_PATH" \ - -LabVIEWPath $LABVIEW_PATH \ - -o -c + -o -c) EXIT_CODE=$? if [ $EXIT_CODE -ne 0 ]; then From 36436361a86779b76fa736e1e01a2d435c1d1bbe Mon Sep 17 00:00:00 2001 From: gregr-ni <71788381+gregr-ni@users.noreply.github.com> Date: Wed, 25 Feb 2026 16:27:24 -0600 Subject: [PATCH 32/51] Update LabVIEWCLI command options in runvicompare.ps1 --- runvicompare.ps1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/runvicompare.ps1 b/runvicompare.ps1 index cb842ad..d803145 100644 --- a/runvicompare.ps1 +++ b/runvicompare.ps1 @@ -46,6 +46,9 @@ foreach ($file in $files) { # -o overwrites an existing report file; -c creates the report directory if necessary. # -nobdcosm & -nofppos omit non-functional changes from diagram and panel respectively & LabVIEWCLI ` + -LabVIEWPath "$LabVIEWPath" ` + -LogToConsole TRUE ` + -Headless ` -OperationName CreateComparisonReport ` -vi1 "$VI_BASE" ` -vi2 "$VI_HEAD" ` From 65672f44b60fd86a594d426c1c8d18d1279a4ae1 Mon Sep 17 00:00:00 2001 From: gregr-ni <71788381+gregr-ni@users.noreply.github.com> Date: Wed, 25 Feb 2026 16:43:04 -0600 Subject: [PATCH 33/51] Update Docker image version in workflow --- .github/workflows/vi-compare-linux.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/vi-compare-linux.yml b/.github/workflows/vi-compare-linux.yml index 351a063..15ad4af 100644 --- a/.github/workflows/vi-compare-linux.yml +++ b/.github/workflows/vi-compare-linux.yml @@ -33,13 +33,13 @@ jobs: echo "$CHANGED" > "${{ github.workspace }}/changed-files.txt" - name: Pull Docker Image from Docker Hub - run: docker pull nationalinstruments/labview:2026q1-linux + run: docker pull nationalinstruments/labview:2025q3-linux - name: Run CreateComparisonReport on Changed Files run: | docker run --rm \ -v "${{ github.workspace }}:/workspace" \ - nationalinstruments/labview:2026q1-linux \ + nationalinstruments/labview:2025q3-linux \ bash -c "chmod +x /workspace/runvicompare.sh && /workspace/runvicompare.sh" - name: Upload Comparison Reports From e9f88061c1faf381886f304cdc257c4a5e232ebf Mon Sep 17 00:00:00 2001 From: gregr-ni <71788381+gregr-ni@users.noreply.github.com> Date: Wed, 25 Feb 2026 16:43:50 -0600 Subject: [PATCH 34/51] Remove duplicate OperationName parameter --- runvicompare.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runvicompare.ps1 b/runvicompare.ps1 index d803145..a8495a5 100644 --- a/runvicompare.ps1 +++ b/runvicompare.ps1 @@ -46,10 +46,10 @@ foreach ($file in $files) { # -o overwrites an existing report file; -c creates the report directory if necessary. # -nobdcosm & -nofppos omit non-functional changes from diagram and panel respectively & LabVIEWCLI ` + -OperationName CreateComparisonReport ` -LabVIEWPath "$LabVIEWPath" ` -LogToConsole TRUE ` -Headless ` - -OperationName CreateComparisonReport ` -vi1 "$VI_BASE" ` -vi2 "$VI_HEAD" ` -reportType "HTMLSingleFile" ` From e27175276f02b13a420ca9b50f170e96dccc675d Mon Sep 17 00:00:00 2001 From: gregr-ni <71788381+gregr-ni@users.noreply.github.com> Date: Wed, 25 Feb 2026 17:07:47 -0600 Subject: [PATCH 35/51] Add LabVIEWPath variable for LabVIEW executable --- runvicompare.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/runvicompare.ps1 b/runvicompare.ps1 index a8495a5..ae345c2 100644 --- a/runvicompare.ps1 +++ b/runvicompare.ps1 @@ -4,6 +4,7 @@ $CHANGED_FILES_FILE = "C:\workspace\changed-files.txt" $REPORT_DIR = "C:\workspace\vi-compare-reports" +$LabVIEWPath = "C:\Program Files\National Instruments\LabVIEW 2026\LabVIEW.exe" New-Item -ItemType Directory -Force -Path $REPORT_DIR | Out-Null From 1e21970ff5047d858b1595e04363990adc51eb17 Mon Sep 17 00:00:00 2001 From: gregr-ni <71788381+gregr-ni@users.noreply.github.com> Date: Wed, 25 Feb 2026 17:08:07 -0600 Subject: [PATCH 36/51] Add headless option to LabVIEW CLI command Enable headless operation for LabVIEW CLI report generation. --- runvicompare.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/runvicompare.sh b/runvicompare.sh index c570551..c4ef254 100644 --- a/runvicompare.sh +++ b/runvicompare.sh @@ -43,6 +43,7 @@ while IFS= read -r file; do OUTPUT=$(LabVIEWCLI \ -LabVIEWPath $LABVIEW_PATH \ -LogToConsole TRUE \ + -Headless \ -OperationName CreateComparisonReport \ -vi1 "$VI_BASE" \ -vi2 "$VI_HEAD" \ From 2eddf65d57c5c9ca97dbc202ddbf6de941591f43 Mon Sep 17 00:00:00 2001 From: gregr-ni <71788381+gregr-ni@users.noreply.github.com> Date: Wed, 25 Feb 2026 17:08:42 -0600 Subject: [PATCH 37/51] Update Docker image version in workflow --- .github/workflows/vi-compare-linux.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/vi-compare-linux.yml b/.github/workflows/vi-compare-linux.yml index 15ad4af..f053eed 100644 --- a/.github/workflows/vi-compare-linux.yml +++ b/.github/workflows/vi-compare-linux.yml @@ -33,13 +33,13 @@ jobs: echo "$CHANGED" > "${{ github.workspace }}/changed-files.txt" - name: Pull Docker Image from Docker Hub - run: docker pull nationalinstruments/labview:2025q3-linux + run: docker pull nationalinstruments/labview:2026q1-linux - name: Run CreateComparisonReport on Changed Files run: | docker run --rm \ -v "${{ github.workspace }}:/workspace" \ - nationalinstruments/labview:2025q3-linux \ + nationalinstruments/labview:2025q1-linux \ bash -c "chmod +x /workspace/runvicompare.sh && /workspace/runvicompare.sh" - name: Upload Comparison Reports From 8f93a1d02b01451249a435ae3c149d59f1a3e233 Mon Sep 17 00:00:00 2001 From: Greg Richardson Date: Thu, 26 Feb 2026 09:11:04 -0600 Subject: [PATCH 38/51] disable all but linux compare --- .github/workflows/vi-analyzer-container.yml | 12 ++++++------ .github/workflows/vi-compare-linux.yml | 2 +- .github/workflows/vi-compare-windows.yml | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/vi-analyzer-container.yml b/.github/workflows/vi-analyzer-container.yml index b21ecd0..368fb4f 100644 --- a/.github/workflows/vi-analyzer-container.yml +++ b/.github/workflows/vi-analyzer-container.yml @@ -1,11 +1,11 @@ name: Run LabVIEWCLI on Linux Container -on: - pull_request: - types: - - opened - - synchronize - - reopened +# on: +# pull_request: +# types: +# - opened +# - synchronize +# - reopened jobs: run-vi-analyzer: diff --git a/.github/workflows/vi-compare-linux.yml b/.github/workflows/vi-compare-linux.yml index f053eed..351a063 100644 --- a/.github/workflows/vi-compare-linux.yml +++ b/.github/workflows/vi-compare-linux.yml @@ -39,7 +39,7 @@ jobs: run: | docker run --rm \ -v "${{ github.workspace }}:/workspace" \ - nationalinstruments/labview:2025q1-linux \ + nationalinstruments/labview:2026q1-linux \ bash -c "chmod +x /workspace/runvicompare.sh && /workspace/runvicompare.sh" - name: Upload Comparison Reports diff --git a/.github/workflows/vi-compare-windows.yml b/.github/workflows/vi-compare-windows.yml index 7b6a1c0..f071cbc 100644 --- a/.github/workflows/vi-compare-windows.yml +++ b/.github/workflows/vi-compare-windows.yml @@ -1,11 +1,11 @@ name: VI Compare (Windows) -on: - pull_request: - types: - - opened - - synchronize - - reopened +# on: +# pull_request: +# types: +# - opened +# - synchronize +# - reopened jobs: run-vi-compare-windows: From 542e7d996b091afb0785a087a7091aab5dc2544c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:28:42 +0000 Subject: [PATCH 39/51] Fix upload failure and add per-file artifact uploads Co-authored-by: gregr-ni <71788381+gregr-ni@users.noreply.github.com> --- .github/workflows/vi-compare-linux.yml | 56 ++++++++++++++++++++---- .github/workflows/vi-compare-windows.yml | 51 +++++++++++++++++---- runvicompare.sh | 8 +++- 3 files changed, 96 insertions(+), 19 deletions(-) diff --git a/.github/workflows/vi-compare-linux.yml b/.github/workflows/vi-compare-linux.yml index 351a063..572cc3f 100644 --- a/.github/workflows/vi-compare-linux.yml +++ b/.github/workflows/vi-compare-linux.yml @@ -42,17 +42,47 @@ jobs: nationalinstruments/labview:2026q1-linux \ bash -c "chmod +x /workspace/runvicompare.sh && /workspace/runvicompare.sh" - - name: Upload Comparison Reports - id: upload + - name: Fix report file permissions if: always() + run: | + if [ -d "${{ github.workspace }}/vi-compare-reports" ]; then + sudo chmod -R a+r "${{ github.workspace }}/vi-compare-reports" + fi + + - name: Upload ArthOps Report + id: upload-ArthOps + if: always() && hashFiles('vi-compare-reports/ArthOps-diff-report.html') != '' uses: actions/upload-artifact@v4 with: - name: vi-compare-reports-linux - path: vi-compare-reports/ - if-no-files-found: ignore + name: ArthOps-diff-report + path: vi-compare-reports/ArthOps-diff-report.html + + - name: Upload BeepWrapper Report + id: upload-BeepWrapper + if: always() && hashFiles('vi-compare-reports/BeepWrapper-diff-report.html') != '' + uses: actions/upload-artifact@v4 + with: + name: BeepWrapper-diff-report + path: vi-compare-reports/BeepWrapper-diff-report.html + + - name: Upload CreateNewProj Report + id: upload-CreateNewProj + if: always() && hashFiles('vi-compare-reports/CreateNewProj-diff-report.html') != '' + uses: actions/upload-artifact@v4 + with: + name: CreateNewProj-diff-report + path: vi-compare-reports/CreateNewProj-diff-report.html + + - name: Upload WriteToRandomFile Report + id: upload-WriteToRandomFile + if: always() && hashFiles('vi-compare-reports/WriteToRandomFile-diff-report.html') != '' + uses: actions/upload-artifact@v4 + with: + name: WriteToRandomFile-diff-report + path: vi-compare-reports/WriteToRandomFile-diff-report.html - name: Post PR Comment with Report Links - if: always() && steps.upload.outputs.artifact-url != '' + if: always() uses: actions/github-script@v7 with: script: | @@ -68,12 +98,22 @@ jobs: if (changedFiles.length === 0) return; - const artifactUrl = '${{ steps.upload.outputs.artifact-url }}'; + const artifactUrls = { + 'ArthOps': '${{ steps.upload-ArthOps.outputs.artifact-url }}', + 'BeepWrapper': '${{ steps.upload-BeepWrapper.outputs.artifact-url }}', + 'CreateNewProj': '${{ steps.upload-CreateNewProj.outputs.artifact-url }}', + 'WriteToRandomFile': '${{ steps.upload-WriteToRandomFile.outputs.artifact-url }}' + }; + let body = '### VI Comparison Reports (Linux)\n\n'; body += '| VI File | Report |\n|---------|--------|\n'; for (const file of changedFiles) { const baseName = path.basename(file, '.vi'); - body += `| \`${file}\` | [${baseName}-diff-report.html](${artifactUrl}) |\n`; + const url = artifactUrls[baseName]; + const reportLink = url + ? `[${baseName}-diff-report.html](${url})` + : 'Not generated'; + body += `| \`${file}\` | ${reportLink} |\n`; } await github.rest.issues.createComment({ diff --git a/.github/workflows/vi-compare-windows.yml b/.github/workflows/vi-compare-windows.yml index f071cbc..196c84c 100644 --- a/.github/workflows/vi-compare-windows.yml +++ b/.github/workflows/vi-compare-windows.yml @@ -51,17 +51,40 @@ jobs: nationalinstruments/labview:2026q1-windows ` powershell -File C:\workspace\runvicompare.ps1 - - name: Upload Comparison Reports - id: upload - if: always() + - name: Upload ArthOps Report + id: upload-ArthOps + if: always() && hashFiles('vi-compare-reports/ArthOps-diff-report.html') != '' + uses: actions/upload-artifact@v4 + with: + name: ArthOps-diff-report + path: vi-compare-reports/ArthOps-diff-report.html + + - name: Upload BeepWrapper Report + id: upload-BeepWrapper + if: always() && hashFiles('vi-compare-reports/BeepWrapper-diff-report.html') != '' + uses: actions/upload-artifact@v4 + with: + name: BeepWrapper-diff-report + path: vi-compare-reports/BeepWrapper-diff-report.html + + - name: Upload CreateNewProj Report + id: upload-CreateNewProj + if: always() && hashFiles('vi-compare-reports/CreateNewProj-diff-report.html') != '' + uses: actions/upload-artifact@v4 + with: + name: CreateNewProj-diff-report + path: vi-compare-reports/CreateNewProj-diff-report.html + + - name: Upload WriteToRandomFile Report + id: upload-WriteToRandomFile + if: always() && hashFiles('vi-compare-reports/WriteToRandomFile-diff-report.html') != '' uses: actions/upload-artifact@v4 with: - name: vi-compare-reports-windows - path: vi-compare-reports/ - if-no-files-found: ignore + name: WriteToRandomFile-diff-report + path: vi-compare-reports/WriteToRandomFile-diff-report.html - name: Post PR Comment with Report Links - if: always() && steps.upload.outputs.artifact-url != '' + if: always() uses: actions/github-script@v7 with: script: | @@ -77,12 +100,22 @@ jobs: if (changedFiles.length === 0) return; - const artifactUrl = '${{ steps.upload.outputs.artifact-url }}'; + const artifactUrls = { + 'ArthOps': '${{ steps.upload-ArthOps.outputs.artifact-url }}', + 'BeepWrapper': '${{ steps.upload-BeepWrapper.outputs.artifact-url }}', + 'CreateNewProj': '${{ steps.upload-CreateNewProj.outputs.artifact-url }}', + 'WriteToRandomFile': '${{ steps.upload-WriteToRandomFile.outputs.artifact-url }}' + }; + let body = '### VI Comparison Reports (Windows)\n\n'; body += '| VI File | Report |\n|---------|--------|\n'; for (const file of changedFiles) { const baseName = path.basename(file, '.vi'); - body += `| \`${file}\` | [${baseName}-diff-report.html](${artifactUrl}) |\n`; + const url = artifactUrls[baseName]; + const reportLink = url + ? `[${baseName}-diff-report.html](${url})` + : 'Not generated'; + body += `| \`${file}\` | ${reportLink} |\n`; } await github.rest.issues.createComment({ diff --git a/runvicompare.sh b/runvicompare.sh index c4ef254..e1423ab 100644 --- a/runvicompare.sh +++ b/runvicompare.sh @@ -40,7 +40,8 @@ while IFS= read -r file; do echo "Running LabVIEWCLI CreateComparisonReport for: $file" # -o overwrites an existing report file; -c continues if LabVIEW is already open. - OUTPUT=$(LabVIEWCLI \ + # Run directly (not captured) so all LabVIEWCLI output is visible in the Actions log. + LabVIEWCLI \ -LabVIEWPath $LABVIEW_PATH \ -LogToConsole TRUE \ -Headless \ @@ -49,12 +50,15 @@ while IFS= read -r file; do -vi2 "$VI_HEAD" \ -reportType "HTMLSingleFile" \ -reportPath "$REPORT_PATH" \ - -o -c) + -o -c EXIT_CODE=$? if [ $EXIT_CODE -ne 0 ]; then echo "✖ CreateComparisonReport failed for $file (exit code $EXIT_CODE)" FAILED=$((FAILED + 1)) + elif [ ! -f "$REPORT_PATH" ]; then + echo "✖ CreateComparisonReport exited 0 but report was not created: $REPORT_PATH" + FAILED=$((FAILED + 1)) else echo "✔ CreateComparisonReport succeeded for $file" fi From 2d09adb96ba3de53bf8225bc0165168ee1781403 Mon Sep 17 00:00:00 2001 From: gregr-ni <71788381+gregr-ni@users.noreply.github.com> Date: Thu, 26 Feb 2026 09:50:06 -0600 Subject: [PATCH 40/51] parameter order --- runvicompare.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runvicompare.sh b/runvicompare.sh index e1423ab..92c0f13 100644 --- a/runvicompare.sh +++ b/runvicompare.sh @@ -42,10 +42,10 @@ while IFS= read -r file; do # -o overwrites an existing report file; -c continues if LabVIEW is already open. # Run directly (not captured) so all LabVIEWCLI output is visible in the Actions log. LabVIEWCLI \ + -OperationName CreateComparisonReport \ -LabVIEWPath $LABVIEW_PATH \ -LogToConsole TRUE \ -Headless \ - -OperationName CreateComparisonReport \ -vi1 "$VI_BASE" \ -vi2 "$VI_HEAD" \ -reportType "HTMLSingleFile" \ From 1f8ab496b60b1f0b0998d53c35aa9df0b1ec232f Mon Sep 17 00:00:00 2001 From: gregr-ni <71788381+gregr-ni@users.noreply.github.com> Date: Thu, 26 Feb 2026 09:56:13 -0600 Subject: [PATCH 41/51] Display LabVIEWCLI command before execution Add echo command to display LabVIEWCLI command being executed. --- runvicompare.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/runvicompare.sh b/runvicompare.sh index 92c0f13..e11af02 100644 --- a/runvicompare.sh +++ b/runvicompare.sh @@ -39,6 +39,8 @@ while IFS= read -r file; do echo "Running LabVIEWCLI CreateComparisonReport for: $file" + echo "LabVIEWCLI -OperationName CreateComparisonReport -LabVIEWPath $LABVIEW_PATH -LogToConsole TRUE -Headless -vi1 $VI_BASE -vi2 $VI_HEAD -reportType HTMLSingleFile -reportPath $REPORT_PATH -o -c" + # -o overwrites an existing report file; -c continues if LabVIEW is already open. # Run directly (not captured) so all LabVIEWCLI output is visible in the Actions log. LabVIEWCLI \ From fd89823f9a7b7fda0b22fef4a4233b391bd40317 Mon Sep 17 00:00:00 2001 From: gregr-ni <71788381+gregr-ni@users.noreply.github.com> Date: Thu, 26 Feb 2026 10:33:01 -0600 Subject: [PATCH 42/51] Update LabVIEW path to version 2026 --- runvicompare.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runvicompare.sh b/runvicompare.sh index e11af02..d705946 100644 --- a/runvicompare.sh +++ b/runvicompare.sh @@ -4,7 +4,7 @@ CHANGED_FILES_FILE='/workspace/changed-files.txt' REPORT_DIR='/workspace/vi-compare-reports' -LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' +LABVIEW_PATH='/usr/local/natinst/LabVIEW-2026-64/labviewprofull' mkdir -p "$REPORT_DIR" mkdir -p "/tmp/natinst" From 6ea1698846fc6e52b0bd8fa1cd7da5f72a7849df Mon Sep 17 00:00:00 2001 From: Greg Richardson Date: Fri, 27 Feb 2026 10:54:48 -0600 Subject: [PATCH 43/51] parameter order --- runvicompare.ps1 | 4 ++-- runvicompare.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/runvicompare.ps1 b/runvicompare.ps1 index ae345c2..38634f5 100644 --- a/runvicompare.ps1 +++ b/runvicompare.ps1 @@ -50,12 +50,12 @@ foreach ($file in $files) { -OperationName CreateComparisonReport ` -LabVIEWPath "$LabVIEWPath" ` -LogToConsole TRUE ` - -Headless ` -vi1 "$VI_BASE" ` -vi2 "$VI_HEAD" ` -reportType "HTMLSingleFile" ` -reportPath "$REPORT_PATH" ` - -o -c -nobdcosm -nofppos + -o -c -nobdcosm ` + -Headless if ($LASTEXITCODE -ne 0) { Write-Host "X CreateComparisonReport failed for $file (exit code $LASTEXITCODE)" diff --git a/runvicompare.sh b/runvicompare.sh index d705946..2d358c0 100644 --- a/runvicompare.sh +++ b/runvicompare.sh @@ -47,12 +47,12 @@ while IFS= read -r file; do -OperationName CreateComparisonReport \ -LabVIEWPath $LABVIEW_PATH \ -LogToConsole TRUE \ - -Headless \ -vi1 "$VI_BASE" \ -vi2 "$VI_HEAD" \ -reportType "HTMLSingleFile" \ -reportPath "$REPORT_PATH" \ - -o -c + -o -c -nobdcosm \ + -Headless EXIT_CODE=$? if [ $EXIT_CODE -ne 0 ]; then From 1776049666812a699c8d57ab1ecc9384a9c1c942 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Feb 2026 17:09:09 +0000 Subject: [PATCH 44/51] Add GitHub Pages deployment for direct HTML report viewing Co-authored-by: gregr-ni <71788381+gregr-ni@users.noreply.github.com> --- .github/workflows/vi-compare-linux.yml | 37 +++++++++++++++++++++--- .github/workflows/vi-compare-windows.yml | 37 +++++++++++++++++++++--- 2 files changed, 66 insertions(+), 8 deletions(-) diff --git a/.github/workflows/vi-compare-linux.yml b/.github/workflows/vi-compare-linux.yml index 572cc3f..d8e210a 100644 --- a/.github/workflows/vi-compare-linux.yml +++ b/.github/workflows/vi-compare-linux.yml @@ -1,5 +1,9 @@ name: VI Compare (Linux) +# Prerequisite: enable GitHub Pages in repo Settings → Pages → Source: GitHub Actions. +# Reports are then served as HTML at https://aphill93.github.io/linuxContainerDemo/ +# so clicking a link in the PR comment opens the rendered HTML directly in the browser. + on: pull_request: types: @@ -13,6 +17,8 @@ jobs: permissions: contents: read pull-requests: write + pages: write + id-token: write steps: - name: Checkout Repository uses: actions/checkout@v4 @@ -81,6 +87,19 @@ jobs: name: WriteToRandomFile-diff-report path: vi-compare-reports/WriteToRandomFile-diff-report.html + - name: Upload reports to GitHub Pages + id: upload-pages + if: always() && hashFiles('vi-compare-reports/*.html') != '' + uses: actions/upload-pages-artifact@v3 + with: + path: vi-compare-reports/ + + - name: Deploy to GitHub Pages + id: deploy-pages + if: always() && steps.upload-pages.outcome == 'success' + uses: actions/deploy-pages@v4 + continue-on-error: true + - name: Post PR Comment with Report Links if: always() uses: actions/github-script@v7 @@ -98,6 +117,9 @@ jobs: if (changedFiles.length === 0) return; + // Use GitHub Pages URL when available so the HTML opens directly in the + // browser. Fall back to the artifact zip download if Pages isn't enabled. + const pagesUrl = '${{ steps.deploy-pages.outputs.page_url }}'; const artifactUrls = { 'ArthOps': '${{ steps.upload-ArthOps.outputs.artifact-url }}', 'BeepWrapper': '${{ steps.upload-BeepWrapper.outputs.artifact-url }}', @@ -109,10 +131,17 @@ jobs: body += '| VI File | Report |\n|---------|--------|\n'; for (const file of changedFiles) { const baseName = path.basename(file, '.vi'); - const url = artifactUrls[baseName]; - const reportLink = url - ? `[${baseName}-diff-report.html](${url})` - : 'Not generated'; + const reportFile = `${baseName}-diff-report.html`; + let reportLink; + if (pagesUrl) { + const base = pagesUrl.endsWith('/') ? pagesUrl : pagesUrl + '/'; + reportLink = `[${reportFile}](${base}${reportFile})`; + } else { + const artifactUrl = artifactUrls[baseName]; + reportLink = artifactUrl + ? `[${reportFile}](${artifactUrl}) *(zip)*` + : 'Not generated'; + } body += `| \`${file}\` | ${reportLink} |\n`; } diff --git a/.github/workflows/vi-compare-windows.yml b/.github/workflows/vi-compare-windows.yml index 196c84c..357d15b 100644 --- a/.github/workflows/vi-compare-windows.yml +++ b/.github/workflows/vi-compare-windows.yml @@ -1,5 +1,9 @@ name: VI Compare (Windows) +# Prerequisite: enable GitHub Pages in repo Settings → Pages → Source: GitHub Actions. +# Reports are then served as HTML at https://aphill93.github.io/linuxContainerDemo/ +# so clicking a link in the PR comment opens the rendered HTML directly in the browser. + # on: # pull_request: # types: @@ -13,6 +17,8 @@ jobs: permissions: contents: read pull-requests: write + pages: write + id-token: write steps: - name: Checkout Repository uses: actions/checkout@v4 @@ -83,6 +89,19 @@ jobs: name: WriteToRandomFile-diff-report path: vi-compare-reports/WriteToRandomFile-diff-report.html + - name: Upload reports to GitHub Pages + id: upload-pages + if: always() && hashFiles('vi-compare-reports/*.html') != '' + uses: actions/upload-pages-artifact@v3 + with: + path: vi-compare-reports/ + + - name: Deploy to GitHub Pages + id: deploy-pages + if: always() && steps.upload-pages.outcome == 'success' + uses: actions/deploy-pages@v4 + continue-on-error: true + - name: Post PR Comment with Report Links if: always() uses: actions/github-script@v7 @@ -100,6 +119,9 @@ jobs: if (changedFiles.length === 0) return; + // Use GitHub Pages URL when available so the HTML opens directly in the + // browser. Fall back to the artifact zip download if Pages isn't enabled. + const pagesUrl = '${{ steps.deploy-pages.outputs.page_url }}'; const artifactUrls = { 'ArthOps': '${{ steps.upload-ArthOps.outputs.artifact-url }}', 'BeepWrapper': '${{ steps.upload-BeepWrapper.outputs.artifact-url }}', @@ -111,10 +133,17 @@ jobs: body += '| VI File | Report |\n|---------|--------|\n'; for (const file of changedFiles) { const baseName = path.basename(file, '.vi'); - const url = artifactUrls[baseName]; - const reportLink = url - ? `[${baseName}-diff-report.html](${url})` - : 'Not generated'; + const reportFile = `${baseName}-diff-report.html`; + let reportLink; + if (pagesUrl) { + const base = pagesUrl.endsWith('/') ? pagesUrl : pagesUrl + '/'; + reportLink = `[${reportFile}](${base}${reportFile})`; + } else { + const artifactUrl = artifactUrls[baseName]; + reportLink = artifactUrl + ? `[${reportFile}](${artifactUrl}) *(zip)*` + : 'Not generated'; + } body += `| \`${file}\` | ${reportLink} |\n`; } From d9783544f896354379de1c6eda818984b321e9c5 Mon Sep 17 00:00:00 2001 From: Greg Richardson Date: Fri, 27 Feb 2026 11:09:22 -0600 Subject: [PATCH 45/51] more VI changes --- Test-VIs/BeepWrapper.vi | Bin 4067 -> 4155 bytes Test-VIs/NewThing.vi | Bin 0 -> 7676 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Test-VIs/NewThing.vi diff --git a/Test-VIs/BeepWrapper.vi b/Test-VIs/BeepWrapper.vi index 31b7b1492828c9cf1c90cacb6926bf6dba3a3e09..50479823342a343fc30436ec3c22ab43aa87f4be 100644 GIT binary patch delta 2127 zcmZuy2{hDe8-HgkgRwK$E{3s$8CjxSyRj$Pg^V?_WXY0kCZsHpJ2DcHP?kH^YbiI` zqmm-~5=vc$t6a!_PTzO)ob#OLd4JFP{{QFv-o--?B~UiDHijH*fWgwi%*xWh z!4UxVzW`t`0RTu){Sm4ymdQq`+DTY@X&2|-vaBiA9ZL_sfuIK1sme`NVET~2 z`dYbt-3i{hM0t0Cn#L`oEO`U~7L}uDRqrFJR2Kj!fY1y$4Is2tsU8GC9n6R^FhgCa z0X+m5=tlX!)9u>ITg`9zR@I)6J+YO4>F!{#mdj6>1J7`&c>#x&m?9c9A=eo3`^D@4 zVr*?{O>aa)8239v&Qmu)L>I)rY`5sry^owDD|Yxh?bR`V$(R8 zG7^5c6fV!_vT0se5s7VX))l9jTF^ z`c6x+n>mk_FyV)HQI_4KT*p-$%Gh15WD~Mc_z#;gx=(hDvD&@D!f9#wb<4Uk=}VS7 zPbW(oJ9L&>vg}!cM<{H2WwxD$sTAa{C$`U$9B@>WGkadBUW#?Nv*rkqgED61JJt$= zcF$zBy|ioBo!C`ZS<$_1BC-%++4_sJSCDs6G(-Aub;ojB`V^Aa*O_!}n&fwCEmFFW z_iXe%iC}nJwT7#2E9Q+^S`#2T!H9T$0GKzU3wmz6ILW8a-!~U{r;sW69ck!(<8>jZ zf7F>br^i`gTK$`fmmr>YIB|_p3Qo!OMQ({8e83s`^jcww>t{9M`ISsE=Z@BSm-B`qw0`%zq<*R&pBwpkIs%SVoEX3` zv_pGS{^Z*nMvw*UPRch%Ei>z_iEJlnHa{Pdbsd{dvGQe)PfbDZ27egIOi9=|Yq$aH zLpIAIr5Lso)q}R9);C_F_jVgd!(Tg|-gJxkI~s<8tDgCs`?e^Vj|a1c+M2T5+iI3F z5`g2z8%R z=^V!hc<5|LW4s)y%25^ijR2vpJh%|+C3!88RZ@5jm zIR&9+peAG_HZHVdYo5+)p|Y{TuNIbWOO#BE^T$?PE~~iMe}hd}+&;f$ribwYKm6m` zf?ns&-hke1cdVeGkdx4O?Gu6JMYYyU+-yFf3BwK;_5<_f&)+o z4?9N(f`=ynAQ=DvwE+M?9gI(dHxrYkY3w$)PHNHb*Ti4r2aV)QoiPLpNYG_K2Vik4 z*2r2qA^CmiA-|VC?4fNLBbR_W(ODX-U~Y|Yc7wBFyO(Pt5%q6L2^a5CC!@uuv#zU9 z$LpDCy>7om)Gs9aZB<+?1!*V@ng#&?@tr1EBdn3I6A%GF1T-W7*;rK=L%|dG{aZAH z>C|~ca;BEdRiCgkQIy~SpFc4I={sM3BOfcwxi%HmUJj-0tP-13i zN6G;HhT}~YLbBs=fS@PI9aN~KMoaJXhinP!K}(_) zH-~DyrYJ21gAHl`KNsR_;E!5;CbrNT)@Y|NdK%&8VvV7(V?EVAVoaYbUA3To*+Rrw4rSaPZcWw^DND1yMzx>C+QoS?C*F{>39DMU)s~bZNij9zJy5mUo>}=@3R-HqHC1 zVLkzJJRVtMI3`nVSM6>Noo+4|!hgI^Q+m{sz-s#|Vs zwPQ!e_cBJ`$P&=|EO3m%WsBYqEz^Y~5Xl)*ZX;~fw=d)0DswS+!Ytgbpx$OuqsH{4 z(F#-lT`oZL-pMO$&pS7WW?)|*cjwmh#vpO0mRLPWpZJ(4WgWL?&QQ}E`RD8S_*{$j zg9j<+F<#khHiwnmG`oc@V=7v~nL*20-S4qX5MjA7_sad`*^fFtWe;V;-1Q5uvAW!c z#(z6p0axrlEoa4HUE?ZcR*rXpE%-b5tTH0Ef%{Mzv$6|XPk4cgSAtuG(G%TSc<-U z^OM+klZWj&s^z`T5P$kE@^&b{y7u8Va%C5}z3b4j<$ScpnAHXE;nxKhc09Iv5Q5E! zssB@%SESPVa<2k*Pe(NwT@#| zwcj$`V`6G<DkMjlp9O0AuMVq9rH>^dh|Qo+Po-F zY`g&%k=t3wEwy>>+QNy$lzPwbY9xG?zr`=|kB8T(&EtfO@{3D|R>NN# z&}+8D*rY3(Z;X|<6*Q&6>t8IJ30w; zn)eT*vK3d0RwACQ{h&{mp7Sd3_yj2ONBZce5LgI?&OxXu{a@5_Kw;Ac9h5zx#zE*t zBC1s294LvDlZ@bifPk=oz<>bBz_r%aHX0OXjB^{yZi6mfzGq!r=z>aPm3MI99l0Hv zoF;hc9?pKvw{T^R%SaY#4*5~1e1EED;k!7va#IKAo(%rh4b~8EV5nu{fSA-J-Glu3 zAo25}dP`>~t$9cuG6U(r?LHC!%~rqcDhH_aDhf6hHZQWpCgFk=lgFM*!$VO^2C^5 zpl^D`*qdP7O|VuWMg`BW10{C>k|IY9_N?~VBDG6;un liC=hbbcVE+cFLCu?JFB8oPZ*Pgit(V0x6V`80^pC{{!5GOi2I$ diff --git a/Test-VIs/NewThing.vi b/Test-VIs/NewThing.vi new file mode 100644 index 0000000000000000000000000000000000000000..a86010ad6c2d7c1b02f0c8a5bdcc49884c242d30 GIT binary patch literal 7676 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 literal 0 HcmV?d00001 From a944ac34066358c0518f227be3bdbcdbb8a32083 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Feb 2026 17:19:52 +0000 Subject: [PATCH 46/51] Add Pages setup error message and remove redundant artifact uploads Co-authored-by: gregr-ni <71788381+gregr-ni@users.noreply.github.com> --- .github/workflows/vi-compare-linux.yml | 80 ++++++++--------------- .github/workflows/vi-compare-windows.yml | 81 ++++++++---------------- 2 files changed, 51 insertions(+), 110 deletions(-) diff --git a/.github/workflows/vi-compare-linux.yml b/.github/workflows/vi-compare-linux.yml index d8e210a..0c7200d 100644 --- a/.github/workflows/vi-compare-linux.yml +++ b/.github/workflows/vi-compare-linux.yml @@ -1,8 +1,8 @@ name: VI Compare (Linux) -# Prerequisite: enable GitHub Pages in repo Settings → Pages → Source: GitHub Actions. -# Reports are then served as HTML at https://aphill93.github.io/linuxContainerDemo/ -# so clicking a link in the PR comment opens the rendered HTML directly in the browser. +# Prerequisite (one-time, requires admin): +# Go to Settings → Pages → Build and deployment → Source → GitHub Actions → Save. +# Without this the "Deploy to GitHub Pages" step will fail with a clear error message. on: pull_request: @@ -55,38 +55,6 @@ jobs: sudo chmod -R a+r "${{ github.workspace }}/vi-compare-reports" fi - - name: Upload ArthOps Report - id: upload-ArthOps - if: always() && hashFiles('vi-compare-reports/ArthOps-diff-report.html') != '' - uses: actions/upload-artifact@v4 - with: - name: ArthOps-diff-report - path: vi-compare-reports/ArthOps-diff-report.html - - - name: Upload BeepWrapper Report - id: upload-BeepWrapper - if: always() && hashFiles('vi-compare-reports/BeepWrapper-diff-report.html') != '' - uses: actions/upload-artifact@v4 - with: - name: BeepWrapper-diff-report - path: vi-compare-reports/BeepWrapper-diff-report.html - - - name: Upload CreateNewProj Report - id: upload-CreateNewProj - if: always() && hashFiles('vi-compare-reports/CreateNewProj-diff-report.html') != '' - uses: actions/upload-artifact@v4 - with: - name: CreateNewProj-diff-report - path: vi-compare-reports/CreateNewProj-diff-report.html - - - name: Upload WriteToRandomFile Report - id: upload-WriteToRandomFile - if: always() && hashFiles('vi-compare-reports/WriteToRandomFile-diff-report.html') != '' - uses: actions/upload-artifact@v4 - with: - name: WriteToRandomFile-diff-report - path: vi-compare-reports/WriteToRandomFile-diff-report.html - - name: Upload reports to GitHub Pages id: upload-pages if: always() && hashFiles('vi-compare-reports/*.html') != '' @@ -100,8 +68,27 @@ jobs: uses: actions/deploy-pages@v4 continue-on-error: true + - name: Check GitHub Pages setup + if: always() && steps.deploy-pages.outcome == 'failure' + run: | + echo "" + echo "==========================================================" + echo " GitHub Pages deployment failed — admin setup required" + echo "==========================================================" + echo "" + echo " A repo admin must complete the following one-time setup:" + echo "" + echo " 1. Go to https://github.com/${{ github.repository }}/settings/pages" + echo " 2. Under 'Build and deployment', set Source to 'GitHub Actions'" + echo " 3. Click Save" + echo "" + echo " This setting requires admin access to the repository." + echo "==========================================================" + echo "::error::GitHub Pages is not configured. A repo admin must go to Settings → Pages → Source → GitHub Actions and click Save. See the step log for details." + exit 1 + - name: Post PR Comment with Report Links - if: always() + if: always() && steps.deploy-pages.outcome == 'success' uses: actions/github-script@v7 with: script: | @@ -117,32 +104,15 @@ jobs: if (changedFiles.length === 0) return; - // Use GitHub Pages URL when available so the HTML opens directly in the - // browser. Fall back to the artifact zip download if Pages isn't enabled. const pagesUrl = '${{ steps.deploy-pages.outputs.page_url }}'; - const artifactUrls = { - 'ArthOps': '${{ steps.upload-ArthOps.outputs.artifact-url }}', - 'BeepWrapper': '${{ steps.upload-BeepWrapper.outputs.artifact-url }}', - 'CreateNewProj': '${{ steps.upload-CreateNewProj.outputs.artifact-url }}', - 'WriteToRandomFile': '${{ steps.upload-WriteToRandomFile.outputs.artifact-url }}' - }; + const base = pagesUrl.endsWith('/') ? pagesUrl : pagesUrl + '/'; let body = '### VI Comparison Reports (Linux)\n\n'; body += '| VI File | Report |\n|---------|--------|\n'; for (const file of changedFiles) { const baseName = path.basename(file, '.vi'); const reportFile = `${baseName}-diff-report.html`; - let reportLink; - if (pagesUrl) { - const base = pagesUrl.endsWith('/') ? pagesUrl : pagesUrl + '/'; - reportLink = `[${reportFile}](${base}${reportFile})`; - } else { - const artifactUrl = artifactUrls[baseName]; - reportLink = artifactUrl - ? `[${reportFile}](${artifactUrl}) *(zip)*` - : 'Not generated'; - } - body += `| \`${file}\` | ${reportLink} |\n`; + body += `| \`${file}\` | [${reportFile}](${base}${reportFile}) |\n`; } await github.rest.issues.createComment({ diff --git a/.github/workflows/vi-compare-windows.yml b/.github/workflows/vi-compare-windows.yml index 357d15b..c491c82 100644 --- a/.github/workflows/vi-compare-windows.yml +++ b/.github/workflows/vi-compare-windows.yml @@ -1,8 +1,8 @@ name: VI Compare (Windows) -# Prerequisite: enable GitHub Pages in repo Settings → Pages → Source: GitHub Actions. -# Reports are then served as HTML at https://aphill93.github.io/linuxContainerDemo/ -# so clicking a link in the PR comment opens the rendered HTML directly in the browser. +# Prerequisite (one-time, requires admin): +# Go to Settings → Pages → Build and deployment → Source → GitHub Actions → Save. +# Without this the "Deploy to GitHub Pages" step will fail with a clear error message. # on: # pull_request: @@ -57,38 +57,6 @@ jobs: nationalinstruments/labview:2026q1-windows ` powershell -File C:\workspace\runvicompare.ps1 - - name: Upload ArthOps Report - id: upload-ArthOps - if: always() && hashFiles('vi-compare-reports/ArthOps-diff-report.html') != '' - uses: actions/upload-artifact@v4 - with: - name: ArthOps-diff-report - path: vi-compare-reports/ArthOps-diff-report.html - - - name: Upload BeepWrapper Report - id: upload-BeepWrapper - if: always() && hashFiles('vi-compare-reports/BeepWrapper-diff-report.html') != '' - uses: actions/upload-artifact@v4 - with: - name: BeepWrapper-diff-report - path: vi-compare-reports/BeepWrapper-diff-report.html - - - name: Upload CreateNewProj Report - id: upload-CreateNewProj - if: always() && hashFiles('vi-compare-reports/CreateNewProj-diff-report.html') != '' - uses: actions/upload-artifact@v4 - with: - name: CreateNewProj-diff-report - path: vi-compare-reports/CreateNewProj-diff-report.html - - - name: Upload WriteToRandomFile Report - id: upload-WriteToRandomFile - if: always() && hashFiles('vi-compare-reports/WriteToRandomFile-diff-report.html') != '' - uses: actions/upload-artifact@v4 - with: - name: WriteToRandomFile-diff-report - path: vi-compare-reports/WriteToRandomFile-diff-report.html - - name: Upload reports to GitHub Pages id: upload-pages if: always() && hashFiles('vi-compare-reports/*.html') != '' @@ -102,8 +70,28 @@ jobs: uses: actions/deploy-pages@v4 continue-on-error: true + - name: Check GitHub Pages setup + if: always() && steps.deploy-pages.outcome == 'failure' + shell: pwsh + run: | + Write-Host "" + Write-Host "==========================================================" + Write-Host " GitHub Pages deployment failed — admin setup required" + Write-Host "==========================================================" + Write-Host "" + Write-Host " A repo admin must complete the following one-time setup:" + Write-Host "" + Write-Host " 1. Go to https://github.com/${{ github.repository }}/settings/pages" + Write-Host " 2. Under 'Build and deployment', set Source to 'GitHub Actions'" + Write-Host " 3. Click Save" + Write-Host "" + Write-Host " This setting requires admin access to the repository." + Write-Host "==========================================================" + Write-Host "::error::GitHub Pages is not configured. A repo admin must go to Settings -> Pages -> Source -> GitHub Actions and click Save. See the step log for details." + exit 1 + - name: Post PR Comment with Report Links - if: always() + if: always() && steps.deploy-pages.outcome == 'success' uses: actions/github-script@v7 with: script: | @@ -119,32 +107,15 @@ jobs: if (changedFiles.length === 0) return; - // Use GitHub Pages URL when available so the HTML opens directly in the - // browser. Fall back to the artifact zip download if Pages isn't enabled. const pagesUrl = '${{ steps.deploy-pages.outputs.page_url }}'; - const artifactUrls = { - 'ArthOps': '${{ steps.upload-ArthOps.outputs.artifact-url }}', - 'BeepWrapper': '${{ steps.upload-BeepWrapper.outputs.artifact-url }}', - 'CreateNewProj': '${{ steps.upload-CreateNewProj.outputs.artifact-url }}', - 'WriteToRandomFile': '${{ steps.upload-WriteToRandomFile.outputs.artifact-url }}' - }; + const base = pagesUrl.endsWith('/') ? pagesUrl : pagesUrl + '/'; let body = '### VI Comparison Reports (Windows)\n\n'; body += '| VI File | Report |\n|---------|--------|\n'; for (const file of changedFiles) { const baseName = path.basename(file, '.vi'); const reportFile = `${baseName}-diff-report.html`; - let reportLink; - if (pagesUrl) { - const base = pagesUrl.endsWith('/') ? pagesUrl : pagesUrl + '/'; - reportLink = `[${reportFile}](${base}${reportFile})`; - } else { - const artifactUrl = artifactUrls[baseName]; - reportLink = artifactUrl - ? `[${reportFile}](${artifactUrl}) *(zip)*` - : 'Not generated'; - } - body += `| \`${file}\` | ${reportLink} |\n`; + body += `| \`${file}\` | [${reportFile}](${base}${reportFile}) |\n`; } await github.rest.issues.createComment({ From 1522ee689642c03aa1de59ee4e37c1bff51dffe2 Mon Sep 17 00:00:00 2001 From: Greg Richardson Date: Fri, 27 Feb 2026 15:25:16 -0600 Subject: [PATCH 47/51] add PrintToSingleFileHtml operation --- .../PrintToSingleFileHtml/Append log.vi | Bin 0 -> 9714 bytes .../Create output file.vi | Bin 0 -> 41642 bytes .../PrintToSingleFileHtml/GetHelp.vi | Bin 0 -> 12715 bytes .../Make path absolute.vi | Bin 0 -> 16774 bytes .../PrintToSingleFileHtml/Open VI.vi | Bin 0 -> 17483 bytes .../PrintToSingleFileHtml/Parse inputs.vi | Bin 0 -> 19240 bytes .../Print to temp file.vi | Bin 0 -> 18858 bytes .../PrintToSingleFileHtml.lvclass | 102 ++++++++++++++++++ .../PrintToSingleFileHtml/RunOperation.vi | Bin 0 -> 14804 bytes .../base64_fast_encode.vi | Bin 0 -> 19398 bytes 10 files changed, 102 insertions(+) create mode 100644 VICompareTooling/PrintToSingleFileHtml/Append log.vi create mode 100644 VICompareTooling/PrintToSingleFileHtml/Create output file.vi create mode 100644 VICompareTooling/PrintToSingleFileHtml/GetHelp.vi create mode 100644 VICompareTooling/PrintToSingleFileHtml/Make path absolute.vi create mode 100644 VICompareTooling/PrintToSingleFileHtml/Open VI.vi create mode 100644 VICompareTooling/PrintToSingleFileHtml/Parse inputs.vi create mode 100644 VICompareTooling/PrintToSingleFileHtml/Print to temp file.vi create mode 100644 VICompareTooling/PrintToSingleFileHtml/PrintToSingleFileHtml.lvclass create mode 100644 VICompareTooling/PrintToSingleFileHtml/RunOperation.vi create mode 100644 VICompareTooling/PrintToSingleFileHtml/base64_fast_encode.vi diff --git a/VICompareTooling/PrintToSingleFileHtml/Append log.vi b/VICompareTooling/PrintToSingleFileHtml/Append log.vi new file mode 100644 index 0000000000000000000000000000000000000000..9cf2341422b4b7102496417223d26a7d876ee8bf GIT binary patch literal 9714 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 literal 0 HcmV?d00001 diff --git a/VICompareTooling/PrintToSingleFileHtml/Create output file.vi b/VICompareTooling/PrintToSingleFileHtml/Create output file.vi new file mode 100644 index 0000000000000000000000000000000000000000..7564b7b7449b2ee3498c195d1f70cf0f7ee37942 GIT binary patch literal 41642 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 bC%Qjk_WBxg{7x*C(*Jr@30w$rJ6ik?kHR6Y literal 0 HcmV?d00001 diff --git a/VICompareTooling/PrintToSingleFileHtml/GetHelp.vi b/VICompareTooling/PrintToSingleFileHtml/GetHelp.vi new file mode 100644 index 0000000000000000000000000000000000000000..f0c983dcf84dcc8fe1cdf2d87118ee0687885a88 GIT binary patch literal 12715 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 literal 0 HcmV?d00001 diff --git a/VICompareTooling/PrintToSingleFileHtml/Make path absolute.vi b/VICompareTooling/PrintToSingleFileHtml/Make path absolute.vi new file mode 100644 index 0000000000000000000000000000000000000000..f0c1327ea58f7514e0f2e9e9cb06957b70f48e48 GIT binary patch literal 16774 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 MN!m{)fW=V%1*dyJQ2+n{ literal 0 HcmV?d00001 diff --git a/VICompareTooling/PrintToSingleFileHtml/Open VI.vi b/VICompareTooling/PrintToSingleFileHtml/Open VI.vi new file mode 100644 index 0000000000000000000000000000000000000000..dfa07a9a6bb22d9f316c7afa0802947582fc69d3 GIT binary patch literal 17483 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 A(EtDd literal 0 HcmV?d00001 diff --git a/VICompareTooling/PrintToSingleFileHtml/Print to temp file.vi b/VICompareTooling/PrintToSingleFileHtml/Print to temp file.vi new file mode 100644 index 0000000000000000000000000000000000000000..dc1ed5f03b1b34454bcb6c3c5f416b680194ccb3 GIT binary patch literal 18858 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 literal 0 HcmV?d00001 diff --git a/VICompareTooling/PrintToSingleFileHtml/PrintToSingleFileHtml.lvclass b/VICompareTooling/PrintToSingleFileHtml/PrintToSingleFileHtml.lvclass new file mode 100644 index 0000000..b5825f4 --- /dev/null +++ b/VICompareTooling/PrintToSingleFileHtml/PrintToSingleFileHtml.lvclass @@ -0,0 +1,102 @@ + + + *A#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!!(]!!!*Q(C=\>7R=2MR%!81N=?"5X<A91P<!FNA#^M#5Y6M96NA"R[WM#WQ"<9A0ZYR'E?G!WPM1$AN>@S(!ZZQG&0%VLZ'@)H8:_X\<^P(^7@8H\4Y;"`NX\;8JZPUX@@MJXC]C.3I6K5S(F/^DHTE)R`ZS%@?]J;XP/5N<XH*3V\SEJ?]Z#F0?=J4HP+5<Y=]Z#%0/>+9@%QU"BU$D-YI-4[':XC':XB]D?%:HO%:HO(2*9:H?):H?)<(<4%]QT-]QT-]BNIEMRVSHO%R@$20]T20]T30+;.Z'K".VA:OAW"%O^B/GK>ZGM>J.%`T.%`T.)`,U4T.UTT.UTROW6;F.]XDE0-9*IKH?)KH?)L(U&%]R6-]R6-]JIPC+:[#+"/7Q2'CX&1[F#`&5TR_2@%54`%54`'YN$WBWF<GI8E==J\E3:\E3:\E-51E4`)E4`)EDW%D?:)H?:)H?5Q6S:-]S:-A;6,42RIMX:A[J3"Z`'S\*<?HV*MENS.C<>Z9GT,7:IOVC7*NDFA00><$D0719CV_L%7.N6CR&C(7(R=,(1M4;Z*9.T][RNXH46X62:X632X61?X6\H(L8_ZYP^`D>LP&^8K.S_53Z`-Z4K>4()`(/"Q/M>`P9\@<P<U'PDH?8AA`XUMPTP_EXOF`[8`Q<IT0]?OYVOA(5/(_Z!!!!!! + 637566976 + 1.0.0.4 + true + true + true + *A#!!!!!!!)!"1!&!!!-!%!!!@````]!!!!"!!%!!"NW5F.31QU+!!.-6E.$4%*76Q!!&JA!!!4?!!!!)!!!&HA!!!!C!!!!!2V1=GFO>&2P5WFO:WRF2GFM:5BU<7QO<(:D<'&T=Q!!!!!!I#9!A!!!-!!!+!!%!!!!!!1!!Q!]!,Q!(U!!!A!!!!!"!!%!"P````]!!!!!!!!!!!!!!!"09LO<YCL#3*8"E3JV(WY;!!!!$!!!!!1!!!!!0^AL86/M]%K6W\=V!S6M.>1>D.G0!,)%[9!*G/TY1HY!!!!!!!!!!,G@`&5=>#R*NJ)<VH'!3.="!!!!`````^1>D.G0!,)%[9!*G/TY1HY!!!!1IC1/+/XL>T5(3<9M_GO\,A!!!!1!!!!!!!!!*Q!"4&:$1Q!!!!%!!F:*4%)!!!!!5&2)-!!!!!5!!1!"!!!!!!)!!Q!!!!!#!!%!!!!!!#%!!!!9?*RD9'.A;G#YQ!$%D!Z-$5Q:1.9(BA!'!$_B":9!!!!!!!!3!!!!$(C=9W"BY)"#"A!!_!!F!!!!!!"(!!!"'(C=9W$!"0_"!%AR-D#Q/!"J&D2R-!VD5R0A-B?886"R:KA<77(#1+%81*I**!>6IQ#29F&!]AY=]%0J!UBC!.B?*TA!!!!!$!!"6EF%5Q!!!!!!!Q!!!8U!!!/]?*S<Q-D!5&ZB:B,!R-$!$'3L-41Q*/?HJ0)S!0E-#*##T#%$.%$.UU)4^WB_I_(:`)/J6."D"UTM`Q70ZC-;BTW['U&#RRU3Q!K\'1UPO2I?_$`B!FA<5!'`P!.9PU`H!=^>--V!*2[>"XU[4TH_PQ27F19#?PTS,8$\'CKN'5L9A?J!UM=<PT"#H9,O!(,.^TDYC-54<JB8,QO46\))EU?H#Z@"=2?O!$'1MFY2,KTWB1%.50$I0)?1X-5)5>(.BR$T[(1-1/&J)0-;,[$Y"CDQ!6XA!31-&?)/9YUN]M(;V`>WM1*J.C1R"Q:)`$MQI7)^"E9'E/>!:#^5L1W1T116YY'+A>B`I7Q.*$V3U)BD9L#(CXH#^3$%6C+Z!S:W#WQ7R&WM5$%^I/1#+.M'S#[!MLW!\!N1>D1DQEUZ1,9!)]1P$!SY;7>`&V=9'RH!]B1M;QE$=8*OA9'"8H6VM%[QDJ//5[V/=#W$%%C]),E-4:A"!.DHE'-!!!!!!!%U!!!#!(C==W"A9#CP-$/:Q-D!Q!T%;AQ.$-HZ+;E-;/!))\I)"$C'B95(?T3`]@$IP/<2?>[DMU<&Q;/T2-5#R$)!M41]OPE^OM5]>M/U`,`MU8H1]-$`E`R4$J;Q>ZRY?1:ETL\`1/$2[]\BU?E#V.DL"G9!.@NT?(3(=5!V\1+J9DQ&UTE*K./D'[T?![D?"]DI^A&K[AU%]E*5."IK/"DYJRZKK!22"TMP'*QQ/&6K".0"C++$%;K$%;+$%;'DB.W%E8`<A>@K1/>*A&TF!(1?G'%">*Y%U(E3`S]<HH2E0!:UFU@H#9`G)R\2]8'/=9?RBRE_M0<VP6WAI%9/<A=A6G+19)#*;S/*AY#TPYNL!Z<YA=5:C")'YO4=!A-$P?LK9*VA(3=>JVK>Y&I'!'[W@ME!!!$]!!!"Q(C==W"A9#CP-$-*9'2A9!:C.99'BO4]F&1'..$#C#Y#!7(BQ2\.<RQ]/K^Z>*\X[+R2M@$I,&%R!,%U1#Q&DWZ_D^UQV@]PNR\A<_U&MDR[X4E]/FW!CJK0=5!6_A-:HU"+3P-]OE&3P2Z!%2]AI^M(+.]<#/3&K#BU/8"U/(,!6$#CK'#%KG$M='1%K<!!KJ!!K<$Q[!Y"/KPZE!2)B9&(NY@%`]O'*VM0?0#\(02I0O)1(2^X',M831*L8^`<"1IKZ/"S!/)MI!B-8!V*(!3=`6V=(<#%,ST-1:11%#=8**@J66=([Q4L//EYV?I%VT)Q!!#)^&9W!!!!%Q!!!!FYH'.A9'"E:!!#!!!5!!-!!!!!%#9Q)4%!!!AS.CYT:$%T-1!!!!!-*A#!!!!!"$)W,D!!!!!!%#9Q)4%!!!AS.CYT:$%T-1!!!!!-*A#!!!!!"$)W,D!!!!!!%#9Q)4%!!!AS.CYT:$%T-1!!!!!5!1!!!068.9*Z*K+-,H.34A:*/:U!!!!.!!!!!!!!!!!!!!!!!!!!!!!!!)$`````A!!!!9!!!!'!!!!"A!!!!9!!!!'!!!!"A!!!!9!!!!'!!!!"A!!!!9!!!!'!9!!"A:A!!99'!!'9!9!"I!"!!<!!Q!'M!U!"IQ\!!;$V1!'A+M!"I$6!!;!KQ!'A.5!"I#L!!;!V1!'9+Y!"BD9!!9'Y!!'!9!!"`````Q!!"!$```````````````````````````````````````````]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!#ZO1!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!#ZU=8,U<E!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!#ZU=7`P\_`S^'Z!!!!!!!!!!!!!!!!!!!!!0``!!#ZU=7`P\_`P\_`P]P2O1!!!!!!!!!!!!!!!!!!``]!S]7`P\_`P\_`P\_`P\`,U1!!!!!!!!!!!!!!!!$``Q$&R<_`P\_`P\_`P\_`P``,!!!!!!!!!!!!!!!!!0``!-8,S]7`P\_`P\_`P````]5!!!!!!!!!!!!!!!!!``]!R=P,S]P&P\_`P```````R1!!!!!!!!!!!!!!!!$``Q$&S]P,S]P,R>(````````&!!!!!!!!!!!!!!!!!0``!-8,S]P,S]P,`````````]5!!!!!!!!!!!!!!!!!``]!R=P,S]P,S]P`````````R1!!!!!!!!!!!!!!!!$``Q$&S]P,S]P,S``````````&!!!!!!!!!!!!!!!!!0``!-8,S]P,S]P,`````````]5!!!!!!!!!!!!!!!!!``]!R=P,S]P,S]P`````````R1!!!!!!!!!!!!!!!!$``Q$,S]P,S]P,S````````]P,!!!!!!!!!!!!!!!!!0``!!$&R=P,S]P,`````]P2R1!!!!!!!!!!!!!!!!!!``]!!!!!R=P,S]P``]P,R1!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!-8,S]P,PQ!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!$&PQ!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````````!!!!!A!"!!!!!!!-!!&'5%B1!!!!!!!$!!!!"!!!!!!!!!6(!!!3>8C=Z6B>4"R6&$ZX7(#7(TN,W1+R>"=S),'1.)X;CFK,$#69,&";W`KAX898;,+[O$_UC>K;O%5R[9P%0J!U];(BJ1`'I0'J3;-,VGR<E!=4+=E+C4('."K47I--Y\FX>G:W:P])%ERU%WYGS`HOO@>]X`HG:!(+XR#KO&5Y,Q-2\O.$FQT&XDA"C$8TE0QUD)"QF0Q&J++;S,#@0SL=Z6<*>BF+P@%'@J=U#L^BN0+$]C'ZT>G&21QN%KJRMW):NHDDF?1&-3')HWQ82QOV82V1)VQCK^RRU@7!PR1.9%+).N,6U5R7A5CV.FOULM@TOC]KUG`NT8QVW^)OAS$&SY*CYF(=%6.`S<<E_ME#>V<<%H$,2JC=H$2!$B85Q)[R&T&E!9$=Y`JT9-I2%R)441R4T$#9ZZ[72X+NDN'T5Z!6OF7-)R*BZZ)XJF!.*O^HM+7F*94BGI1.SF!B*J\HK`F&\XRB77`U#S"!9K`SSKAS10'/1Z1%&FO/0.3X%+%0H`NE?#Q;ZU[#4;PO-IQR&GQ;#]^1&AYQ&OT3K!!'$7.Z;*"MM<K;.H]E&09&X9&_^WG`*R2S$Q80$(P#0L@8%`;E%`3M&,@PI<?HS:AWQ!EW_!0/J29\!"-4%VA!8!XI0I27CAE>ZW#X?5MPO.=I/-VK6/YZL*TUZZ%"7LX[&E[4,-=E?ZWN49:Q>[.Q(9,V=#<B0L(RQHU3^84?)FQ)QS*=T#(#03L)%#\'!`Q/Y2S9P9CZE#J=R)12=T'`=*_S#J>#,=+^@0GS#9<F<^'&;S.%&7ZU6FF26KB]<SE`E2LYC-G89YB?:)0O@R8XHQ7PO@)(MYLV[>SF>R?"+NBC@W$!(9C%BS*B#QMF-H3BR0#Y7^4>?<J\&1J!B'+]WP@T#XCVS-D($J@;0_L&(^SE_/4TVSH0USH05XSVX78E?6(.-[TGO;%*L:(FQ1Q<EA@,>1TT\"94*3H>6MHSH.2I5RS-NLGZ/=SZP,SMFCN;#__D6E8[4;J+DVN;=#P7LQEZSNO#*V!$^3?A`G8!2JR7'\'A9;1A'9%W>6WX+?68B&Z&::FM[KOMT/`,QTSH-4`E#8J?][&:B>,\,Z<O3\23H]*18F_;SF#5TYX'S&[5[>3C*.X*JLG4D@F3*VNXUJ8YW8L4=+JP4%[F(>@5,`'.>[J<G:T+$_0Q>A\8O:XG6//)OA<_(*A\;5YVDHGO;8FS/>6-GF/.;[FS/>7M4EB7PZJ8@I1<]"\T+V7<X=A*T8*+79&X9>#E7H+(VL_$V>^J6KV`D;KN/"XUU>?J;FHO`I$@[QN;7#G6S1S+M&R-/$5V<)-#W!'0Y$VX(-3>[7L939%\ZF,0A@Y7></17LI+>=H+>P"VKKN91\U+$=5V@_A`XV7X-LTAL.KARVABD5<$"+H.F?G/$W/)GY85UB!^B4@^.0^#K(\(1:F]GW))BZWK)23C)9S]1OO5D%/^_?HN7V&PJW#877`"L(J\@!X$H$UQ\!O?$:Y*7^M?[R`[LQMM`$]17#3$Q)KM!M-"<+=_`K,)7H&;-,V5WL+_CFP8/I2V-T@L]91(UY=Q;:/'M0:.'M)/L(5)QW(,-I3^EWE)[VDP%0;";1CL@Z.4"@#1-9=B^:VU!PM:;8>;;?`/3HN:8G_2[F\K4'?[:Z/9\NUEJA_PH_G-YX<@?JE_EMLUF-YUTZCW(UI:OPC\UR&?_18('`T,^$^)@PA_56*S"1DNG0O#$%[JL8R'[-2;FP+>@,NQ"9>6H''X]6@Y_\(P^*_#9FU[-DJ,3O!T=>T&6`U.+W1A8!!!!!!%!!!!7A!!!!1!!!!!!!!!$!!"1E2)5!!!!!!!!Q!!!!1!!!!!!!!!9A!!!(*YH'.A9-A4E'$[RV$XFY&*Y#O1)@W8A6H1D`%X!Q/HH]"B)-UI)!E5FPX,Q#[I$2<70K,,Q1!&KGS-(*)=BQ5ZQ$)=,2I-````Z`B[Z"J=R2%@/&.FFDS("!!59BE!!!!!!!!%!!!!"Q!!!^5!!!!)!!!!&%Z*,ER7,E&M<#Z4<X6S9W60<GRZ!!!!&39!A!!!!!!"!!1!)1!"!!!"!!!!!!!!!#&@<GF@4'&T>%NO<X>O4X>O;7ZH4&:$<'&T=U.M>8.U:8)!!!#E*A#!!!!!!!%!#!!Q`````Q!"!!!!!!#)!!!!"A!-1$$`````!F:*!!!51$$`````#E^V>("V>&"B>'A!!!Z!)1FP>G6S>X*J>'5!'E!B&'.S:7&U:3"P>82Q>81A:G^M:'6S!!!;1&!!"!!!!!%!!A!$#H"B=G&N:82F=H-!!"Z!5!!"!!165(*J<H25<V.J<G>M:5:J<'6)>'VM!!%!"1!!!!!!!!!;4&:$<'&T=V"S;8:B>'6%982B6'&C4X*E:8)!!!!^*A#!!!!!!!)!"1!(!!!-!%!!!@````]!!!!"!!%!!!!'!!!!!!!!!!%!!!!#!!!!!Q!!!!1!!!!&!!!!!!!!!"N-6E.M98.T5(*J>G&U:52B>'&5;7VF=X2B<8!!!!!:*A#!!!!!!!%!"1!(!!!"!!$FR[-`!!!!!!!!!#:-6E.M98.T5(*J>G&U:52B>'&-98.U18"Q<'FF:&2J<76T>'&N=!!!!"EG!)!!!!!!!1!&!!=!!!%!!/8(IT]!!!!!!!!!'ER71WRB=X.1=GFW982F2'&U962Z='6%:8.D!!!!OC9!A!!!!!!"!!A!-0````]!!1!!!!!!HA!!!!=!$%!Q`````Q*731!!&%!Q`````QJ0>82Q>821982I!!!/1#%*<X:F=H>S;82F!"J!)22D=G6B>'5A<X6U=(6U)':P<'2F=A!!'E"1!!1!!!!"!!)!!QJQ98*B<76U:8*T!!!51$$`````#GRP:S"P>82Q>81!!#"!5!!#!!1!"261=GFO>&2P5WFO:WRF2GFM:5BU<7Q!!1!'!!!!!!!!!"Z-6E.M98.T5(*J>G&U:52B>'&%:GRU2'&U96.J?G5!!!!:*A#!!!!!!!%!"1!$!!!"!!!!!!!A!!!!!!!!!"J-6E.M98.T5(*J>G&U:52B>'&%:GRU2'&U91!!!,1G!)!!!!!!"Q!-1$$`````!F:*!!!51$$`````#E^V>("V>&"B>'A!!!Z!)1FP>G6S>X*J>'5!'E!B&'.S:7&U:3"P>82Q>81A:G^M:'6S!!!;1&!!"!!!!!%!!A!$#H"B=G&N:82F=H-!!"2!-0````]+<'^H)'^V>("V>!!!)%"1!!)!"!!&&6"S;7ZU6'^4;7ZH<'6';7RF3(2N<!!"!!9!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!A!$!!!!!1!!!(2!!!!+!!!!!)!!!1!!!!!!A!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&.!!!#'XC=D6&"4M-Q%*T',7F,31M.U"9K*4=/##(R!#)B68#C!M1:KX&+*,?O(#>QZ#]]BJ@Q!&Y!'T>3$X$!)^G?X@8/L!TA'*XI`*O7]XA$_/N\_T9XK^R-O8E'P#BMK5,I&ZU;A6%5_D-NO"'"ME6"IG1M.#AT22V!$1Z9?]5V8QAD>,<J+N7]?A2)@(V_P&^3P4/?[H2J(N2^OJR,-5GFO$9,?3;,G?2:.PQ\/T-3J[4IE':D@#8TD,1#F14W5<$3;6&[D,HB;"$12ASQ!6QCL++Y1!ONS!6,Z"T.[)WJ/\-/#*7A2`U:NN("$MPD"%X9/5ARB)>SWC[B2`#MEVVUG8G.K8@*0/TBZ.]/(>#W67YVE.!4G;ND1IU#\//!8*=Y,/V7=#P]DGQS!YPVK$5-\@@U3;6*M4Z]D("E9Q[>0K&"D"%D#T`^+GT^!!!!!!!!:1!"!!)!!Q!%!!!!3!!0"!!!!!!0!.A!V1!!!&%!$Q1!!!!!$Q$9!.5!!!";!!]%!!!!!!]!W!$6!!!!9Y!!B!#!!!!0!.A!V1B4:7>P:3"631B4:7>P:3"631B4:7>P:3"631%Q!!!!5F.31QU+!!.-6E.$4%*76Q!!&JA!!!4?!!!!)!!!&HA!!!!!!!!!!!!!!#!!!!!U!!!%R!!!!"^-35*/!!!!!!!!!92-6F.3!!!!!!!!!:B36&.(!!!!!!!!!;R$1V.5!!!!!!!!!="-38:J!!!!!!!!!>2$4UZ1!!!!!!!!!?B544AQ!!!!!1!!!@R%2E24!!!!!!!!!C2-372T!!!!!!!!!DB735.%!!!!!A!!!ER(1U2*!!!!!!!!!IBW:8*T!!!!"!!!!JR41V.3!!!!!!!!!Q"(1V"3!!!!!!!!!R2*1U^/!!!!!!!!!SBJ9WQY!!!!!!!!!TR$5%-S!!!!!!!!!V"-37:Q!!!!!!!!!W2'5%6Y!!!!!!!!!XB'5%BC!!!!!!!!!YR'5&.&!!!!!!!!!["75%21!!!!!!!!!\2-37*E!!!!!!!!!]B#2%6Y!!!!!!!!!^R#2%BC!!!!!!!!!`"#2&.&!!!!!!!!"!273624!!!!!!!!""B%6%B1!!!!!!!!"#R.65F%!!!!!!!!"%")36.5!!!!!!!!"&271V21!!!!!!!!"'B'6%&#!!!!!!!!"(Q!!!!!`````Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#A!!!!!!!!!!0````]!!!!!!!!!T!!!!!!!!!!!`````Q!!!!!!!!$A!!!!!!!!!!$`````!!!!!!!!!/A!!!!!!!!!!0````]!!!!!!!!"&!!!!!!!!!!!`````Q!!!!!!!!%=!!!!!!!!!!,`````!!!!!!!!!51!!!!!!!!!!0````]!!!!!!!!"8!!!!!!!!!!!`````Q!!!!!!!!'I!!!!!!!!!!$`````!!!!!!!!!<A!!!!!!!!!!@````]!!!!!!!!$0!!!!!!!!!!#`````Q!!!!!!!!2U!!!!!!!!!!$`````!!!!!!!!"81!!!!!!!!!"0````]!!!!!!!!&D!!!!!!!!!!(`````Q!!!!!!!!7A!!!!!!!!!!D`````!!!!!!!!"<!!!!!!!!!!#@````]!!!!!!!!&R!!!!!!!!!!+`````Q!!!!!!!!85!!!!!!!!!!$`````!!!!!!!!"?A!!!!!!!!!!0````]!!!!!!!!'!!!!!!!!!!!!`````Q!!!!!!!!95!!!!!!!!!!$`````!!!!!!!!"JA!!!!!!!!!!0````]!!!!!!!!+H!!!!!!!!!!!`````Q!!!!!!!!KE!!!!!!!!!!$`````!!!!!!!!#L1!!!!!!!!!!0````]!!!!!!!!+P!!!!!!!!!!!`````Q!!!!!!!"!)!!!!!!!!!!$`````!!!!!!!!%"!!!!!!!!!!!0````]!!!!!!!!1'!!!!!!!!!!!`````Q!!!!!!!"!I!!!!!!!!!!$`````!!!!!!!!%$!!!!!!!!!!!0````]!!!!!!!!1G!!!!!!!!!!!`````Q!!!!!!!"#A!!!!!!!!!!$`````!!!!!!!!&(Q!!!!!!!!!!0````]!!!!!!!!5B!!!!!!!!!!!`````Q!!!!!!!"3-!!!!!!!!!!$`````!!!!!!!!&,A!!!!!!!!!A0````]!!!!!!!!7$!!!!!!:5(*J<H25<V.J<G>M:5:J<'6)>'VM,G.U<!!!!!! + + +!!!!!2V1=GFO>&2P5WFO:WRF2GFM:5BU<7QO<(:D<'&T=V"53$!!!!!!!!!!!!!!!!!!"1!"!!!!!!!!!!!!!!%!(%"1!!!65(*J<H25<V.J<G>M:5:J<'6)>'VM!!%!!!!!!!!!!!!!!!!"$ERB9F:*26=A4W*K:7.U!&"53$!!!!!!!!!!!!!G!)!!!!!!!!!!!@``!!!!!1!!!!!!!1!!!!!"!"R!5!!!&6"S;7ZU6'^4;7ZH<'6';7RF3(2N<!!"!!!!!!!"`````A!!!!!!!!%61W^S:5^Q:8*B>'FP<CZM>G.M98.T5&2)-!!!!!!!!!!!!#9!A!!!!!!!!!!!!!!!!1!!!!!!!A!!!!!'!!R!-0````]#6EE!!"2!-P````]+4X6U=(6U5'&U;!!!$E!B#7^W:8*X=GFU:1!;1#%59X*F982F)'^V>("V>#"G<WRE:8)!!"J!5!!%!!!!!1!#!!-+='&S97VF>'6S=Q!!;A$RZ=??4A!!!!)>5(*J<H25<V.J<G>M:5:J<'6)>'VM,GRW9WRB=X-:5(*J<H25<V.J<G>M:5:J<'6)>'VM,G.U<!!K1&!!!1!%(5.M>8.U:8)A<W9A9WRB=X-A=(*J>G&U:3"E982B!!%!"1!!!!(`````!!!!!&"53$!!!!!%!!!!!!!!!!!!!!%61W^S:5^Q:8*B>'FP<CZM>G.M98.T5&2)-!!!!!!!!!!!!#9!A!!!!!!!!!!!!!!!!1!!!!!!!Q!!!!!'!!R!-0````]#6EE!!"2!-0````]+4X6U=(6U5'&U;!!!$E!B#7^W:8*X=GFU:1!;1#%59X*F982F)'^V>("V>#"G<WRE:8)!!"J!5!!%!!!!!1!#!!-+='&S97VF>'6S=Q!!;A$RZ=??O!!!!!)>5(*J<H25<V.J<G>M:5:J<'6)>'VM,GRW9WRB=X-:5(*J<H25<V.J<G>M:5:J<'6)>'VM,G.U<!!K1&!!!1!%(5.M>8.U:8)A<W9A9WRB=X-A=(*J>G&U:3"E982B!!%!"1!!!!5!!!!!!!!!!@````]!!!!$!!!!"!!!!!!!!!!!!!!!!!!!!26$<X*F4X"F=G&U;7^O,GRW9WRB=X.16%AQ!!!!!!!!!!!!*A#!!!!!!!!!!!!!!!!"!!!!!!!%!!!!!!=!$%!Q`````Q*731!!&%!Q`````QJ0>82Q>821982I!!!/1#%*<X:F=H>S;82F!"J!)22D=G6B>'5A<X6U=(6U)':P<'2F=A!!'E"1!!1!!!!"!!)!!QJQ98*B<76U:8*T!!!51$$`````#GRP:S"P>82Q>81!!'Q!]?8(IT]!!!!#(6"S;7ZU6'^4;7ZH<'6';7RF3(2N<#ZM>G.M98.T'6"S;7ZU6'^4;7ZH<'6';7RF3(2N<#ZD>'Q!,%"1!!)!"!!&(5.M>8.U:8)A<W9A9WRB=X-A=(*J>G&U:3"E982B!!%!"A!!!!9!!!!!!!!!!1!!!!)!!!!$!!!!"0````]!!!!!!!!!!!!!!!!!!!!!!!!!!!%61W^S:5^Q:8*B>'FP<CZM>G.M98.T5&2)-!!!!!!!!!!!!#9!A!!!!!!!!!!!!!!! + + + false + 1.0.0.1 + + + + + 2 + + + -1 + 160 + 0 + 2 + 1 + 8388608 + 2 + + + -1 + 16777216 + 0 + 2 + 1 + 532496 + 2 + + + -1 + 16777344 + 0 + 2 + 1 + 532496 + 2 + + + -1 + 1090519168 + 1 + 1 + 1 + 34078736 + + + -1 + 160 + 0 + 2 + 1 + 8388626 + 2 + + + -1 + 160 + 0 + 2 + 1 + 8388626 + 2 + + + -1 + 160 + 0 + 2 + 1 + 8388624 + 2 + + + -1 + 160 + 0 + 2 + 1 + 524304 + 2 + + + -1 + 16777344 + 1 + 1 + 1 + 34078736 + + diff --git a/VICompareTooling/PrintToSingleFileHtml/RunOperation.vi b/VICompareTooling/PrintToSingleFileHtml/RunOperation.vi new file mode 100644 index 0000000000000000000000000000000000000000..c18c25b68f425dd04243dfd59cca3f3d035f5305 GIT binary patch literal 14804 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 Lo3|Hu!ts9qlgXwU literal 0 HcmV?d00001 diff --git a/VICompareTooling/PrintToSingleFileHtml/base64_fast_encode.vi b/VICompareTooling/PrintToSingleFileHtml/base64_fast_encode.vi new file mode 100644 index 0000000000000000000000000000000000000000..85082a59e97fcbce60a286da2838c1dca97abd2d GIT binary patch literal 19398 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 literal 0 HcmV?d00001 From 8cb780a00f15276e4193de817b5e44b1248262b8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Feb 2026 21:33:33 +0000 Subject: [PATCH 48/51] Use PrintToSingleFileHtml for added/deleted VIs; add -AdditionalOperationDirectory Co-authored-by: gregr-ni <71788381+gregr-ni@users.noreply.github.com> --- .github/workflows/vi-compare-linux.yml | 42 ++++--- .github/workflows/vi-compare-windows.yml | 39 +++++-- runvicompare.ps1 | 140 ++++++++++++++++------- runvicompare.sh | 138 ++++++++++++++++------ 4 files changed, 258 insertions(+), 101 deletions(-) diff --git a/.github/workflows/vi-compare-linux.yml b/.github/workflows/vi-compare-linux.yml index 0c7200d..8f4d820 100644 --- a/.github/workflows/vi-compare-linux.yml +++ b/.github/workflows/vi-compare-linux.yml @@ -27,17 +27,21 @@ jobs: - name: Compute Changed Files and Prepare Base Versions run: | - CHANGED=$(git diff --name-only "origin/${{ github.base_ref }}...HEAD" | grep '\.vi$' || true) + # Write tab-separated STATUSFILE lines for changed .vi files. + # STATUS: A=added, D=deleted, M=modified. + # Run git diff separately so errors are not masked by grep's exit code. + git diff --name-status "origin/${{ github.base_ref }}...HEAD" \ + > /tmp/vi-diff-all.txt + grep '\.vi$' /tmp/vi-diff-all.txt \ + > "${{ github.workspace }}/changed-files.txt" || true + echo "Changed VI files:" - echo "$CHANGED" + cat "${{ github.workspace }}/changed-files.txt" # Create a git worktree for the base branch so binary .vi files can be # compared safely without manual extraction. git worktree add "${{ github.workspace }}/vi-base" "origin/${{ github.base_ref }}" - # Write the list to a file so the container can read it. - echo "$CHANGED" > "${{ github.workspace }}/changed-files.txt" - - name: Pull Docker Image from Docker Hub run: docker pull nationalinstruments/labview:2026q1-linux @@ -97,22 +101,34 @@ jobs: const changedFilesPath = path.join(process.env.GITHUB_WORKSPACE, 'changed-files.txt'); if (!fs.existsSync(changedFilesPath)) return; - const changedFiles = fs.readFileSync(changedFilesPath, 'utf8') + // Each line is: STATUS\tpath/to/file.vi + // STATUS: A=added, D=deleted, M=modified + const entries = fs.readFileSync(changedFilesPath, 'utf8') .split('\n') - .map(f => f.trim()) - .filter(f => f.endsWith('.vi')); + .map(l => l.trim()) + .filter(l => l.includes('\t') && l.endsWith('.vi')) + .map(l => { + const [status, file] = l.split('\t', 2); + return { status: status.trim(), file: file.trim() }; + }); - if (changedFiles.length === 0) return; + if (entries.length === 0) return; const pagesUrl = '${{ steps.deploy-pages.outputs.page_url }}'; const base = pagesUrl.endsWith('/') ? pagesUrl : pagesUrl + '/'; let body = '### VI Comparison Reports (Linux)\n\n'; - body += '| VI File | Report |\n|---------|--------|\n'; - for (const file of changedFiles) { + body += '| VI File | Change | Report |\n|---------|--------|--------|\n'; + for (const { status, file } of entries) { const baseName = path.basename(file, '.vi'); - const reportFile = `${baseName}-diff-report.html`; - body += `| \`${file}\` | [${reportFile}](${base}${reportFile}) |\n`; + const isModified = status === 'M'; + const reportFile = isModified + ? `${baseName}-diff-report.html` + : `${baseName}-print-report.html`; + const changeLabel = status === 'A' ? 'Added' + : status === 'D' ? 'Deleted' + : 'Modified'; + body += `| \`${file}\` | ${changeLabel} | [${reportFile}](${base}${reportFile}) |\n`; } await github.rest.issues.createComment({ diff --git a/.github/workflows/vi-compare-windows.yml b/.github/workflows/vi-compare-windows.yml index c491c82..83f3c23 100644 --- a/.github/workflows/vi-compare-windows.yml +++ b/.github/workflows/vi-compare-windows.yml @@ -28,10 +28,13 @@ jobs: - name: Compute Changed Files and Prepare Base Versions shell: pwsh run: | - $changed = git diff --name-only "origin/${{ github.base_ref }}...HEAD" | + # Write tab-separated STATUSFILE lines for changed .vi files. + # STATUS: A=added, D=deleted, M=modified. + $lines = git diff --name-status "origin/${{ github.base_ref }}...HEAD" | Where-Object { $_ -match '\.vi$' } + Write-Host "Changed VI files:" - $changed | ForEach-Object { Write-Host " $_" } + $lines | ForEach-Object { Write-Host " $_" } # Create a git worktree for the base branch so binary .vi files can be # compared safely without manual extraction. @@ -39,10 +42,10 @@ jobs: # Write the list to a file so the container can read it without # multiline environment-variable encoding issues. - if ($null -eq $changed) { + if ($null -eq $lines) { New-Item -ItemType File -Path "${{ github.workspace }}\changed-files.txt" -Force | Out-Null } else { - $changed | Out-File -FilePath "${{ github.workspace }}\changed-files.txt" ` + $lines | Out-File -FilePath "${{ github.workspace }}\changed-files.txt" ` -Encoding utf8NoBOM } @@ -100,22 +103,34 @@ jobs: const changedFilesPath = path.join(process.env.GITHUB_WORKSPACE, 'changed-files.txt'); if (!fs.existsSync(changedFilesPath)) return; - const changedFiles = fs.readFileSync(changedFilesPath, 'utf8') + // Each line is: STATUS\tpath/to/file.vi + // STATUS: A=added, D=deleted, M=modified + const entries = fs.readFileSync(changedFilesPath, 'utf8') .split('\n') - .map(f => f.trim()) - .filter(f => f.endsWith('.vi')); + .map(l => l.trim()) + .filter(l => l.includes('\t') && l.endsWith('.vi')) + .map(l => { + const [status, file] = l.split('\t', 2); + return { status: status.trim(), file: file.trim() }; + }); - if (changedFiles.length === 0) return; + if (entries.length === 0) return; const pagesUrl = '${{ steps.deploy-pages.outputs.page_url }}'; const base = pagesUrl.endsWith('/') ? pagesUrl : pagesUrl + '/'; let body = '### VI Comparison Reports (Windows)\n\n'; - body += '| VI File | Report |\n|---------|--------|\n'; - for (const file of changedFiles) { + body += '| VI File | Change | Report |\n|---------|--------|--------|\n'; + for (const { status, file } of entries) { const baseName = path.basename(file, '.vi'); - const reportFile = `${baseName}-diff-report.html`; - body += `| \`${file}\` | [${reportFile}](${base}${reportFile}) |\n`; + const isModified = status === 'M'; + const reportFile = isModified + ? `${baseName}-diff-report.html` + : `${baseName}-print-report.html`; + const changeLabel = status === 'A' ? 'Added' + : status === 'D' ? 'Deleted' + : 'Modified'; + body += `| \`${file}\` | ${changeLabel} | [${reportFile}](${base}${reportFile}) |\n`; } await github.rest.issues.createComment({ diff --git a/runvicompare.ps1 b/runvicompare.ps1 index 38634f5..224cb73 100644 --- a/runvicompare.ps1 +++ b/runvicompare.ps1 @@ -1,10 +1,15 @@ -# Reads a list of changed .vi files from changed-files.txt (written by the workflow), -# then uses LabVIEWCLI CreateComparisonReport to compare the base-branch version -# (vi-base\) against the head version and generates an HTML report for each file. +# Reads a list of changed .vi files from changed-files.txt (written by the workflow). +# Each line is a tab-separated pair: \t +# where STATUS is A (added), D (deleted), or M (modified). +# +# Modified VIs -> CreateComparisonReport (base vs head), *-diff-report.html +# Added VIs -> PrintToSingleFileHtml (head version), *-print-report.html +# Deleted VIs -> PrintToSingleFileHtml (base version), *-print-report.html -$CHANGED_FILES_FILE = "C:\workspace\changed-files.txt" -$REPORT_DIR = "C:\workspace\vi-compare-reports" -$LabVIEWPath = "C:\Program Files\National Instruments\LabVIEW 2026\LabVIEW.exe" +$CHANGED_FILES_FILE = "C:\workspace\changed-files.txt" +$REPORT_DIR = "C:\workspace\vi-compare-reports" +$LabVIEWPath = "C:\Program Files\National Instruments\LabVIEW 2026\LabVIEW.exe" +$AdditionalOpDir = "C:\workspace\VICompareTooling" New-Item -ItemType Directory -Force -Path $REPORT_DIR | Out-Null @@ -13,62 +18,115 @@ if (-not (Test-Path $CHANGED_FILES_FILE)) { exit 0 } -$files = Get-Content $CHANGED_FILES_FILE | +$lines = Get-Content $CHANGED_FILES_FILE | ForEach-Object { $_.Trim() } | - Where-Object { $_ -ne "" -and $_.EndsWith(".vi") } + Where-Object { $_ -match '\t' -and $_ -match '\.vi$' } -if ($files.Count -eq 0) { - Write-Host "No changed .vi files to compare. Exiting." +if ($lines.Count -eq 0) { + Write-Host "No changed .vi files to process. Exiting." exit 0 } $FAILED = 0 -foreach ($file in $files) { - # Use Join-Path to combine base and relative paths, handling any mix of - # forward/backward slashes produced by git on Windows. - $VI_BASE = Join-Path "C:\workspace\vi-base" $file - $VI_HEAD = Join-Path "C:\workspace" $file +foreach ($line in $lines) { + $parts = $line -split "`t", 2 + $status = $parts[0].Trim() + $file = $parts[1].Trim() + $baseName = [System.IO.Path]::GetFileNameWithoutExtension($file) - $REPORT_PATH = Join-Path $REPORT_DIR "$baseName-diff-report.html" - if (-not (Test-Path $VI_HEAD)) { - Write-Host "Warning: Head version not found: $VI_HEAD, skipping." - continue - } + if ($status -eq "M") { + # ---------- Modified: compare base vs head ---------- + $VI_BASE = Join-Path "C:\workspace\vi-base" $file + $VI_HEAD = Join-Path "C:\workspace" $file + $REPORT_PATH = Join-Path $REPORT_DIR "$baseName-diff-report.html" + + if (-not (Test-Path $VI_HEAD)) { + Write-Host "Warning: Head version not found: $VI_HEAD, skipping." + continue + } + if (-not (Test-Path $VI_BASE)) { + Write-Host "Warning: Base version not found: $VI_BASE, skipping." + continue + } + + Write-Host "Running LabVIEWCLI CreateComparisonReport for modified VI: $file" + + # -o overwrites an existing report; -c continues if LabVIEW is already open. + & LabVIEWCLI ` + -OperationName CreateComparisonReport ` + -AdditionalOperationDirectory "$AdditionalOpDir" ` + -LabVIEWPath "$LabVIEWPath" ` + -LogToConsole TRUE ` + -vi1 "$VI_BASE" ` + -vi2 "$VI_HEAD" ` + -reportType "HTMLSingleFile" ` + -reportPath "$REPORT_PATH" ` + -o -c -nobdcosm ` + -Headless + + } elseif ($status -eq "A") { + # ---------- Added: print the new VI ---------- + $VI_PATH = Join-Path "C:\workspace" $file + $REPORT_PATH = Join-Path $REPORT_DIR "$baseName-print-report.html" + + if (-not (Test-Path $VI_PATH)) { + Write-Host "Warning: Added VI not found: $VI_PATH, skipping." + continue + } - if (-not (Test-Path $VI_BASE)) { - Write-Host "Warning: Base version not found: $VI_BASE, skipping." + Write-Host "Running LabVIEWCLI PrintToSingleFileHtml for added VI: $file" + + & LabVIEWCLI ` + -OperationName PrintToSingleFileHtml ` + -AdditionalOperationDirectory "$AdditionalOpDir" ` + -LabVIEWPath "$LabVIEWPath" ` + -LogToConsole TRUE ` + -VI "$VI_PATH" ` + -OutputPath "$REPORT_PATH" ` + -o -c ` + -Headless + + } elseif ($status -eq "D") { + # ---------- Deleted: print the old VI ---------- + $VI_PATH = Join-Path "C:\workspace\vi-base" $file + $REPORT_PATH = Join-Path $REPORT_DIR "$baseName-print-report.html" + + if (-not (Test-Path $VI_PATH)) { + Write-Host "Warning: Deleted VI not found in base: $VI_PATH, skipping." + continue + } + + Write-Host "Running LabVIEWCLI PrintToSingleFileHtml for deleted VI: $file" + + & LabVIEWCLI ` + -OperationName PrintToSingleFileHtml ` + -AdditionalOperationDirectory "$AdditionalOpDir" ` + -LabVIEWPath "$LabVIEWPath" ` + -LogToConsole TRUE ` + -VI "$VI_PATH" ` + -OutputPath "$REPORT_PATH" ` + -o -c ` + -Headless + + } else { + Write-Host "Skipping unrecognised status '$status' for: $file" continue } - Write-Host "Running LabVIEWCLI CreateComparisonReport for: $file" - - # -o overwrites an existing report file; -c creates the report directory if necessary. - # -nobdcosm & -nofppos omit non-functional changes from diagram and panel respectively - & LabVIEWCLI ` - -OperationName CreateComparisonReport ` - -LabVIEWPath "$LabVIEWPath" ` - -LogToConsole TRUE ` - -vi1 "$VI_BASE" ` - -vi2 "$VI_HEAD" ` - -reportType "HTMLSingleFile" ` - -reportPath "$REPORT_PATH" ` - -o -c -nobdcosm ` - -Headless - if ($LASTEXITCODE -ne 0) { - Write-Host "X CreateComparisonReport failed for $file (exit code $LASTEXITCODE)" + Write-Host "X LabVIEWCLI failed for $file (exit code $LASTEXITCODE)" $FAILED++ } else { - Write-Host "[OK] CreateComparisonReport succeeded for $file" + Write-Host "[OK] Report generated for $file" } } if ($FAILED -gt 0) { - Write-Host "X $FAILED file(s) failed comparison. Exiting with error." + Write-Host "X $FAILED file(s) failed. Exiting with error." exit 1 } else { - Write-Host "[OK] All comparison reports generated successfully." + Write-Host "[OK] All reports generated successfully." exit 0 } diff --git a/runvicompare.sh b/runvicompare.sh index 2d358c0..8c62f5e 100644 --- a/runvicompare.sh +++ b/runvicompare.sh @@ -1,10 +1,17 @@ #!/bin/bash -# Reads changed .vi files from /workspace/changed-files.txt and generates -# HTML comparison reports using LabVIEWCLI CreateComparisonReport. +# Reads changed .vi files from /workspace/changed-files.txt and generates HTML +# reports. Each line of changed-files.txt is a tab-separated pair: +# \t +# where STATUS is A (added), D (deleted), or M (modified). +# +# Modified VIs → CreateComparisonReport (base vs head), *-diff-report.html +# Added VIs → PrintToSingleFileHtml (head version), *-print-report.html +# Deleted VIs → PrintToSingleFileHtml (base version), *-print-report.html CHANGED_FILES_FILE='/workspace/changed-files.txt' REPORT_DIR='/workspace/vi-compare-reports' LABVIEW_PATH='/usr/local/natinst/LabVIEW-2026-64/labviewprofull' +ADDITIONAL_OP_DIR='/workspace/VICompareTooling' mkdir -p "$REPORT_DIR" mkdir -p "/tmp/natinst" @@ -17,59 +24,120 @@ fi FAILED=0 -while IFS= read -r file; do +# Set IFS to tab for the read loop, saving and restoring the original value. +ORIG_IFS="$IFS" +IFS=$'\t' +while read -r status file; do + IFS="$ORIG_IFS" file="$(echo "$file" | tr -d '\r')" + status="$(echo "$status" | tr -d '\r')" + IFS=$'\t' [[ -z "$file" ]] && continue [[ "$file" != *.vi ]] && continue - VI_BASE="/workspace/vi-base/$file" - VI_HEAD="/workspace/$file" BASE_NAME="$(basename "$file" .vi)" - REPORT_PATH="$REPORT_DIR/$BASE_NAME-diff-report.html" - if [ ! -f "$VI_HEAD" ]; then - echo "Warning: Head version not found: $VI_HEAD, skipping." - continue - fi + if [[ "$status" == "M" ]]; then + # ---------- Modified: compare base vs head ---------- + VI_BASE="/workspace/vi-base/$file" + VI_HEAD="/workspace/$file" + REPORT_PATH="$REPORT_DIR/$BASE_NAME-diff-report.html" + + if [ ! -f "$VI_HEAD" ]; then + echo "Warning: Head version not found: $VI_HEAD, skipping." + continue + fi + if [ ! -f "$VI_BASE" ]; then + echo "Warning: Base version not found: $VI_BASE, skipping." + continue + fi + + echo "Running LabVIEWCLI CreateComparisonReport for modified VI: $file" + + # -o overwrites an existing report file; -c continues if LabVIEW is already open. + LabVIEWCLI \ + -OperationName CreateComparisonReport \ + -AdditionalOperationDirectory "$ADDITIONAL_OP_DIR" \ + -LabVIEWPath $LABVIEW_PATH \ + -LogToConsole TRUE \ + -vi1 "$VI_BASE" \ + -vi2 "$VI_HEAD" \ + -reportType "HTMLSingleFile" \ + -reportPath "$REPORT_PATH" \ + -o -c -nobdcosm \ + -Headless + + EXIT_CODE=$? + + elif [[ "$status" == "A" ]]; then + # ---------- Added: print the new VI ---------- + VI_PATH="/workspace/$file" + REPORT_PATH="$REPORT_DIR/$BASE_NAME-print-report.html" + + if [ ! -f "$VI_PATH" ]; then + echo "Warning: Added VI not found: $VI_PATH, skipping." + continue + fi + + echo "Running LabVIEWCLI PrintToSingleFileHtml for added VI: $file" - if [ ! -f "$VI_BASE" ]; then - echo "Warning: Base version not found: $VI_BASE, skipping." + LabVIEWCLI \ + -OperationName PrintToSingleFileHtml \ + -AdditionalOperationDirectory "$ADDITIONAL_OP_DIR" \ + -LabVIEWPath $LABVIEW_PATH \ + -LogToConsole TRUE \ + -VI "$VI_PATH" \ + -OutputPath "$REPORT_PATH" \ + -o -c \ + -Headless + + EXIT_CODE=$? + + elif [[ "$status" == "D" ]]; then + # ---------- Deleted: print the old VI ---------- + VI_PATH="/workspace/vi-base/$file" + REPORT_PATH="$REPORT_DIR/$BASE_NAME-print-report.html" + + if [ ! -f "$VI_PATH" ]; then + echo "Warning: Deleted VI not found in base: $VI_PATH, skipping." + continue + fi + + echo "Running LabVIEWCLI PrintToSingleFileHtml for deleted VI: $file" + + LabVIEWCLI \ + -OperationName PrintToSingleFileHtml \ + -AdditionalOperationDirectory "$ADDITIONAL_OP_DIR" \ + -LabVIEWPath $LABVIEW_PATH \ + -LogToConsole TRUE \ + -VI "$VI_PATH" \ + -OutputPath "$REPORT_PATH" \ + -o -c \ + -Headless + + EXIT_CODE=$? + + else + echo "Skipping unrecognised status '$status' for: $file" continue fi - echo "Running LabVIEWCLI CreateComparisonReport for: $file" - - echo "LabVIEWCLI -OperationName CreateComparisonReport -LabVIEWPath $LABVIEW_PATH -LogToConsole TRUE -Headless -vi1 $VI_BASE -vi2 $VI_HEAD -reportType HTMLSingleFile -reportPath $REPORT_PATH -o -c" - - # -o overwrites an existing report file; -c continues if LabVIEW is already open. - # Run directly (not captured) so all LabVIEWCLI output is visible in the Actions log. - LabVIEWCLI \ - -OperationName CreateComparisonReport \ - -LabVIEWPath $LABVIEW_PATH \ - -LogToConsole TRUE \ - -vi1 "$VI_BASE" \ - -vi2 "$VI_HEAD" \ - -reportType "HTMLSingleFile" \ - -reportPath "$REPORT_PATH" \ - -o -c -nobdcosm \ - -Headless - - EXIT_CODE=$? if [ $EXIT_CODE -ne 0 ]; then - echo "✖ CreateComparisonReport failed for $file (exit code $EXIT_CODE)" + echo "✖ LabVIEWCLI failed for $file (exit code $EXIT_CODE)" FAILED=$((FAILED + 1)) elif [ ! -f "$REPORT_PATH" ]; then - echo "✖ CreateComparisonReport exited 0 but report was not created: $REPORT_PATH" + echo "✖ LabVIEWCLI exited 0 but report was not created: $REPORT_PATH" FAILED=$((FAILED + 1)) else - echo "✔ CreateComparisonReport succeeded for $file" + echo "✔ Report generated for $file" fi done < "$CHANGED_FILES_FILE" +IFS="$ORIG_IFS" if [ $FAILED -gt 0 ]; then - echo "✖ $FAILED file(s) failed comparison. Exiting with error." + echo "✖ $FAILED file(s) failed. Exiting with error." exit 1 else - echo "✔ All comparison reports generated successfully." + echo "✔ All reports generated successfully." exit 0 fi From c15d3e7f5b0e925bf80957860ab98be814a99edc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Feb 2026 21:51:43 +0000 Subject: [PATCH 49/51] Fix space-in-filename links, move scripts to VICompareTooling, re-enable Windows workflow Co-authored-by: gregr-ni <71788381+gregr-ni@users.noreply.github.com> --- .github/workflows/vi-compare-linux.yml | 4 ++-- .github/workflows/vi-compare-windows.yml | 16 ++++++++-------- .../runvicompare.ps1 | 5 ++++- .../runvicompare.sh | 2 +- 4 files changed, 15 insertions(+), 12 deletions(-) rename runvicompare.ps1 => VICompareTooling/runvicompare.ps1 (95%) rename runvicompare.sh => VICompareTooling/runvicompare.sh (98%) diff --git a/.github/workflows/vi-compare-linux.yml b/.github/workflows/vi-compare-linux.yml index 8f4d820..057bf0e 100644 --- a/.github/workflows/vi-compare-linux.yml +++ b/.github/workflows/vi-compare-linux.yml @@ -50,7 +50,7 @@ jobs: docker run --rm \ -v "${{ github.workspace }}:/workspace" \ nationalinstruments/labview:2026q1-linux \ - bash -c "chmod +x /workspace/runvicompare.sh && /workspace/runvicompare.sh" + bash -c "chmod +x /workspace/VICompareTooling/runvicompare.sh && /workspace/VICompareTooling/runvicompare.sh" - name: Fix report file permissions if: always() @@ -128,7 +128,7 @@ jobs: const changeLabel = status === 'A' ? 'Added' : status === 'D' ? 'Deleted' : 'Modified'; - body += `| \`${file}\` | ${changeLabel} | [${reportFile}](${base}${reportFile}) |\n`; + body += `| \`${file}\` | ${changeLabel} | [${reportFile}](${base}${encodeURIComponent(reportFile)}) |\n`; } await github.rest.issues.createComment({ diff --git a/.github/workflows/vi-compare-windows.yml b/.github/workflows/vi-compare-windows.yml index 83f3c23..8affc0a 100644 --- a/.github/workflows/vi-compare-windows.yml +++ b/.github/workflows/vi-compare-windows.yml @@ -4,12 +4,12 @@ name: VI Compare (Windows) # Go to Settings → Pages → Build and deployment → Source → GitHub Actions → Save. # Without this the "Deploy to GitHub Pages" step will fail with a clear error message. -# on: -# pull_request: -# types: -# - opened -# - synchronize -# - reopened +on: + pull_request: + types: + - opened + - synchronize + - reopened jobs: run-vi-compare-windows: @@ -58,7 +58,7 @@ jobs: docker run --rm ` -v "${{ github.workspace }}:C:\workspace" ` nationalinstruments/labview:2026q1-windows ` - powershell -File C:\workspace\runvicompare.ps1 + powershell -File C:\workspace\VICompareTooling\runvicompare.ps1 - name: Upload reports to GitHub Pages id: upload-pages @@ -130,7 +130,7 @@ jobs: const changeLabel = status === 'A' ? 'Added' : status === 'D' ? 'Deleted' : 'Modified'; - body += `| \`${file}\` | ${changeLabel} | [${reportFile}](${base}${reportFile}) |\n`; + body += `| \`${file}\` | ${changeLabel} | [${reportFile}](${base}${encodeURIComponent(reportFile)}) |\n`; } await github.rest.issues.createComment({ diff --git a/runvicompare.ps1 b/VICompareTooling/runvicompare.ps1 similarity index 95% rename from runvicompare.ps1 rename to VICompareTooling/runvicompare.ps1 index 224cb73..bc1b0d5 100644 --- a/runvicompare.ps1 +++ b/VICompareTooling/runvicompare.ps1 @@ -111,13 +111,16 @@ foreach ($line in $lines) { -Headless } else { - Write-Host "Skipping unrecognised status '$status' for: $file" + Write-Host "Skipping unrecognized status '$status' for: $file" continue } if ($LASTEXITCODE -ne 0) { Write-Host "X LabVIEWCLI failed for $file (exit code $LASTEXITCODE)" $FAILED++ + } elseif (-not (Test-Path $REPORT_PATH)) { + Write-Host "X LabVIEWCLI exited 0 but report was not created: $REPORT_PATH" + $FAILED++ } else { Write-Host "[OK] Report generated for $file" } diff --git a/runvicompare.sh b/VICompareTooling/runvicompare.sh similarity index 98% rename from runvicompare.sh rename to VICompareTooling/runvicompare.sh index 8c62f5e..04f674a 100644 --- a/runvicompare.sh +++ b/VICompareTooling/runvicompare.sh @@ -118,7 +118,7 @@ while read -r status file; do EXIT_CODE=$? else - echo "Skipping unrecognised status '$status' for: $file" + echo "Skipping unrecognized status '$status' for: $file" continue fi From 878f72c668201dc250914e64858b73ec8d31ef23 Mon Sep 17 00:00:00 2001 From: Sumedha Ganjoo <37421667+sganjoo@users.noreply.github.com> Date: Mon, 2 Mar 2026 10:26:22 -0600 Subject: [PATCH 50/51] Update runlabview.sh Testing if I am write permission --- runlabview.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runlabview.sh b/runlabview.sh index 503cae2..dfb35a6 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -1,5 +1,5 @@ #!/bin/bash -CONFIG_FILE='/workspace/Test-VIs/viaPassCase.viancfg' +CONFIG_FILE='/workspace/Test-VIs/VIAnalyzerCfgFile.viancfg' REPORT_PATH='/usr/local/natinst/ContainerExamples/Results.txt' MASSCOMPILE_DIR='/workspace/Test-VIs' LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull' From 39c660daceb6c005a56d51a5f348621069c89510 Mon Sep 17 00:00:00 2001 From: Sumedha Ganjoo <37421667+sganjoo@users.noreply.github.com> Date: Mon, 2 Mar 2026 12:05:28 -0600 Subject: [PATCH 51/51] Update runlabview.sh --- runlabview.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runlabview.sh b/runlabview.sh index dfb35a6..503cae2 100644 --- a/runlabview.sh +++ b/runlabview.sh @@ -1,5 +1,5 @@ #!/bin/bash -CONFIG_FILE='/workspace/Test-VIs/VIAnalyzerCfgFile.viancfg' +CONFIG_FILE='/workspace/Test-VIs/viaPassCase.viancfg' REPORT_PATH='/usr/local/natinst/ContainerExamples/Results.txt' MASSCOMPILE_DIR='/workspace/Test-VIs' LABVIEW_PATH='/usr/local/natinst/LabVIEW-2025-64/labviewprofull'