#! /bin/sh -e
# Take TODO list and make html summary of it.

SOURCE=~/devel/kernel/2.6-TODO
DEST=index.html
CACHEDIR=~/tmp

barf()
{
    echo "$@" >&2
    exit 1
}

# Takes patch and produces impact-o-meter results.
analyze_patch()
{
    AP_BYTES=`wc -c < $1`
    AP_CHANGES=`grep -c '^+++ ' < $1`
    # New files have old file date at epoch w/ timezone adjust.
    # Don't get spurious failure on no matches.
    AP_NEW=`egrep -c '^--- .*[^0-9]19(69|70)([^0-9]|$)' < $1 || true`
    AP_CONFIG=`egrep -i '^--- .*(Makefile|Config.in|Config.help|CREDITS|MAINTAINERS|Kconfig)' < $1 | egrep -cv ' 19(69|70)$' || true`

    echo 'S: '$(($AP_BYTES / 1000)) kbytes, $(($AP_CHANGES - $AP_NEW - $AP_CONFIG))/$AP_CONFIG files altered, $AP_NEW new'<br>'
}

# Skip over patches to Config.in, config.in, Makefile, and new/deleted files.
executive_summary()
{
    ES_STATE=SKIPPING
    while IFS="
" read -r ES_LINE; do
	case "$ES_LINE" in
	diff\ *) ES_STATE=SKIPPING;;
	---\ */config.in*) ES_STATE=SKIPPING;;
	---\ */Config.in*) ES_STATE=SKIPPING;;
	---\ */Config.help*) ES_STATE=SKIPPING;;
	---\ */Makefile*) ES_STATE=SKIPPING;;
	---\ */CREDITS*) ES_STATE=SKIPPING;;
	---\ */MAINTAINERS*) ES_STATE=SKIPPING;;
	---\ *) ES_STATE=SAVING;;
	@@\ -0,0*) ES_SAVED=""; ES_STATE=SKIPPING;;
	@@\ *+0,0\ @@) ES_SAVED=""; ES_STATE=SKIPPING;;
	@@\ *) [ x"$ES_SAVED" = x ] || { echo "$ES_SAVED"; ES_SAVED=""; ES_STATE=OUTPUTTING; }
	      ;;
	esac
	case "$ES_STATE" in
	SAVING) ES_SAVED="$ES_SAVED
$ES_LINE";;
	OUTPUTTING) echo "$ES_LINE";;
	esac
    done < $1 | gzip -9 > $2.summary.patch.gz
    echo "T: <a href=\"$2.diffstat.txt\">Diffstat</a><br>"
    diffstat -p1 < $1 > $2.diffstat.txt 2>/dev/null
    ES_SIZE=$(($(zcat $2.summary.patch.gz | wc -c) / 1000))
    echo "X: <a href=\"$2.summary.patch.gz\">Summary patch (${ES_SIZE}k)</a><br>"
}

try_cache()
{
    CACHESUM=`echo "$1" | md5sum | cut -d\  -f1`
    if [ -f $CACHEDIR/$CACHESUM.tar.gz ]; then
	tar xfz $CACHEDIR/$CACHESUM.tar.gz
    fi
}

save_cache()
{
    CACHESUM=`echo "$1" | md5sum | cut -d\  -f1`
    tar cfz $CACHEDIR/$CACHESUM.tar.gz .
}

create_summary()
{
    mkdir /tmp/summary.$$
    trap "rm -rf /tmp/summary.$$*" 0
    CS_URL=`echo "$@" | sed 's/[^"]*"\([^"]*\)"[^"]*/\1 /g'`
    pushd /tmp/summary.$$ >/dev/null

    echo Analyzing "$CS_URL"... >&2
    try_cache "$CS_URL"
    for CS_U in $CS_URL; do
	case $CS_U in 
	*/) wget -q --level=1 --reject '*.html*' --no-directories --timestamping -r --relative $CS_U || barf "Can't get $CS_U";;
	ftp*) wget -q --timestamping $CS_U || barf "Can't get $CS_U";;
	*) wget -q --timestamping $CS_U || barf "Can't get $CS_U";;
	esac
    done

    for f in *; do
	case $f in
	*.bz2) bzcat $f;;
	*.gz) zcat $f;;
	*) cat $f;;
	esac
    done > /tmp/summary.$$.diff
    if isapplied ~/devel/kernel/linux-`latest-kernel-version` /tmp/summary.$$.diff >/dev/null; then
	echo WARNING: "$CS_URL" already applied >&2
    fi
    analyze_patch /tmp/summary.$$.diff
    save_cache "$CS_URL"
    popd >/dev/null
    executive_summary /tmp/summary.$$.diff `echo $CS_URL | sed 's/ .*//' | sed 's/[^-A-Za-z0-9._]\+/_/g'`
    rm -rf /tmp/summary.$$*
}

cd 2.6-not-in-yet

cat $DEST.head > $DEST

# Insert linebreaks before single letter prefixes, highlight titles,
# href urls...
sed 's/^\( *[A-Z]:.*\)/\1 <br>/' < $SOURCE |
    sed 's,^\([-A-Za-z0-9/() ]\+\)$,<h3>\1</h3>,' |
    sed 's,\(\(http\|ftp\):[^ ]*\),<a href="\1">\1</a>,g' |
    while read LINE; do
	case "$LINE" in
	D:*) echo "$LINE"; create_summary $LINE;;
	*) echo "$LINE";;
	esac
    done >> $DEST

sed "s/Last modified:.*/Last modified: `date`/" $DEST.tail >> $DEST
