#!/usr/bin/env bash
#=============================================================================
# Copyright 2010-2015 Kitware, Inc.
#
# 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.
#=============================================================================

# Run this script to set up the local Git repository to push to
# a personal fork for this project in GitLab.

# Project configuration instructions:
#
# - Run a GitLab server
#
# - Populate adjacent "config" file with:
#    gitlab.protocol = Top GitLab protocol, if not 'https'
#    gitlab.host = Top GitLab fully qualified host name
#    gitlab.site = Top GitLab URL, if not "<protocol>://<host>"
#    gitlab.group-name = Name of group containing project in GitLab
#    gitlab.group-path = Path of group containing project in GitLab
#    gitlab.project-name = Name of project within GitLab group
#    gitlab.project-path = Path of project within GitLab group
#    gitlab.url = GitLab push URL with "$username" placeholder,
#                 if not "<site>/$username/<project-path>.git"
#    gitlab.pushurl = GitLab push URL with "$username" placeholder,
#                     if not "git@<host>:$username/<project-path>.git"
#    gitlab.remote = GitLab remote name, if not "gitlab"

die() {
	echo 1>&2 "$@" ; exit 1
}

# Make sure we are inside the repository.
cd "${BASH_SOURCE%/*}" &&

# Load the project configuration.
protocol=$(git config -f config --get gitlab.protocol ||
	   echo "https") &&
host=$(git config -f config --get gitlab.host) &&
site=$(git config -f config --get gitlab.site ||
       echo "$protocol://$host") &&
group_path=$(git config -f config --get gitlab.group-path) &&
group_name=$(git config -f config --get gitlab.group-name) &&
project_name=$(git config -f config --get gitlab.project-name) &&
project_path=$(git config -f config --get gitlab.project-path) &&
pushurl_=$(git config -f config --get gitlab.pushurl ||
	   echo "git@$host:\$username/$project_path.git") &&
remote=$(git config -f config --get gitlab.remote ||
	 echo "gitlab") &&
fetchurl_=$(git config -f config --get gitlab.url ||
	    echo "$site/\$username/$project_path.git") ||
die 'This project is not configured to use GitLab.'

# Get current gitlab push URL.
pushurl=$(git config --get remote."$remote".pushurl ||
	  git config --get remote."$remote".url || echo '') &&

# Tell user about current configuration.
if test -n "$pushurl"; then
	echo 'Remote "'"$remote"'" is currently configured to push to

  '"$pushurl"'
' &&
	read -ep 'Reconfigure GitLab? [y/N]: ' ans &&
	if [ "$ans" == "y" ] || [ "$ans" == "Y" ]; then
		setup=1
	else
		setup=''
	fi
else
	echo 'Remote "'"$remote"'" is not yet configured.
' &&
	read -ep 'Configure GitLab to contribute to '"$project_name"'? [Y/n]: ' ans &&
	if [ "$ans" == "n" ] || [ "$ans" == "N" ]; then
		exit 0
	else
		setup=1
	fi
fi &&

setup_instructions='Add your SSH public keys at

  '"$site"'/profile/keys

Then visit the main repository at:

  '"$site/$group_path/$project_path"'

and use the Fork button in the upper right.
'

# Perform setup if necessary.
if test -n "$setup"; then
	echo 'Sign-in to GitLab to get/set your username at

  '"$site/profile/account"'

'"$setup_instructions" &&
	read -ep "GitLab username? [$USER]: " gu &&
	if test -z "$gu"; then
		gu="$USER"
	fi &&
	fetchurl="${fetchurl_/\$username/$gu}" &&
	if test -z "$pushurl"; then
		git remote add "$remote" "$fetchurl"
	else
		git config remote."$remote".url "$fetchurl"
	fi &&
	pushurl="${pushurl_/\$username/$gu}" &&
	git config remote."$remote".pushurl "$pushurl" &&
	echo 'Remote "'"$remote"'" is now configured to push to

  '"$pushurl"'
'
fi &&

# Optionally test GitLab access.
if test -n "$pushurl"; then
	read -ep 'Test access to GitLab (SSH)? [y/N]: ' ans &&
	if [ "$ans" == "y" ] || [ "$ans" == "Y" ]; then
		echo -n 'Testing GitLab access by SSH...'
		if git ls-remote --heads "$pushurl" >/dev/null; then
			echo 'passed.'
		else
			echo 'failed.' &&
			die 'Could not access your GitLab fork of this project.
'"$setup_instructions"
		fi
	fi
fi
