#!/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=""
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
      ;;
    *)
      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 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}"

