#!/bin/bash
#
#  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.
#
#  Author: Martin Stockhammer <martin_s@apache.org>
#  Date:   2018-11-03
#
# This script runs a sparse git clone of a remote repository and
# initializes the git configuration.
#
# It is mainly used for site content creation, because the main archiva-web-content repository
# is rather large and we don't want to checkout the complete data.
#

SITE_DIR="site-content"
GIT_REMOTE=""

GIT_USER=$(git config user.name)
GIT_EMAIL=$(git config user.email)

GIT_PATTERN_FILE="git-sparse-checkout-pattern"
GIT_PATTERN_DEST=".git/info/sparse-checkout"

MY_PWD=$(pwd)

CLONE=1
FORCE=1
MODULE_DIR="${MY_PWD}"
PATTERN=""
BRANCH="master"
while [ ! -z "$1" ]; do
  case "$1" in
    -f) 
      FORCE=0
      shift
      ;;
    -d)
      shift
      SITE_DIR="$1"
      shift
      ;;
    -p)
      shift
      if [ -z "${PATTERN}" ]; then
        PATTERN="${1}"
      else
        PATTERN="${PATTERN}\n${1}"
      fi
      shift
      ;;
    -m)
      shift
      MODULE_DIR="$1"
      shift
      ;;
    -b)
      shift
      BRANCH="$1"
      shift
      ;;
    *)
      GIT_REMOTE="$1"
      shift
      ;; 
  esac
done

print_usage() {
  echo "checkoutRepo [-m MODULE_DIR] [-d SITE_DIR]  [-f] GIT_URL"
  echo " -m: The module directory where the pattern file can be found and the site dir will be created."
  echo " -d SITE_DIR: Use the given directory for checkout"
  echo " -f: Force clone, even if directory exists"
}

if [ ! -f "${MODULE_DIR}/pom.xml" ]; then
  echo "Looks like the working directory is not a valid dir. No pom.xml found."
  exit 1
fi

cd "${MODULE_DIR}" || { echo "Could not change to module directory ${MODULE_DIR}"; exit 1; }

if [ -z "$GIT_REMOTE" ]; then
  print_usage
  exit 1
fi

if [ "${GIT_REMOTE:0:8}" == "scm:git:" ]; then
  GIT_REMOTE="${GIT_REMOTE:8}"
fi


if [ -d "${SITE_DIR}" ]; then
  if [ ! -d "${SITE_DIR}/.git" ]; then
    echo "Directory ${SITE_DIR} exist already, but is not a git clone. Aborting."
    exit 1
  elif [ "$FORCE" -eq 0 ]; then
    CLONE=0
  fi
else
  CLONE=0
fi

if [ $CLONE -eq 0 ]; then
  git clone "${GIT_REMOTE}" "${SITE_DIR}" --no-checkout
  if [ $? -ne 0 ]; then
    echo "Git clone failed"
    exit 1
  fi
fi

cd "${SITE_DIR}" || { echo "Could not change to site dir ${SITE_DIR}"; exit 1; }

git checkout "${BRANCH}"

git config core.sparsecheckout true
git config user.name "${GIT_USER}"
git config user.email "${GIT_EMAIL}"

if [ ! -z "${PATTERN}" ]; then
    echo -e "${PATTERN}" >"${GIT_PATTERN_DEST}"
elif [ -f "../${GIT_PATTERN_FILE}" ]; then
  cp "../${GIT_PATTERN_FILE}" "${GIT_PATTERN_DEST}"
fi

git checkout --

cd "${MY_PWD}"

