Add git-resquash.sh to repository

This differs from my old git-resquash.sh in that it uses the newer
`git rebase --keep-base` if available
This commit is contained in:
Nick Mathewson 2020-07-17 12:24:01 -04:00
parent 2225c3c369
commit 0401993197
2 changed files with 47 additions and 1 deletions

View File

@ -3,7 +3,7 @@
SCRIPT_NAME=$(basename "$0") SCRIPT_NAME=$(basename "$0")
SCRIPTS_DIR=$(dirname "$0") SCRIPTS_DIR=$(dirname "$0")
TOOL_NAMES=(push-all pull-all merge-forward list-tor-branches) TOOL_NAMES=(push-all pull-all merge-forward list-tor-branches resquash)
function usage() function usage()
{ {

46
scripts/git/git-resquash.sh Executable file
View File

@ -0,0 +1,46 @@
#!/bin/sh
#
# Provides a convenient alias for "git rebase -i --autosquash --keep-root"
# on gits that have it, and a replacement on gits that don't.
set -e
PARENT="$1"
if test "x$PARENT" = "x"; then
echo "You must specify the parent branch."
exit 1
fi
# Can we use git rebase --keep-base? Detect the git version to find out.
GITVER=$(git version)
if test "$(echo "$GITVER"|cut -d ' ' -f 1-2)" = "git version"; then
# --keep-base was added in git 2.24. Detect if we have that version.
GITVER=$(echo "$GITVER" | cut -d ' ' -f 3)
major=$(echo "$GITVER" | cut -d . -f 1)
minor=$(echo "$GITVER" | cut -d . -f 2)
if test "$major" -lt 2; then
USE_KEEP_BASE=0
elif test "$major" -eq 2 && test "$minor" -lt 24; then
USE_KEEP_BASE=0
else
USE_KEEP_BASE=1
fi
else
# This isn't a git that reports its version in a way recognize; assume that
# --keep-base will work
USE_KEEP_BASE=1
fi
if test "x$USE_KEEP_BASE" = "x1" ; then
exec git rebase -i --autosquash --keep-base "${PARENT}"
else
REV=$(git log --reverse --format='%H' "${PARENT}..HEAD" | head -1)
if test "x${REV}" = "x"; then
echo "No changes here since ${PARENT}"
exit 1
fi
exec git rebase -i --autosquash "${REV}^"
fi