Dotfiles/site-modules/core/files/bin/git-merge-patch
Ade Attwood a94a9d6dc2 feat(bin): support merge-patch --skip
When hitting a conflict with no changes you can `--skip` just like you would if
you where rebaseing and running `rebase --skip`
2022-02-15 20:31:59 +00:00

116 lines
2.8 KiB
Bash
Executable file

#!/usr/bin/env bash
#
# Merges a remote branch into your current branch forcing a fast
# forward merge by rebasing first. This uses the rebase style of
# `--continue` and `--abort` when you have started to pick up where
# you left off
#
# Author: Ade Attwood <code@adeattwood.co.uk>
# Created: 2021-05-16
#
set -e
MERGE_BRANCH="$1";
#
# The merge branch argument is required
#
if [[ -z "$1" ]]; then
cat << HELP
Git Merge Patch
git merge-patch my-remote-branch
HELP
exit 1;
fi
#
# Test for merge conflicts can abort if any are found. Theses need to be
# resolved before you can continue
#
if [[ ! -z "$(git diff --name-only --diff-filter=U)" ]]; then
echo "ERROR: Conflicts found, you need to resolve them before you continue your"
echo "merge-patch. Use 'git am --show-current-patch' to see the failed patch. Then you"
echo "can continue the merge-patch with 'git merge-patch --continue'"
exit 1
fi
if [[ "$MERGE_BRANCH" == "--abort" ]] || [[ "$MERGE_BRANCH" == "--skip" ]]; then
#
# If we are in a rebase state then we want to abort that to
#
if [[ -f "$(git rev-parse --show-toplevel)/.git/REBASE_HEAD" ]]; then
git rebase $MERGE_BRANCH
fi
if [[ -f "$(git rev-parse --show-toplevel)/.git/MERGE_PATCH" ]]; then
rm "$(git rev-parse --show-toplevel)/.git/MERGE_PATCH"
fi
exit 0
fi
if [[ "$MERGE_BRANCH" != "--continue" ]]; then
branch=$(git rev-parse --abbrev-ref HEAD);
echo "$branch" > "$(git rev-parse --show-toplevel)/.git/MERGE_PATCH"
#
# Fetch from remove so every ting is upto date
#
git fetch
#
# Check out the merge branch from the origin
#
git checkout -b "$MERGE_BRANCH" "origin/$MERGE_BRANCH"
#
# Ensure the target branch is up to date
#
git checkout $branch
git pull origin $branch
git checkout $MERGE_BRANCH
#
# Rebase onto branch so we don't create a merge commit
#
git rebase $branch;
else
if [[ ! -f "$(git rev-parse --show-toplevel)/.git/MERGE_PATCH" ]]; then
echo "ERROR: Merge patch has not been started"
exit 1;
fi
#
# If we are still in the rebase from above then we need to
# continue with that before we finish merging the patch
#
if [[ -f "$(git rev-parse --show-toplevel)/.git/REBASE_HEAD" ]]; then
git rebase --continue
fi
MERGE_BRANCH=$(git rev-parse --abbrev-ref HEAD)
branch="$(cat $(git rev-parse --show-toplevel)/.git/MERGE_PATCH)"
fi
#
# Force push the rebased branch to the remove so Gitlab
# recognises the hash has been merged
#
git push origin "$MERGE_BRANCH" -f -o ci.skip
#
# Merge into the target branch ensuring its a fast forward merge
#
git checkout $branch
git merge --ff-only --log $MERGE_BRANCH;
#
# Clean up the MERGE_PATCH file now we have completed the merge
#
if [[ -f "$(git rev-parse --show-toplevel)/.git/MERGE_PATCH" ]]; then
rm "$(git rev-parse --show-toplevel)/.git/MERGE_PATCH"
fi