name: Update FrogPilot Branch on: schedule: - cron: "0 18 * * *" env: BRANCH_FROGPILOT: FrogPilot BRANCH_PREVIOUS: FrogPilot-Previous BRANCH_STAGING: FrogPilot-Staging TZ: America/Phoenix UPDATE_FILE: .github/update_date jobs: check_update: runs-on: ubuntu-latest outputs: update_due: ${{ steps.check_update.outputs.update_due }} scheduled_date: ${{ steps.check_update.outputs.scheduled_date }} steps: - name: Download the 'update_date' File id: download_update run: | curl -fLsS "https://raw.githubusercontent.com/FrogAi/FrogPilot/${{ env.BRANCH_STAGING }}/${{ env.UPDATE_FILE }}" -o update_date || touch update_date_missing - name: Check If Update Is Due id: check_update run: | if [ -f update_date_missing ]; then echo "No update_date file found in FrogPilot-Staging." echo "update_due=false" >> "$GITHUB_OUTPUT" exit 0 fi SCHEDULED_DATE=$(cat update_date) CURRENT_DATE=$(TZ="${{ env.TZ }}" date +%F) echo "Scheduled Date: $SCHEDULED_DATE" echo "Current Date: $CURRENT_DATE" if [ "$SCHEDULED_DATE" != "$CURRENT_DATE" ]; then echo "Update not due." echo "update_due=false" >> "$GITHUB_OUTPUT" exit 0 fi echo "update_due=true" >> "$GITHUB_OUTPUT" echo "scheduled_date=$SCHEDULED_DATE" >> "$GITHUB_OUTPUT" update_branch: needs: check_update if: ${{ needs.check_update.outputs.update_due == 'true' }} runs-on: ubuntu-latest steps: - name: Configure Git Identity run: | git config --global user.name "${{ github.actor }}" git config --global user.email "${{ github.actor }}@users.noreply.github.com" - name: Checkout ${{ env.BRANCH_STAGING }} uses: actions/checkout@v3 with: fetch-depth: 0 ref: ${{ env.BRANCH_STAGING }} - name: Update README Date and Remove (${{ env.UPDATE_FILE }}) run: | DAY=$(TZ="${{ env.TZ }}" date +'%d' | sed 's/^0//') case "$DAY" in 1|21|31) SUFFIX="st" ;; 2|22) SUFFIX="nd" ;; 3|23) SUFFIX="rd" ;; *) SUFFIX="th" ;; esac MONTH=$(TZ="${{ env.TZ }}" date +'%B') YEAR=$(TZ="${{ env.TZ }}" date +'%Y') NEW_DATE="**${MONTH} ${DAY}${SUFFIX}, ${YEAR}**" echo "Updating README date to ${NEW_DATE}" sed -i "/FrogPilot was last updated on:/ { N; N; s/\(\n\)\n.*$/\1\n${NEW_DATE}/; }" README.md git add README.md git rm -f "${{ env.UPDATE_FILE }}" git commit -m "Updated README date to ${NEW_DATE}" - name: Squash Commits run: | COMMIT_MSG=$(git log -1 --pretty=%B HEAD~1) git reset --soft HEAD~2 git commit -m "$COMMIT_MSG" - name: Rewrite Commit Dates to Noon ${{ env.TZ }} run: | COMMIT_DATETIME="${{ needs.check_update.outputs.scheduled_date }} 12:00" COMMIT_PHX=$(TZ="${{ env.TZ }}" date -d "$COMMIT_DATETIME" +"%Y-%m-%dT%H:%M:%S %z") git filter-branch --env-filter "export GIT_AUTHOR_DATE='$COMMIT_PHX'; export GIT_COMMITTER_DATE='$COMMIT_PHX'" "${{ env.BRANCH_STAGING }}" - name: Fetch ${{ env.BRANCH_PREVIOUS }} and ${{ env.BRANCH_FROGPILOT }} run: | git fetch origin ${{ env.BRANCH_PREVIOUS }} ${{ env.BRANCH_FROGPILOT }} - name: Wait Until Noon ${{ env.TZ }} Before Continuing run: | NOW=$(TZ="${{ env.TZ }}" date +%s) TARGET=$(TZ="${{ env.TZ }}" date -d "12:00" +%s) if [ "$NOW" -lt "$TARGET" ]; then SLEEP_TIME=$((TARGET - NOW)) echo "Sleeping for $SLEEP_TIME seconds until noon..." sleep $SLEEP_TIME else echo "It is already noon or past noon, proceeding immediately." fi - name: Push ${{ env.BRANCH_STAGING }} run: | git push origin "${{ env.BRANCH_STAGING }}" --force - name: Reset ${{ env.BRANCH_PREVIOUS }} to Match ${{ env.BRANCH_FROGPILOT }} run: | git switch "${{ env.BRANCH_PREVIOUS }}" git reset --hard "origin/${{ env.BRANCH_FROGPILOT }}" git push origin "${{ env.BRANCH_PREVIOUS }}" --force - name: Reset ${{ env.BRANCH_FROGPILOT }} to Match ${{ env.BRANCH_STAGING }} run: | git switch "${{ env.BRANCH_FROGPILOT }}" git reset --hard "origin/${{ env.BRANCH_STAGING }}" git push origin "${{ env.BRANCH_FROGPILOT }}" --force