check-imports 2.9 KB
Newer Older
1 2 3 4
#!/usr/bin/python
#

# Copyright (C) 2011 Google Inc.
Klaus Aehlig's avatar
Klaus Aehlig committed
5
# All rights reserved.
6
#
Klaus Aehlig's avatar
Klaus Aehlig committed
7 8 9
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
10
#
Klaus Aehlig's avatar
Klaus Aehlig committed
11 12
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
13
#
Klaus Aehlig's avatar
Klaus Aehlig committed
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
# 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.
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101


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