# This action looks at the commit history since the last release, and uses
# this to decide which submodules require an update:
on:
  push:
    branches:
      - master
name: release-please-submodule
jobs:
  # This logic looks at commits that have occurred since GitHub's magic
  # latestRelease:
  # https://developer.github.com/v3/repos/releases/#get-the-latest-release
  # TODO: it would be better if we retrieved a list of all prior releases,
  # and found the oldest release within the SUB_MODULES array. We need this
  # logic for other libraries as well, and would like to pull this logic
  # into its own action.
  changeFinder:
    runs-on: ubuntu-latest
    outputs:
      submodules: ${{ steps.interrogate.outputs.submodules }}
    steps:
      - uses: actions/checkout@v2
      - id: interrogate
        uses: actions/github-script@v4
        with:
            github-token: ${{secrets.GITHUB_TOKEN}}
            script: |
              const {execSync} = require('child_process');
              const SUB_MODULES = [
                'bigtable',
                'bigquery',
                'datastore',
                'firestore',
                'logging',
                'pubsub',
                'pubsublite',
                'spanner',
                'storage',
              ];
              const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');
              const latestRelease = await github.repos.getLatestRelease({
                owner,
                repo
              });
              console.info(`latest release: ${latestRelease.data.tag_name}`);
              // pull all tags, so we can get diff between HEAD and last release:
              execSync('git pull --tags');
              execSync(`git reset --hard ${latestRelease.data.tag_name}`);
              const status = execSync(`git diff --name-only origin/master`, { encoding: 'utf-8'});
              console.info(status);
              const changes = status.split('\n');
              const submodules = new Set();
              for (const change of changes) {
                const library = change.split('/')[0];
                console.info(`update to path ${library}`);
                if (SUB_MODULES.includes(library)) {
                  submodules.add(library);
                }
              }
              console.log(`::set-output name=submodules::${JSON.stringify(Array.from(submodules))}`);
  release-pr: # Create the release PR based on commit history:
    runs-on: ubuntu-latest
    needs: changeFinder
    strategy:
      fail-fast: false
      matrix:
        package: ${{fromJson(needs.changeFinder.outputs.submodules)}}
    steps:
      - uses: GoogleCloudPlatform/release-please-action@v2
        id: release-please
        with:
           path: ${{ matrix.package }}
           token: ${{ secrets.FORKING_TOKEN }}
           fork: true
           release-type: go-yoshi
           bump-minor-pre-major: true
           package-name: ${{ matrix.package }}
           monorepo-tags: true
           command: release-pr
      - uses: actions/github-script@v4
        id: label # Adds the "autorelease: pending" label.
        if: ${{steps.release-please.outputs.pr}}
        with:
            github-token: ${{secrets.GITHUB_TOKEN}}
            script: |
              const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');
              const latestRelease = await github.issues.addLabels({
                owner,
                repo,
                issue_number: ${{steps.release-please.outputs.pr}},
                labels: ['autorelease: pending']
              });
              console.log(`Tagged ${{steps.release-please.outputs.pr}}`)
  release-please-release: # Actually create a release tag.
    runs-on: ubuntu-latest
    needs: changeFinder
    strategy:
      fail-fast: false
      matrix:
        package: ${{fromJson(needs.changeFinder.outputs.submodules)}}
    steps:
      - uses: GoogleCloudPlatform/release-please-action@v2
        id: tag-release
        with:
          path: ${{ matrix.package }}
          changelog-path: CHANGES.md
          token: ${{ secrets.GITHUB_TOKEN }}
          release-type: go-yoshi
          monorepo-tags: true
          package-name: ${{ matrix.package }}
          command: github-release
      # Add the "autorelease: published" and remove tagged, this allows
      # monitoring to be enabled that detects failed releases:
      - uses: actions/github-script@v4
        id: untag-release
        if: ${{steps.tag-release.outputs.pr}}
        with:
          github-token: ${{secrets.GITHUB_TOKEN}}
          script: |
            const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');
            await github.issues.addLabels({
              owner,
              repo,
              issue_number: ${{steps.tag-release.outputs.pr}},
              labels: ['autorelease: published']
            });
            github.issues.removeLabel({
              owner,
              repo,
              issue_number: ${{steps.tag-release.outputs.pr}},
              name: 'autorelease: tagged',
            });
            console.log(`Tagged ${{steps.tag-release.outputs.pr}}`)
