From 2b2df53c8bdb31f10eeb982d3f51fede1e6547e0 Mon Sep 17 00:00:00 2001 From: Diogo Mendes Matsubara Date: Tue, 25 Aug 2026 10:29:12 +0200 Subject: [PATCH 1/2] chore: don't update git url for zenoh-flat As seen in https://github.com/eclipse-zenoh/ci/actions/runs/32243126985/job/96105227398 when set-git-branch action tries to update zenoh-flat-jni dependencies, it should skip zenoh-flat and leave it unchanged. --- .github/workflows/merge-release-branch.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/merge-release-branch.yml b/.github/workflows/merge-release-branch.yml index aee571b..1a0df91 100644 --- a/.github/workflows/merge-release-branch.yml +++ b/.github/workflows/merge-release-branch.yml @@ -64,7 +64,7 @@ jobs: release-branch: release/${{ inputs.version }} repo: ${{ matrix.repo }} github-token: ${{ secrets.BOT_TOKEN_WORKFLOW }} - deps-pattern: zenoh.* + deps-pattern: ^zenoh(?!-flat$).* deps-git-url: https://github.com/eclipse-zenoh/zenoh.git deps-branch: main From c846a33cfa941bfeeff44159c347493fa495da5a Mon Sep 17 00:00:00 2001 From: Diogo Mendes Matsubara Date: Tue, 25 Aug 2026 11:30:23 +0200 Subject: [PATCH 2/2] fix: support multiple dependency git mappings --- .github/workflows/merge-release-branch.yml | 12 +++++-- __tests__/set-git-branch.test.ts | 29 ++++++++++++++++ dist/set-git-branch-main.mjs | 34 +++++++++++++++---- set-git-branch/action.yml | 3 ++ src/set-git-branch.ts | 39 ++++++++++++++++------ 5 files changed, 97 insertions(+), 20 deletions(-) create mode 100644 __tests__/set-git-branch.test.ts diff --git a/.github/workflows/merge-release-branch.yml b/.github/workflows/merge-release-branch.yml index 1a0df91..be1eedb 100644 --- a/.github/workflows/merge-release-branch.yml +++ b/.github/workflows/merge-release-branch.yml @@ -64,9 +64,15 @@ jobs: release-branch: release/${{ inputs.version }} repo: ${{ matrix.repo }} github-token: ${{ secrets.BOT_TOKEN_WORKFLOW }} - deps-pattern: ^zenoh(?!-flat$).* - deps-git-url: https://github.com/eclipse-zenoh/zenoh.git - deps-branch: main + deps-pattern: | + ^zenoh(?!-flat$).* + ^zenoh-flat$ + deps-git-url: | + https://github.com/eclipse-zenoh/zenoh.git + https://github.com/eclipse-zenoh/zenoh-flat.git + deps-branch: | + main + main - name: Checkout zenoh-c merge release branch if: ${{ matrix.repo == 'eclipse-zenoh/zenoh-c' }} diff --git a/__tests__/set-git-branch.test.ts b/__tests__/set-git-branch.test.ts new file mode 100644 index 0000000..f65504b --- /dev/null +++ b/__tests__/set-git-branch.test.ts @@ -0,0 +1,29 @@ +import { describe, expect, test } from "@jest/globals"; + +import { parseDependencies } from "../src/set-git-branch"; + +describe("parseDependencies", () => { + test("parses aligned dependency mappings", () => { + const dependencies = parseDependencies( + ["^zenoh(?!-flat$).*", "^zenoh-flat$"], + ["https://github.com/eclipse-zenoh/zenoh.git", "https://github.com/eclipse-zenoh/zenoh-flat.git"], + ["main", "main"], + ); + + expect(dependencies).toHaveLength(2); + expect(dependencies[0].pattern.test("zenoh-ext")).toBe(true); + expect(dependencies[0].pattern.test("zenoh-flat")).toBe(false); + expect(dependencies[0].gitUrl).toBe("https://github.com/eclipse-zenoh/zenoh.git"); + expect(dependencies[1].pattern.test("zenoh-flat")).toBe(true); + expect(dependencies[1].gitUrl).toBe("https://github.com/eclipse-zenoh/zenoh-flat.git"); + }); + + test("requires aligned dependency mappings", () => { + expect(() => parseDependencies(["zenoh.*"], ["https://example.com/zenoh.git"], [])).toThrow( + "deps-pattern, deps-git-url, and deps-branch must all be provided", + ); + expect(() => + parseDependencies(["zenoh.*"], ["https://example.com/zenoh.git", "https://example.com/other.git"], ["main"]), + ).toThrow("deps-pattern, deps-git-url, and deps-branch must have the same number of lines"); + }); +}); diff --git a/dist/set-git-branch-main.mjs b/dist/set-git-branch-main.mjs index e5c214b..2ad5f10 100644 --- a/dist/set-git-branch-main.mjs +++ b/dist/set-git-branch-main.mjs @@ -25183,6 +25183,13 @@ function getInput(name, options) { } return val.trim(); } +function getMultilineInput(name, options) { + const inputs = getInput(name, options).split("\n").filter((x) => x !== ""); + if (options && options.trimWhitespace === false) { + return inputs; + } + return inputs.map((input) => input.trim()); +} function setFailed(message) { process.exitCode = ExitCode.Failure; error(message); @@ -68077,6 +68084,19 @@ async function installBinaryCached(name) { } // src/set-git-branch.ts +function parseDependencies(patterns, gitUrls, branches) { + if (patterns.length === 0 || gitUrls.length === 0 || branches.length === 0) { + throw new Error("deps-pattern, deps-git-url, and deps-branch must all be provided"); + } + if (patterns.length !== gitUrls.length || patterns.length !== branches.length) { + throw new Error("deps-pattern, deps-git-url, and deps-branch must have the same number of lines"); + } + return patterns.map((pattern, index) => ({ + pattern: new RegExp(pattern), + gitUrl: gitUrls[index], + branch: branches[index] + })); +} function setup() { const version3 = getInput("version", { required: true }); const releaseBranch = getInput("release-branch", { required: true }); @@ -68085,9 +68105,9 @@ function setup() { const toolchain = getInput("toolchain", { required: false }); const githubToken = getInput("github-token", { required: true }); const githubUser = getInput("github-user"); - const depsPattern = getInput("deps-pattern"); - const depsGitUrl = getInput("deps-git-url"); - const depsBranch = getInput("deps-branch"); + const depsPatterns = getMultilineInput("deps-pattern"); + const depsGitUrls = getMultilineInput("deps-git-url"); + const depsBranches = getMultilineInput("deps-branch"); return { version: version3, releaseBranch, @@ -68096,9 +68116,7 @@ function setup() { toolchain: toolchain === "" ? "" : `+${toolchain}`, githubToken, githubUser: githubUser === "" ? "eclipse-zenoh-bot" : githubUser, - depsRegExp: depsPattern === "" ? void 0 : new RegExp(depsPattern), - depsGitUrl: depsGitUrl === "" ? void 0 : depsGitUrl, - depsBranch: depsBranch === "" ? void 0 : depsBranch + dependencies: parseDependencies(depsPatterns, depsGitUrls, depsBranches) }; } async function main(input) { @@ -68113,7 +68131,9 @@ async function main(input) { const pathsToCheck = []; let path12; for (path12 of cargoPaths) { - await setGitBranch(path12, input.depsRegExp, input.depsGitUrl, input.depsBranch); + for (const dependency of input.dependencies) { + await setGitBranch(path12, dependency.pattern, dependency.gitUrl, dependency.branch); + } if (sh("git diff", { cwd: repo, check: false })) { sh("find . -name 'Cargo.toml' | xargs git add", { cwd: repo }); sh(`git commit --message 'chore: Update git/branch ${path12}'`, { cwd: repo, env: gitEnv }); diff --git a/set-git-branch/action.yml b/set-git-branch/action.yml index 0789a03..dfb12cd 100644 --- a/set-git-branch/action.yml +++ b/set-git-branch/action.yml @@ -18,10 +18,13 @@ inputs: required: false default: eclipse-zenoh-bot deps-pattern: + description: "Multiline list of regular expressions for dependencies (one per line)" required: true deps-git-url: + description: "Multiline list of git URLs matching deps-pattern (one per line)" required: true deps-branch: + description: "Multiline list of branches matching deps-pattern (one per line)" required: true runs: using: node24 diff --git a/src/set-git-branch.ts b/src/set-git-branch.ts index eee666c..e1c2603 100644 --- a/src/set-git-branch.ts +++ b/src/set-git-branch.ts @@ -15,11 +15,30 @@ export type Input = { toolchain: string; githubToken: string; githubUser?: string; - depsRegExp: RegExp; - depsGitUrl: string; - depsBranch: string; + dependencies: Dependency[]; }; +export type Dependency = { + pattern: RegExp; + gitUrl: string; + branch: string; +}; + +export function parseDependencies(patterns: string[], gitUrls: string[], branches: string[]): Dependency[] { + if (patterns.length === 0 || gitUrls.length === 0 || branches.length === 0) { + throw new Error("deps-pattern, deps-git-url, and deps-branch must all be provided"); + } + if (patterns.length !== gitUrls.length || patterns.length !== branches.length) { + throw new Error("deps-pattern, deps-git-url, and deps-branch must have the same number of lines"); + } + + return patterns.map((pattern, index) => ({ + pattern: new RegExp(pattern), + gitUrl: gitUrls[index], + branch: branches[index], + })); +} + export function setup(): Input { const version = core.getInput("version", { required: true }); const releaseBranch = core.getInput("release-branch", { required: true }); @@ -28,9 +47,9 @@ export function setup(): Input { const toolchain = core.getInput("toolchain", { required: false }); const githubToken = core.getInput("github-token", { required: true }); const githubUser = core.getInput("github-user"); - const depsPattern = core.getInput("deps-pattern"); - const depsGitUrl = core.getInput("deps-git-url"); - const depsBranch = core.getInput("deps-branch"); + const depsPatterns = core.getMultilineInput("deps-pattern"); + const depsGitUrls = core.getMultilineInput("deps-git-url"); + const depsBranches = core.getMultilineInput("deps-branch"); return { version, @@ -40,9 +59,7 @@ export function setup(): Input { toolchain: toolchain === "" ? "" : `+${toolchain}`, githubToken, githubUser: githubUser === "" ? "eclipse-zenoh-bot" : githubUser, - depsRegExp: depsPattern === "" ? undefined : new RegExp(depsPattern), - depsGitUrl: depsGitUrl === "" ? undefined : depsGitUrl, - depsBranch: depsBranch === "" ? undefined : depsBranch, + dependencies: parseDependencies(depsPatterns, depsGitUrls, depsBranches), }; } @@ -63,7 +80,9 @@ export async function main(input: Input) { const pathsToCheck: string[] = []; let path: string; for (path of cargoPaths) { - await cargo.setGitBranch(path, input.depsRegExp, input.depsGitUrl, input.depsBranch); + for (const dependency of input.dependencies) { + await cargo.setGitBranch(path, dependency.pattern, dependency.gitUrl, dependency.branch); + } if (sh("git diff", { cwd: repo, check: false })) { sh("find . -name 'Cargo.toml' | xargs git add", { cwd: repo }); sh(`git commit --message 'chore: Update git/branch ${path}'`, { cwd: repo, env: gitEnv });