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