name: Release
on: workflow_dispatch
permissions:
  contents: read

jobs:
  prepare:
    permissions:
      contents: write
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.update_version.outputs.version }}
      head_sha: ${{ steps.push_release.outputs.head_sha }}

    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - uses: actions/setup-python@v4
        with:
          python-version: "3.10"

      - name: Update version
        id: update_version
        run: |
          python devscripts/update-version.py ${{ vars.PUSH_VERSION_COMMIT == '' && '"$(date -u +"%H%M%S")"' || '' }} | \
            grep -Po "version=\d+\.\d+\.\d+(\.\d+)?" >> "$GITHUB_OUTPUT"

      - name: Update documentation
        run: |
          make doc
          sed '/### /Q' Changelog.md >> ./CHANGELOG
          echo '### ${{ steps.update_version.outputs.version }}' >> ./CHANGELOG
          python ./devscripts/make_changelog.py -vv -c >> ./CHANGELOG
          echo >> ./CHANGELOG
          grep -Poz '(?s)### \d+\.\d+\.\d+.+' 'Changelog.md' | head -n -1 >> ./CHANGELOG
          cat ./CHANGELOG > Changelog.md

      - name: Push to release
        id: push_release
        run: |
          git config --global user.name github-actions
          git config --global user.email github-actions@example.com
          git add -u
          git commit -m "Release ${{ steps.update_version.outputs.version }}" \
            -m "Created by: ${{ github.event.sender.login }}" -m ":ci skip all :ci run dl"
          git push origin --force ${{ github.event.ref }}:release
          echo "head_sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"

      - name: Update master
        if: vars.PUSH_VERSION_COMMIT != ''
        run: git push origin ${{ github.event.ref }}

  publish_pypi_homebrew:
    needs: prepare
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: "3.10"

      - name: Install Requirements
        run: |
          sudo apt-get -y install pandoc man
          python -m pip install -U pip setuptools wheel twine
          python -m pip install -U -r requirements.txt

      - name: Prepare
        run: |
          python devscripts/update-version.py ${{ needs.prepare.outputs.version }}
          python devscripts/make_lazy_extractors.py

      - name: Build and publish on PyPI
        env:
          TWINE_USERNAME: __token__
          TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
        if: env.TWINE_PASSWORD != ''
        run: |
          rm -rf dist/*
          make pypi-files
          python devscripts/set-variant.py pip -M "You installed yt-dlp with pip or using the wheel from PyPi; Use that to update"
          python setup.py sdist bdist_wheel
          twine upload dist/*

      - name: Checkout Homebrew repository
        env:
          BREW_TOKEN: ${{ secrets.BREW_TOKEN }}
          PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
        if: env.BREW_TOKEN != '' && env.PYPI_TOKEN != ''
        uses: actions/checkout@v3
        with:
          repository: yt-dlp/homebrew-taps
          path: taps
          ssh-key: ${{ secrets.BREW_TOKEN }}

      - name: Update Homebrew Formulae
        env:
          BREW_TOKEN: ${{ secrets.BREW_TOKEN }}
          PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
        if: env.BREW_TOKEN != '' && env.PYPI_TOKEN != ''
        run: |
          python devscripts/update-formulae.py taps/Formula/yt-dlp.rb "${{ needs.prepare.outputs.version }}"
          git -C taps/ config user.name github-actions
          git -C taps/ config user.email github-actions@example.com
          git -C taps/ commit -am 'yt-dlp: ${{ needs.prepare.outputs.version }}'
          git -C taps/ push

  build:
    needs: prepare
    uses: ./.github/workflows/build.yml
    with:
      version: ${{ needs.prepare.outputs.version }}
    permissions:
      contents: read
      packages: write # For package cache
    secrets:
      GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }}

  publish:
    needs: [prepare, build]
    uses: ./.github/workflows/publish.yml
    permissions:
      contents: write
    with:
      version: ${{ needs.prepare.outputs.version }}
      target_commitish: ${{ needs.prepare.outputs.head_sha }}
