| import fs from "fs"; |
| import yaml from "js-yaml"; |
| import { Octokit } from "@octokit/core"; |
|
|
| |
| const backendYml = yaml.load(fs.readFileSync(".github/workflows/backend.yml", "utf8")); |
| const jobs = backendYml.jobs; |
| const backendJobs = jobs["backend-jobs"]; |
| const backendJobsDarwin = jobs["backend-jobs-darwin"]; |
| const includes = backendJobs.strategy.matrix.include; |
| const includesDarwin = backendJobsDarwin.strategy.matrix.include; |
|
|
| |
| const token = process.env.GITHUB_TOKEN; |
| const octokit = new Octokit({ auth: token }); |
|
|
| const eventPath = process.env.GITHUB_EVENT_PATH; |
| const event = JSON.parse(fs.readFileSync(eventPath, "utf8")); |
|
|
| let prNumber, repo, owner; |
| if (event.pull_request) { |
| prNumber = event.pull_request.number; |
| repo = event.repository.name; |
| owner = event.repository.owner.login; |
| } else { |
| throw new Error("This workflow must be triggered by a pull_request event."); |
| } |
|
|
| async function getChangedFiles() { |
| let files = []; |
| let page = 1; |
| while (true) { |
| const res = await octokit.request('GET /repos/{owner}/{repo}/pulls/{pull_number}/files', { |
| owner, |
| repo, |
| pull_number: prNumber, |
| per_page: 100, |
| page |
| }); |
| files = files.concat(res.data.map(f => f.filename)); |
| if (res.data.length < 100) break; |
| page++; |
| } |
| return files; |
| } |
|
|
| |
| function inferBackendPath(item) { |
| if (item.dockerfile.endsWith("python")) { |
| return `backend/python/${item.backend}/`; |
| } |
| if (item.dockerfile.endsWith("golang")) { |
| return `backend/go/${item.backend}/`; |
| } |
| if (item.dockerfile.endsWith("llama-cpp")) { |
| return `backend/cpp/llama-cpp/`; |
| } |
| return null; |
| } |
|
|
| function inferBackendPathDarwin(item) { |
| if (!item.lang) { |
| return `backend/python/${item.backend}/`; |
| } |
|
|
| return `backend/${item.lang}/${item.backend}/`; |
| } |
|
|
| (async () => { |
| const changedFiles = await getChangedFiles(); |
|
|
| console.log("Changed files:", changedFiles); |
|
|
| const filtered = includes.filter(item => { |
| const backendPath = inferBackendPath(item); |
| if (!backendPath) return false; |
| return changedFiles.some(file => file.startsWith(backendPath)); |
| }); |
|
|
| const filteredDarwin = includesDarwin.filter(item => { |
| const backendPath = inferBackendPathDarwin(item); |
| return changedFiles.some(file => file.startsWith(backendPath)); |
| }) |
|
|
| console.log("Filtered files:", filtered); |
| console.log("Filtered files Darwin:", filteredDarwin); |
|
|
| const hasBackends = filtered.length > 0 ? 'true' : 'false'; |
| const hasBackendsDarwin = filteredDarwin.length > 0 ? 'true' : 'false'; |
| console.log("Has backends?:", hasBackends); |
| console.log("Has Darwin backends?:", hasBackendsDarwin); |
|
|
| fs.appendFileSync(process.env.GITHUB_OUTPUT, `has-backends=${hasBackends}\n`); |
| fs.appendFileSync(process.env.GITHUB_OUTPUT, `has-backends-darwin=${hasBackendsDarwin}\n`); |
| fs.appendFileSync(process.env.GITHUB_OUTPUT, `matrix=${JSON.stringify({ include: filtered })}\n`); |
| fs.appendFileSync(process.env.GITHUB_OUTPUT, `matrix-darwin=${JSON.stringify({ include: filteredDarwin })}\n`); |
| })(); |
|
|