diff --git a/__mocks__/@actions/github.ts b/__mocks__/@actions/github.ts index ea8319f6..b3629370 100644 --- a/__mocks__/@actions/github.ts +++ b/__mocks__/@actions/github.ts @@ -1,7 +1,13 @@ export const context = { payload: { pull_request: { - number: 123 + number: 123, + head: { + ref: 'head-branch-name' + }, + base: { + ref: 'base-branch-name' + } } }, repo: { diff --git a/__tests__/branch.test.ts b/__tests__/branch.test.ts index b5849017..51855ba5 100644 --- a/__tests__/branch.test.ts +++ b/__tests__/branch.test.ts @@ -1,17 +1,40 @@ -import {checkBranch} from '../src/branch'; +import {getBranchName, checkBranch} from '../src/branch'; import * as github from '@actions/github'; jest.mock('@actions/core'); jest.mock('@actions/github'); -describe('checkBranch', () => { - describe('when a single pattern is provided', () => { - beforeEach(() => { - github.context.payload.pull_request!.head = { - ref: 'test/feature/123' - }; +describe('getBranchName', () => { + describe('when the pull requests base branch is requested', () => { + it('returns the base branch name', () => { + const result = getBranchName('base'); + expect(result).toEqual('base-branch-name'); }); + }); + describe('when the pull requests head branch is requested', () => { + it('returns the head branch name', () => { + const result = getBranchName('head'); + expect(result).toEqual('head-branch-name'); + }); + }); + + describe('when no branch is specified', () => { + it('returns the head branch name', () => { + const result = getBranchName('base'); + expect(result).toEqual('base-branch-name'); + }); + }); +}); + +describe('checkBranch', () => { + beforeEach(() => { + github.context.payload.pull_request!.head = { + ref: 'test/feature/123' + }; + }); + + describe('when a single pattern is provided', () => { describe('and the pattern matches the head branch', () => { it('returns true', () => { const result = checkBranch(['^test']); @@ -28,12 +51,6 @@ describe('checkBranch', () => { }); describe('when multiple patterns are provided', () => { - beforeEach(() => { - github.context.payload.pull_request!.head = { - ref: 'test/feature/123' - }; - }); - describe('and at least one pattern matches', () => { it('returns true', () => { const result = checkBranch(['^test/', '^feature/']); diff --git a/src/branch.ts b/src/branch.ts index e2637896..d6ccc3ad 100644 --- a/src/branch.ts +++ b/src/branch.ts @@ -1,17 +1,23 @@ import * as core from '@actions/core'; import * as github from '@actions/github'; -function getHeadBranchName(): string | undefined { +type BranchBase = 'base' | 'head'; + +export function getBranchName(branchBase?: BranchBase): string | undefined { const pullRequest = github.context.payload.pull_request; if (!pullRequest) { return undefined; } - return pullRequest.head?.ref; + if (branchBase === 'base') { + return pullRequest.base?.ref; + } else { + return pullRequest.head?.ref; + } } -export function checkBranch(glob: string[]): boolean { - const branchName = getHeadBranchName(); +export function checkBranch(glob: string[], branchBase?: BranchBase): boolean { + const branchName = getBranchName(branchBase); if (!branchName) { core.debug(` no branch name`); return false; diff --git a/src/labeler.ts b/src/labeler.ts index 75bcb4c4..cf8e9d4d 100644 --- a/src/labeler.ts +++ b/src/labeler.ts @@ -9,6 +9,8 @@ interface MatchConfig { all?: string[]; any?: string[]; branch?: string[]; + headBranch?: string[]; + baseBranch?: string[]; } type StringOrMatchConfig = string | MatchConfig; @@ -240,6 +242,18 @@ function checkMatch(changedFiles: string[], matchConfig: MatchConfig): boolean { } } + if (matchConfig.headBranch !== undefined) { + if (!checkBranch(matchConfig.headBranch, 'head')) { + return false; + } + } + + if (matchConfig.baseBranch !== undefined) { + if (!checkBranch(matchConfig.baseBranch, 'base')) { + return false; + } + } + return true; }