#!/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