# #
#   @type               github workflow
#   @author             Aetherinox
#   @url                https://github.com/Aetherinox
#   @usage              cleans all commit history for a repository
#                       edit the 'environment:' to determine which deployment to keep clean
#                           - can be ran manually
#
#   @secrets            secrets.SELF_TOKEN                                          self github personal access token (fine-grained)
#                       secrets.SELF_TOKEN_CL                                       self github personal access token (classic)
#                       secrets.NPM_TOKEN                                           self npmjs access token
#                       secrets.PYPI_API_TOKEN                                      self Pypi API token (production site) - https://pypi.org/
#                       secrets.PYPI_API_TEST_TOKEN                                 self Pypi API token (test site) - https://test.pypi.org/
#                       secrets.SELF_DOCKERHUB_TOKEN                                self Dockerhub token
#                       secrets.CODECOV_TOKEN                                       codecov upload token for nodejs projects
#                       secrets.MAXMIND_GELITE_TOKEN                                maxmind API token
#                       secrets.CF_ACCOUNT_ID                                       cloudflare account id
#                       secrets.CF_ACCOUNT_TOKEN                                    cloudflare account token
#                       secrets.ORG_TOKEN                                           org github personal access token (fine-grained)
#                       secrets.ORG_TOKEN_CL                                        org github personal access token (classic)
#                       secrets.ORG_DOCKERHUB_TOKEN                                 org dockerhub secret
#                       secrets.ORG_GITEA_TOKEN                                     org gitea personal access token (classic) with package:write permission
#                       secrets.BOT_GPG_KEY_ASC                                     bot gpg private key (armored) | BEGIN PGP PRIVATE KEY BLOCK
#                       secrets.BOT_GPG_KEY_B64                                     bot gpg private key (binary) converted to base64
#                       secrets.BOT_GPG_PASSPHRASE                                  bot gpg private key passphrase
#                       secrets.DISCORD_WEBHOOK_CHAN_GITHUB_RELEASES                discord webhook to report release notifications from github to discord
#                       secrets.DISCORD_WEBHOOK_CHAN_GITHUB_WORKFLOWS               discord webhook to report workflow notifications from github to discord
#                       secrets.DISCORD_WEBHOOK_CHAN_GITHUB_UPDATES                 discord webhook to report activity notifications from github to discord
#
#
#   @local              these workflows can be tested locally through the use of `act`
#                           https://github.com/nektos/act
#                       Extract act to folder
#                       Add system env var with path to act.exe
#                       Run the commands:
#                           git pull https://github.com/username/repo
#                           act -W .github/workflows/history-clean.yml -P ubuntu-latest=catthehacker/ubuntu:full-22.04
#                           act -W .github/workflows/history-clean.yml -s TOKEN_CL=XXXXXXXXXX --pull=false
# #

name: '🧹 History › Clean'
run-name: '🧹 History › Clean'

# #
#   triggers
# #

on:

    # #
    #   Trigger > Workflow Dispatch
    # #

    workflow_dispatch:
        inputs:

            # #
            #   Commit Label
            #
            #   the label to use when repository is cleaned
            # #

            COMMIT_LABEL:
                description:    '🏷️ Commit Label'
                required:       true
                default:        'cleanup'
                type:           string

            # #
            #   Branch
            #
            #   select branch to clean
            #   you must also run the workflow from that branch
            # #

            BRANCH:
                description:    '🌳 Branch'
                required:       true
                default:        'main'
                type:           string

# #
#   environment variables
# #

env:
    COMMIT_LABEL:               ${{ github.event.inputs.COMMIT_LABEL || 'cleanup' }}
    BRANCH:                     ${{ github.event.inputs.BRANCH || 'main' }}
    BOT_NAME_1:                 EuropaServ
    BOT_NAME_2:                 BinaryServ
    BOT_NAME_DEPENDABOT:        dependabot[bot]
    BOT_NAME_RENOVATE:          renovate[bot]

# #
#   jobs
# #

jobs:
    history-clean:
        name: >-
            🧹 History › Clean
        runs-on: ubuntu-latest
      # runs-on: apollo-x64
        timeout-minutes: 15
        permissions:
            contents: write
        steps:

            # #
            #   History › Clean › Checkout
            # #

            - name: '☑️ Checkout'
              uses: actions/checkout@v4
              with:
                  fetch-depth: 0

            # #
            #   History › Clean › Job Information
            # #

            - name: >-
                  🔄 Load Job
              uses: qoomon/actions--context@v4
              id: 'context'

            # #
            #   History › Clean › Start
            # #

            - name: >-
                  ✅ Start
              run: |
                  echo "‎"
                  echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
                  echo " Starting Job ${{ steps.context.outputs.job_name }}"
                  echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"

                  YEAR="$(date +'%Y')"
                  echo "YEAR=${YEAR}" >> $GITHUB_ENV

                  NOW="$(date +'%m-%d-%Y %H:%M:%S')"                                                #  02-25-2025 12:49:48
                  echo "NOW=${NOW}" >> $GITHUB_ENV

                  NOW_SHORT="$(date +'%m-%d-%Y')"                                                   #  02-25-2025
                  echo "NOW_SHORT=${NOW_SHORT}" >> $GITHUB_ENV

                  NOW_LONG="$(date +'%m-%d-%Y %H:%M')"                                              #  02-25-2025 12:49
                  echo "NOW_LONG=${NOW_LONG}" >> $GITHUB_ENV

                  NOW_DOCKER="$(date +'%Y%m%d')"                                                    #  20250225
                  echo "NOW_DOCKER=${NOW_DOCKER}" >> $GITHUB_ENV

                  NOW_DOCKER_TS="$(date -u +'%FT%T.%3NZ')"                                          #  2025-02-25T12:50:11.569Z
                  echo "NOW_DOCKER_TS=${NOW_DOCKER_TS}" >> $GITHUB_ENV

                  SHA1="$(git rev-parse HEAD)"                                                      #  71fad013cfce9116ec62779e4a7e627fe4c33627
                  echo "SHA1=${SHA1}" >> $GITHUB_ENV

                  SHA1_GH="$(echo ${GITHUB_SHA})"                                                   #  71fad013cfce9116ec62779e4a7e627fe4c33627
                  echo "SHA1_GH=${SHA1_GH}" >> $GITHUB_ENV

                  PKG_VER_1DIGIT="$(echo ${{ env.IMAGE_VERSION }} | cut -d '.' -f1-1)"              #  3.22 > 3
                  echo "PKG_VER_1DIGIT=${PKG_VER_1DIGIT}" >> $GITHUB_ENV

                  PKG_VER_2DIGIT="$(echo ${{ env.IMAGE_VERSION }} | cut -f2 -d ":" | cut -c1-3)"    #  3.22 > 3.2
                  echo "PKG_VER_2DIGIT=${PKG_VER_2DIGIT}" >> $GITHUB_ENV

                  echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
                  echo "‎"
                  echo "‎"
                  sudo apt -qq update
                  sudo apt -qq install tree
                  echo "‎"
                  echo "‎"
                  echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
                  echo "‎"
                  echo "‎"
                  echo " Runner .............. ${{ runner.name }}"
                  echo " Workflow ............ ${{ github.workflow }} (#${{ github.workflow_ref }})"
                  echo " Run Number .......... ${{ github.run_number }}"
                  echo " Ref ................. ${{ github.ref }}"
                  echo " Ref Name ............ ${{ github.ref_name }}"
                  echo " Event Name .......... ${{ github.event_name }}"
                  echo " Repo ................ ${{ github.repository }}"
                  echo " Repo Owner .......... ${{ github.repository_owner }}"
                  echo " Run ID .............. https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
                  echo " Triggered By ........ ${{ github.actor }}"
                  echo " SHA 1 (GITHUB_SHA) .. ${GITHUB_SHA}"
                  echo " SHA 2 (github.sha) .. ${{ github.sha }}"
                  echo " SHA 3 (env.SHA1) .... ${SHA1}"
                  echo " SHA 4 (env.SHA1_GH) . ${SHA1_GH}"
                  echo " Workspace ........... ${{ github.workspace }}"
                  echo " PWD ................. ${PWD}"
                  echo " Job Name ............ ${{ steps.context.outputs.job_name }}"
                  echo " Job ID .............. ${{ steps.context.outputs.job_id }}"
                  echo " Job URL ............. ${{ steps.context.outputs.job_url }}"
                  echo " Run ID .............. ${{ steps.context.outputs.run_id }}"
                  echo " Run Attempt ......... ${{ steps.context.outputs.run_attempt }}"
                  echo " Run Number .......... ${{ steps.context.outputs.run_number }}"
                  echo " Run URL ............. ${{ steps.context.outputs.run_url }}"
                  echo " Run Env ............. ${{ steps.context.outputs.environment }}"
                  echo " Run Env URL ......... ${{ steps.context.outputs.environment_url }}"
                  echo " Run Deployment ...... ${{ steps.context.outputs.deployment_id }}"
                  echo " Run Deployment URL .. ${{ steps.context.outputs.deployment_url }}"
                  echo " Run Deployment ...... ${{ steps.context.outputs.deployment_id }}"
                  echo " Run Runner Name ..... ${{ steps.context.outputs.runner_name }}"
                  echo " Run Runner ID ....... ${{ steps.context.outputs.runner_id }}"
                  echo " Year ................ ${YEAR}"
                  echo " Now ................. ${NOW}"
                  echo " Now (Short) ......... ${NOW_SHORT}"
                  echo " Now (Long) .......... ${NOW_LONG}"
                  echo " Now (Docker) ........ ${NOW_DOCKER}"
                  echo " Now (Docker TS) ..... ${NOW_DOCKER_TS}"
                  echo "‎"
                  echo "‎"
                  echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
                  echo "‎"
                  echo "‎"
                  tree -I node_modules -I .git
                  echo "‎"
                  echo "‎"
                  echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
                  echo "‎"
                  echo "‎"

            # #
            #   History › Clean › Git Identify
            # #

            - name: >-
                  🪪 Configure Git Identity
              run: |
                    git config --local user.email "github-actions[bot]@users.noreply.github.com"
                    git config --local user.name "github-actions[bot]"

            # #
            #   History › Clean › Pre-Commit
            # #

            - name: >-
                  📦 Commit › Pre-commit
              run: |
                  now=$(date -u '+%m/%d/%Y %H:%M')
                  commit_label="${{ env.COMMIT_LABEL }}" >> $GITHUB_ENV
                  echo -e "$commit_label"
                  commit_message="chore(maint): \\\`️️🧹 $commit_label 🧹\\\` \\\`$now UTC\\\`" >> $GITHUB_ENV
                  echo -e "$commit_message"
                  echo "COMMIT_MESSAGE=$(echo $commit_message)" >> $GITHUB_ENV
                  echo "NOW=$(echo $now)" >> $GITHUB_ENV

            # #
            #   History › Clean › Pre-Commit › Debug
            # #

            - name: >-
                  📦 Commit › Pre-commit › Debug
              run: |
                  echo -e "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
                  echo -e " Printing Values"
                  echo -e "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
                  echo -e " env.COMMIT_LABEL .................... ${{ env.COMMIT_LABEL }}"
                  echo -e " env.COMMIT_MESSAGE .................. ${{ env.COMMIT_MESSAGE }}"
                  echo -e " env.NOW ............................. ${{ env.NOW }}"

            # #
            #   History › Clean › Start
            # #

            - name: >-
                  🧹 Clean Repo History
              run: |
                    # Create a new orphan branch
                    git checkout --orphan temp-branch

                    # Add all files to the new branch
                    git add -A

                    # Commit the files to the new branch
                    git commit -m "${{ env.COMMIT_MESSAGE }}"

                    # Delete the old main branch
                    git branch -D ${{ env.BRANCH }}

                    # Rename the new orphan branch to main
                    git branch -m ${{ env.BRANCH }}

                    # Force push the new main branch to the remote repository
                    git push -f origin ${{ env.BRANCH }}

            # #
            #   History › Clean › References
            # #

            - name: >-
                  🗑️ Garbage Collection (Aggressive)
              run: |
                    # Remove remote-tracking references to deleted branches (optional)
                    git fetch origin --prune
                    git repack
                    git prune-packed
                    git reflog expire --expire=now --all
                    git gc --prune=now --aggressive

            # #
            #   History › Clean › Commit
            # #

            - name: >-
                  📦 Commit › Execute
              uses: stefanzweifel/git-auto-commit-action@v5
              with:
                  commit_message: ${{ env.COMMIT_MESSAGE }}
