63 lines
1.5 KiB
Bash
Executable File
63 lines
1.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
#
|
|
# Basic usage:
|
|
# ./git-merge-check origin/develop origin/release/v1.1.9
|
|
#
|
|
|
|
set -x
|
|
|
|
set -o nounset
|
|
set -o pipefail
|
|
|
|
# Start from branch ...
|
|
branch1=$1
|
|
|
|
# ... and try to merge in
|
|
branch2=$2
|
|
|
|
echo "Checking if $branch2 merges without conflicts into $branch1..."
|
|
|
|
git checkout -q $branch1 || exit 1
|
|
|
|
# There are two options here as far as I see on what we should check for. Either
|
|
#
|
|
# (A) check for CONFLICT in any file except whitelist (such as .lock files)
|
|
# (B) check for "Automatic merge failed"
|
|
#
|
|
# Both of these options have drawbacks.
|
|
#
|
|
# The first (A) has the problem in that maybe we don't want to fail if the
|
|
# changes can be automatically merged (duh), but at least we are not pestered
|
|
# about constant lock file changes.
|
|
# The second (B) has the problem that it's difficult to filter out automatic
|
|
# merge fails for files we don't care about (.lock files).
|
|
#
|
|
# The ideal solution would be to check for automatic merge fails for files
|
|
# except those on a whitelist (e.g. lock files).
|
|
|
|
# For now I choose to use (B) here, because I hope it might be less noisy
|
|
|
|
# Alternative A
|
|
#output=$(git merge --no-commit --no-ff $branch2 | grep -v .lock)
|
|
#merge_failed=$(echo $output | grep -v "CONFLICT")
|
|
#return_code=$?
|
|
|
|
# Alternative B
|
|
output=$(git merge --no-commit --no-ff $branch2)
|
|
merge_failed=$(echo $output | grep -v "Automatic merge failed")
|
|
return_code=$?
|
|
|
|
# Restore
|
|
|
|
git merge --abort
|
|
git checkout -q -
|
|
|
|
if [ $return_code -eq 0 ]; then
|
|
echo "Merge check success"
|
|
else
|
|
echo "Merge check failed"
|
|
fi
|
|
|
|
exit $return_code
|