#!/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 "://" # 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 "/$username/.git" # gitlab.pushurl = GitLab push URL with "$username" placeholder, # if not "git@:$username/.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