#!/usr/bin/python
#

# Copyright (C) 2011 Google Inc.
#
# 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., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.


"""Script to check module imports.

"""

# pylint: disable=C0103
# C0103: Invalid name

import sys

# All modules imported after this line are removed from the global list before
# importing a module to be checked
_STANDARD_MODULES = sys.modules.keys()

import os.path

from ganeti import build


def main():
  args = sys.argv[1:]

  # Get references to functions used later on
  load_module = build.LoadModule
  abspath = os.path.abspath
  commonprefix = os.path.commonprefix
  normpath = os.path.normpath

  script_path = abspath(__file__)
  srcdir = normpath(abspath(args.pop(0)))

  assert "ganeti" in sys.modules

  for filename in args:
    # Reset global state
    for name in sys.modules.keys():
      if name not in _STANDARD_MODULES:
        sys.modules.pop(name, None)

    assert "ganeti" not in sys.modules

    # Load module (this might import other modules)
    module = load_module(filename)

    result = []

    for (name, checkmod) in sorted(sys.modules.items()):
      if checkmod is None or checkmod == module:
        continue

      try:
        checkmodpath = getattr(checkmod, "__file__")
      except AttributeError:
        # Built-in module
        pass
      else:
        abscheckmodpath = os.path.abspath(checkmodpath)

        if abscheckmodpath == script_path:
          # Ignore check script
          continue

        if commonprefix([abscheckmodpath, srcdir]) == srcdir:
          result.append(name)

    if result:
      raise Exception("Module '%s' has illegal imports: %s" %
                      (filename, ", ".join(result)))


if __name__ == "__main__":
  main()
