#!/bin/bash

# ============LICENSE_START=======================================================
#  Copyright (C) 2019 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 OpenDev
# Gerrit.
# Pre-requisites for script to run successfully:
# - The Gerrit username in Nordix needs to match with the Gerrit username in
#   OpenDev
# - infra public key on build server needs to be added to your users SSH
#   Public Keys in OpenDev Gerrit
#
set -euxo pipefail

cd "$WORKSPACE"

opendev_gerrit_base='review.opendev.org:29418'
nordix_gerrit_rest='https://gerrit.nordix.org'

echo >&2 "Collecting information about what and how to push towards OpenDev"

# 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 opendev/<opendev-project>
opendev_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 accound in Nordix Gerrit. This
# should match with the Gerrit username in the OpenDev 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')

opendev_remote_url="ssh://$username@$opendev_gerrit_base/$opendev_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/$GERRIT_TOPIC"
fi

echo >&2 "Pushing to OpenDev"

# 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 "$opendev_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
