# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

# Based on Apache Arrow's sync-nightlies action
# https://github.com/apache/arrow/blob/master/.github/actions/sync-nightlies/action.yml
name: 'Sync Nightlies'
description: 'Sync files to and from nightlies.apache.org'
inputs:
  upload:
    description: 'Sync from local to remote'
    default: false
    required: false
  switches:
    description: 'see rsync --help'
    required: true
  local_path:
    description: 'The relative local path within $GITHUB_WORKSPACE'
    required: true
  remote_path:
    description: 'The remote path incl. sub dirs e.g. {{secrets.path}}/arrow/r'
    required: true
  remote_host:
    description: 'The remote host'
    required: true
  remote_port:
    description: 'The remote port'
    required: false
    default: 22
  remote_user:
    description: 'The remote user'
    required: true
  remote_key:
    description: 'The remote key'
    required: true

runs:
  using: "composite"
  steps:
    - name: Sync files
      shell: bash
      env:
        SWITCHES: "${{ inputs.switches }}"
        LOCAL_PATH: "${{ github.workspace }}/${{ inputs.local_path }}"

        SSH_KEY: "${{ inputs.remote_key }}"
        PORT: "${{ inputs.remote_port }}"
        USER: "${{ inputs.remote_user }}"
        HOST: "${{ inputs.remote_host }}"
        REMOTE_PATH: "${{ inputs.remote_path }}"
      run: |
        # Make SSH key available and add remote to known hosts
        eval "$(ssh-agent)" > /dev/null
        echo "$SSH_KEY" | tr -d '\r' | ssh-add - >/dev/null
        mkdir -p .ssh
        chmod go-rwx .ssh
        echo "$HOST_KEY" >> .ssh/known_hosts
        # strict errors
        set -eu
        # We have to use a custom RSH to supply the port
        RSH="ssh -o StrictHostKeyChecking=no -p $PORT"
        DSN="$USER@$HOST"
        # It is important to append '/' to the source path otherwise
        # the entire source dir will be created as a sub dir in the destination
        if [ "${{ inputs.upload }}" = true ]
        then
          SOURCE=$LOCAL_PATH/
          DEST=$DSN:$REMOTE_PATH
        else
          SOURCE=$DSN:$REMOTE_PATH/
          DEST=$LOCAL_PATH
        fi
        rsync $SWITCHES --rsh="$RSH" $SOURCE $DEST
