summaryrefslogtreecommitdiff
path: root/util/scripts/gerrit-rebase
diff options
context:
space:
mode:
authorPatrick Georgi <pgeorgi@google.com>2017-06-13 15:14:09 +0200
committerPatrick Georgi <pgeorgi@google.com>2017-06-19 18:44:13 +0200
commit8f8668d87f985c3b3c3321d5b4b80229ef4a262e (patch)
tree296bf9654ac24355865640a005b53566fe7cb8c0 /util/scripts/gerrit-rebase
parent09634d0328fdaa6a182a9467a9eb6e97ebcb8da9 (diff)
util/scripts/gerrit-rebase: allow skipping old history
This might provide a minor speedup but more importantly it allows skipping commits without Reviewed-on line (which we have a couple of due to mistakes with git push). To use, add a line starting with "Gerrit-Rebase-Ignore-CLs-Before:" pointing out a match string (ie "something that comes after Reviewed-on") prior to which no changes are considered on the originating branch. The target branch is still fully considered to avoid issues with changes that were retargetted out of order around the new cut and would then make a reappearance (or be skipped). Change-Id: I9f2679891e93f6d28a781315aebd2aa60a1e3b23 Signed-off-by: Patrick Georgi <pgeorgi@google.com> Reviewed-on: https://review.coreboot.org/20185 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Martin Roth <martinroth@google.com>
Diffstat (limited to 'util/scripts/gerrit-rebase')
-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