aboutsummaryrefslogtreecommitdiffstats
path: root/CheckPush
blob: e79f364e8e7247e9d3d32ab215681674f610d34b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/bin/dash

MASTER=master

for range in $(
	{
		git for-each-ref --format='%(refname)' refs/heads/maint-\* |
		perl -e '
			sub compare_dotted_version {
				my (@ours) = split(/\./, $_[0]);
				my (@theirs) = split(/\./, $_[1]);
				my ($i, $diff);

				for ($i = 0; $i < @ours && $i < @theirs; $i++) {
					$diff = $ours[$i] - $theirs[$i];
					return $diff if ($diff);
				}
				return 1 if ($i < @ours);
				return -1 if ($i < @theirs);
				return 0;
			}
			my @maint = ();
			while (<STDIN>) {
				next unless s|^refs/heads/||;
				chomp;
				my ($v) = ($_ =~ /^maint-(.*)$/);
				push @maint, [$v, $_];
			}
			for (map { $_->[1] }
			     sort { compare_dotted_version($a->[0], $b->[0]) }
			     @maint) {
				print "$_\n";
			}
		' &&
		cat <<-EOF
		maint
		$MASTER
		next
		EOF
	} |
	{
		prev_branch=
		while read branch
		do
			if test -n "$prev_branch"
			then
				echo "$branch..$prev_branch"
			fi
			prev_branch=$branch
		done
	}
) seen..jch
do
	lg=$(git log --oneline "$range")
	if test -n "$lg"
	then
		echo "*** $range ***"
		echo "$lg"
	fi
done

if ! next_equiv=$(git rev-parse --verify 'jch^{/^### match next}' 2>/dev/null) ||
   ! git diff --stat --exit-code next $next_equiv
then
	next_tree=$(git rev-parse next^{tree}) &&
	next_equiv=$(git rev-list --first-parent $MASTER^..seen |
			xargs -n1 sh -c '
				echo $(git rev-parse $1^{tree}) $1
			' - | sed -n -e "s/^$next_tree //p"
		    )
fi

if test -n "$next_equiv"
then
	jch=$(git rev-list --first-parent $MASTER..jch | wc -l) &&
	seen=$(git rev-list --first-parent $MASTER..seen | wc -l) &&
	next=$(git rev-list --first-parent $MASTER..$next_equiv | wc -l) &&
	if test $jch -le $next
	then
		echo "$MASTER..$jch..jch..$next..next..$seen..seen"
	else
		echo "$MASTER..$next..next..$jch..jch..$seen..seen"
	fi
fi