Proposed github process modification. #81
Workflow file for this run
This file contains 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: Schedule Status Update Based on Last Call Time | |
permissions: | |
pull-requests: write | |
contents: write | |
packages: write | |
defaults: | |
run: | |
shell: bash | |
on: | |
pull_request: | |
types: [closed] | |
branches: | |
- main | |
jobs: | |
check-merged-file: | |
if: github.event.pull_request.merged == true | |
runs-on: improvement-proposals-linux-medium | |
steps: | |
- name: Check out the code | |
uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 | |
- name: Get modified files | |
id: get-modified-files | |
run: | | |
PR_NUMBER=${{ github.event.pull_request.number }} | |
FILES=$(curl -s -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" "https://api.github.com/repos/${{ github.repository }}/pulls/$PR_NUMBER/files" | jq -r '.[].filename') | |
echo "Modified files:" | |
echo "$FILES" | |
echo "modified_files<<EOF" >> $GITHUB_OUTPUT | |
echo "$FILES" >> $GITHUB_OUTPUT | |
echo "EOF" >> $GITHUB_OUTPUT | |
- name: Check if modified files are in the HIP directory and have a .md extension | |
if: steps.get-modified-files.outputs.modified_files != '' | |
id: check-hip-files | |
run: | | |
HIP_FILES="" | |
while IFS= read -r file; do | |
if [[ $file == HIP/*.md ]]; then | |
HIP_FILES="$HIP_FILES $file" | |
fi | |
done <<< "${{ steps.get-modified-files.outputs.modified_files }}" | |
if [ -z "$HIP_FILES" ]; then | |
echo "No modified HIP files found." | |
else | |
echo "Modified HIP files: $HIP_FILES" | |
echo "hip_files=$HIP_FILES" >> $GITHUB_OUTPUT | |
fi | |
- name: Check if modified files are in Last Call | |
if: steps.check-hip-files.outputs.hip_files != '' | |
id: check-last-call | |
run: | | |
last_call_files="" | |
for file in ${{ steps.check-hip-files.outputs.hip_files }}; do | |
if grep -qE '^status: Last Call' "$file"; then | |
last_call_files="$last_call_files $file" | |
fi | |
done | |
if [[ -n "$last_call_files" ]]; then | |
echo "Files in Last Call: $last_call_files" | |
echo "last_call_files=$last_call_files" >> $GITHUB_OUTPUT | |
else | |
echo "No files in Last Call" | |
fi | |
- name: Calculate Delay Until Last Call | |
if: steps.check-last-call.outputs.last_call_files != '' | |
id: calculate-delay | |
run: | | |
first_last_call_file=$(echo "${{ steps.check-last-call.outputs.last_call_files }}" | awk '{print $1}') | |
last_call_time=$(grep -oP '(?<=^last-call-date-time: ).*' "$first_last_call_file") | |
echo "Last Call Date Time: $last_call_time" | |
target_epoch=$(date -d "$last_call_time" +%s) | |
current_epoch=$(date +%s) | |
delay_seconds=$((target_epoch - current_epoch)) | |
echo "Delay in seconds: $delay_seconds" | |
if [[ $delay_seconds -gt 0 ]]; then | |
echo "Delaying PR creation and automerge for $delay_seconds seconds." | |
echo "delay_seconds=$delay_seconds" >> $GITHUB_OUTPUT | |
else | |
echo "The last-call date-time is in the past. Skipping delay." | |
exit 1 | |
fi | |
- name: Delay Until Last Call | |
if: steps.calculate-delay.outputs.delay_seconds != '' | |
run: | | |
delay_seconds=${{ steps.calculate-delay.outputs.delay_seconds }} | |
echo "Sleeping for $delay_seconds seconds" | |
sleep "$delay_seconds" | |
- name: Update HIP status and Add/Update `updated` Date | |
if: steps.check-last-call.outputs.last_call_files != '' | |
run: | | |
current_date=$(date +%Y-%m-%d) | |
for file in ${{ steps.check-last-call.outputs.last_call_files }}; do | |
hip_type=$(grep -oP '(?<=^type: ).*' "$file") | |
hip_category=$(grep -oP '(?<=^category: ).*' "$file") | |
echo "Processing file: $file" | |
echo "Extracted type: $hip_type" | |
echo "Extracted category: $hip_category" | |
new_status="" | |
if [[ "$hip_type" == "Standards Track" ]]; then | |
if [[ "$hip_category" == "Core" || "$hip_category" == "Service" || "$hip_category" == "Mirror" ]]; then | |
new_status="Council Review" | |
elif [[ "$hip_category" == "Application" ]]; then | |
new_status="Accepted" | |
fi | |
elif [[ "$hip_type" == "Informational" || "$hip_type" == "Process" ]]; then | |
new_status="Active" | |
fi | |
if [[ -n "$new_status" ]]; then | |
# Update status | |
sed -i "s/^status: Last Call/status: $new_status/" "$file" | |
# Update or add `updated` property before the final "---" | |
if grep -q '^updated: ' "$file"; then | |
sed -i "s/^updated:.*/updated: $current_date/" "$file" | |
else | |
sed -i "/^---$/i updated: $current_date" "$file" | |
fi | |
echo "Updated status of $file to $new_status and set updated date to $current_date" | |
else | |
echo "Unable to determine the new status for $file. Check the type and category fields." | |
fi | |
done | |
- name: Create PR for status update | |
if: steps.check-last-call.outputs.last_call_files != '' | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
id: create-pr | |
run: | | |
git config --global user.name 'GitHub Action' | |
git config --global user.email 'action@github.com' | |
git add . | |
git commit -m "Update HIP status and set updated date" | |
git push origin HEAD:status-update-${{ github.sha }} | |
PR_URL=$(gh pr create --title "Update HIP status" --body "Automatically updating the status of HIPs in Last Call and setting the updated date based on the type and category." --base main --head status-update-${{ github.sha }}) | |
echo "Pull request created at $PR_URL" | |
echo "pr_url=$PR_URL" >> $GITHUB_OUTPUT | |
- name: Auto-merge PR | |
if: steps.create-pr.outputs.pr_url != '' | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
PR_NUMBER=$(echo "${{ steps.create-pr.outputs.pr_url }}" | grep -oP '\d+$') | |
echo "Merging PR number: $PR_NUMBER" | |
gh pr merge $PR_NUMBER --merge --auto --body "Auto-merged via GitHub Actions" |