56 lines
1.5 KiB
Bash
Executable file
56 lines
1.5 KiB
Bash
Executable file
#!/bin/bash
|
|
# This script is meant to be run as a GIT_SEQUENCE_EDITOR
|
|
# when running `git rebase -i`. The idea being that it will
|
|
# cross-reference commit logs and history with the target branch and
|
|
# drop any changes, squashed or otherwise, that exist on that branch
|
|
|
|
FILE=${1}
|
|
|
|
# Find the branch we're rebasing onto
|
|
|
|
ONTO=$(awk '/^# Rebase/{ print $5 }' ${FILE})
|
|
|
|
# Create tempfile to rewrite the todo list
|
|
random=$( (whoami ; hostname ; date; cat $1) | git hash-object --stdin)
|
|
dest="$1.tmp.${random}"
|
|
|
|
trap 'rm -f "${dest}"' EXIT
|
|
|
|
# For each commit...
|
|
while read -r line; do
|
|
if [[ "$line" =~ ^#.* ]]; then
|
|
echo $line >> ${dest}
|
|
continue
|
|
fi
|
|
commit=$(echo -n $line | awk '{ print $2 }')
|
|
if [ -z "${commit}" ]; then
|
|
continue
|
|
fi
|
|
# ...see if there's a Change-Id in it....
|
|
changeid=$(git log --format=%B -n 1 ${commit} | awk '/Change-Id/{ print $2 }')
|
|
if [ -n "${changeid}" ]; then
|
|
# ...and match it against the history of the target branch
|
|
gitlog=$(git log --grep "${changeid}" ${ONTO})
|
|
if [ -n "${gitlog}" ] ; then
|
|
echo $line "# Has Change-Id ${changeid}" | sed 's/pick/drop/g' >> ${dest}
|
|
continue
|
|
fi
|
|
fi
|
|
echo $line >> ${dest}
|
|
done < ${FILE}
|
|
|
|
|
|
# Apply the changes from the tempfile
|
|
|
|
if ! mv "${dest}" "$1" ; then
|
|
echo "cannot mv ${dest} to $1"
|
|
exit 1
|
|
fi
|
|
|
|
# Proceed with the editor as per usual
|
|
|
|
REAL_EDITOR="$(git var GIT_EDITOR)"
|
|
|
|
if [ -n "$REAL_EDITOR" ]; then
|
|
$REAL_EDITOR "$@"
|
|
fi
|