name: Release
on:
  workflow_dispatch:
    inputs:
      version:
        description: Version tag (YYYY.MM.DD[.REV])
        required: false
        default: ''
        type: string
      channel:
        description: Update channel (stable/nightly/...)
        required: false
        default: ''
        type: string
      prerelease:
        description: Pre-release
        default: false
        type: boolean

permissions:
  contents: read

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

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

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

      - name: Set channel
        id: set_channel
        run: |
          CHANNEL="${{ github.repository == 'yt-dlp/yt-dlp' && 'stable' || github.repository }}"
          echo "channel=${{ inputs.channel || '$CHANNEL' }}" > "$GITHUB_OUTPUT"

      - name: Update version
        id: update_version
        run: |
          REVISION="${{ vars.PUSH_VERSION_COMMIT == '' && '$(date -u +"%H%M%S")' || '' }}"
          REVISION="${{ inputs.prerelease && '$(date -u +"%H%M%S")' || '$REVISION' }}"
          python devscripts/update-version.py ${{ inputs.version || '$REVISION' }} | \
            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
        if: ${{ !inputs.prerelease }}
        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

      - name: Get target commitish
        id: get_target
        run: |
          echo "head_sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"

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

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

  publish_pypi_homebrew:
    needs: [prepare, build]
    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 != '' && !inputs.prerelease
        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 != '' && !inputs.prerelease
        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 != '' && !inputs.prerelease
        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

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