From 6ea94ffd28716f35db994a4f22505d6b08de3dee Mon Sep 17 00:00:00 2001 From: SuperEwald Date: Mon, 30 Jun 2025 16:53:30 +0200 Subject: [PATCH] fix(git-data): pass cwd to git diff subprocess for out-of-source runs --- src/git-data.ts | 4 ++-- src/utils.ts | 6 +++--- tests/utils.test.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/git-data.ts b/src/git-data.ts index 9869b0a53..d6e309e9c 100644 --- a/src/git-data.ts +++ b/src/git-data.ts @@ -80,8 +80,8 @@ export class GitData { } } - static changedFiles (defaultBranch: string) { - return Utils.syncSpawn(["git", "diff", "--name-only", defaultBranch]).stdout.split("\n"); + static changedFiles (defaultBranch: string, cwd: string) { + return Utils.syncSpawn(["git", "diff", "--name-only", defaultBranch], cwd).stdout.split("\n"); } private async initRemoteData (cwd: string, writeStreams: WriteStreams): Promise { diff --git a/src/utils.ts b/src/utils.ts index e61524bee..07c32ac1a 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -199,7 +199,7 @@ export class Utils { for (const rule of opt.rules) { if (!Utils.evaluateRuleIf(rule.if, opt.variables)) continue; if (!Utils.evaluateRuleExist(opt.cwd, rule.exists)) continue; - if (evaluateRuleChanges && !Utils.evaluateRuleChanges(gitData.branches.default, rule.changes)) continue; + if (evaluateRuleChanges && !Utils.evaluateRuleChanges(gitData.branches.default, rule.changes, opt.cwd)) continue; when = rule.when ? rule.when : jobWhen; allowFailure = rule.allow_failure ?? allowFailure; @@ -337,7 +337,7 @@ export class Utils { return false; } - static evaluateRuleChanges (defaultBranch: string, ruleChanges: string[] | {paths: string[]} | undefined): boolean { + static evaluateRuleChanges (defaultBranch: string, ruleChanges: string[] | {paths: string[]} | undefined, cwd: string): boolean { if (ruleChanges === undefined) return true; // Normalize rules:changes:paths to rules:changes @@ -346,7 +346,7 @@ export class Utils { // NOTE: https://docs.gitlab.com/ee/ci/yaml/#ruleschanges // Glob patterns are interpreted with Ruby's [File.fnmatch](https://docs.ruby-lang.org/en/master/File.html#method-c-fnmatch) // with the flags File::FNM_PATHNAME | File::FNM_DOTMATCH | File::FNM_EXTGLOB. - return micromatch.some(GitData.changedFiles(`origin/${defaultBranch}`), ruleChanges, { + return micromatch.some(GitData.changedFiles(`origin/${defaultBranch}`, cwd), ruleChanges, { nonegate: true, noextglob: true, posix: false, diff --git a/tests/utils.test.ts b/tests/utils.test.ts index b34fdbfe9..17d3b1e22 100644 --- a/tests/utils.test.ts +++ b/tests/utils.test.ts @@ -178,7 +178,7 @@ describe("evaluateRuleChanges", () => { test.concurrent(`${t.description} \t\t [input: ${t.input} pattern: ${t.pattern} hasChanges: ${t.hasChanges}]`, () => { const spy = import.meta.jest.spyOn(GitData, "changedFiles"); spy.mockReturnValue(t.input); - expect(Utils.evaluateRuleChanges("origin/master", t.pattern)).toBe(t.hasChanges); + expect(Utils.evaluateRuleChanges("origin/master", t.pattern, ".")).toBe(t.hasChanges); }); }); });