#!/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;
}
td.wrong {
  background: #ff9a69;
}
td.correct {
  background: #d2ffc4;
}
td.nopatches {
  background: #d2ffc4;
}

td.somepatches {
  background: #ffd870;
}

td.lotsofpatches {
  background: #ff9a69;
}
</style>
<title>Statistics of Buildroot packages</title>
</head>

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

<table>
<tr>
<td>Id</td>
<td>Package</td>
<td class=\"centered\">Patch count</td>
<td class=\"centered\">Infrastructure</td>
<td class=\"centered\">License</td>
<td class=\"centered\">License files</td>
</tr>
"

autotools_packages=0
cmake_packages=0
generic_packages=0
manual_packages=0
packages_with_licence=0
packages_without_licence=0
packages_with_license_files=0
packages_without_license_files=0
total_patch_count=0
cnt=0

for i in $(find boot/ linux/ package/ -name '*.mk' | sort) ; do

    if test \
	$i = "boot/common.mk" -o \
	$i = "linux/linux-ext-xenomai.mk" -o \
	$i = "linux/linux-ext-rtai.mk" -o \
	$i = "linux/linux-ext-ocf-linux.mk" -o \
	$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/pkg-autotools.mk" -o \
 	$i = "package/pkg-cmake.mk" -o \
 	$i = "package/pkg-generic.mk" -o \
 	$i = "package/pkg-utils.mk" -o \
 	$i = "package/pkg-download.mk" -o \
	$i = "package/matchbox/matchbox.mk" -o \
	$i = "package/x11r7/x11r7.mk" ; then
	echo "skipping $i" 1>&2
	continue
    fi

    cnt=$((cnt+1))

    hashost=0
    hastarget=0
    infratype=""

    # Determine package infrastructure
    if grep -E "\(host-autotools-package\)" $i > /dev/null ; then
	infratype="autotools"
	hashost=1
    fi

    if grep -E "\(autotools-package\)" $i > /dev/null ; then
	infratype="autotools"
	hastarget=1
    fi

    if grep -E "\(host-generic-package\)" $i > /dev/null ; then
	infratype="generic"
	hashost=1
    fi

    if grep -E "\(generic-package\)" $i > /dev/null ; then
	infratype="generic"
	hastarget=1
    fi

    if grep -E "\(host-cmake-package\)" $i > /dev/null ; then
	infratype="cmake"
	hashost=1
    fi

    if grep -E "\(cmake-package\)" $i > /dev/null ; then
	infratype="cmake"
	hastarget=1
    fi

    pkg=$(basename $i)
    pkg=${pkg%.mk}
    pkgvariable=$(echo ${pkg} | tr "a-z-" "A-Z_")


    # Count packages per infrastructure
    if [ -z ${infratype} ] ; then
	infratype="manual"
	manual_packages=$(($manual_packages+1))
    elif [ ${infratype} = "autotools" ]; then
	autotools_packages=$(($autotools_packages+1))
    elif [ ${infratype} = "cmake" ]; then
	cmake_packages=$(($cmake_packages+1))
    elif [ ${infratype} = "generic" ]; then
	generic_packages=$(($generic_packages+1))
    fi

    if grep -qE "^${pkgvariable}_LICENSE[ ]*=" $i ; then
	packages_with_license=$(($packages_with_license+1))
	license=1
    else
	packages_without_license=$(($packages_without_license+1))
	license=0
    fi

    if grep -qE "^${pkgvariable}_LICENSE_FILES[ ]*=" $i ; then
	packages_with_license_files=$(($packages_with_license_files+1))
	license_files=1
    else
	packages_without_license_files=$(($packages_without_license_files+1))
	license_files=0
    fi

    echo "<tr>"

    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_class="nopatches"
    elif test $patch_count -lt 5 ; then
	patch_count_class="somepatches"
    else
	patch_count_class="lotsofpatches"
    fi

    echo "<td class=\"centered ${patch_count_class}\">"
    echo "<b>$patch_count</b>"
    echo "</td>"

    if [ ${infratype} = "manual" ] ; then
	echo "<td class=\"centered wrong\"><b>manual</b></td>"
    else
	echo "<td class=\"centered correct\">"
	echo "<b>${infratype}</b><br/>"
	if [ ${hashost} -eq 1 -a ${hastarget} -eq 1 ]; then
	    echo "target + host"
	elif [ ${hashost} -eq 1 ]; then
	    echo "host"
	else
	    echo "target"
	fi
	echo "</td>"
    fi

    if [ ${license} -eq 0 ] ; then
	echo "<td class=\"centered wrong\">No</td>"
    else
	echo "<td class=\"centered correct\">Yes</td>"
    fi

    if [ ${license_files} -eq 0 ] ; then
	echo "<td class=\"centered wrong\">No</td>"
    else
	echo "<td class=\"centered correct\">Yes</td>"
    fi

    echo "</tr>"

done
echo "</table>"

echo "<a id="results"></a>"
echo "<table>"
echo "<tr>"
echo "<td>Packages using the <i>generic</i> infrastructure</td>"
echo "<td>$generic_packages</td>"
echo "</tr>"
echo "<tr>"
echo "<td>Packages using the <i>cmake</i> infrastructure</td>"
echo "<td>$cmake_packages</td>"
echo "</tr>"
echo "<tr>"
echo "<td>Packages using the <i>autotools</i> infrastructure</td>"
echo "<td>$autotools_packages</td>"
echo "</tr>"
echo "<tr>"
echo "<td>Packages not using any infrastructure</td>"
echo "<td>$manual_packages</td>"
echo "</tr>"
echo "<tr>"
echo "<td>Packages having license information</td>"
echo "<td>$packages_with_license</td>"
echo "</tr>"
echo "<tr>"
echo "<td>Packages not having licence information</td>"
echo "<td>$packages_without_license</td>"
echo "</tr>"
echo "<tr>"
echo "<td>Packages having license files information</td>"
echo "<td>$packages_with_license_files</td>"
echo "</tr>"
echo "<tr>"
echo "<td>Packages not having licence files information</td>"
echo "<td>$packages_without_license_files</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>"

echo "<hr/>"
echo "<i>Updated on $(LANG=C date), Git commit $(git log master -n 1 --pretty=format:%H)</i>"
echo "</body>"
echo "</html>"