mirror of
https://github.com/theoludwig/programming-challenges.git
synced 2025-05-18 12:02:53 +02:00
feat(cli): add --ci option to run test
command
This commit is contained in:
@ -1,20 +1,66 @@
|
||||
import simpleGit from 'simple-git'
|
||||
import execa from 'execa'
|
||||
|
||||
import { Challenge } from './Challenge'
|
||||
import { Solution } from './Solution'
|
||||
|
||||
const git = simpleGit()
|
||||
|
||||
const solutionsRegex = new RegExp(
|
||||
/challenges\/[\s\S]*\/solutions\/(c|cpp|cs|dart|java|javascript|python|rust|typescript)\/[\s\S]*\/(solution|Solution).(c|cpp|cs|dart|java|js|py|rs|ts)/
|
||||
)
|
||||
|
||||
class GitAffected {
|
||||
export interface GitAffectedOptions {
|
||||
isContinuousIntegration: boolean
|
||||
}
|
||||
|
||||
export class GitAffected implements GitAffectedOptions {
|
||||
public isContinuousIntegration: boolean
|
||||
|
||||
constructor (options: GitAffectedOptions) {
|
||||
this.isContinuousIntegration = options.isContinuousIntegration
|
||||
}
|
||||
|
||||
public parseGitOutput (output: string): string[] {
|
||||
return output
|
||||
.split('\n')
|
||||
.map((line) => line.trim())
|
||||
.filter((line) => line.length > 0)
|
||||
}
|
||||
|
||||
public async getFilesUsingBaseAndHead (
|
||||
base: string,
|
||||
head: string
|
||||
): Promise<string[]> {
|
||||
const { stdout } = await execa.command(
|
||||
`git diff --name-only --relative ${base} ${head}`
|
||||
)
|
||||
return this.parseGitOutput(stdout)
|
||||
}
|
||||
|
||||
public async getUncommittedFiles (): Promise<string[]> {
|
||||
return await this.getFilesUsingBaseAndHead('HEAD', '.')
|
||||
}
|
||||
|
||||
public async getLatestPushedCommit (): Promise<string> {
|
||||
const latestCommit = this.isContinuousIntegration ? '~1' : ''
|
||||
const { stdout } = await execa.command(`git rev-parse origin/master${latestCommit}`)
|
||||
return stdout
|
||||
}
|
||||
|
||||
public async getUnpushedFiles (): Promise<string[]> {
|
||||
return await this.getFilesUsingBaseAndHead(
|
||||
await this.getLatestPushedCommit(),
|
||||
'.'
|
||||
)
|
||||
}
|
||||
|
||||
public async getAffectedSolutions (): Promise<Solution[]> {
|
||||
await git.add('.')
|
||||
const diff = await git.diff(['--name-only', '--staged'])
|
||||
const affectedSolutionsPaths = diff.split('\n').filter((currentDiff) => {
|
||||
return solutionsRegex.test(currentDiff)
|
||||
const files = Array.from(
|
||||
new Set([
|
||||
...(await this.getUnpushedFiles()),
|
||||
...(await this.getUncommittedFiles())
|
||||
])
|
||||
)
|
||||
const affectedSolutionsPaths = files.filter((filePath) => {
|
||||
return solutionsRegex.test(filePath)
|
||||
})
|
||||
return affectedSolutionsPaths.map((solution) => {
|
||||
const [, challengeName, , programmingLanguageName, solutionName] =
|
||||
@ -29,5 +75,3 @@ class GitAffected {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export const gitAffected = new GitAffected()
|
||||
|
Reference in New Issue
Block a user