#!/usr/bin/python
#

# Copyright (C) 2011 Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


"""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()
