#!/usr/bin/env bash PROGRAM=$0 PRIMARY_BRANCH="" SECONDARY_BRANCH="" FF="--ff" CONTINUE="no" 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 [[ $# -gt 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) SECONDARY_BRANCH=${TARGET_BRANCH%"-rebased-on-top-of-"*} PRIMARY_BRANCH=${TARGET_BRANCH#*"-rebased-on-top-of-"} if [[ "${SECONDARY_BRANCH}-rebased-on-top-of-${PRIMARY_BRANCH}" != $TARGET_BRANCH ]]; then echo "Couldn't continue rebasing on ${TARGET_BRANCH}" exit 30 # Impossible to detect PRIMARY_BRANCH AND SECONDARY_BRANCH fi 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 if git merge "${SECONDARY_BRANCH}" ${FF} \ -m "Psycho-rebased branch ${SECONDARY_BRANCH} on top of ${PRIMARY_BRANCH}"; 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