#!/bin/bash

# Copyright (C) 2009 by Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

# This script generates an HTML file that contains a report about all
# Buildroot packages, their usage of the different package
# infrastructure and possible cleanup actions
#
# Run the script from the Buildroot toplevel directory:
#
#  ./support/scripts/pkg-stats > /tmp/pkg.html
#

echo "<head>
<style type=\"text/css\">
table {
  width: 100%;
}
td {
  border: 1px solid black;
}
td.centered {
  text-align: center;
}
tr.wrong td {
  background: #ff9a69;
}
tr.correct td {
  background: #d2ffc4;
}
</style>
</head>

<a href=\"#results\">Results</a><br/>

<table>
<tr>
<td rowspan=\"2\">Id</td>
<td rowspan=\"2\">Package</td>
<td rowspan=\"2\">Patch count</td>
<td colspan=\"2\" class=\"centered\">AUTOTARGETS</td>
<td colspan=\"2\" class=\"centered\">GENTARGETS</td>
<td colspan=\"2\" class=\"centered\">CMAKETARGETS</td>
<td colspan=\"2\" class=\"centered\">manual</td>
<td rowspan=\"2\" class=\"centered\">Actions</td>
</tr>
<tr>
<td class=\"centered\">host</td>
<td class=\"centered\">target</td>
<td class=\"centered\">host</td>
<td class=\"centered\">target</td>
<td class=\"centered\">host</td>
<td class=\"centered\">target</td>
<td class=\"centered\">host</td>
<td class=\"centered\">target</td>
</tr>"

convert_to_generic_target=0
convert_to_generic_host=0
convert_to_target_autotools=0
convert_to_host_autotools=0
total_patch_count=0
cnt=0
for i in $(find package/ -name '*.mk') ; do

    if test \
	$i = "package/java/java.mk" -o \
	$i = "package/games/games.mk" -o \
	$i = "package/gtk2-themes/gtk2-themes.mk" -o \
	$i = "package/multimedia/multimedia.mk" -o \
	$i = "package/customize/customize.mk" -o \
	$i = "package/matchbox/matchbox.mk" -o \
	$i = "package/x11r7/x11r7.mk" ; then
	echo "skipping $i" 1>&2
	continue
    fi

    cnt=$((cnt+1))

    is_auto_host=0
    is_auto_target=0
    is_cmake_host=0
    is_cmake_target=0
    is_pkg_target=0
    is_pkg_host=0
    is_manual_target=0
    is_manual_host=0

    if grep -E "\(call AUTOTARGETS,host\)" $i > /dev/null ; then
	is_auto_host=1
    fi

    if grep -E "\(call AUTOTARGETS\)" $i > /dev/null ; then
	is_auto_target=1
    fi

    if grep -E "\(call GENTARGETS,host\)" $i > /dev/null ; then
	is_pkg_host=1
    fi

    if grep -E "\(call GENTARGETS\)" $i > /dev/null ; then
	is_pkg_target=1
    fi

    if grep -E "\(call CMAKETARGETS,host\)" $i > /dev/null ; then
	is_cmake_host=1
    fi

    if grep -E "\(call CMAKETARGETS\)" $i > /dev/null ; then
	is_cmake_target=1
    fi

    pkg=$(basename $i)
    pkg=${pkg%.mk}

    if grep "^host-$pkg:" $i > /dev/null ; then
	is_manual_host=1
    fi

    if test $is_pkg_target -eq 0 -a $is_auto_target -eq 0 -a $is_cmake_target -eq 0; then
	is_manual_target=1
    fi

    tasks=""

    if [ $is_manual_target -eq 1 ] ; then
	if grep "/configure" $i > /dev/null ; then
	    tasks=$tasks"<li>convert package to autotools ?</li>"
	    convert_to_target_autotools=$((convert_to_target_autotools+1))
	else
	    tasks=$tasks"<li>convert to generic target</li>"
	    convert_to_generic_target=$((convert_to_generic_target+1))
	fi
    fi

    if [ $is_manual_host -eq 1 ]; then
	if grep "/configure" $i > /dev/null ; then
	    tasks=$tasks"<li>convert package to autotools ?</li>"
	    convert_to_host_autotools=$((convert_to_host_autotools+1))
	else
	    tasks=$tasks"<li>convert to generic host</li>"
	    convert_to_generic_host=$((convert_to_generic_host+1))
	fi
    fi

    if test -n "$tasks" ; then
	echo "<tr class=\"wrong\">"
    else
	echo "<tr class=\"correct\">"
    fi

    echo "<td>$cnt</td>"
    echo "<td>$i</td>"

    package_dir=$(dirname $i)
    patch_count=$(find ${package_dir} -name '*.patch' | wc -l)
    total_patch_count=$(($total_patch_count+$patch_count))

    if test $patch_count -lt 1 ; then
	patch_count_color="#00ff00"
    elif test $patch_count -lt 5 ; then
	patch_count_color="#ffc600"
    else
	patch_count_color="#ff0000"
    fi

    echo "<td class=\"centered\" style=\"color: $patch_count_color; font-weight: bold;\">"
    echo $patch_count
    echo "</td>"

    echo "<td class=\"centered\">"
    if [ $is_auto_host -eq 1 ] ; then
	echo "<b>YES</b>"
    else
	echo "NO"
    fi
    echo "</td>"

    echo "<td class=\"centered\">"
    if [ $is_auto_target -eq 1 ] ; then
	echo "<b>YES</b>"
    else
	echo "NO"
    fi
    echo "</td>"

    echo "<td class=\"centered\">"
    if [ $is_pkg_host -eq 1 ] ; then
	echo "<b>YES</b>"
    else
	echo "NO"
    fi
    echo "</td>"

    echo "<td class=\"centered\">"
    if [ $is_pkg_target -eq 1 ] ; then
	echo "<b>YES</b>"
    else
	echo "NO"
    fi
    echo "</td>"

    echo "<td class=\"centered\">"
    if [ $is_cmake_host -eq 1 ] ; then
	echo "<b>YES</b>"
    else
	echo "NO"
    fi
    echo "</td>"

    echo "<td class=\"centered\">"
    if [ $is_cmake_target -eq 1 ] ; then
	echo "<b>YES</b>"
    else
	echo "NO"
    fi
    echo "</td>"

    echo "<td class=\"centered\">"
    if [ $is_manual_host -eq 1 ] ; then
	echo "<b>YES</b>"
    else
	echo "NO"
    fi
    echo "</td>"

    echo "<td class=\"centered\">"
    if [ $is_manual_target -eq 1 ] ; then
	echo "<b>YES</b>"
    else
	echo "NO"
    fi
    echo "</td>"

    echo "<td>"
    echo "<ul>"
    echo $tasks
    echo "</ul>"
    echo "</td>"

    echo "</tr>"

done
echo "</table>"

echo "<table>"
echo "<tr>"
echo "<td>Packages to convert to generic target</td>"
echo "<td>$convert_to_generic_target</td>"
echo "</tr>"
echo "<tr>"
echo "<td>Packages to convert to generic host</td>"
echo "<td>$convert_to_generic_host</td>"
echo "</tr>"
echo "<tr>"
echo "<td>Packages to convert to target autotools</td>"
echo "<td>$convert_to_target_autotools</td>"
echo "</tr>"
echo "<tr>"
echo "<td>Packages to convert to host autotools</td>"
echo "<td>$convert_to_host_autotools</td>"
echo "</tr>"
echo "<tr>"
echo "<td>Number of patches in all packages</td>"
echo "<td>$total_patch_count</td>"
echo "</tr>"
echo "<tr>"
echo "<td>TOTAL</td>"
echo "<td>$cnt</td>"
echo "</tr>"
echo "</table>"
