name: 'test_artifacts'
description: "Upload failed test artifacts"
runs:
  using: "composite"
  steps:
    - name: Collect matrix properties for naming
      uses: actions/github-script@v8
      id: matrix-props
      env:
        MATRIX_PROPS: ${{ toJSON(matrix) }}
      with:
        # An array-flattening-to-string JavaScript function.
        script: |
          const f = function (x) { return x.toString().length > 0; }
          const g = function (x) {
            return (Array.isArray(x))
              ? x.filter(f)
                .map((function (h) { return function (y) { return h(y); }; })(g))
                .join('-')
              : x;
          }
          return Object.values(JSON.parse(process.env.MATRIX_PROPS))
            .filter(f)
            .map(g)
            .join('-');
        # By default, the JSON-encoded return value of the function is
        # set as the "result".
        result-encoding: string
    - name: Upload failed tests
      uses: actions/upload-artifact@v4
      with:
        # Name of the artifact to upload.
        name: ${{ format('GH-{0}-{1}-{2}-{3}-{4}-failed-tests',
          github.run_id,
          github.run_attempt,
          github.job,
          strategy.job-index,
          steps.matrix-props.outputs.result) }}

        # A file, directory or wildcard pattern that describes what
        # to upload.
        path: |
         ${{ github.workspace }}/runtime/indent/testdir/*.fail
         ${{ github.workspace }}/runtime/syntax/testdir/failed/*
         ${{ github.workspace }}/src/testdir/failed/*
        # The desired behavior if no files are found using the
        # provided path.
        if-no-files-found: ignore

        # Duration after which artifact will expire in days. 0 means
        # using repository settings.
        retention-days: 0

        # If true, an artifact with a matching name will be deleted
        overwrite: true
