#!/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)'

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

files=
for f in "$@"; do
  if [ -L "$f" ]; then
      echo "SKIPPING $f (symbolic link)"
      continue
  fi
  case "$f" in
    *.c.inc)
      # 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/qemu/qemu-plugin.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
  files="$files $f"

  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" ] && [ -n "$files" ]; then
    if egrep "^[[:space:]]*#[[:space:]]*include" $files | tr -d '[:blank:]' \
        | sort | uniq -c | grep -v '^ *1 '; then
        echo "Found duplicate header file includes. Please check the above files manually."
        exit 1
    fi
fi

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

This commit was created with scripts/clean-includes.

All .c should include qemu/osdep.h first.  The script performs three
related cleanups:

* Ensure .c files include qemu/osdep.h first.
* Including it in a .h is redundant, since the .c  already includes
  it.  Drop such inclusions.
* Likewise, including headers qemu/osdep.h includes is redundant.
  Drop these, too.

EOF

fi
