#! /bin/bash

# usage:	create <PROJECT> - create a git bare repository named PROJECT.git
#		this command will setup the repo and send a mail for confirmation.

GITDIR="/var/git"
MULTIMAIL="/usr/doc/git-2.14.5/contrib/hooks/multimail/git_multimail.py"
GITUSER="git"
GITGRP="git"
VENVSDIR="/usr/local/venvs"
USEVENV=false

function is_bare() {
	repodir=$1
	if "$(git --git-dir="$repodir" rev-parse --is-bare-repository)" = true
	then
		true
	else
		false
	fi
}

function git_init() {
	PROJECT=$1
	echo "creating project \"${PROJECT}.git\""
	read -p "Describe your project in one line: " DESCRIPTION
	if [ ! -d ${GITDIR}/${PROJECT}.git ]; then
		mkdir ${GITDIR}/${PROJECT}.git
	fi
	cd ${GITDIR}/${PROJECT}.git
	git init --bare
	echo "Remember to insert a README.md file to explain what your project is about."
	mkdir custom-hooks
	ln -s $MULTIMAIL custom-hooks/git_multimail.py
	touch hooks/post-receive
	cat > hooks/post-receive <<EOPR
#!/bin/sh
/usr/bin/pee ${GITDIR}/${PROJECT}.git/custom-hooks/deploy.sh \
	${GITDIR}/${PROJECT}.git/custom-hooks/pip_install \
	${GITDIR}/${PROJECT}.git/custom-hooks/git_multimail.py

EOPR
	if [ $USEVENV == true ]; then
		cat > custom-hooks/pip_install << EOPIP
#!/bin/sh
while read oldrev newrev refname; do
	if [[ \$refname =~ .*/master$ ]]; then
		# definitely updating master;
		CHECKFILE=\$(git ls-tree --full-tree -r HEAD |grep requirements.txt |awk '{print \$3}')
		TMPREQ=\$(git cat-file -p \$CHECKFILE > /tmp/${PROJECT}-req.txt)
		if [ \$CHECKFILE ]; then
			${VENVSDIR}/${PROJECT}/bin/pip install -r /tmp/${PROJECT}-req.txt
		fi
		if git diff-tree --name-only -r -z \$oldrev \$newrev \$CHECKFILE; then
			${VENVSDIR}/${PROJECT}/bin/pip install -r /tmp/${PROJECT}-req.txt
		fi
	fi
done
EOPIP
	fi
	cat >> config <<EOT

[multimailhook]
	mailer = "sendmail"
	refchangeShowGraph = true
	mailingList = "danixland@gmail.com"
	commitEmailFormat = "html"
	htmlInIntro = true
	htmlInFooter = true
	from = "danix@danix.xyz"
	administrator = "danix@danix.xyz"
	quiet = true
	logFile = "/var/log/multimail.log"
	errorLogFile = "/var/log/multimail_err.log"
EOT
	touch custom-hooks/deploy.sh
	cat > custom-hooks/deploy.sh <<EODP
#!/bin/bash
# Directory where to deploy files from repository
DPTARGET=""
# Directory containing repository
DPGIT_DIR="${GITDIR}/${PROJECT}.git"
# Branch that is going to be deployed to server
DPBRANCH="master"

while read oldrev newrev ref
do
	# if DPTARGET is empty we don't want deploy for this project
	if [[ ! "" == \$DPTARGET ]]; then
		# let's check that we are deploying to the correct branch
		if [[ \$ref = refs/heads/\${DPBRANCH} ]]; then
			echo "Ref \$ref received. Deploying \${DPBRANCH} branch to production..."
			git --work-tree=\$DPTARGET --git-dir=\$DPGIT_DIR checkout -f \$DPBRANCH
			NOW=\$(date +"%d%m%Y-%H%M")
			git tag release_\$NOW \$DPBRANCH
			echo "   /==============================="
			echo "   | DEPLOYMENT COMPLETED"
			echo "   | Target branch: \$DPTARGET"
			echo "   | Target folder: \$DPGIT_DIR"
			echo "   | Tag name     : release_\$NOW"
			echo "   \=============================="
		else
			echo "Ref \$ref received. Doing nothing: only the \${DPBRANCH} branch may be deployed on this server."
		fi
	else
		echo "Target directory not declared. Skipping deploy to server."
	fi
done

EODP
	chmod 0755 hooks/post-receive custom-hooks/deploy.sh
	echo $DESCRIPTION > description
	cd ${GITDIR}/
	chown -R ${GITUSER}:${GITGRP} ${GITDIR}/${PROJECT}.git
	echo "All done, you can now work on \"${PROJECT}.git\""
	exit 0
}

if [ ! -z $1 ]; then
	if [ "python" == $1 ]; then
		USEVENV=true
		# this is a python project. Let's create a virtualenv
		if [ ! -z $2 ]; then
			PROJECT=$2
		else
			read -p 'Python project name: ' PROJECT
		fi
		virtualenv ${VENVSDIR}/${PROJECT}
		echo "virtual environment created inside ${VENVSDIR}/${PROJECT}"
	else
		PROJECT=$1
	fi
else
	read -p 'Project name: ' PROJECT
fi

if [ ! -d ${GITDIR}/${PROJECT}.git ]; then
	git_init $PROJECT
else
	echo "Project directory ${PROJECT}.git already exists."
	if [ $(ls -A ${GITDIR}/${PROJECT}.git) ]; then
		if is_bare ${GITDIR}/${PROJECT}.git
		then
			echo "looks like \"${PROJECT}.git\" is an existing git project directory, choose another name."
			exit 171
		else
			echo "\"${PROJECT}.git\" is not empty, I can't create a Git Project in it. Choose another name."
			exit 172
		fi
	else
		echo "\"${PROJECT}.git\" is an empty directory. Do you want to initialize a Git Project here? [y/N]"
		read answer
		case $answer in
			Y|y)
				git_init $PROJECT	
				;;
			N|n)
				echo "Aborting due to user request."
				exit 173
				;;
			*)
				# we assume no as default answer.
				echo "you said \"$answer\" which I don't understand, so to me is no. Aborting."
				exit 177
				;;
		esac
	fi
fi


