From 3bec9227d184c7576c616843e68fa18107c84ee6 Mon Sep 17 00:00:00 2001 From: Josh Dales Date: Fri, 24 Mar 2023 21:44:26 -0400 Subject: [PATCH] Add any and all functions for both checks --- __tests__/branch.test.ts | 16 ++++++------- __tests__/changedFiles.test.ts | 16 ++++++------- src/branch.ts | 25 +++++++++++++++++++- src/changedFiles.ts | 10 ++++++-- src/labeler.ts | 43 ++++++++++++++++++++-------------- 5 files changed, 73 insertions(+), 37 deletions(-) diff --git a/__tests__/branch.test.ts b/__tests__/branch.test.ts index 1085c1b2..d9c904cf 100644 --- a/__tests__/branch.test.ts +++ b/__tests__/branch.test.ts @@ -1,6 +1,6 @@ import { getBranchName, - checkBranch, + checkAnyBranch, toBranchMatchConfig, BranchMatchConfig } from '../src/branch'; @@ -25,7 +25,7 @@ describe('getBranchName', () => { }); }); -describe('checkBranch', () => { +describe('checkAnyBranch', () => { beforeEach(() => { github.context.payload.pull_request!.head = { ref: 'test/feature/123' @@ -38,14 +38,14 @@ describe('checkBranch', () => { describe('when a single pattern is provided', () => { describe('and the pattern matches the head branch', () => { it('returns true', () => { - const result = checkBranch(['^test'], 'head'); + const result = checkAnyBranch(['^test'], 'head'); expect(result).toBe(true); }); }); describe('and the pattern does not match the head branch', () => { it('returns false', () => { - const result = checkBranch(['^feature/'], 'head'); + const result = checkAnyBranch(['^feature/'], 'head'); expect(result).toBe(false); }); }); @@ -54,21 +54,21 @@ describe('checkBranch', () => { describe('when multiple patterns are provided', () => { describe('and at least one pattern matches', () => { it('returns true', () => { - const result = checkBranch(['^test/', '^feature/'], 'head'); + const result = checkAnyBranch(['^test/', '^feature/'], 'head'); expect(result).toBe(true); }); }); describe('and all patterns match', () => { it('returns true', () => { - const result = checkBranch(['^test/', '/feature/'], 'head'); + const result = checkAnyBranch(['^test/', '/feature/'], 'head'); expect(result).toBe(true); }); }); describe('and no patterns match', () => { it('returns false', () => { - const result = checkBranch(['^feature/', '/test$'], 'head'); + const result = checkAnyBranch(['^feature/', '/test$'], 'head'); expect(result).toBe(false); }); }); @@ -77,7 +77,7 @@ describe('checkBranch', () => { describe('when the branch to check is specified as the base branch', () => { describe('and the pattern matches the base branch', () => { it('returns true', () => { - const result = checkBranch(['^main$'], 'base'); + const result = checkAnyBranch(['^main$'], 'base'); expect(result).toBe(true); }); }); diff --git a/__tests__/changedFiles.test.ts b/__tests__/changedFiles.test.ts index 9efa2193..983b0e75 100644 --- a/__tests__/changedFiles.test.ts +++ b/__tests__/changedFiles.test.ts @@ -1,21 +1,21 @@ import { ChangedFilesMatchConfig, - checkAll, - checkAny, + checkAllChangedFiles, + checkAnyChangedFiles, toChangedFilesMatchConfig } from '../src/changedFiles'; jest.mock('@actions/core'); jest.mock('@actions/github'); -describe('checkAll', () => { +describe('checkAllChangedFiles', () => { const changedFiles = ['foo.txt', 'bar.txt']; describe('when the globs match every file that has changed', () => { const globs = ['*.txt']; it('returns true', () => { - const result = checkAll(changedFiles, globs); + const result = checkAllChangedFiles(changedFiles, globs); expect(result).toBe(true); }); }); @@ -24,20 +24,20 @@ describe('checkAll', () => { const globs = ['foo.txt']; it('returns false', () => { - const result = checkAll(changedFiles, globs); + const result = checkAllChangedFiles(changedFiles, globs); expect(result).toBe(false); }); }); }); -describe('checkAny', () => { +describe('checkAnyChangedFiles', () => { const changedFiles = ['foo.txt', 'bar.txt']; describe('when the globs match any of the files that have changed', () => { const globs = ['foo.txt']; it('returns true', () => { - const result = checkAny(changedFiles, globs); + const result = checkAnyChangedFiles(changedFiles, globs); expect(result).toBe(true); }); }); @@ -46,7 +46,7 @@ describe('checkAny', () => { const globs = ['*.md']; it('returns false', () => { - const result = checkAny(changedFiles, globs); + const result = checkAnyChangedFiles(changedFiles, globs); expect(result).toBe(false); }); }); diff --git a/src/branch.ts b/src/branch.ts index a8609608..39ccce0e 100644 --- a/src/branch.ts +++ b/src/branch.ts @@ -40,7 +40,7 @@ export function getBranchName(branchBase: BranchBase): string | undefined { } } -export function checkBranch( +export function checkAnyBranch( regexps: string[], branchBase: BranchBase ): boolean { @@ -63,6 +63,29 @@ export function checkBranch( return false; } +export function checkAllBranch( + regexps: string[], + branchBase: BranchBase +): boolean { + const branchName = getBranchName(branchBase); + if (!branchName) { + core.debug(` no branch name`); + return false; + } + + core.debug(` checking "branch" pattern against ${branchName}`); + const matchers = regexps.map(regexp => new RegExp(regexp)); + for (const matcher of matchers) { + if (!matchBranchPattern(matcher, branchName)) { + core.debug(` "branch" patterns matched against ${branchName}`); + return false; + } + } + + core.debug(` "branch" patterns did not match against ${branchName}`); + return true; +} + function matchBranchPattern(matcher: RegExp, branchName: string): boolean { core.debug(` - ${matcher}`); if (matcher.test(branchName)) { diff --git a/src/changedFiles.ts b/src/changedFiles.ts index 526977e6..d82877b8 100644 --- a/src/changedFiles.ts +++ b/src/changedFiles.ts @@ -64,7 +64,10 @@ function isMatch(changedFile: string, matchers: Minimatch[]): boolean { } // equivalent to "Array.some()" but expanded for debugging and clarity -export function checkAny(changedFiles: string[], globs: string[]): boolean { +export function checkAnyChangedFiles( + changedFiles: string[], + globs: string[] +): boolean { const matchers = globs.map(g => new Minimatch(g)); core.debug(` checking "any" patterns`); for (const changedFile of changedFiles) { @@ -79,7 +82,10 @@ export function checkAny(changedFiles: string[], globs: string[]): boolean { } // equivalent to "Array.every()" but expanded for debugging and clarity -export function checkAll(changedFiles: string[], globs: string[]): boolean { +export function checkAllChangedFiles( + changedFiles: string[], + globs: string[] +): boolean { const matchers = globs.map(g => new Minimatch(g)); core.debug(` checking "all" patterns`); for (const changedFile of changedFiles) { diff --git a/src/labeler.ts b/src/labeler.ts index 3fb95495..ec0da0d2 100644 --- a/src/labeler.ts +++ b/src/labeler.ts @@ -5,9 +5,16 @@ import * as yaml from 'js-yaml'; import { ChangedFilesMatchConfig, getChangedFiles, - toChangedFilesMatchConfig + toChangedFilesMatchConfig, + checkAllChangedFiles, + checkAnyChangedFiles } from './changedFiles'; -import {checkBranch, toBranchMatchConfig, BranchMatchConfig} from './branch'; +import { + checkAnyBranch, + checkAllBranch, + toBranchMatchConfig, + BranchMatchConfig +} from './branch'; export type BaseMatchConfig = BranchMatchConfig & ChangedFilesMatchConfig; @@ -215,24 +222,24 @@ function checkMatch(changedFiles: string[], matchConfig: MatchConfig): boolean { // equivalent to "Array.some()" but expanded for debugging and clarity export function checkAny( matchConfigs: BaseMatchConfig[], - _changedFiles: string[] + changedFiles: string[] ): boolean { core.debug(` checking "any" patterns`); for (const matchConfig of matchConfigs) { if (matchConfig.baseBranch) { - if (checkBranch(matchConfig.baseBranch, 'base')) { + if (checkAnyBranch(matchConfig.baseBranch, 'base')) { return true; } } - // if (matchConfig.changedFiles) { - // if (checkFiles(matchConfig.changedFiles, changedFiles)) { - // return true; - // } - // } + if (matchConfig.changedFiles) { + if (checkAnyChangedFiles(changedFiles, matchConfig.changedFiles)) { + return true; + } + } if (matchConfig.headBranch) { - if (checkBranch(matchConfig.headBranch, 'head')) { + if (checkAnyBranch(matchConfig.headBranch, 'head')) { return true; } } @@ -245,24 +252,24 @@ export function checkAny( // equivalent to "Array.every()" but expanded for debugging and clarity export function checkAll( matchConfigs: BaseMatchConfig[], - _changedFiles: string[] + changedFiles: string[] ): boolean { core.debug(` checking "all" patterns`); for (const matchConfig of matchConfigs) { if (matchConfig.baseBranch) { - if (!checkBranch(matchConfig.baseBranch, 'base')) { + if (!checkAllBranch(matchConfig.baseBranch, 'base')) { return false; } } - // if (matchConfig.changedFiles) { - // if (checkFiles(matchConfig.changedFiles, changedFiles)) { - // return true; - // } - // } + if (matchConfig.changedFiles) { + if (checkAllChangedFiles(changedFiles, matchConfig.changedFiles)) { + return true; + } + } if (matchConfig.headBranch) { - if (!checkBranch(matchConfig.headBranch, 'head')) { + if (!checkAllBranch(matchConfig.headBranch, 'head')) { return false; } }