#!/bin/bash

# ============LICENSE_START=======================================================
#  Copyright (C) 2020 The Nordix Foundation. All rights reserved.
# ================================================================================
# Licensed 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.
#
# SPDX-License-Identifier: Apache-2.0
# ============LICENSE_END=========================================================

#
# This script will take the single commit form the given Nordix Gerrit review
# and push it, and all its ancestor commit till $GERRIT_BRANCH, to FDio Gerrit.
# Pre-requisites for script to run successfully:
# - The Gerrit username in Nordix needs to match with the Gerrit
#   username in FDio Gerrit
# - infra public key on build server needs to be added to your users SSH
#   Public Keys in FDio Gerrit
#
set -euxo pipefail

cd "$WORKSPACE"

fdio_gerrit_base='gerrit.fd.io:29418'
nordix_gerrit_rest='https://gerrit.nordix.org'

echo >&2 "Collecting information about what and how to push towards Fast Data Project (FDio)"

# The git hash of the commit in the review this job runs on
commit_hash="$GERRIT_PATCHSET_REVISION"

# GERRIT_PROJECT is in the form of fdio/<opendev-project>
fdio_project=$(echo "$GERRIT_PROJECT" | cut -d/ -f2- )

# Nordix Gerrit can map the email address of the user pushed the change to
# the review to the Gerrit username of the account in Nordix Gerrit. This
# should match with the Gerrit username in the FDio Gerrit.
username=$(
    curl -s -H 'Accept: application/json' \
        "$nordix_gerrit_rest/accounts/?q=email:$GERRIT_EVENT_ACCOUNT_EMAIL&o=DETAILS" \
    | tee /dev/stderr | tail -1 | jq -r '.[0].username')

fdio_remote_url="ssh://$username@$fdio_gerrit_base/$fdio_project"

# GERRIT_BRANCH is the _intended_ branch of the commit under review
# E.g. git push HEAD:refs/for/master => GERRIT_BRANCH='master'
# GERRIT_TOPIC is the rest of the refspec after GERRIT_BRANCH when the topic
# is set for the change.
if [ -z "${GERRIT_TOPIC:-}" ] ; then
    refspec="${commit_hash}:refs/for/${GERRIT_BRANCH}"
else
    refspec="${commit_hash}:refs/for/${GERRIT_BRANCH}%topic=${GERRIT_TOPIC}"
fi

echo >&2 "Pushing to FDio Gerrit"

# do not fail if git push fails as in case of no new changes we want to succeed. See below.
set +o pipefail

git push "$fdio_remote_url" "$refspec" 2>&1 | tee push_result.txt
push_result=${PIPESTATUS[0]}

# make the job a success if the above git push fails due to no new changes are needed
# to be created upstream. This will be useful when we switch to automatic triggering
# of the push-upstream for each patch set and jobs on different commits in a same chain
# will race with each other to push parts of the chain
if [ $push_result -ne 0 ]; then
    grep '(no new changes)' push_result.txt
fi
