#
# Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

name: 'Get JTReg'
description: 'Download JTReg from cache or source location'
outputs:
  path:
    description: 'Path to the installed JTReg'
    value: ${{ steps.path-name.outputs.path }}

runs:
  using: composite
  steps:
    - name: 'Get JTReg version configuration'
      id: version
      uses: ./.github/actions/config
      with:
        var: JTREG_VERSION

    - name: 'Check cache for JTReg'
      id: get-cached-jtreg
      uses: actions/cache@v4
      with:
        path: jtreg/installed
        key: jtreg-${{ steps.version.outputs.value }}

    - name: 'Checkout the JTReg source'
      uses: actions/checkout@v4
      with:
        repository: openjdk/jtreg
        ref: jtreg-${{ steps.version.outputs.value }}
        path: jtreg/src
      if: steps.get-cached-jtreg.outputs.cache-hit != 'true'

    - name: 'Build JTReg'
      run: |
        # If runner architecture is x64 set JAVA_HOME_17_X64 otherwise set to JAVA_HOME_17_arm64
        if [[ '${{ runner.arch }}' == 'X64' ]]; then
          JDK="$JAVA_HOME_17_X64"
        else
          JDK="$JAVA_HOME_17_arm64"
        fi
        # Build JTReg and move files to the proper locations
        bash make/build.sh --jdk "$JDK"
        mkdir ../installed
        mv build/images/jtreg/* ../installed
      working-directory: jtreg/src
      shell: bash
      if: steps.get-cached-jtreg.outputs.cache-hit != 'true'

    - name: 'Export path to where JTReg is installed'
      id: path-name
      run: |
        # Export the path
        echo 'path=jtreg/installed' >> $GITHUB_OUTPUT
      shell: bash
