name: Sync channels
on:
  schedule:
    # The nightly channel is usually updated at 01:00:00 UTC.
    - cron: '0 2 * * *' # *-*-* 02:00:00 UTC

    # The stable channel is usually updated before 17:00:00 UTC on Thursday.
    # It seems there are some stable users eagerly want to use the latest stable and
    # cannot afford a lengthy 24hrs delay. So poll once every hour here. ¯\_(ツ)_/¯
    # See: https://github.com/oxalica/rust-overlay/pull/166
    - cron: '0 14-20 * * THU' # Thu *-*-* 14..19:00:00 UTC

  workflow_dispatch:

permissions:
  contents: write

jobs:
  sync-channels:
    name: Sync channels and prefetch toolchains
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v5
      with:
        persist-credentials: false
        ref: master

    - name: Install Nix
      uses: cachix/install-nix-action@v31
      with:
        nix_path: nixpkgs=channel:nixpkgs-unstable

    # Workaround for https://github.com/oxalica/rust-overlay/issues/54
    - name: Don't let ~/.cargo/bin mess things up
      run: rm -rf ~/.cargo/bin

    - name: Sync stable channel
      timeout-minutes: 5
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: ./scripts/fetch.py stable

    - name: Sync beta channel
      if: github.event.schedule != '0 14-20 * * THU'
      timeout-minutes: 5
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: ./scripts/fetch.py beta

    - name: Sync nightly channel
      if: github.event.schedule != '0 14-20 * * THU'
      timeout-minutes: 5
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: ./scripts/fetch.py nightly

    - name: Check and commit changes
      id: commit
      continue-on-error: true
      run: |
        git config --local user.email "action@github.com"
        git config --local user.name "GitHub Action"
        git add manifests
        git commit -m "manifest: update"

    - name: Validate nix files changed
      if: steps.commit.outcome == 'success'
      run: |
        files=( $(git diff --name-only HEAD HEAD^ '*.nix') )
        echo "${#files[*]} nix files changed: ${files[*]}"
        if [[ "${#files[*]}" -ne 0 ]]; then
          nix-instantiate --parse "${files[@]}" >/dev/null
        fi

    - name: Test stable Rust
      if: steps.commit.outcome == 'success'
      run: |
        cd examples/hello-world
        set -o pipefail
        nix-shell --pure --command "make run" | tee out
        [[ "$(< out)" == *"Hello, world!"* ]]

    - name: Push changes
      if: steps.commit.outcome == 'success'
      uses: ad-m/github-push-action@master
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        branch: master
