Skip to content

PMD Comments Removal #52

PMD Comments Removal

PMD Comments Removal #52

Workflow file for this run

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:-pr/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 \
-e '/^\s*!/s/.*//' \
-e '/^[cC*dD]/s/.*//' \
-e '/^[ \t]*[cC*dD]/s/.*//' \
-e 's/([^"'\'']*("[^"]*"[^"'\'']*|'\''[^'\'']*'\''[^"'\'']*)*[^"'\'']*)[!].*$/\1/' \
"$file" > "$TMP_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=40