#!/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;
}
</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" -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

    found=0

    echo "<tr>"
    echo "<td>$cnt</td>"
    cnt=$((cnt+1))
    echo "<td>$i</td>"

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

    echo "<td class=\"centered\">"
    if grep -E "\(call AUTOTARGETS,[^,]*,[^,]*,host\)" $i > /dev/null ; then
	is_auto_host=1
	echo "<b>YES</b>"
    else
	echo "NO"
    fi

    echo "<td class=\"centered\">"
    if grep -E "\(call AUTOTARGETS,[^,]*,[^,]*(,target|)\)" $i > /dev/null ; then
	found=1
	is_auto_target=1
	echo "<b>YES</b>"
    else
	echo "NO"
    fi
    echo "</td>"

    echo "<td class=\"centered\">"
    if grep -E "\(call GENTARGETS,[^,]*,[^,]*,host\)" $i > /dev/null ; then
	found=1
	is_pkg_host=1
	echo "<b>YES</b>"
    else
	echo "NO"
    fi
    echo "</td>"

    echo "<td class=\"centered\">"
    if grep -E "\(call GENTARGETS,[^,]*,[^,]*(,target|)\)" $i > /dev/null ; then
	found=1
	is_pkg_target=1
	echo "<b>YES</b>"
    else
	echo "NO"
    fi
    echo "</td>"

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

    echo "<td class=\"centered\">"
    if grep "^host-$pkg:" $i > /dev/null ; then
	found=1
	is_manual_host=1
	echo "<b>YES</b>"
    else
	echo "NO"
    fi
    echo "</td>"

    echo "<td class=\"centered\">"
    if grep "^$pkg:" $i > /dev/null ; then
	found=1
	is_manual_target=1
	echo "<b>YES</b>"
    else
	echo "NO"
    fi
    echo "</td>"

    echo "<td>"
    echo "<ul>"
    if [ $is_manual_target -eq 1 ]; then
	echo "<li>convert to generic target</li>"
	convert_to_generic_target=$((convert_to_generic_target+1))
    fi
    if [ $is_manual_host -eq 1 ]; then
	echo "<li>convert to generic host</li>"
	convert_to_generic_host=$((convert_to_generic_host+1))
    fi
    if grep "\./configure" $i > /dev/null ; then
	if [ $is_manual_host -ne 1 ] ; then
	    echo "<li>convert package to autotools ?</li>"
	    convert_to_autotools=$((convert_to_autotools+1))
	fi
    fi
    if [ $found -eq 0 ] ; then
	echo "<li>look manually</li>"
    fi
    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 autotools</td>"
echo "<td>$convert_to_autotools</td>"
echo "</tr>"
echo "<tr>"
echo "<td>TOTAL</td>"
echo "<td>$cnt</td>"
echo "</tr>"
echo "</table>"
