diff --git a/.github/workflows/copyPasteDetection.yml b/.github/workflows/copyPasteDetection.yml new file mode 100644 index 00000000000..793337de5ad --- /dev/null +++ b/.github/workflows/copyPasteDetection.yml @@ -0,0 +1,86 @@ +# github actions: https://docs.github.com/en/actions/use-cases-and-examples/building-and-testing/building-and-testing-nodejs +# setup-node: https://github.com/actions/setup-node + +name: Copy-Paste Detection + +on: + pull_request: + branches: [master, feature/*, staging] + +jobs: + jscpd: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [18.x] + env: + NODE_OPTIONS: '--max-old-space-size=8192' + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + + - name: Fetch fork upstream + run: | + git remote add forkUpstream https://github.com/${{ github.event.pull_request.head.repo.full_name }} # URL of the fork + git fetch forkUpstream # Fetch fork + + - name: Determine base and target branches for comparison. + run: | + echo "CURRENT_BRANCH=${{ github.head_ref }}" >> $GITHUB_ENV + echo "TARGET_BRANCH=${{ github.event.pull_request.base.ref }}" >> $GITHUB_ENV + - run: git diff --name-only origin/$TARGET_BRANCH forkUpstream/$CURRENT_BRANCH > diff_output.txt + - run: | + npm install -g jscpd + + - run: jscpd --config "$GITHUB_WORKSPACE/.github/workflows/jscpd.json" + + - if: always() + uses: actions/upload-artifact@v4 + 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]' diff_output.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 for duplicates + 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 report (if applicable) + if: env.filtered_report_exists == 'true' + uses: actions/upload-artifact@v4 + with: + name: filtered-jscpd-report + path: ./filtered-jscpd-report.json + + - name: Fail and log found duplicates. + if: env.filtered_report_exists == 'true' + run: | + cat ./filtered-jscpd-report.json + echo "Duplications found, failing the check." + exit 1 diff --git a/.github/workflows/jscpd.json b/.github/workflows/jscpd.json index 87dd9ce943e..5f294209407 100644 --- a/.github/workflows/jscpd.json +++ b/.github/workflows/jscpd.json @@ -1,7 +1,9 @@ { "pattern": "packages/**/*.ts", - "ignore": ["**node_modules**", "**dist**"], + "ignore": ["**node_modules**", "**dist**", "*/scripts/*"], "gitignore": true, - "threshold": 1.34, - "minLines": 15 + "threshold": 3.0, + "minLines": 3, + "output": "./", + "reporters": ["json"] } diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index ae255b30c76..a4d9827b831 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -55,24 +55,6 @@ jobs: - run: npm run testCompile - run: npm run lint - jscpd: - needs: lint-commits - runs-on: ubuntu-latest - strategy: - matrix: - node-version: [18.x] - env: - NODE_OPTIONS: '--max-old-space-size=8192' - steps: - - uses: actions/checkout@v4 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node-version }} - - run: npm install jscpd - - name: Run jscpd - run: npx jscpd --config "$GITHUB_WORKSPACE/.github/workflows/jscpd.json" - macos: needs: lint-commits name: test macOS