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

# Azure template for archiving pipeline step outputs and uploading them.
#
# This template will archive all of $BIN_DIR, and upload it for use by
# downstream jobs using download-artifacts-template.yml.
#
# This template expects that a variable $BUILD_ROOT is set. See
# util/build_consts.sh for more information.


parameters:
  # Rsync-style file patterns to include in the partial BIN_DIR output.
  - name: includePatterns
    type: object
    default: []

steps:
  - bash: |
      set -e
      test -n "$BUILD_ROOT"
      . util/build_consts.sh

      # Write all include patterns to a file used by rsync.
      echo "${{ join('\n', parameters.includePatterns) }}" > "$BUILD_ROOT/include_patterns.txt"

      echo
      echo Files matching these patterns will be included in the binary build artifact for this job:
      echo vvvvvvvvvvvvvvvvvv
      cat "$BUILD_ROOT/include_patterns.txt"
      echo ^^^^^^^^^^^^^^^^^^

      # The file upstream_bin_dir_contents.txt lists all files which were part
      # of an "upstream" BIN_DIR which got downloaded at the beginning of this
      # job. Ensure that this file exists, even if no upstream BIN_DIR was
      # downloaded.
      touch "$BUILD_ROOT/upstream_bin_dir_contents.txt"

      BIN_DIR_FULL="${BIN_DIR}.full"
      mv "$BIN_DIR" "$BIN_DIR_FULL"
      mkdir -p "$BIN_DIR"

      echo
      echo Copying files into the output archive:
      rsync \
        --archive \
        --verbose \
        --remove-source-files \
        --prune-empty-dirs \
        --exclude-from="$BUILD_ROOT/upstream_bin_dir_contents.txt" \
        --include="*/" \
        --include-from="$BUILD_ROOT/include_patterns.txt" \
        --exclude="*" \
        "${BIN_DIR_FULL}/" "${BIN_DIR}/"

      echo
      echo 'Files in $BIN_DIR not considered outputs of this job:'
      echo vvvvvvvvvvvvvvvvvv
      find "$BIN_DIR_FULL"
      echo ^^^^^^^^^^^^^^^^^^

      tar -C "$BUILD_ROOT" \
        -cvf "$BUILD_ROOT/build-bin.tar" \
        "${BIN_DIR#"$BUILD_ROOT/"}"
    displayName: Archive step outputs
  - publish: "$(Build.ArtifactStagingDirectory)/build-bin.tar"
    # The PhaseName is the string after the "job" key in the build description,
    # e.g. "job: my_phase_name".
    artifact: partial-build-bin-$(System.PhaseName)
    displayName: Upload step outputs
