#!/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] file ...
# or
#   clean-includes [--git subjectprefix] --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.
#
# 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

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

if [ $# -ne 0 ] && [ "$1" = "--git" ]; then
    if [ $# -eq 1 ]; then
        echo "--git option requires an argument"
        exit 1
    fi
    GITSUBJ="$2"
    GIT=yes
    shift
    shift
fi

if [ $# -eq 0 ]; then
    echo "Usage: clean-includes [--git subjectprefix] [--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 [ "$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
