mirror of
https://github.com/tj/git-extras.git
synced 2026-09-10 07:26:17 -04:00
87 lines
2.2 KiB
Bash
Executable file
87 lines
2.2 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
PROGRAM=$0
|
|
PRIMARY_BRANCH=""
|
|
SECONDARY_BRANCH=""
|
|
FF="--ff"
|
|
CONTINUE="no"
|
|
|
|
function current_branch() {
|
|
git rev-parse --abbrev-ref HEAD
|
|
}
|
|
|
|
function usage()
|
|
{
|
|
echo "USAGE: ${PROGRAM} PRIMARY_BRANCH [SECONDARY_BRANCH] [--no-ff]"
|
|
echo "USAGE: ${PROGRAM} --continue"
|
|
echo ""
|
|
echo "OPTIONS:"
|
|
echo " --no-ff: Force rebase commit."
|
|
echo " -c|--continue: Continue after the user updates conflicts."
|
|
}
|
|
|
|
while [[ $# > 0 ]]
|
|
do
|
|
key="$1"
|
|
|
|
case $key in
|
|
--no-ff)
|
|
FF="--no-ff"
|
|
;;
|
|
-c|--continue)
|
|
CONTINUE=yes
|
|
;;
|
|
*)
|
|
if [[ "$PRIMARY_BRANCH" == "" ]]; then
|
|
PRIMARY_BRANCH=$key
|
|
elif [[ "$SECONDARY_BRANCH" == "" ]]; then
|
|
SECONDARY_BRANCH=$key
|
|
else
|
|
usage
|
|
exit 20 # Error during arguments parsing
|
|
fi
|
|
;;
|
|
esac
|
|
shift # past argument or value
|
|
done
|
|
|
|
if [[ "$SECONDARY_BRANCH" == "" ]]; then
|
|
SECONDARY_BRANCH=$(current_branch)
|
|
fi
|
|
|
|
if [[ "$CONTINUE" == "yes" ]]; then
|
|
TARGET_BRANCH=$(current_branch)
|
|
set $(echo "$TARGET_BRANCH" | sed -e "s/-rebased-on-top-of-/\n/g")
|
|
if [[ $# != 2 ]]; then
|
|
echo "Couldn't continue rebasing on ${TARGET_BRANCH}"
|
|
exit 30 # Impossible to detect PRIMARY_BRANCH AND SECONDARY_BRANCH
|
|
fi
|
|
|
|
SECONDARY_BRANCH=$1
|
|
PRIMARY_BRANCH=$2
|
|
|
|
echo "Continuing rebasing of $SECONDARY_BRANCH on top of $PRIMARY_BRANCH"
|
|
git commit || exit 51
|
|
git branch -d ${SECONDARY_BRANCH} || exit 52
|
|
git branch -m ${TARGET_BRANCH} ${SECONDARY_BRANCH} || exit 53
|
|
|
|
elif [[ "$PRIMARY_BRANCH" == "" ]]; then
|
|
usage
|
|
exit 10 # Missing arguments PRIMARY_BRANCH
|
|
else
|
|
echo "Rebasing $SECONDARY_BRANCH on top of $PRIMARY_BRANCH"
|
|
TARGET_BRANCH="${SECONDARY_BRANCH}-rebased-on-top-of-${PRIMARY_BRANCH}"
|
|
|
|
git checkout ${PRIMARY_BRANCH} || exit 41
|
|
git checkout -b ${TARGET_BRANCH} || exit 42
|
|
git merge ${SECONDARY_BRANCH} ${FF} \
|
|
-m "Psycho-rebased branch ${SECONDARY_BRANCH} on top of ${PRIMARY_BRANCH}"
|
|
|
|
if [[ $? == 0 ]]; then
|
|
git branch -d ${SECONDARY_BRANCH} || exit 43
|
|
git branch -m ${TARGET_BRANCH} ${SECONDARY_BRANCH} || exit 44
|
|
else
|
|
echo "Resolve the conflict and run ``${PROGRAM} --continue``."
|
|
exit 1
|
|
fi
|
|
fi
|