#!/usr/bin/env bash

###################################################################################
# 更新代码脚本
# 只有退出码（exit code）为 0 ，表示脚本执行成功。
# @author: Zhang Peng
###################################################################################

# 检查脚本参数，如必要参数未传入，退出脚本。
checkInput() {
  if [ "${repository}" == "" ] || [ "${branch}" == "" ]; then
    echo "请输入脚本参数：repository branch [source] [target]"
    echo "    repository: git 仓储（必填）。"
    echo "    branch: git 分支（必填）。如 master/develop"
    echo "    source: 代码存放目录。默认为/home/zp/source。"
    echo "    target: 代码存放目录。默认为脚本所在目录。"
    exit 1
  fi
}

# 检查文件夹是否存在，不存在则创建
function createFolderIfNotExist() {
  if [ ! -d "$1" ];then
    mkdir -p "$1"
  fi
}

# 判断 git 版本库是否存在。根据实际结果修改 ${gitok} 值。
gitok=false
function isGitExist() {
  cd ${SOURCE_DIR}
  if [ -d "${SOURCE_DIR}/${repository}/${target}" ]; then
    cd ${SOURCE_DIR}/${repository}/${target}
    #(1)删除git状态零时文件
    if [ -f "gitstatus.tmp" ]; then
      rm -rf gitstatus.tmp
    fi

    #(2) 判断是否存在.git目录
    if [ -d "./.git" ]; then
      #(3) 判断git是否可用
      git status &> gitstatus.tmp
      grep -iwq 'not a git repository' gitstatus.tmp && gitok=false || gitok=true
    fi

    #返回到主目录
    cd ${SOURCE_DIR}
  fi
}

# 如果 git 版本库存在（根据 ${gitok} 值），执行 fetch 操作；反之，执行 clone 操作。
function doFetchOrClone() {
  if ${gitok}; then
    cd ${SOURCE_DIR}/${repository}/${target}
    git reset --hard
    git clean -ffdx
    git fetch
    echo "git fetch ${repository} remote repository 到本地成功"
  else
    #删除所有内容,便于重新进行git clone
    rm -rf ${repository}
    git clone --no-checkout git@github.com:${GITHUB_ACCOUNT}/${repository}.git ${SOURCE_DIR}/${repository}/${target}
    echo "git clone ${repository} remote repository 到本地成功"
    cd ${SOURCE_DIR}/${repository}/${target}
  fi
}

# 切换到 ${branch} 分支
function doCheckout() {
  echo "检出 ${repository} ${branch} 分支代码"
  isRemoteBranch=false
  gitRemoteBranch=`git branch -r`
  echo -e "$gitRemoteBranch" | grep -iwq ${branch} && isRemoteBranch=true || isRemoteBranch=false
  if ${isRemoteBranch}; then
    echo "找到 ${branch} 分支。"
    git checkout -f 'origin/'${branch}
  else
    echo "未找到 ${branch} 分支！"
    exit 2
  fi
  echo "更新子模块代码"
  git submodule update --init --recursive --force
}

######################################## MAIN ########################################
export LANG="zh_CN.UTF-8"

# 0. 检查传入的参数
repository=`echo $1`
branch=`echo $2`
source=`echo $3`
target=`echo $4`
checkInput

# 设置全局常量
GITHUB_ACCOUNT=dunwu
SOURCE_DIR=/home/xyz/source
if [ "${source}" != "" ]; then
  SOURCE_DIR=${source}
fi
createFolderIfNotExist ${SOURCE_DIR}

# 1. 判断本地是否已存在 Git 仓库
isGitExist

# 2. 如果本地已有代码，执行 fetch；反之，从远程 clone
doFetchOrClone

# 3. 切换到指定分支
doCheckout

# 4. 分配权限
chmod -R 777 ${SOURCE_DIR}

exit 0
