summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xutil/scripts/gerrit-rebase36
1 files changed, 32 insertions, 4 deletions
diff --git a/util/scripts/gerrit-rebase b/util/scripts/gerrit-rebase
index 8f59e7f497..c4f8a80e2a 100755
--- a/util/scripts/gerrit-rebase
+++ b/util/scripts/gerrit-rebase
@@ -27,7 +27,22 @@ to=$2
# so go for Reviewed-on instead. It's also unique because it
# contains the gerrit instance's host name and the change's number
# on that system.
-match_string='^ [-A-Za-z]*[Rr]eviewed-on: '
+match_string='[-A-Za-z]*[Rr]eviewed-on:'
+
+# Custom root: allow a certain CL (identified by matching either side's
+# match_string) to be the new root, instead of using git's common history only.
+# This allows cutting down on commits that are re-evaluated on every run.
+#
+# Use:
+# To the commit message of a commit on the "to" side, add
+# $custom_root: match_string (the part coming after $match_string)
+#
+# For a $match_string of ~ "Reviewed-on: " this might
+# be "$custom_root: https://example.com/12345"
+#
+# On traversal, the commit with "$match_string: https://example.com/12345"
+# is then considered a base commit.
+custom_root='^Gerrit-Rebase-Ignore-CLs-Before:'
# fetch common ancestor
common_base=$(git merge-base ${from} ${to} 2>/dev/null)
@@ -37,9 +52,22 @@ if [ -z "${common_base}" ]; then
exit 1
fi
+from_base=$common_base
+
+# fetch custom root ID
+croot_marker=$(git log --pretty=%b -1 --grep "${custom_root}" \
+ ${common_base}..${to} | \
+ grep "${custom_root}" | cut -d: -f2-)
+if [ -n "${croot_marker}" ]; then
+ from_base=$( ( \
+ git log --pretty=%H -1 \
+ --grep "^${match_string}${croot_marker}" \
+ ${from_base}..${from}; echo ${from_base} )| head -1)
+fi
+
# collect matches that are present on the target side
to_matches="$(git log ${common_base}..${to} | \
- grep "${match_string}" | \
+ grep "^ ${match_string}" | \
cut -d: -f2-)"
# start rebase process, but fail immediately by enforcing an invalid todo
@@ -49,8 +77,8 @@ GIT_SEQUENCE_EDITOR="echo foo >" \
# write new rebase todo
# the appended "commit" line triggers handling of the last log entry
commit=""
-(git log --reverse ${common_base}..${from} | \
- grep -E "(^commit [0-9a-f]{40}\$|${match_string})"; \
+(git log --reverse ${from_base}..${from} | \
+ grep -E "(^commit [0-9a-f]{40}\$|^ ${match_string})"; \
echo "commit") | \
while read key value; do
if [ "${key}" = "commit" ]; then