Skip to content

Commit 3d31db4

Browse files
committed
Merge branch 'master' into ec2/commentkeys
2 parents b907682 + f2900e5 commit 3d31db4

File tree

3 files changed

+154
-86
lines changed

3 files changed

+154
-86
lines changed

.github/workflows/copyPasteDetection.yml

Lines changed: 0 additions & 86 deletions
This file was deleted.

.github/workflows/lintbranch.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// Check that branch name conforms to GitHub naming convention:
2+
// https://docs.github.com/en/get-started/using-git/dealing-with-special-characters-in-branch-and-tag-names#naming-branches-and-tags
3+
4+
// To run self-tests,
5+
// node lintbranch.js test
6+
// TODO: deduplicate code from lintbranch.js and lintcommit.js.
7+
8+
function isValid(branchName) {
9+
const branchNameRegex = /^[a-zA-Z][a-zA-Z0-9._/-]*$/
10+
11+
return branchNameRegex.test(branchName)
12+
}
13+
14+
function run(branchName) {
15+
if (isValid(branchName)) {
16+
console.log(`Branch name "${branchName}" is valid.`)
17+
process.exit(0)
18+
} else {
19+
const helpUrl =
20+
'https://docs.github.com/en/get-started/using-git/dealing-with-special-characters-in-branch-and-tag-names#naming-branches-and-tags'
21+
console.log(`Branch name "${branchName}" is invalid see ${helpUrl} for more information.`)
22+
process.exit(1)
23+
}
24+
}
25+
26+
function _test() {
27+
const tests = {
28+
'feature/branch-name': true,
29+
feature_123: true,
30+
'my-branch': true,
31+
'123invalid-start': false,
32+
'!invalid@start': false,
33+
'': false,
34+
'another/valid-name134': true,
35+
'feature/123";id;{echo,Y2F0IC9ldGMvcGFzc3dk}|{base64,-d}|{bash,-i};#': false,
36+
}
37+
38+
let passed = 0
39+
let failed = 0
40+
41+
for (const [branchName, expected] of Object.entries(tests)) {
42+
const result = isValid(branchName)
43+
if (result === expected) {
44+
console.log(`✅ Test passed for "${branchName}"`)
45+
passed++
46+
} else {
47+
console.log(`❌ Test failed for "${branchName}" (expected "${expected}", got "${result}")`)
48+
failed++
49+
}
50+
}
51+
52+
console.log(`\n${passed} tests passed, ${failed} tests failed`)
53+
}
54+
55+
function main() {
56+
const mode = process.argv[2]
57+
58+
if (mode === 'test') {
59+
_test()
60+
} else if (mode === 'run') {
61+
run(process.argv[3])
62+
} else {
63+
throw new Error(`Unknown mode: ${mode}`)
64+
}
65+
}
66+
67+
main()

.github/workflows/node.js.yml

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ jobs:
3232
- uses: actions/setup-node@v4
3333
with:
3434
node-version: '20'
35+
- name: Validate Branch name
36+
if: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref != ''}}
37+
env:
38+
BRANCH_NAME: ${{ github.event.pull_request.head.ref }}
39+
run: |
40+
node "$GITHUB_WORKSPACE/.github/workflows/lintbranch.js" run "$BRANCH_NAME"
3541
- name: Check PR title
3642
run: |
3743
node "$GITHUB_WORKSPACE/.github/workflows/lintcommit.js"
@@ -55,6 +61,87 @@ jobs:
5561
- run: npm run testCompile
5662
- run: npm run lint
5763

64+
jscpd:
65+
needs: lint-commits
66+
if: ${{ github.event_name == 'pull_request'}}
67+
runs-on: ubuntu-latest
68+
strategy:
69+
matrix:
70+
node-version: [18.x]
71+
env:
72+
NODE_OPTIONS: '--max-old-space-size=8192'
73+
74+
steps:
75+
- uses: actions/checkout@v4
76+
with:
77+
fetch-depth: 0
78+
79+
- name: Use Node.js ${{ matrix.node-version }}
80+
uses: actions/setup-node@v4
81+
with:
82+
node-version: ${{ matrix.node-version }}
83+
84+
- name: Fetch fork upstream
85+
env:
86+
REPO_NAME: ${{ github.event.pull_request.head.repo.full_name }}
87+
run: |
88+
git remote add forkUpstream https://github.com/$REPO_NAME # URL of the fork
89+
git fetch forkUpstream # Fetch fork
90+
91+
- name: Compute git diff
92+
env:
93+
CURRENT_BRANCH: ${{ github.head_ref }}
94+
TARGET_BRANCH: ${{ github.event.pull_request.base.ref }}
95+
run: git diff --name-only origin/$TARGET_BRANCH forkUpstream/$CURRENT_BRANCH > diff_output.txt
96+
97+
- run: npm install -g jscpd
98+
99+
- run: jscpd --config "$GITHUB_WORKSPACE/.github/workflows/jscpd.json"
100+
101+
- if: always()
102+
uses: actions/upload-artifact@v4
103+
with:
104+
name: unfiltered-jscpd-report
105+
path: ./jscpd-report.json
106+
107+
- name: Filter jscpd report for changed files
108+
run: |
109+
if [ ! -f ./jscpd-report.json ]; then
110+
echo "jscpd-report.json not found"
111+
exit 1
112+
fi
113+
echo "Filtering jscpd report for changed files..."
114+
CHANGED_FILES=$(jq -R -s -c 'split("\n")[:-1]' diff_output.txt)
115+
echo "Changed files: $CHANGED_FILES"
116+
jq --argjson changed_files "$CHANGED_FILES" '
117+
.duplicates | map(select(
118+
(.firstFile?.name as $fname | $changed_files | any(. == $fname)) or
119+
(.secondFile?.name as $sname | $changed_files | any(. == $sname))
120+
))
121+
' ./jscpd-report.json > filtered-jscpd-report.json
122+
cat filtered-jscpd-report.json
123+
124+
- name: Check for duplicates
125+
run: |
126+
if [ $(wc -l < ./filtered-jscpd-report.json) -gt 1 ]; then
127+
echo "filtered_report_exists=true" >> $GITHUB_ENV
128+
else
129+
echo "filtered_report_exists=false" >> $GITHUB_ENV
130+
fi
131+
- name: upload filtered report (if applicable)
132+
if: env.filtered_report_exists == 'true'
133+
uses: actions/upload-artifact@v4
134+
with:
135+
name: filtered-jscpd-report
136+
path: ./filtered-jscpd-report.json
137+
138+
- name: Fail and log found duplicates.
139+
if: env.filtered_report_exists == 'true'
140+
run: |
141+
cat ./filtered-jscpd-report.json
142+
echo "Duplications found, failing the check."
143+
exit 1
144+
58145
macos:
59146
needs: lint-commits
60147
name: test macOS

0 commit comments

Comments
 (0)