#!/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
