|
2 | 2 |
|
3 | 3 | /* eslint-disable import/no-extraneous-dependencies */
|
4 | 4 |
|
5 |
| -const { existsSync } = require('fs'); |
6 |
| -const { join } = require('path'); |
| 5 | +const { existsSync, readFileSync } = require('fs'); |
| 6 | +const { join, sep } = require('path'); |
7 | 7 |
|
8 | 8 | const chalk = require('chalk');
|
9 | 9 | const execa = require('execa');
|
| 10 | +const yaml = require('yaml'); |
10 | 11 |
|
11 | 12 | const [, , task] = process.argv;
|
12 | 13 | const { log } = console;
|
13 |
| -const sha = process.env.CIRCLE_SHA1 || 'HEAD'; |
| 14 | + |
| 15 | +const getDiff = async () => { |
| 16 | + const { |
| 17 | + CIRCLE_BRANCH, |
| 18 | + CIRCLE_SHA1, |
| 19 | + CIRCLE_COMPARE_URL, |
| 20 | + GITHUB_SHA, |
| 21 | + GITHUB_BASE_REF |
| 22 | + } = process.env; |
| 23 | + let baseRef = 'master'; |
| 24 | + let sha = 'HEAD'; |
| 25 | + |
| 26 | + if (CIRCLE_SHA1) { |
| 27 | + if (CIRCLE_BRANCH === 'master' && CIRCLE_COMPARE_URL) { |
| 28 | + const reCompare = /compare\/([0-9a-z]+)\.\.\.([0-9a-z]+)$/; |
| 29 | + const [, from] = CIRCLE_COMPARE_URL.match(reCompare); |
| 30 | + baseRef = from || 'master'; |
| 31 | + } |
| 32 | + sha = CIRCLE_SHA1; |
| 33 | + } |
| 34 | + |
| 35 | + if (GITHUB_SHA) { |
| 36 | + sha = GITHUB_SHA; |
| 37 | + baseRef = GITHUB_BASE_REF || 'master'; |
| 38 | + } |
| 39 | + |
| 40 | + log(chalk`{blue Comparing ${baseRef}...${sha}}`); |
| 41 | + |
| 42 | + const { stdout } = await execa('git', ['diff', `${baseRef}...${sha}`, '--name-only']); |
| 43 | + return stdout; |
| 44 | +}; |
14 | 45 |
|
15 | 46 | (async () => {
|
16 |
| - const rePkg = /(packages\/([\w\-_]+))\/?/; |
17 |
| - const { stdout: diff } = await execa('git', ['diff', `master...${sha}`, '--name-only']); |
| 47 | + const workspace = readFileSync(join(__dirname, '..', 'pnpm-workspace.yaml'), 'utf-8'); |
| 48 | + const { packages } = yaml.parse(workspace); |
| 49 | + const roots = packages.map((item) => item.split(sep)[0]).join('|'); |
| 50 | + const rePkg = new RegExp(`(${roots}/([\\w\\-_]+))/?`); |
| 51 | + const diff = await getDiff(); |
18 | 52 | const filters = diff
|
19 | 53 | .split('\n')
|
20 | 54 | .filter((line) => rePkg.test(line) && existsSync(join(__dirname, '..', line)))
|
|
0 commit comments