#!/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 = "package/efl/efl.mk" -o \
	$i = "package/freescale-imx/freescale-imx.mk" -o \
	$i = "package/gcc/gcc.mk" -o \
	$i = "package/gstreamer/gstreamer.mk" -o \
	$i = "package/gstreamer1/gstreamer1.mk" -o \
	$i = "package/gtk2-themes/gtk2-themes.mk" -o \
	$i = "package/matchbox/matchbox.mk" -o \
	$i = "package/opengl/opengl.mk" -o \
	$i = "package/qt5/qt5.mk" -o \
	$i = "package/x11r7/x11r7.mk" -o \
 	$i = "package/pkg-autotools.mk" -o \
 	$i = "package/pkg-cmake.mk" -o \
	$i = "package/pkg-download.mk" -o \
 	$i = "package/pkg-generic.mk" -o \
 	$i = "package/pkg-utils.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>"