#!/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:
#
#  ./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 colspan=\"2\" class=\"centered\">AUTOTARGETS</td>
<td colspan=\"2\" class=\"centered\">GENTARGETS</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>
</tr>"

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

    if test $i = "package/mtd/mtd.mk" -o \
	$i = "package/java/java.mk" -o \
	$i = "package/database/database.mk" -o \
	$i = "package/editors/editors.mk" -o \
	$i = "package/games/games.mk" -o \
	$i = "package/multimedia/multimedia.mk" -o \
	$i = "package/customize/customize.mk" -o \
	$i = "package/gnuconfig/gnuconfig.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_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,[^,]*,[^,]*(,target|)\)" $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,[^,]*,[^,]*(,target|)\)" $i > /dev/null ; then
	is_pkg_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 ; 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>"

    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_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>TOTAL</td>"
echo "<td>$cnt</td>"
echo "</tr>"
echo "</table>"
