#!/bin/bash
# Скрипт, выполняющий hg transplant из текущей ветки для указанной
# в параметре ветки. Директория .hg (а в случае, если .hg - симлинк, то
# та директория, на которую указывает .hg) копируется во временную
# директорию, после чего выполняется hg up -C для указанной в параметре
# ветки и выполняется hg transplant -b из текущей ветки.

CURR_BRANCH=`hg branch`
RECV_BRANCH=$1

# если принимающая ветвь не указана
[ "$RECV_BRANCH" == "" ] && echo "Usage: $0 branch" && exit -1

# переходим в каталог, содержащий .hg
while [[ ! -d .hg && 'pwd' != / ]]; do cd .. ; done

REPO=`pwd`/.hg

# если .hg - это симлинк
[ -L .hg  ] && REPO=`pwd`/`readlink .hg`

# временная директория
TMPDIR=/tmp/hg_transplant-$RANDOM$RANDOM

# создаём $TMPDIR
mkdir "$TMPDIR"
if [ "$?" != "0" ]; then
	echo "Не удалось создать временную директорию"
	rm -rf "$TMPDIR"
	exit -1
else
	# запрещаем доступ всем посторонним
	chmod 700 "$TMPDIR"
fi

# копируем $REPO в $TMPDIR
cp -rf "$REPO" "$TMPDIR"
if [ "$?" != "0" ]; then
	echo "Не удалось скопировать репозиторий во временную директорию"
	rm -rf "$TMPDIR"
	exit -1
fi

# переходим во временную директорию
cd "$TMPDIR"
hg up -C $RECV_BRANCH

# выполняем transplant
mergetool=`grep ^merge ~/.hgrc | cut -d= -f2 | head -n1 | sed s~[\ \t]~~g`
transp_failed_file=`hg transplant -b $CURR_BRANCH 2>&1 1>&3 | grep hunks\ FAILED | sed "s~^.*hunks FAILED -- saving rejects to file ~~"`
while [ "$transp_failed_file" != "" ]; do
	$mergetool "$transp_failed_file" `echo "$transp_failed_file" | sed "s~\.rej$~~"`
	transp_failed_file=`hg transplant --continue 2>&1 1>&3 | grep hunks\ FAILED | sed "s~^.*hunks FAILED -- saving rejects to file ~~"`
done
hg ci -m "права на вновь добавленные файлы"
hg_automerge.sh && hg push

if [ "$?" == 0 ]; then
	echo "Все операции завершились успешно! :-)"
	rm -rf "$TMPDIR"
	exit 0
else
	echo "Одна из операций потерпела неудачу :-("
	rm -rf "$TMPDIR"
	exit -1
fi