# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

# Azure template for downloading pipeline step outputs and unpacking them.
#
# This template will download all artifacts from the upstream jobs listed in
# `downloadPartialBuildBinFrom` (which are expected to use
# upload-artifacts-template.yml) and unpack them.
#
# This template expects that a variable $BUILD_ROOT is set to a writeable
# directory; the results will be available in $BIN_DIR. See
# util/build_consts.sh for more information.

parameters:
  # Names of jobs to download a partial $BIN_DIR from.
  # List all "upstream" jobs here which produce files in $BIN_DIR which are
  # needed in the current job. In other words, list all jobs which need to be
  # executed and produce some build outputs before this job can start. The
  # current job will find all outputs from those upstream jobs in $BIN_DIR and
  # can use them.
  - name: downloadPartialBuildBinFrom
    type: object
    default: []

steps:
  - ${{ each job in parameters.downloadPartialBuildBinFrom }}:
    - task: DownloadPipelineArtifact@2
      inputs:
        buildType: current
        path: '$(BUILD_ROOT)/downloads/${{ job }}'
        artifact: "partial-build-bin-${{ job }}"
      displayName: Downloading partial build-bin directory from job ${{ job }}
  - bash: |
      set -e
      test -n "$BUILD_ROOT"
      . util/build_consts.sh

      test -f "$BUILD_ROOT/upstream_bin_dir_contents.txt" && {
        echo The download-artifacts-template.yml template can be called only once per job.
        exit 1
      }

      mkdir -p "$BIN_DIR"

      echo 'Extracting partial BIN_DIRs:'
      find "$BUILD_ROOT/downloads" \
        -name 'build-bin.tar' \
        -exec \
          tar -C "$BIN_DIR" \
          --strip-components=1 \
          -xvf {} \;

      # Remember all files which were present in the upstream $BIN_DIRs.
      find "$BIN_DIR" -type f -fprintf "$BUILD_ROOT/upstream_bin_dir_contents.txt" '%P\n'

      echo
      echo Upstream BIN_DIR contents:
      echo vvvvvvvvvvvvvvvvvv
      cat "$BUILD_ROOT/upstream_bin_dir_contents.txt"
      echo ^^^^^^^^^^^^^^^^^^
    displayName: Unpack upstream outputs
