PMD Comments Removal
#58
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Source DRYness | |
| on: [push, pull_request, workflow_dispatch] | |
| jobs: | |
| pmd: | |
| name: PMD | |
| runs-on: "ubuntu-latest" | |
| env: | |
| pr_everything: 0 | |
| steps: | |
| - name: Clone - PR | |
| uses: actions/checkout@v4 | |
| - name: Set up Java | |
| uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: '17' | |
| - name: Run CPD for Fortran | |
| continue-on-error: true | |
| run: | | |
| # Get latest PMD version from GitHub API | |
| PMD_VERSION=$(curl -s https://api.github.com/repos/pmd/pmd/releases/latest | grep '"tag_name":' | cut -d'"' -f4 | sed 's/pmd_releases\///') | |
| echo "Using PMD version: $PMD_VERSION" | |
| curl -sSL -o pmd.zip \ | |
| "https://github.com/pmd/pmd/releases/download/pmd_releases/${PMD_VERSION}/pmd-dist-${PMD_VERSION}-bin.zip" | |
| unzip -q pmd.zip | |
| PMD_HOME="pmd-bin-${PMD_VERSION}" | |
| SOURCE_DIR="${1:-src}" | |
| total_files=$(find "$SOURCE_DIR" -type f \( -name "*.f" -o -name "*.f90" -o -name "*.for" -o -name "*.fpp" -o -name "*.F" -o -name "*.F90" \) | wc -l) | |
| processed=0 | |
| find "$SOURCE_DIR" -type f \( -name "*.f" -o -name "*.f90" -o -name "*.for" -o -name "*.fpp" -o -name "*.F" -o -name "*.F90" \) -print0 | | |
| while IFS= read -r -d $'\0' file; do | |
| processed=$((processed + 1)) | |
| echo -e "[$processed/$total_files] Processing ${file}..." | |
| # Create a temporary file with same permissions as original | |
| TMP_FILE=$(mktemp) | |
| if [ $? -ne 0 ]; then | |
| echo -e "Failed to create temporary file for $file, skipping" | |
| continue | |
| fi | |
| # Copy permissions from original file | |
| chmod --reference="$file" "$TMP_FILE" | |
| # More comprehensive sed command to handle different Fortran comment styles: | |
| # 1. Replace lines that are entirely comments with an empty line: | |
| # - Lines starting with '!' (free form comments) | |
| # - Lines starting with 'c', 'C', '*', 'd', 'D' in column 1 (fixed form comments) | |
| # 2. Remove end-of-line comments (anything after '!' that isn't in a string) | |
| # 3. Preserve strings containing '!' characters | |
| sed -E ' | |
| :a # ① label for looping | |
| /&$/ { # ② if the *current* line ends with “&” | |
| N # read the *next* line into the pattern space | |
| s/&[[:space:]]*\n[[:space:]]*&/ / # ③ delete the trailing “&”, | |
| # the following newline, the | |
| # leading “&” on the next line, | |
| # and join them with one space | |
| ba # ④ repeat until the next line no longer starts | |
| # with “&” (handles runs of many “&” lines) | |
| } | |
| s/&//g # ⑤ finally strip any stray “&” left in the file | |
| ' "$file" > "$TMP_FILE" && mv "$TMP_FILE" "$file" | |
| sed -E \ | |
| -e '/^\s*!/s/.*//' \ | |
| -e '/^[cC*dD]/s/.*//' \ | |
| -e '/^[ \t]*[cC*dD]/s/.*//' \ | |
| -e 's/([^"'\'']*("[^"]*"[^"'\'']*|'\''[^'\'']*'\''[^"'\'']*)*[^"'\'']*)[!].*$/\1/' \ | |
| "$file" > "$TMP_FILE" && mv "$TMP_FILE" "$file" | |
| # Check if file was actually modified before replacing | |
| if cmp -s "$file" "$TMP_FILE"; then | |
| echo -e "No changes needed for $file" | |
| rm "$TMP_FILE" | |
| else | |
| # Overwrite the original file with the processed content | |
| mv "$TMP_FILE" "$file" | |
| echo -e "Successfully processed $file" | |
| fi | |
| done | |
| "${PMD_HOME}/bin/pmd" cpd \ | |
| --dir src \ | |
| --language fortran \ | |
| --minimum-tokens=20 \ | |
| --no-fail-on-violation \ | |
| --no-fail-on-error |