onemerge: make sure each merge in master..seen brings in only one topic
If a topic B is built on top of a merge of topic A into master, then we should merge topic A first before topic B when preparing the integration branches. Merging topic B first would bring topic A along with it, which is generally not a good idea if we consider A and B as two separate topics.
Junio C Hamano committed
Jun 29, 2026 at 09:25 UTC
ca61a38eca70897e2db33efc913a7b682168de52
1 file changed
+34
onemerge.sh
+34
new file mode 100755
index 0000000000..d0bed02db5
--- /dev/null
+++ b/onemerge.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+# between master..seen, are there merges that bring in
+# more than one topic at a time?
+
+endpoint=${1-seen}
+
+tmp=/var/tmp/e.$$
+rm -f "$tmp.1" "$tmp.2" &&
+prev= &&
+trap 'rm -f "$tmp.*"' 0 || exit
+
+git rev-list --merges --first-parent master..$endpoint |
+while read commit
+do
+ # $tmp.1 has remaining topics after the merge we are looking at.
+ # $tmp.2 has remaining topics after the previous merge that is
+ # a descendant of the current merge.
+
+ git branch --list --no-merged "$commit" '??/*' >"$tmp.1"
+ if test -f "$tmp.2" && test -n "$prev"
+ then
+ cnt=$(comm -23 "$tmp.1" "$tmp.2" | wc -l)
+ if test $cnt != 1
+ then
+ echo Merges multiple topics
+ git show -s --format="* %s" "$prev"
+ comm -23 "$tmp.1" "$tmp.2"
+ exit
+
+ fi
+ fi
+ mv -f "$tmp.1" "$tmp.2"
+ prev=$commit
+done