What's cooking (2021/06 #06)
[git] / CheckPush
1 #!/bin/sh
2
3 MASTER=master
4
5 for range in $(
6         prev_branch=
7         {
8                 git for-each-ref --format='%(refname)' refs/heads/maint-* |
9                 perl -e '
10                         sub compare_dotted_version {
11                                 my (@ours) = split(/\./, $_[0]);
12                                 my (@theirs) = split(/\./, $_[1]);
13                                 my ($i, $diff);
14
15                                 for ($i = 0; $i < @ours && $i < @theirs; $i++) {
16                                         $diff = $ours[$i] - $theirs[$i];
17                                         return $diff if ($diff);
18                                 }
19                                 return 1 if ($i < @ours);
20                                 return -1 if ($i < @theirs);
21                                 return 0;
22                         }
23                         my @maint = ();
24                         while (<STDIN>) {
25                                 next unless s|^refs/heads/||;
26                                 chomp;
27                                 my ($v) = ($_ =~ /^maint-(.*)$/);
28                                 push @maint, [$v, $_];
29                         }
30                         for (map { $_->[1] }
31                              sort { compare_dotted_version($a->[0], $b->[0]) }
32                              @maint) {
33                                 print "$_\n";
34                         }
35                 '
36                 cat <<-EOF
37                 maint
38                 $MASTER
39                 next
40                 EOF
41         } |
42         while read branch
43         do
44                 if test -n "$prev_branch"
45                 then
46                         echo "$branch..$prev_branch"
47                 fi
48                 prev_branch=$branch
49         done
50 ) seen..jch
51 do
52         lg=$(git log --oneline "$range")
53         if test -n "$lg"
54         then
55                 echo "*** $range ***"
56                 echo "$lg"
57         fi
58 done
59
60 if ! next_equiv=$(git rev-parse --verify 'jch^{/^### match next}' 2>/dev/null) ||
61    ! git diff --stat --exit-code next $next_equiv
62 then
63         next_tree=$(git rev-parse next^{tree}) &&
64         next_equiv=$(git rev-list --first-parent $MASTER..seen |
65                         xargs -n1 sh -c '
66                                 echo $(git rev-parse $1^{tree}) $1
67                         ' - | sed -n -e "s/^$next_tree //p"
68                     )
69 fi
70
71 if test -n "$next_equiv"
72 then
73         jch=$(git rev-list --first-parent $MASTER..jch | wc -l) &&
74         seen=$(git rev-list --first-parent $MASTER..seen | wc -l) &&
75         next=$(git rev-list --first-parent $MASTER..$next_equiv | wc -l) &&
76         if test $jch -le $next
77         then
78                 echo "$MASTER..$jch..jch..$next..next..$seen..seen"
79         else
80                 echo "$MASTER..$next..next..$jch..jch..$seen..seen"
81         fi
82 fi