Skip to content

Commit

Permalink
feat: add support for controlling the pattern order (#1693)
Browse files Browse the repository at this point in the history
Co-authored-by: GitHub Action <action@github.com>
  • Loading branch information
jackton1 and actions-user committed Nov 3, 2023
1 parent 50a9cc9 commit 892553a
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 83 deletions.
4 changes: 4 additions & 0 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,10 @@ inputs:
description: "Fail when the submodule diff fails."
required: false
default: "false"
negation_patterns_first:
description: "Apply the negation patterns first. **NOTE:** This affects how changed files are matched."
required: false
default: "false"

outputs:
added_files:
Expand Down
80 changes: 46 additions & 34 deletions dist/index.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dist/index.js.map

Large diffs are not rendered by default.

11 changes: 10 additions & 1 deletion src/inputs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ export type Inputs = {
skipInitialFetch: boolean
failOnInitialDiffError: boolean
failOnSubmoduleDiffError: boolean
negationPatternsFirst: boolean
}

export const getInputs = (): Inputs => {
Expand Down Expand Up @@ -218,6 +219,13 @@ export const getInputs = (): Inputs => {
}
)

const negationPatternsFirst = core.getBooleanInput(
'negation_patterns_first',
{
required: false
}
)

const inputs: Inputs = {
files,
filesSeparator,
Expand Down Expand Up @@ -268,7 +276,8 @@ export const getInputs = (): Inputs => {
outputDir,
outputRenamedFilesAsDeletedAndAdded,
token,
apiUrl
apiUrl,
negationPatternsFirst
}

if (fetchDepth) {
Expand Down
103 changes: 56 additions & 47 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -938,90 +938,99 @@ export const getFilePatterns = async ({
inputs: Inputs
workingDirectory: string
}): Promise<string[]> => {
let filePatterns = ''
let cleanedFilePatterns: string[] = []

if (inputs.files) {
const filesPatterns = inputs.files
.split(inputs.filesSeparator)
.filter(Boolean)

cleanedFilePatterns.push(...filesPatterns)

core.debug(`files patterns: ${filesPatterns.join('\n')}`)
}

if (inputs.filesFromSourceFile !== '') {
const inputFilesFromSourceFile = inputs.filesFromSourceFile
.split(inputs.filesFromSourceFileSeparator)
.filter(Boolean)
.map(p => path.join(workingDirectory, p))

core.debug(`files from source file: ${inputFilesFromSourceFile}`)

const filesFromSourceFiles = await getFilesFromSourceFile({
filePaths: inputFilesFromSourceFile
})

core.debug(
`files from source files patterns: ${filesFromSourceFiles.join('\n')}`
)

cleanedFilePatterns.push(...filesFromSourceFiles)
}

if (inputs.filesIgnore) {
const filesIgnorePatterns = inputs.filesIgnore
.split(inputs.filesIgnoreSeparator)
.filter(p => p !== '')
.filter(Boolean)
.map(p => {
if (!p.startsWith('!')) {
p = `!${p}`
}
return p
})
.join('\n')

core.debug(`files ignore patterns: ${filesIgnorePatterns}`)
core.debug(`files ignore patterns: ${filesIgnorePatterns.join('\n')}`)

filePatterns = filePatterns.concat('\n', filesIgnorePatterns)
cleanedFilePatterns.push(...filesIgnorePatterns)
}

if (inputs.filesIgnoreFromSourceFile) {
const inputFilesIgnoreFromSourceFile = inputs.filesIgnoreFromSourceFile
.split(inputs.filesIgnoreFromSourceFileSeparator)
.filter(p => p !== '')
.filter(Boolean)
.map(p => path.join(workingDirectory, p))

core.debug(
`files ignore from source file: ${inputFilesIgnoreFromSourceFile}`
)

const filesIgnoreFromSourceFiles = (
await getFilesFromSourceFile({
filePaths: inputFilesIgnoreFromSourceFile,
excludedFiles: true
})
).join('\n')
const filesIgnoreFromSourceFiles = await getFilesFromSourceFile({
filePaths: inputFilesIgnoreFromSourceFile,
excludedFiles: true
})

core.debug(
`files ignore from source files patterns: ${filesIgnoreFromSourceFiles}`
`files ignore from source files patterns: ${filesIgnoreFromSourceFiles.join(
'\n'
)}`
)

filePatterns = filePatterns.concat('\n', filesIgnoreFromSourceFiles)
cleanedFilePatterns.push(...filesIgnoreFromSourceFiles)
}

if (inputs.files) {
filePatterns = filePatterns.concat(
'\n',
inputs.files.split(inputs.filesSeparator).filter(Boolean).join('\n')
)
if (inputs.negationPatternsFirst) {
cleanedFilePatterns.sort((a, b) => {
return a.startsWith('!') ? -1 : b.startsWith('!') ? 1 : 0
})
}

if (inputs.filesFromSourceFile !== '') {
const inputFilesFromSourceFile = inputs.filesFromSourceFile
.split(inputs.filesFromSourceFileSeparator)
.filter(p => p !== '')
.map(p => path.join(workingDirectory, p))

core.debug(`files from source file: ${inputFilesFromSourceFile}`)

const filesFromSourceFiles = (
await getFilesFromSourceFile({filePaths: inputFilesFromSourceFile})
).join('\n')

core.debug(`files from source files patterns: ${filesFromSourceFiles}`)

filePatterns = filePatterns.concat('\n', filesFromSourceFiles)
// Reorder file patterns '**' should come first
if (cleanedFilePatterns.includes('**')) {
cleanedFilePatterns.sort((a, b) => {
return a === '**' ? -1 : b === '**' ? 1 : 0
})
}

if (isWindows()) {
filePatterns = filePatterns.replace(/\r\n/g, '\n')
filePatterns = filePatterns.replace(/\r/g, '\n')
}

const filePatternsArray = filePatterns.trim().split('\n').filter(Boolean)

// Reorder file patterns '**' should come before '!**/*.txt' and then the rest 'dir/**/*.txt'
if (filePatternsArray.includes('**')) {
filePatternsArray.sort((a, b) => {
return a === '**' ? -1 : b === '**' ? 1 : 0
})
cleanedFilePatterns = cleanedFilePatterns.map(pattern =>
pattern.replace(/\r\n/g, '\n').replace(/\r/g, '\n')
)
}

core.debug(`Input file patterns: \n${filePatternsArray.join('\n')}`)
core.debug(`Input file patterns: \n${cleanedFilePatterns.join('\n')}`)

return filePatternsArray
return cleanedFilePatterns
}

// Example YAML input:
Expand Down

0 comments on commit 892553a

Please sign in to comment.