From 15b69b4d50fd550c441fc6719696c08ae60d4ad6 Mon Sep 17 00:00:00 2001 From: David Buzinski Date: Tue, 31 Mar 2026 10:50:04 -0400 Subject: [PATCH 01/12] Add format gate in CI --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bca1444..468ce75 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "prepare": "npm run build", "package": "ncc build --minify", "test": "NODE_OPTIONS='--experimental-vm-modules' jest", - "all": "npm test && npm run build && npm run package", + "all": "npm run format-check && npm test && npm run build && npm run package", "ci": "npm run clean && npm ci --ignore-scripts && npm run all" }, "files": [ From 15a3c6f846406c54d14f8c1b6ad71a04cd630e07 Mon Sep 17 00:00:00 2001 From: David Buzinski Date: Tue, 31 Mar 2026 10:50:58 -0400 Subject: [PATCH 02/12] fix formatter findings --- .github/workflows/bat.yml | 69 ++++++------- .github/workflows/publish.yml | 154 ++++++++++++++-------------- jest.config.ts | 2 +- src/buildSummary.ts | 43 +++++--- src/buildSummary.unit.test.ts | 67 +++++++++--- src/matlab.ts | 27 +++-- src/matlab.unit.test.ts | 22 ++-- src/script.ts | 6 +- src/script.unit.test.ts | 5 +- src/testResultsSummary.ts | 123 +++++++++++++--------- src/testResultsSummary.unit.test.ts | 44 ++++---- 11 files changed, 326 insertions(+), 236 deletions(-) diff --git a/.github/workflows/bat.yml b/.github/workflows/bat.yml index b54564f..56dee1a 100644 --- a/.github/workflows/bat.yml +++ b/.github/workflows/bat.yml @@ -1,35 +1,34 @@ -name: Build and Test -on: [push] -permissions: - contents: read - -jobs: - plugin-tests: - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - include: - - os: ubuntu-latest - - os: windows-latest - - os: macos-latest - steps: - - uses: actions/checkout@v6 - - uses: matlab-actions/setup-matlab@v2 - with: - release: latest-including-prerelease - - uses: matlab-actions/run-tests@v2 - with: - source-folder: plugins - - bat: - name: Build and Test - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v6 - - uses: actions/setup-node@v6 - with: - node-version: 24 - - name: Perform npm tasks - run: npm run ci - +name: Build and Test +on: [push] +permissions: + contents: read + +jobs: + plugin-tests: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + - os: windows-latest + - os: macos-latest + steps: + - uses: actions/checkout@v6 + - uses: matlab-actions/setup-matlab@v2 + with: + release: latest-including-prerelease + - uses: matlab-actions/run-tests@v2 + with: + source-folder: plugins + + bat: + name: Build and Test + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-node@v6 + with: + node-version: 24 + - name: Perform npm tasks + run: npm run ci diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2b73fcd..9683fc6 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,77 +1,77 @@ -name: Publish -on: - release: - types: published -permissions: - contents: write - -jobs: - build: - name: Build - runs-on: ubuntu-latest - outputs: - tag: ${{ steps.update-package-version.outputs.version }} - steps: - - uses: actions/checkout@v6 - - name: Configure git - run: | - git config user.name 'Release Action' - git config user.email '<>' - - uses: actions/setup-node@v6 - with: - node-version: 24 - - # Call `npm version`. It increments the version and commits the changes. - # We'll save the output (new version string) for use in the following - # steps - - name: Update package version - id: update-package-version - run: | - git tag -d "${{ github.event.release.tag_name }}" - VERSION=$(npm version "${{ github.event.release.tag_name }}" --no-git-tag-version) - git add package.json package-lock.json - git commit -m "[skip ci] Bump $VERSION" - git push origin HEAD:main - - # Now carry on, business as usual - - name: Perform npm tasks - run: npm run ci - - # Finally, create a detached commit containing the built artifacts and tag - # it with the release. Note: the fact that the branch is locally updated - # will not be relayed (pushed) to origin - - name: Commit to release branch - id: release_info - run: | - # Check for semantic versioning - longVersion="${{github.event.release.tag_name}}" - echo "Preparing release for version $longVersion" - [[ $longVersion == v[0-9]*.[0-9]*.[0-9]* ]] || (echo "must follow semantic versioning" && exit 1) - majorVersion=$(echo ${longVersion%.*.*}) - minorVersion=$(echo ${longVersion%.*}) - - # Add the built artifacts. Using --force because dist/lib should be in - # .gitignore - git add --force dist lib - - # Make the commit - MESSAGE="Build for $(git rev-parse --short HEAD)" - git commit --allow-empty -m "$MESSAGE" - git tag -f -a -m "Release $longVersion" $longVersion - - # Get the commit of the tag you just released - commitHash=$(git rev-list -n 1 $longVersion) - - # Delete the old major and minor version tags locally - git tag -d $majorVersion || true - git tag -d $minorVersion || true - - # Make new major and minor version tags locally that point to the commit you got from the "git rev-list" above - git tag -f $majorVersion $commitHash - git tag -f $minorVersion $commitHash - - # Force push the new minor version tag to overwrite the old tag remotely - echo "Pushing new tags" - git push -f origin $longVersion - git push -f origin $majorVersion - git push -f origin $minorVersion +name: Publish +on: + release: + types: published +permissions: + contents: write + +jobs: + build: + name: Build + runs-on: ubuntu-latest + outputs: + tag: ${{ steps.update-package-version.outputs.version }} + steps: + - uses: actions/checkout@v6 + - name: Configure git + run: | + git config user.name 'Release Action' + git config user.email '<>' + - uses: actions/setup-node@v6 + with: + node-version: 24 + + # Call `npm version`. It increments the version and commits the changes. + # We'll save the output (new version string) for use in the following + # steps + - name: Update package version + id: update-package-version + run: | + git tag -d "${{ github.event.release.tag_name }}" + VERSION=$(npm version "${{ github.event.release.tag_name }}" --no-git-tag-version) + git add package.json package-lock.json + git commit -m "[skip ci] Bump $VERSION" + git push origin HEAD:main + + # Now carry on, business as usual + - name: Perform npm tasks + run: npm run ci + + # Finally, create a detached commit containing the built artifacts and tag + # it with the release. Note: the fact that the branch is locally updated + # will not be relayed (pushed) to origin + - name: Commit to release branch + id: release_info + run: | + # Check for semantic versioning + longVersion="${{github.event.release.tag_name}}" + echo "Preparing release for version $longVersion" + [[ $longVersion == v[0-9]*.[0-9]*.[0-9]* ]] || (echo "must follow semantic versioning" && exit 1) + majorVersion=$(echo ${longVersion%.*.*}) + minorVersion=$(echo ${longVersion%.*}) + + # Add the built artifacts. Using --force because dist/lib should be in + # .gitignore + git add --force dist lib + + # Make the commit + MESSAGE="Build for $(git rev-parse --short HEAD)" + git commit --allow-empty -m "$MESSAGE" + git tag -f -a -m "Release $longVersion" $longVersion + + # Get the commit of the tag you just released + commitHash=$(git rev-list -n 1 $longVersion) + + # Delete the old major and minor version tags locally + git tag -d $majorVersion || true + git tag -d $minorVersion || true + + # Make new major and minor version tags locally that point to the commit you got from the "git rev-list" above + git tag -f $majorVersion $commitHash + git tag -f $minorVersion $commitHash + + # Force push the new minor version tag to overwrite the old tag remotely + echo "Pushing new tags" + git push -f origin $longVersion + git push -f origin $majorVersion + git push -f origin $minorVersion diff --git a/jest.config.ts b/jest.config.ts index 5551fb3..864e6f1 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -14,7 +14,7 @@ export default { }, ], }, - extensionsToTreatAsEsm: ['.ts'], + extensionsToTreatAsEsm: [".ts"], transformIgnorePatterns: ["node_modules/(?!(@actions)/)"], moduleNameMapper: { "^(\\.{1,2}/.*)\\.js$": "$1", diff --git a/src/buildSummary.ts b/src/buildSummary.ts index 30803b4..02d7530 100644 --- a/src/buildSummary.ts +++ b/src/buildSummary.ts @@ -1,7 +1,7 @@ // Copyright 2024-25 The MathWorks, Inc. import * as core from "@actions/core"; -import { join } from 'path'; -import { readFileSync, unlinkSync, existsSync } from 'fs'; +import { join } from "path"; +import { readFileSync, unlinkSync, existsSync } from "fs"; export function addSummary(taskSummaryTableRows: string[][], actionName: string) { try { @@ -9,25 +9,30 @@ export function addSummary(taskSummaryTableRows: string[][], actionName: string) .addHeading("MATLAB Build Results (" + actionName + ") ") .addTable(taskSummaryTableRows); } catch (e) { - console.error('An error occurred while adding the build results table to the summary:', e); + console.error("An error occurred while adding the build results table to the summary:", e); } } export function getSummaryRows(buildSummary: string): any[] { const rows = JSON.parse(buildSummary).map((t: any) => { if (t.failed) { - return [t.name, '🔴 Failed', t.description, t.duration]; + return [t.name, "🔴 Failed", t.description, t.duration]; } else if (t.skipped) { - return [t.name, '🔵 Skipped' + ' (' + interpretSkipReason(t.skipReason) + ')', t.description, t.duration]; + return [ + t.name, + "🔵 Skipped" + " (" + interpretSkipReason(t.skipReason) + ")", + t.description, + t.duration, + ]; } else { - return [t.name, '🟢 Successful', t.description, t.duration]; + return [t.name, "🟢 Successful", t.description, t.duration]; } }); return rows; } -export function interpretSkipReason(skipReason: string){ - switch(skipReason) { +export function interpretSkipReason(skipReason: string) { + switch (skipReason) { case "UpToDate": return "up-to-date"; case "UserSpecified": @@ -40,28 +45,32 @@ export function interpretSkipReason(skipReason: string){ } } -export function processAndAddBuildSummary( - runnerTemp: string, - runId: string, - actionName: string -) { - const header = [{ data: 'MATLAB Task', header: true }, { data: 'Status', header: true }, { data: 'Description', header: true }, { data: 'Duration (HH:mm:ss)', header: true }]; +export function processAndAddBuildSummary(runnerTemp: string, runId: string, actionName: string) { + const header = [ + { data: "MATLAB Task", header: true }, + { data: "Status", header: true }, + { data: "Description", header: true }, + { data: "Duration (HH:mm:ss)", header: true }, + ]; const filePath: string = join(runnerTemp, `buildSummary${runId}.json`); let taskSummaryTable; if (existsSync(filePath)) { try { - const buildSummary = readFileSync(filePath, { encoding: 'utf8' }); + const buildSummary = readFileSync(filePath, { encoding: "utf8" }); const rows = getSummaryRows(buildSummary); taskSummaryTable = [header, ...rows]; } catch (e) { - console.error('An error occurred while reading the build summary file:', e); + console.error("An error occurred while reading the build summary file:", e); return; } finally { try { unlinkSync(filePath); } catch (e) { - console.error(`An error occurred while trying to delete the build summary file ${filePath}:`, e); + console.error( + `An error occurred while trying to delete the build summary file ${filePath}:`, + e, + ); } } addSummary(taskSummaryTable, actionName); diff --git a/src/buildSummary.unit.test.ts b/src/buildSummary.unit.test.ts index d8454bb..d6d80cd 100644 --- a/src/buildSummary.unit.test.ts +++ b/src/buildSummary.unit.test.ts @@ -2,7 +2,7 @@ import { jest, describe, it, expect, beforeEach } from "@jest/globals"; -jest.unstable_mockModule('@actions/core', () => ({ +jest.unstable_mockModule("@actions/core", () => ({ summary: { addTable: jest.fn().mockReturnThis(), addHeading: jest.fn().mockReturnThis(), @@ -19,33 +19,66 @@ beforeEach(() => { (core.summary.write as jest.Mock).mockReturnThis(); }); -describe('summaryGeneration', () => { - it('should process and return summary rows for valid JSON with different task statuses', () => { +describe("summaryGeneration", () => { + it("should process and return summary rows for valid JSON with different task statuses", () => { const mockBuildSummary = JSON.stringify([ - { name: 'Task 1', failed: true, skipped: false, description: 'Task 1 description', duration: '00:00:10' }, - { name: 'Task 2', failed: false, skipped: true, skipReason: 'UserSpecified', description: 'Task 2 description', duration: '00:00:20' }, - { name: 'Task 3', failed: false, skipped: true, skipReason: 'DependencyFailed', description: 'Task 3 description', duration: '00:00:20' }, - { name: 'Task 4', failed: false, skipped: true, skipReason: 'UpToDate', description: 'Task 4 description', duration: '00:00:20' }, - { name: 'Task 5', failed: false, skipped: false, description: 'Task 5 description', duration: '00:00:30' } + { + name: "Task 1", + failed: true, + skipped: false, + description: "Task 1 description", + duration: "00:00:10", + }, + { + name: "Task 2", + failed: false, + skipped: true, + skipReason: "UserSpecified", + description: "Task 2 description", + duration: "00:00:20", + }, + { + name: "Task 3", + failed: false, + skipped: true, + skipReason: "DependencyFailed", + description: "Task 3 description", + duration: "00:00:20", + }, + { + name: "Task 4", + failed: false, + skipped: true, + skipReason: "UpToDate", + description: "Task 4 description", + duration: "00:00:20", + }, + { + name: "Task 5", + failed: false, + skipped: false, + description: "Task 5 description", + duration: "00:00:30", + }, ]); const result = buildSummary.getSummaryRows(mockBuildSummary); expect(result).toEqual([ - ['Task 1', '🔴 Failed', 'Task 1 description', '00:00:10'], - ['Task 2', '🔵 Skipped (user requested)', 'Task 2 description', '00:00:20'], - ['Task 3', '🔵 Skipped (dependency failed)', 'Task 3 description', '00:00:20'], - ['Task 4', '🔵 Skipped (up-to-date)', 'Task 4 description', '00:00:20'], - ['Task 5', '🟢 Successful', 'Task 5 description', '00:00:30'] + ["Task 1", "🔴 Failed", "Task 1 description", "00:00:10"], + ["Task 2", "🔵 Skipped (user requested)", "Task 2 description", "00:00:20"], + ["Task 3", "🔵 Skipped (dependency failed)", "Task 3 description", "00:00:20"], + ["Task 4", "🔵 Skipped (up-to-date)", "Task 4 description", "00:00:20"], + ["Task 5", "🟢 Successful", "Task 5 description", "00:00:30"], ]); }); - it('writes the summary correctly', () => { + it("writes the summary correctly", () => { const mockTableRows = [ - ['MATLAB Task', 'Status', 'Description', 'Duration (HH:mm:ss)'], - ['Test Task', '🔴 Failed', 'A test task', '00:00:10'], + ["MATLAB Task", "Status", "Description", "Duration (HH:mm:ss)"], + ["Test Task", "🔴 Failed", "A test task", "00:00:10"], ]; - const actionName = 'run-build'; + const actionName = "run-build"; buildSummary.addSummary(mockTableRows, actionName); diff --git a/src/matlab.ts b/src/matlab.ts index 02dd1fe..f2403e0 100644 --- a/src/matlab.ts +++ b/src/matlab.ts @@ -37,9 +37,9 @@ export async function generateScript(workspaceDir: string, command: string): Pro encoding: "utf8", }); - return { - dir: temporaryDirectory, - command: scriptName + return { + dir: temporaryDirectory, + command: scriptName, }; } @@ -53,7 +53,13 @@ export async function generateScript(workspaceDir: string, command: string): Pro * @param architecture Architecture of the runner (e.g., "x64") * @param fn ExecFn that will execute a command on the runner */ -export async function runCommand(hs: HelperScript, platform: string, architecture: string, fn: ExecFn, args?: string[]): Promise { +export async function runCommand( + hs: HelperScript, + platform: string, + architecture: string, + fn: ExecFn, + args?: string[], +): Promise { const rmcPath = getRunMATLABCommandScriptPath(platform, architecture); await fs.chmod(rmcPath, 0o777); @@ -62,7 +68,7 @@ export async function runCommand(hs: HelperScript, platform: string, architectur let execArgs = [rmcArg]; if (args) { - execArgs = execArgs.concat(args); + execArgs = execArgs.concat(args); } const exitCode = await fn(rmcPath, execArgs); @@ -76,10 +82,12 @@ export async function runCommand(hs: HelperScript, platform: string, architectur * * @param platform Operating system of the runner (e.g., "win32" or "linux") * @param architecture Architecture of the runner (e.g., "x64") -*/ + */ export function getRunMATLABCommandScriptPath(platform: string, architecture: string): string { if (architecture != "x64" && !(platform == "darwin" && architecture == "arm64")) { - throw new Error(`This action is not supported on ${platform} runners using the ${architecture} architecture.`); + throw new Error( + `This action is not supported on ${platform} runners using the ${architecture} architecture.`, + ); } let ext; let platformDir; @@ -101,9 +109,10 @@ export function getRunMATLABCommandScriptPath(platform: string, architecture: st platformDir = "glnxa64"; break; default: - throw new Error(`This action is not supported on ${platform} runners using the ${architecture} architecture.`); + throw new Error( + `This action is not supported on ${platform} runners using the ${architecture} architecture.`, + ); } const rmcPath = path.join(import.meta.dirname, "bin", platformDir, `run-matlab-command${ext}`); return rmcPath; - } diff --git a/src/matlab.unit.test.ts b/src/matlab.unit.test.ts index 3bca266..93d891a 100644 --- a/src/matlab.unit.test.ts +++ b/src/matlab.unit.test.ts @@ -60,7 +60,7 @@ describe("script generation", () => { describe("run command", () => { const helperScript = { dir: "/home/sweet/home", command: "disp('hello, world');" }; const platform = "win32"; - const architecture = "x64" + const architecture = "x64"; it("ideally works", async () => { const chmod = jest.spyOn(fs, "chmod"); @@ -80,7 +80,11 @@ describe("run command", () => { chmod.mockResolvedValue(undefined); execFn.mockResolvedValue(0); - const actual = matlab.runCommand(helperScript, platform, architecture, execFn, ["-nojvm", "-logfile", "file"]); + const actual = matlab.runCommand(helperScript, platform, architecture, execFn, [ + "-nojvm", + "-logfile", + "file", + ]); await expect(actual).resolves.toBeUndefined(); expect(execFn.mock.calls[0][1]![1]).toBe("-nojvm"); expect(execFn.mock.calls[0][1]![2]).toBe("-logfile"); @@ -127,8 +131,8 @@ describe("run command", () => { }); describe("ci helper path", () => { - const platform = "linux" - const architecture = "x64" + const platform = "linux"; + const architecture = "x64"; const testExtension = (platform: string, ext: string) => { it(`considers the appropriate script on ${platform}`, () => { const actualPath = matlab.getRunMATLABCommandScriptPath(platform, architecture); @@ -143,7 +147,7 @@ describe("ci helper path", () => { expect(actualPath).toContain(subdirectory); }); }; - + testExtension("win32", "exe"); testExtension("darwin", ""); testExtension("linux", ""); @@ -154,10 +158,10 @@ describe("ci helper path", () => { testDirectory("linux", "x64", "glnxa64"); it("errors on unsupported platform", () => { - expect(() => matlab.getRunMATLABCommandScriptPath('sunos',architecture)).toThrow(); - }) + expect(() => matlab.getRunMATLABCommandScriptPath("sunos", architecture)).toThrow(); + }); it("errors on unsupported architecture", () => { - expect(() => matlab.getRunMATLABCommandScriptPath(platform, 'x86')).toThrow(); - }) + expect(() => matlab.getRunMATLABCommandScriptPath(platform, "x86")).toThrow(); + }); }); diff --git a/src/script.ts b/src/script.ts index 5b3e185..78d10d7 100644 --- a/src/script.ts +++ b/src/script.ts @@ -10,10 +10,8 @@ import * as path from "path"; * @returns MATLAB command. */ export function prepare(command: string): string { - const pluginsPath = path.join(import.meta.dirname, "plugins").replaceAll("'","''"); - return `cd(getenv('MW_ORIG_WORKING_FOLDER')); ` + - `addpath('` + pluginsPath + `'); ` - + command; + const pluginsPath = path.join(import.meta.dirname, "plugins").replaceAll("'", "''"); + return `cd(getenv('MW_ORIG_WORKING_FOLDER')); ` + `addpath('` + pluginsPath + `'); ` + command; } /** diff --git a/src/script.unit.test.ts b/src/script.unit.test.ts index 79fe7f8..1c8e4a0 100644 --- a/src/script.unit.test.ts +++ b/src/script.unit.test.ts @@ -8,8 +8,9 @@ describe("call generation", () => { it("ideally works", () => { // I know what your thinking const testCommand = "disp('hello world')"; - const pluginsPath = path.join(import.meta.dirname, "plugins").replaceAll("'","''"); - const expectedString = `cd(getenv('MW_ORIG_WORKING_FOLDER')); addpath('` + pluginsPath + `'); ${testCommand}`; + const pluginsPath = path.join(import.meta.dirname, "plugins").replaceAll("'", "''"); + const expectedString = + `cd(getenv('MW_ORIG_WORKING_FOLDER')); addpath('` + pluginsPath + `'); ${testCommand}`; expect(script.prepare(testCommand)).toMatch(expectedString); }); diff --git a/src/testResultsSummary.ts b/src/testResultsSummary.ts index f5c4dbe..8f400a3 100644 --- a/src/testResultsSummary.ts +++ b/src/testResultsSummary.ts @@ -68,7 +68,7 @@ export function processAndAddTestSummary( workspace: string, ) { const testResultsData = getTestResults(runnerTemp, runId, workspace); - if(testResultsData) { + if (testResultsData) { addSummary(testResultsData, actionName); } } @@ -132,10 +132,7 @@ export function getTestResults( return testResultsData; } -export function addSummary( - testResultsData: TestResultsData, - actionName: string, -) { +export function addSummary(testResultsData: TestResultsData, actionName: string) { try { const helpLink = ` Total tests - Passed ` + getStatusEmoji(MatlabTestStatus.PASSED) + ` - Failed ` + getStatusEmoji(MatlabTestStatus.FAILED) + ` - Incomplete ` + getStatusEmoji(MatlabTestStatus.INCOMPLETE) + ` - Not Run ` + getStatusEmoji(MatlabTestStatus.NOT_RUN) + ` + Passed ` + + getStatusEmoji(MatlabTestStatus.PASSED) + + ` + Failed ` + + getStatusEmoji(MatlabTestStatus.FAILED) + + ` + Incomplete ` + + getStatusEmoji(MatlabTestStatus.INCOMPLETE) + + ` + Not Run ` + + getStatusEmoji(MatlabTestStatus.NOT_RUN) + + ` Duration(s) ⌛ - ` + stats.Total + ` - ` + stats.Passed + ` - ` + stats.Failed + ` - ` + stats.Incomplete + ` - ` + stats.NotRun + ` - ` + stats.Duration.toFixed(2) + ` + ` + + stats.Total + + ` + ` + + stats.Passed + + ` + ` + + stats.Failed + + ` + ` + + stats.Incomplete + + ` + ` + + stats.NotRun + + ` + ` + + stats.Duration.toFixed(2) + + ` ` ); @@ -183,10 +200,10 @@ export function getDetailedResults(testResults: MatlabTestFile[][]): string { Test File Duration(s) ` + - testResults - .flat() - .map((file) => generateTestFileRow(file)) - .join("") + + testResults + .flat() + .map((file) => generateTestFileRow(file)) + .join("") + `` ); } @@ -199,11 +216,17 @@ function generateTestFileRow(file: MatlabTestFile): string { return ( ` - + - ` + - statusEmoji + ` ` + file.Name + - ` + ` + + statusEmoji + + ` ` + + file.Name + + `
@@ -212,15 +235,15 @@ function generateTestFileRow(file: MatlabTestFile): string { ` + - file.TestCases.map((tc) => generateTestCaseRow(tc)).join("") + - `
Diagnostics Duration(s)
+ file.TestCases.map((tc) => generateTestCaseRow(tc)).join("") + + ` ` + - `` + - file.Duration.toFixed(2) + - `` + - ` + `` + + file.Duration.toFixed(2) + + `` + + ` ` ); } @@ -229,26 +252,32 @@ function generateTestCaseRow(testCase: MatlabTestCase): string { const statusEmoji = getStatusEmoji(testCase.Status); const diagnosticsColumn = testCase.Diagnostics.length > 0 - ? testCase.Diagnostics - .map( - (diagnostic) => - `
` + - `` + - diagnostic.Event + - `` + - `
` +
-                                diagnostic.Report.replace(/\n/g, "
").trim() + - `
` + - `
`, - ) - .join("") + ? testCase.Diagnostics.map( + (diagnostic) => + `
` + + `` + + diagnostic.Event + + `` + + `
` +
+                      diagnostic.Report.replace(/\n/g, "
").trim() + + `
` + + `
`, + ).join("") : ""; return ( `` + - `` + statusEmoji + ` ` + testCase.Name + `` + - `` + diagnosticsColumn + `` + - `` + testCase.Duration.toFixed(2) + `` + + `` + + statusEmoji + + ` ` + + testCase.Name + + `` + + `` + + diagnosticsColumn + + `` + + `` + + testCase.Duration.toFixed(2) + + `` + `` ); } @@ -320,7 +349,9 @@ function determineTestStatus(testResult: MatlabTestResultJson): MatlabTestStatus } } -function processDiagnostics(diagnostics: MatlabTestDiagnostics | MatlabTestDiagnostics[] | undefined): MatlabTestDiagnostics[] { +function processDiagnostics( + diagnostics: MatlabTestDiagnostics | MatlabTestDiagnostics[] | undefined, +): MatlabTestDiagnostics[] { if (!diagnostics) return []; return Array.isArray(diagnostics) ? diagnostics : [diagnostics]; diff --git a/src/testResultsSummary.unit.test.ts b/src/testResultsSummary.unit.test.ts index 6666bc3..aa2cbc2 100644 --- a/src/testResultsSummary.unit.test.ts +++ b/src/testResultsSummary.unit.test.ts @@ -1,6 +1,6 @@ // Copyright 2025-2026 The MathWorks, Inc. -import {jest, describe, it, expect, beforeAll} from "@jest/globals"; +import { jest, describe, it, expect, beforeAll } from "@jest/globals"; import * as path from "path"; import * as os from "os"; import * as nodeFs from "fs"; @@ -29,7 +29,7 @@ jest.unstable_mockModule("fs", () => ({ const core = await import("@actions/core"); const fs = await import("fs"); const testResultsSummary = await import("./testResultsSummary.js"); -const {MatlabTestStatus} = testResultsSummary; +const { MatlabTestStatus } = testResultsSummary; describe("Artifact Processing Tests", () => { // Shared test data @@ -59,11 +59,17 @@ describe("Artifact Processing Tests", () => { return { osName: "windows", workspaceParent: "C:\\" }; if (platform.includes("linux") || platform.includes("unix") || platform.includes("aix")) return { osName: "linux", workspaceParent: "/home/user/" }; - if (platform.includes("darwin")) return { osName: "mac", workspaceParent: "/Users/username/" }; + if (platform.includes("darwin")) + return { osName: "mac", workspaceParent: "/Users/username/" }; throw new Error(`Unsupported OS: ${platform}`); } - function copyTestDataFile(osName: string, runnerTemp: string, runId: string, actionName: string) { + function copyTestDataFile( + osName: string, + runnerTemp: string, + runId: string, + actionName: string, + ) { const sourceFilePath = path.join( import.meta.dirname, "test-data", @@ -120,18 +126,10 @@ describe("Artifact Processing Tests", () => { expect(testResults[0][0].TestCases[8].Name).toBe("testInvalidDateFormat"); expect(testResults[1][0].TestCases[0].Name).toBe("testNonLeapYear"); - expect(testResults[0][0].TestCases[0].Status).toBe( - MatlabTestStatus.PASSED, - ); - expect(testResults[0][0].TestCases[4].Status).toBe( - MatlabTestStatus.FAILED, - ); - expect(testResults[0][0].TestCases[8].Status).toBe( - MatlabTestStatus.NOT_RUN, - ); - expect(testResults[1][0].TestCases[0].Status).toBe( - MatlabTestStatus.INCOMPLETE, - ); + expect(testResults[0][0].TestCases[0].Status).toBe(MatlabTestStatus.PASSED); + expect(testResults[0][0].TestCases[4].Status).toBe(MatlabTestStatus.FAILED); + expect(testResults[0][0].TestCases[8].Status).toBe(MatlabTestStatus.NOT_RUN); + expect(testResults[1][0].TestCases[0].Status).toBe(MatlabTestStatus.INCOMPLETE); expect(testResults[0][0].TestCases[0].Duration).toBeCloseTo(0.1); expect(testResults[0][0].TestCases[1].Duration).toBeCloseTo(0.11); @@ -382,7 +380,11 @@ describe("Error Handling Tests", () => { fs.writeFileSync(invalidJsonPath, "{ invalid json content"); try { - const result = testResultsSummary.getTestResults(process.env.RUNNER_TEMP, process.env.GITHUB_RUN_ID, ""); + const result = testResultsSummary.getTestResults( + process.env.RUNNER_TEMP, + process.env.GITHUB_RUN_ID, + "", + ); expect(result).toBeNull(); // Verify error was logged @@ -419,9 +421,13 @@ describe("Error Handling Tests", () => { fs.writeFileSync(validJsonPath, "[]"); // Empty array - valid JSON try { - const result = testResultsSummary.getTestResults(process.env.RUNNER_TEMP, process.env.GITHUB_RUN_ID, ""); + const result = testResultsSummary.getTestResults( + process.env.RUNNER_TEMP, + process.env.GITHUB_RUN_ID, + "", + ); - if(result){ + if (result) { // Should still return results even if deletion fails expect(result).toBeDefined(); expect(result.TestResults).toEqual([]); From 728f75337c55cdaacf97e938ab1b0bdc94bdb61b Mon Sep 17 00:00:00 2001 From: David Buzinski Date: Wed, 1 Apr 2026 08:41:22 -0400 Subject: [PATCH 03/12] add contribuing and run npm audit fix --- devel/contributing.md | 44 +++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 12 ++++++------ 2 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 devel/contributing.md diff --git a/devel/contributing.md b/devel/contributing.md new file mode 100644 index 0000000..6057bb1 --- /dev/null +++ b/devel/contributing.md @@ -0,0 +1,44 @@ +## Contributing + +Verify changes by running tests and building locally with the following command: + +``` +npm run ci +``` + +## Creating a New Release + +Familiarize yourself with the best practices for [releasing and maintaining GitHub actions](https://docs.github.com/en/actions/creating-actions/releasing-and-maintaining-actions). + +Changes should be made on a new branch. The new branch should be merged to the main branch via a pull request. Ensure that all of the CI pipeline checks and tests have passed for your changes. + +After the pull request has been approved and merged to main, follow the Github process for [creating a new release](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository). The release must follow semantic versioning (ex: vX.Y.Z). This will kick off a new pipeline execution, and the action will automatically be published to the GitHub Actions Marketplace if the pipeline finishes successfully. Check the [GitHub Marketplace](https://github.com/marketplace/actions/setup-matlab) and check the major version in the repository (ex: v1 for v1.0.0) to ensure that the new semantically versioned tag is available. + +## Adding a pre-commit hook + +You may choose to run all CI checks before each commit by adding a pre-commit hook. To do so, navigate to the repository root directory, and run the following commands: + +_bash (Unix/macOS)_ + +```sh +echo '#!/bin/sh' > .git/hooks/pre-commit +echo 'npm run ci' >> .git/hooks/pre-commit +chmod +x .git/hooks/pre-commit +``` + +_Command Prompt (Windows)_ + +```cmd +echo #!/bin/sh > .git\hooks\pre-commit +echo npm run ci >> .git\hooks\pre-commit +``` + +_PowerShell (Windows)_ + +```pwsh +Set-Content .git\hooks\pre-commit '#!/bin/sh' +Add-Content .git\hooks\pre-commit 'npm run ci' +``` + +> **Note:** +> Git hooks are not version-controlled, so you’ll need to set up this hook for each fresh clone of the repository. diff --git a/package-lock.json b/package-lock.json index acf45cd..d007d09 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1807,9 +1807,9 @@ } }, "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://mw-npm-repository.mathworks.com:443/artifactory/api/npm/npm-repos/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -4063,9 +4063,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://mw-npm-repository.mathworks.com:443/artifactory/api/npm/npm-repos/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { From e144a21e6769f3d9b182631c9edccc4d8c488462 Mon Sep 17 00:00:00 2001 From: David Buzinski Date: Wed, 1 Apr 2026 08:49:09 -0400 Subject: [PATCH 04/12] sanitize --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index d007d09..3120f13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1808,7 +1808,7 @@ }, "node_modules/anymatch/node_modules/picomatch": { "version": "2.3.2", - "resolved": "https://mw-npm-repository.mathworks.com:443/artifactory/api/npm/npm-repos/picomatch/-/picomatch-2.3.2.tgz", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", @@ -4064,7 +4064,7 @@ }, "node_modules/picomatch": { "version": "4.0.4", - "resolved": "https://mw-npm-repository.mathworks.com:443/artifactory/api/npm/npm-repos/picomatch/-/picomatch-4.0.4.tgz", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", From cf180e9c26915800661367d9c86f7e9a671a877b Mon Sep 17 00:00:00 2001 From: David Buzinski <103441853+davidbuzinski@users.noreply.github.com> Date: Mon, 6 Apr 2026 09:35:13 -0400 Subject: [PATCH 05/12] Address doc feedback --- devel/contributing.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/devel/contributing.md b/devel/contributing.md index 6057bb1..c25f9a8 100644 --- a/devel/contributing.md +++ b/devel/contributing.md @@ -14,11 +14,11 @@ Changes should be made on a new branch. The new branch should be merged to the m After the pull request has been approved and merged to main, follow the Github process for [creating a new release](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository). The release must follow semantic versioning (ex: vX.Y.Z). This will kick off a new pipeline execution, and the action will automatically be published to the GitHub Actions Marketplace if the pipeline finishes successfully. Check the [GitHub Marketplace](https://github.com/marketplace/actions/setup-matlab) and check the major version in the repository (ex: v1 for v1.0.0) to ensure that the new semantically versioned tag is available. -## Adding a pre-commit hook +## Adding a Pre-Commit Hook -You may choose to run all CI checks before each commit by adding a pre-commit hook. To do so, navigate to the repository root directory, and run the following commands: +You can run all CI checks before each commit by adding a pre-commit hook. To do so, navigate to the repository root folder and run the following commands: -_bash (Unix/macOS)_ +_bash (Linux/macOS)_ ```sh echo '#!/bin/sh' > .git/hooks/pre-commit @@ -41,4 +41,4 @@ Add-Content .git\hooks\pre-commit 'npm run ci' ``` > **Note:** -> Git hooks are not version-controlled, so you’ll need to set up this hook for each fresh clone of the repository. +> Git hooks are not version-controlled, so you need to set up this hook for each fresh clone of the repository. From 96f92c8d4dfb01828012477976997e19eeb77275 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 03:08:45 +0000 Subject: [PATCH 06/12] Bump handlebars from 4.7.8 to 4.7.9 Bumps [handlebars](https://github.com/handlebars-lang/handlebars.js) from 4.7.8 to 4.7.9. - [Release notes](https://github.com/handlebars-lang/handlebars.js/releases) - [Changelog](https://github.com/handlebars-lang/handlebars.js/blob/v4.7.9/release-notes.md) - [Commits](https://github.com/handlebars-lang/handlebars.js/compare/v4.7.8...v4.7.9) --- updated-dependencies: - dependency-name: handlebars dependency-version: 4.7.9 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3120f13..49c47b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2663,9 +2663,9 @@ "license": "ISC" }, "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dev": true, "license": "MIT", "dependencies": { From 2717d7d5e9fb908427e3c367e1aad85e2f634e66 Mon Sep 17 00:00:00 2001 From: David Buzinski Date: Mon, 6 Apr 2026 09:43:19 -0400 Subject: [PATCH 07/12] rebase --- devel/contributing.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/devel/contributing.md b/devel/contributing.md index c25f9a8..00e775c 100644 --- a/devel/contributing.md +++ b/devel/contributing.md @@ -14,11 +14,19 @@ Changes should be made on a new branch. The new branch should be merged to the m After the pull request has been approved and merged to main, follow the Github process for [creating a new release](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository). The release must follow semantic versioning (ex: vX.Y.Z). This will kick off a new pipeline execution, and the action will automatically be published to the GitHub Actions Marketplace if the pipeline finishes successfully. Check the [GitHub Marketplace](https://github.com/marketplace/actions/setup-matlab) and check the major version in the repository (ex: v1 for v1.0.0) to ensure that the new semantically versioned tag is available. +<<<<<<< HEAD ## Adding a Pre-Commit Hook You can run all CI checks before each commit by adding a pre-commit hook. To do so, navigate to the repository root folder and run the following commands: _bash (Linux/macOS)_ +======= +## Adding a pre-commit hook + +You may choose to run all CI checks before each commit by adding a pre-commit hook. To do so, navigate to the repository root directory, and run the following commands: + +_bash (Unix/macOS)_ +>>>>>>> 1cc85ef (rebase) ```sh echo '#!/bin/sh' > .git/hooks/pre-commit @@ -41,4 +49,8 @@ Add-Content .git\hooks\pre-commit 'npm run ci' ``` > **Note:** +<<<<<<< HEAD > Git hooks are not version-controlled, so you need to set up this hook for each fresh clone of the repository. +======= +> Git hooks are not version-controlled, so you’ll need to set up this hook for each fresh clone of the repository. +>>>>>>> 1cc85ef (rebase) From e21a43550e90df54f16fb60879bb50749f121559 Mon Sep 17 00:00:00 2001 From: David Buzinski Date: Mon, 6 Apr 2026 09:42:07 -0400 Subject: [PATCH 08/12] npm audit fix --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 49c47b5..193c442 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1956,9 +1956,9 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "license": "MIT", "dependencies": { @@ -4559,9 +4559,9 @@ } }, "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { From dab53ea977a75f7c2d4f07327244d132c2b53573 Mon Sep 17 00:00:00 2001 From: David Buzinski Date: Mon, 6 Apr 2026 09:44:42 -0400 Subject: [PATCH 09/12] run format --- devel/contributing.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/devel/contributing.md b/devel/contributing.md index 00e775c..439308c 100644 --- a/devel/contributing.md +++ b/devel/contributing.md @@ -15,18 +15,20 @@ Changes should be made on a new branch. The new branch should be merged to the m After the pull request has been approved and merged to main, follow the Github process for [creating a new release](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository). The release must follow semantic versioning (ex: vX.Y.Z). This will kick off a new pipeline execution, and the action will automatically be published to the GitHub Actions Marketplace if the pipeline finishes successfully. Check the [GitHub Marketplace](https://github.com/marketplace/actions/setup-matlab) and check the major version in the repository (ex: v1 for v1.0.0) to ensure that the new semantically versioned tag is available. <<<<<<< HEAD + ## Adding a Pre-Commit Hook You can run all CI checks before each commit by adding a pre-commit hook. To do so, navigate to the repository root folder and run the following commands: -_bash (Linux/macOS)_ -======= +# _bash (Linux/macOS)_ + ## Adding a pre-commit hook You may choose to run all CI checks before each commit by adding a pre-commit hook. To do so, navigate to the repository root directory, and run the following commands: _bash (Unix/macOS)_ ->>>>>>> 1cc85ef (rebase) + +> > > > > > > 1cc85ef (rebase) ```sh echo '#!/bin/sh' > .git/hooks/pre-commit @@ -49,8 +51,9 @@ Add-Content .git\hooks\pre-commit 'npm run ci' ``` > **Note:** -<<<<<<< HEAD +> <<<<<<< HEAD > Git hooks are not version-controlled, so you need to set up this hook for each fresh clone of the repository. -======= +> ======= > Git hooks are not version-controlled, so you’ll need to set up this hook for each fresh clone of the repository. ->>>>>>> 1cc85ef (rebase) +> +> > > > > > > 1cc85ef (rebase) From d6dbbb023dfdbf8336fbf8a204d4ce69456e94da Mon Sep 17 00:00:00 2001 From: David Buzinski Date: Mon, 6 Apr 2026 10:05:46 -0400 Subject: [PATCH 10/12] fix contributing --- devel/contributing.md | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/devel/contributing.md b/devel/contributing.md index 439308c..c25f9a8 100644 --- a/devel/contributing.md +++ b/devel/contributing.md @@ -14,21 +14,11 @@ Changes should be made on a new branch. The new branch should be merged to the m After the pull request has been approved and merged to main, follow the Github process for [creating a new release](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository). The release must follow semantic versioning (ex: vX.Y.Z). This will kick off a new pipeline execution, and the action will automatically be published to the GitHub Actions Marketplace if the pipeline finishes successfully. Check the [GitHub Marketplace](https://github.com/marketplace/actions/setup-matlab) and check the major version in the repository (ex: v1 for v1.0.0) to ensure that the new semantically versioned tag is available. -<<<<<<< HEAD - ## Adding a Pre-Commit Hook You can run all CI checks before each commit by adding a pre-commit hook. To do so, navigate to the repository root folder and run the following commands: -# _bash (Linux/macOS)_ - -## Adding a pre-commit hook - -You may choose to run all CI checks before each commit by adding a pre-commit hook. To do so, navigate to the repository root directory, and run the following commands: - -_bash (Unix/macOS)_ - -> > > > > > > 1cc85ef (rebase) +_bash (Linux/macOS)_ ```sh echo '#!/bin/sh' > .git/hooks/pre-commit @@ -51,9 +41,4 @@ Add-Content .git\hooks\pre-commit 'npm run ci' ``` > **Note:** -> <<<<<<< HEAD > Git hooks are not version-controlled, so you need to set up this hook for each fresh clone of the repository. -> ======= -> Git hooks are not version-controlled, so you’ll need to set up this hook for each fresh clone of the repository. -> -> > > > > > > 1cc85ef (rebase) From 61803c66ccf417013281f9865918efb5aeca61c9 Mon Sep 17 00:00:00 2001 From: David Buzinski Date: Mon, 6 Apr 2026 10:09:07 -0400 Subject: [PATCH 11/12] remove end of line whitespace --- devel/contributing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devel/contributing.md b/devel/contributing.md index c25f9a8..018b52c 100644 --- a/devel/contributing.md +++ b/devel/contributing.md @@ -40,5 +40,5 @@ Set-Content .git\hooks\pre-commit '#!/bin/sh' Add-Content .git\hooks\pre-commit 'npm run ci' ``` -> **Note:** +> **Note:** > Git hooks are not version-controlled, so you need to set up this hook for each fresh clone of the repository. From 9587e124847ff0cd0aef6a305597dd1645019581 Mon Sep 17 00:00:00 2001 From: David Buzinski Date: Tue, 7 Apr 2026 09:02:18 -0400 Subject: [PATCH 12/12] update workflow --- .github/workflows/bat.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/bat.yml b/.github/workflows/bat.yml index 56dee1a..cc5fdf2 100644 --- a/.github/workflows/bat.yml +++ b/.github/workflows/bat.yml @@ -15,16 +15,16 @@ jobs: - os: macos-latest steps: - uses: actions/checkout@v6 - - uses: matlab-actions/setup-matlab@v2 + - uses: matlab-actions/setup-matlab@v3 with: release: latest-including-prerelease - - uses: matlab-actions/run-tests@v2 + - uses: matlab-actions/run-tests@v3 with: source-folder: plugins bat: name: Build and Test - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v6 - uses: actions/setup-node@v6