#!/bin/sh -e
#
# Clean up QEMU #include lines by ensuring that qemu/osdep.h
# is the first include listed in .c files, and no headers provided
# by osdep.h itself are redundantly included in either .c or .h files.
#
# Copyright (c) 2015 Linaro Limited
#
# Authors:
#  Peter Maydell <peter.maydell@linaro.org>
#
# This work is licensed under the terms of the GNU GPL, version 2
# or (at your option) any later version. See the COPYING file in
# the top-level directory.

# Usage:
#   clean-includes [--git subjectprefix] [--check-dup-head] file ...
# or
#   clean-includes [--git subjectprefix] [--check-dup-head] --all
#
# If the --git subjectprefix option is given, then after making
# the changes to the files this script will create a git commit
# with the subject line "subjectprefix: Clean up includes"
# and a boilerplate commit message.
#
# If --check-dup-head is specified, additionally check for duplicate
# header includes.
#
# Using --all will cause clean-includes to run on the whole source
# tree (excluding certain directories which are known not to need
# handling).

# This script requires Coccinelle to be installed.

# .c files will have the osdep.h included added, and redundant
# includes removed.
# .h files will have redundant includes (including includes of osdep.h)
# removed.
# Other files (including C++ and ObjectiveC) can't be handled by this script.

# The following one-liner may be handy for finding files to run this on.
# However some caution is required regarding files that might be part
# of the guest agent or standalone tests.

# for i in $(git ls-tree --name-only HEAD) ; do test -f $i && \
#   grep -E '^# *include' $i | head -1 | grep 'osdep.h' ; test $? != 0 && \
#   echo $i ; done


GIT=no
DUPHEAD=no

# Extended regular expression defining files to ignore when using --all
XDIRREGEX='^(tests/tcg|tests/multiboot|pc-bios|disas/libvixl)'

while true
do
    case $1 in
    "--git")
         if [ $# -eq 1 ]; then
             echo "--git option requires an argument"
             exit 1
         fi
         GITSUBJ="$2"
         GIT=yes
         shift
         shift
         ;;
    "--check-dup-head")
        DUPHEAD=yes
        shift
        ;;
    "--")
        shift
        break
        ;;
    *)
        break
        ;;
   esac
done

if [ $# -eq 0 ]; then
    echo "Usage: clean-includes [--git subjectprefix] [--check-dup-head] [--all | foo.c ...]"
    echo "(modifies the files in place)"
    exit 1
fi

if [ "$1" = "--all" ]; then
    # We assume there are no files in the tree with spaces in their name
    set -- $(git ls-files '*.[ch]' | grep -E -v "$XDIRREGEX")
fi

# Annoyingly coccinelle won't read a scriptfile unless its
# name ends '.cocci', so write it out to a tempfile with the
# right kind of name.
COCCIFILE="$(mktemp --suffix=.cocci)"

trap 'rm -f -- "$COCCIFILE"' INT TERM HUP EXIT

cat >"$COCCIFILE" <<EOT
@@
@@

(
+ #include "qemu/osdep.h"
 #include "..."
|
+ #include "qemu/osdep.h"
 #include <...>
)
EOT

for f in "$@"; do
  case "$f" in
    *.inc.c)
      # These aren't standalone C source files
      echo "SKIPPING $f (not a standalone source file)"
      continue
      ;;
    *.c)
      MODE=c
      ;;
    *include/qemu/osdep.h | \
    *include/qemu/compiler.h | \
    *include/glib-compat.h | \
    *include/sysemu/os-posix.h | \
    *include/sysemu/os-win32.h | \
    *include/standard-headers/ )
      # Removing include lines from osdep.h itself would be counterproductive.
      echo "SKIPPING $f (special case header)"
      continue
      ;;
    *include/standard-headers/*)
      echo "SKIPPING $f (autogenerated header)"
      continue
      ;;
    *.h)
      MODE=h
      ;;
    *)
      echo "WARNING: ignoring $f (cannot handle non-C files)"
      continue
      ;;
  esac

  if [ "$MODE" = "c" ]; then
    # First, use Coccinelle to add qemu/osdep.h before the first existing include
    # (this will add two lines if the file uses both "..." and <...> #includes,
    # but we will remove the extras in the next step)
    spatch  --in-place --no-show-diff --cocci-file "$COCCIFILE" "$f"

    # Now remove any duplicate osdep.h includes
    perl -n -i -e 'print if !/#include "qemu\/osdep.h"/ || !$n++;' "$f"
  else
    # Remove includes of osdep.h itself
    perl -n -i -e 'print if !/\s*#\s*include\s*(["<][^>"]*[">])/ ||
                            ! (grep { $_ eq $1 } qw ("qemu/osdep.h"))' "$f"
  fi

  # Remove includes that osdep.h already provides
  perl -n -i -e 'print if !/\s*#\s*include\s*(["<][^>"]*[">])/ ||
                          ! (grep { $_ eq $1 } qw (
           "config-host.h" "config-target.h" "qemu/compiler.h"
           <setjmp.h> <stdarg.h> <stddef.h> <stdbool.h> <stdint.h> <sys/types.h>
           <stdlib.h> <stdio.h> <string.h> <strings.h> <inttypes.h>
           <limits.h> <unistd.h> <time.h> <ctype.h> <errno.h> <fcntl.h>
           <sys/stat.h> <sys/time.h> <assert.h> <signal.h> <glib.h>
           <sys/stat.h> <sys/time.h> <assert.h> <signal.h> <glib.h> <sys/mman.h>
           "sysemu/os-posix.h, sysemu/os-win32.h "glib-compat.h"
           "qemu/typedefs.h"
            ))' "$f"

done

if [ "$DUPHEAD" = "yes" ]; then
    egrep "^[[:space:]]*#[[:space:]]*include" "$@" | tr -d '[:blank:]' \
        | sort | uniq -c | awk '{if ($1 > 1) print $0}'
    if [ $? -eq 0 ]; then
        echo "Found duplicate header file includes. Please check the above files manually."
        exit 1
    fi
fi

if [ "$GIT" = "yes" ]; then
    git add -- "$@"
    git commit --signoff -F - <<EOF
$GITSUBJ: Clean up includes

Clean up includes so that osdep.h is included first and headers
which it implies are not included manually.

This commit was created with scripts/clean-includes.

EOF

fi
