From 1acf92ada834bcc44b05beba33fd658c103b72a3 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 22 Jan 2013 14:41:36 -0800 Subject: [PATCH] Meta/GRADUATED: still experimenting... --- GRADUATED | 65 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 14 deletions(-) diff --git a/GRADUATED b/GRADUATED index c04040af8b..e267be5a19 100755 --- a/GRADUATED +++ b/GRADUATED @@ -1,11 +1,13 @@ #!/bin/sh -base= +base= ignore_file= while : do case "$1" in --base=*) base=${1#*=} ;; + --ignore=*) + ignore_file=${1#*=} ;; -*) echo >&2 "Eh? $1" exit 1 ;; @@ -27,12 +29,29 @@ then } fi -topics= -leftover= -dothis= +topics= leftover= dothis= LF=' ' +ignores= +if test -f "$ignore_file" +then + while read ignore rest + do + test -n "$ignore" && + if ignore=$(git rev-parse -q --verify $ignore) + then + : + elif ignore=$(expr "$rest" : '.* \([0-9a-f]\{40\}\)$') + then + : + else + continue + fi + ignores="$ignores$ignore " + done <"$ignore_file" +fi + defer () { leftover="$leftover$1$LF" } @@ -42,20 +61,26 @@ dothis () { } one_topic () { - topic="$1" tip="$2" date="$3" + topic="$2" tip="$3" date="$4" merged="$1" case " $topics" in *" $topic "*) return ;; esac topics="$topics$topic " - mergeable=no ready=no label= - maint_count=$(git rev-list "maint..$tip" | wc -l) if test "$maint_count" = 0 then + echo "**** already merged $topic ****" return ;# already merged fi - master_count=$(git rev-list "$base..$tip" | wc -l) - test $master_count = $maint_count && mergeable=yes + ready=no label= + + master_count=$(git rev-list "$base..$tip" | wc -l) + if test $maint_count -le $master_count + then + mergeable=yes + else + mergeable=no + fi if current=$(git rev-parse --verify -q "$topic^0") && test "$current" = "$tip" @@ -70,14 +95,25 @@ one_topic () { case "$mergeable,$ready" in no,*) - defer "# $topic: not mergeable ($master_count vs $maint_count)" + comment="# $topic: not mergeable ($master_count vs $maint_count)" + comment="$comment$LF# $merged" + defer "$comment" ;; yes,no) topic_count=$(git rev-list "$base..$current" | wc -l) - defer "# $topic: not ready ($master_count vs $topic_count)" + + comment="# $topic: not ready ($master_count vs $topic_count)" + comment="$comment$LF# $merged" + defer "$comment" ;; yes,yes) - insn="$label # $master_count ($date)" + insn="$label" + if test $maint_count = $master_count + then + insn="$insn # $master_count ($date) $merged" + else + insn="$insn # $maint_count/$master_count ($date) $merged" + fi insn="$insn$LF$(git log --oneline "maint..$tip" | sed -e "s/^/# /")" dothis "$insn" ;; @@ -88,11 +124,12 @@ git log --first-parent --min-parents=2 --max-parents=2 \ --format='%ci %H %P %s' "$base..master" | { while read date time zone commit parent tip subject do + case " $ignores" in *" $commit "*) continue ;; esac topic=$(expr "$subject" : "Merge branch '\(.*\)'$") || { - echo >&2 "Cannot parse $commit ($subject)" + defer "# ignoring $commit ($subject)" continue } - one_topic "$topic" "$tip" "$date" + one_topic "$commit" "$topic" "$tip" "$date" done echo "$leftover" echo "$dothis" -- 2.47.3