-
Notifications
You must be signed in to change notification settings - Fork 2.3k
131 lines (113 loc) · 4.4 KB
/
jscpd.yml
File metadata and controls
131 lines (113 loc) · 4.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
name: Check for Duplicated Code
on:
pull_request:
branches:
- master
permissions:
contents: read
jobs:
check-duplication:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version: '20'
- name: Install jscpd
run: npm install -g jscpd
- name: Create jscpd config file
run: |
echo '{
"threshold": 20,
"minTokens": 100,
"reporters": [
"json"
],
"output": "./",
"pattern": "**/*.js",
"ignore": ["**/*spec.js"]
}' > .jscpd.json
- name: Run jscpd on entire codebase
run: jscpd
- name: Fetch base branch for comparison
run: |
git fetch origin refs/heads/${{ github.base_ref }}
- name: Get changed files
run: |
git diff --name-only FETCH_HEAD...HEAD > changed_files.txt
cat changed_files.txt
- name: List generated files (debug)
run: ls -l
- name: Upload unfiltered jscpd report
if: always()
uses: actions/upload-artifact@v7
with:
name: unfiltered-jscpd-report
path: ./jscpd-report.json
- name: Filter jscpd report for changed files
run: |
if [ ! -f ./jscpd-report.json ]; then
echo "jscpd-report.json not found"
exit 1
fi
echo "Filtering jscpd report for changed files..."
CHANGED_FILES=$(jq -R -s -c 'split("\n")[:-1]' changed_files.txt)
echo "Changed files: $CHANGED_FILES"
jq --argjson changed_files "$CHANGED_FILES" '
.duplicates | map(select(
(.firstFile?.name as $fname | $changed_files | any(. == $fname)) or
(.secondFile?.name as $sname | $changed_files | any(. == $sname))
))
' ./jscpd-report.json > filtered-jscpd-report.json
cat filtered-jscpd-report.json
- name: Check if filtered jscpd report exists
id: check_filtered_report
run: |
if [ $(wc -l < ./filtered-jscpd-report.json) -gt 1 ]; then
echo "filtered_report_exists=true" >> $GITHUB_ENV
else
echo "filtered_report_exists=false" >> $GITHUB_ENV
fi
- name: Upload filtered jscpd report
if: env.filtered_report_exists == 'true'
uses: actions/upload-artifact@v7
with:
name: filtered-jscpd-report
path: ./filtered-jscpd-report.json
- name: Generate PR comment
if: env.filtered_report_exists == 'true'
uses: actions/github-script@v8
with:
script: |
const fs = require('fs');
const filteredReport = JSON.parse(fs.readFileSync('filtered-jscpd-report.json', 'utf8'));
let comment = "Whoa there, partner! 🌵🤠 We wrangled some duplicated code in your PR:\n\n";
function link(dup) {
return `https://github.com/${{ github.repository }}/blob/${{ github.event.pull_request.head.sha }}/${dup.name}#L${dup.start + 1}-L${dup.end - 1}`
}
filteredReport.forEach(duplication => {
const firstFile = duplication.firstFile;
const secondFile = duplication.secondFile;
const lines = duplication.lines;
comment += `- [\`${firstFile.name}\`](${link(firstFile)}) has ${lines} duplicated lines with [\`${secondFile.name}\`](${link(secondFile)})\n`;
});
comment += "\nReducing code duplication by importing common functions from a library not only makes our code cleaner but also easier to maintain. Please move the common code from both files into a library and import it in each. We hate that we have to mention this, however, commits designed to hide from this utility by renaming variables or reordering an object are poor conduct. We will not look upon them kindly! Keep up the great work! 🚀";
fs.writeFileSync('${{ runner.temp }}/comment.json', JSON.stringify({
issue_number: context.issue.number,
body: comment
}))
- name: Upload comment data
if: env.filtered_report_exists == 'true'
uses: actions/upload-artifact@v7
with:
name: comment
path: ${{ runner.temp }}/comment.json
- name: Fail if duplications are found
if: env.filtered_report_exists == 'true'
run: |
echo "Duplications found, failing the check."
exit 1