#!/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/efl/efl.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>"
