site.py revision ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1f
1ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot"""Append module search paths for third-party packages to sys.path.
2ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
3ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot****************************************************************
4ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot* This module is automatically imported during initialization. *
5ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot****************************************************************
6ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
7ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team RobotIn earlier versions of Python (up to 1.5a3), scripts or modules that
8ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotneeded to use site-specific modules would place ``import site''
9ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotsomewhere near the top of their code.  Because of the automatic
10ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport, this is no longer necessary (but code that does it still
11ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotworks).
12ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
13ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team RobotThis will append site-specific paths to the module search path.  On
14ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team RobotUnix (including Mac OSX), it starts with sys.prefix and
15ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotsys.exec_prefix (if different) and appends
16ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotlib/python<version>/site-packages as well as lib/site-python.
17ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team RobotOn other platforms (such as Windows), it tries each of the
18ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotprefixes directly, as well as with lib/site-packages appended.  The
19ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotresulting directories, if they exist, are appended to sys.path, and
20ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotalso inspected for path configuration files.
21ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
22ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team RobotA path configuration file is a file whose name has the form
23ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot<package>.pth; its contents are additional directories (one per line)
24ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotto be added to sys.path.  Non-existing directories (or
25ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotnon-directories) are never added to sys.path; no directory is added to
26ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotsys.path more than once.  Blank lines and lines beginning with
27ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot'#' are skipped. Lines starting with 'import' are executed.
28ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
29ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team RobotFor example, suppose sys.prefix and sys.exec_prefix are set to
30ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot/usr/local and there is a directory /usr/local/lib/python2.5/site-packages
31ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotwith three subdirectories, foo, bar and spam, and two path
32ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotconfiguration files, foo.pth and bar.pth.  Assume foo.pth contains the
33ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotfollowing:
34ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
35ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot  # foo package configuration
36ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot  foo
37ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot  bar
38ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot  bletch
39ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
40ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotand bar.pth contains:
41ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
42ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot  # bar package configuration
43ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot  bar
44ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
45ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team RobotThen the following directories are added to sys.path, in this order:
46ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
47ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot  /usr/local/lib/python2.5/site-packages/bar
48ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot  /usr/local/lib/python2.5/site-packages/foo
49ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
50ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team RobotNote that bletch is omitted because it doesn't exist; bar precedes foo
51ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotbecause bar.pth comes alphabetically before foo.pth; and spam is
52ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotomitted because it is not mentioned in either path configuration file.
53ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
54ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team RobotAfter these path manipulations, an attempt is made to import a module
55ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotnamed sitecustomize, which can perform arbitrary additional
56ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotsite-specific customizations.  If this import fails with an
57ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team RobotImportError exception, it is silently ignored.
58ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
59ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot"""
60ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
61ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport sys
62ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport os
63ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport __builtin__
64ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport traceback
65ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
66ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# Prefixes for site-packages; add additional prefixes like /usr/local here
67ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team RobotPREFIXES = [sys.prefix, sys.exec_prefix]
68ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# Enable per user site-packages directory
69ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# set it to False to disable the feature or True to force the feature
70ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team RobotENABLE_USER_SITE = None
71ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
72ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# for distutils.commands.install
73ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# These values are initialized by the getuserbase() and getusersitepackages()
74ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# functions, through the main() function when Python starts.
75ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team RobotUSER_SITE = None
76ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team RobotUSER_BASE = None
77ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
78ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
79ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef makepath(*paths):
80ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    dir = os.path.join(*paths)
81ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    try:
82ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        dir = os.path.abspath(dir)
83ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    except OSError:
84ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pass
85ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    return dir, os.path.normcase(dir)
86ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
87ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
88ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef abs__file__():
89ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Set all module' __file__ attribute to an absolute path"""
90ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    for m in sys.modules.values():
91ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if hasattr(m, '__loader__'):
92ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            continue   # don't mess with a PEP 302-supplied __file__
93ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        try:
94ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            m.__file__ = os.path.abspath(m.__file__)
95ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        except (AttributeError, OSError):
96ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            pass
97ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
98ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
99ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef removeduppaths():
100ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """ Remove duplicate entries from sys.path along with making them
101ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    absolute"""
102ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # This ensures that the initial path provided by the interpreter contains
103ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # only absolute pathnames, even if we're running from the build directory.
104ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    L = []
105ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    known_paths = set()
106ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    for dir in sys.path:
107ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Filter out duplicate paths (on case-insensitive file systems also
108ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # if they only differ in case); turn relative paths into absolute
109ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # paths.
110ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        dir, dircase = makepath(dir)
111ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if not dircase in known_paths:
112ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            L.append(dir)
113ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            known_paths.add(dircase)
114ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    sys.path[:] = L
115ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    return known_paths
116ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
117ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
118ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef _init_pathinfo():
119ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Return a set containing all existing directory entries from sys.path"""
120ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    d = set()
121ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    for dir in sys.path:
122ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        try:
123ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if os.path.isdir(dir):
124ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                dir, dircase = makepath(dir)
125ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                d.add(dircase)
126ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        except TypeError:
127ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            continue
128ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    return d
129ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
130ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
131ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef addpackage(sitedir, name, known_paths):
132ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Process a .pth file within the site-packages directory:
133ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot       For each line in the file, either combine it with sitedir to a path
134ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot       and add that to known_paths, or execute it if it starts with 'import '.
135ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """
136ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if known_paths is None:
137ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _init_pathinfo()
138ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reset = 1
139ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    else:
140ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reset = 0
141ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    fullname = os.path.join(sitedir, name)
142ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    try:
143ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = open(fullname, "rU")
144ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    except IOError:
145ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return
146ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    with f:
147ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for n, line in enumerate(f):
148ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if line.startswith("#"):
149ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                continue
150ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            try:
151ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                if line.startswith(("import ", "import\t")):
152ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    exec line
153ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    continue
154ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                line = line.rstrip()
155ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                dir, dircase = makepath(sitedir, line)
156ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                if not dircase in known_paths and os.path.exists(dir):
157ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    sys.path.append(dir)
158ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    known_paths.add(dircase)
159ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            except Exception as err:
160ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                print >>sys.stderr, "Error processing line {:d} of {}:\n".format(
161ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    n+1, fullname)
162ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                for record in traceback.format_exception(*sys.exc_info()):
163ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    for line in record.splitlines():
164ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        print >>sys.stderr, '  '+line
165ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                print >>sys.stderr, "\nRemainder of file ignored"
166ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                break
167ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if reset:
168ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        known_paths = None
169ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    return known_paths
170ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
171ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
172ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef addsitedir(sitedir, known_paths=None):
173ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Add 'sitedir' argument to sys.path if missing and handle .pth files in
174ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    'sitedir'"""
175ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if known_paths is None:
176ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        known_paths = _init_pathinfo()
177ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reset = 1
178ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    else:
179ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reset = 0
180ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    sitedir, sitedircase = makepath(sitedir)
181ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if not sitedircase in known_paths:
182ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        sys.path.append(sitedir)        # Add path component
183ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    try:
184ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        names = os.listdir(sitedir)
185ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    except os.error:
186ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return
187ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    dotpth = os.extsep + "pth"
188ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    names = [name for name in names if name.endswith(dotpth)]
189ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    for name in sorted(names):
190ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        addpackage(sitedir, name, known_paths)
191ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if reset:
192ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        known_paths = None
193ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    return known_paths
194ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
195ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
196ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef check_enableusersite():
197ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Check if user site directory is safe for inclusion
198ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
199ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    The function tests for the command line flag (including environment var),
200ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    process uid/gid equal to effective uid/gid.
201ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
202ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    None: Disabled for security reasons
203ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    False: Disabled by user (command line option)
204ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    True: Safe and enabled
205ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """
206ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if sys.flags.no_user_site:
207ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return False
208ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
209ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if hasattr(os, "getuid") and hasattr(os, "geteuid"):
210ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # check process uid == effective uid
211ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if os.geteuid() != os.getuid():
212ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return None
213ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if hasattr(os, "getgid") and hasattr(os, "getegid"):
214ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # check process gid == effective gid
215ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if os.getegid() != os.getgid():
216ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return None
217ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
218ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    return True
219ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
220ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef getuserbase():
221ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Returns the `user base` directory path.
222ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
223ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    The `user base` directory can be used to store data. If the global
224ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    variable ``USER_BASE`` is not initialized yet, this function will also set
225ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    it.
226ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """
227ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    global USER_BASE
228ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if USER_BASE is not None:
229ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return USER_BASE
230ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    from sysconfig import get_config_var
231ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    USER_BASE = get_config_var('userbase')
232ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    return USER_BASE
233ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
234ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef getusersitepackages():
235ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Returns the user-specific site-packages directory path.
236ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
237ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    If the global variable ``USER_SITE`` is not initialized yet, this
238ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    function will also set it.
239ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """
240ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    global USER_SITE
241ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    user_base = getuserbase() # this will also set USER_BASE
242ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
243ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if USER_SITE is not None:
244ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return USER_SITE
245ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
246ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    from sysconfig import get_path
247ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    import os
248ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
249ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if sys.platform == 'darwin':
250ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        from sysconfig import get_config_var
251ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if get_config_var('PYTHONFRAMEWORK'):
252ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            USER_SITE = get_path('purelib', 'osx_framework_user')
253ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return USER_SITE
254ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
255ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    USER_SITE = get_path('purelib', '%s_user' % os.name)
256ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    return USER_SITE
257ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
258ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef addusersitepackages(known_paths):
259ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Add a per user site-package to sys.path
260ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
261ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    Each user has its own python directory with site-packages in the
262ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    home directory.
263ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """
264ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # get the per user site-package path
265ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # this call will also make sure USER_BASE and USER_SITE are set
266ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    user_site = getusersitepackages()
267ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
268ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if ENABLE_USER_SITE and os.path.isdir(user_site):
269ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        addsitedir(user_site, known_paths)
270ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    return known_paths
271ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
272ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef getsitepackages():
273ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Returns a list containing all global site-packages directories
274ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    (and possibly site-python).
275ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
276ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    For each directory present in the global ``PREFIXES``, this function
277ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    will find its `site-packages` subdirectory depending on the system
278ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    environment, and will return a list of full paths.
279ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """
280ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    sitepackages = []
281ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    seen = set()
282ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
283ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    for prefix in PREFIXES:
284ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if not prefix or prefix in seen:
285ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            continue
286ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        seen.add(prefix)
287ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
288ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if sys.platform in ('os2emx', 'riscos'):
289ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))
290ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        elif os.sep == '/':
291ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            sitepackages.append(os.path.join(prefix, "lib",
292ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                        "python" + sys.version[:3],
293ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                        "site-packages"))
294ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            sitepackages.append(os.path.join(prefix, "lib", "site-python"))
295ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
296ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            sitepackages.append(prefix)
297ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
298ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if sys.platform == "darwin":
299ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # for framework builds *only* we add the standard Apple
300ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # locations.
301ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            from sysconfig import get_config_var
302ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            framework = get_config_var("PYTHONFRAMEWORK")
303ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if framework:
304ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                sitepackages.append(
305ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        os.path.join("/Library", framework,
306ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                            sys.version[:3], "site-packages"))
307ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    return sitepackages
308ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
309ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef addsitepackages(known_paths):
310ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Add site-packages (and possibly site-python) to sys.path"""
311ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    for sitedir in getsitepackages():
312ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if os.path.isdir(sitedir):
313ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            addsitedir(sitedir, known_paths)
314ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
315ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    return known_paths
316ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
317ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef setBEGINLIBPATH():
318ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """The OS/2 EMX port has optional extension modules that do double duty
319ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    as DLLs (and must use the .DLL file extension) for other extensions.
320ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    The library search path needs to be amended so these will be found
321ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    during module import.  Use BEGINLIBPATH so that these are at the start
322ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    of the library search path.
323ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
324ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """
325ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload")
326ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    libpath = os.environ['BEGINLIBPATH'].split(';')
327ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if libpath[-1]:
328ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        libpath.append(dllpath)
329ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    else:
330ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        libpath[-1] = dllpath
331ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    os.environ['BEGINLIBPATH'] = ';'.join(libpath)
332ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
333ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
334ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef setquit():
335ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Define new builtins 'quit' and 'exit'.
336ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
337ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    These are objects which make the interpreter exit when called.
338ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    The repr of each object contains a hint at how it works.
339ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
340ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """
341ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if os.sep == ':':
342ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        eof = 'Cmd-Q'
343ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    elif os.sep == '\\':
344ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        eof = 'Ctrl-Z plus Return'
345ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    else:
346ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        eof = 'Ctrl-D (i.e. EOF)'
347ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
348ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    class Quitter(object):
349ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __init__(self, name):
350ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.name = name
351ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __repr__(self):
352ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return 'Use %s() or %s to exit' % (self.name, eof)
353ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def __call__(self, code=None):
354ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Shells like IDLE catch the SystemExit, but listen when their
355ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # stdin wrapper is closed.
356ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            try:
357ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                sys.stdin.close()
358ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            except:
359ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                pass
360ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            raise SystemExit(code)
361ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    __builtin__.quit = Quitter('quit')
362ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    __builtin__.exit = Quitter('exit')
363ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
364ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
365ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass _Printer(object):
366ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """interactive prompt objects for printing the license text, a list of
367ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    contributors and the copyright notice."""
368ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
369ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    MAXLINES = 23
370ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
371ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__(self, name, data, files=(), dirs=()):
372ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.__name = name
373ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.__data = data
374ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.__files = files
375ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.__dirs = dirs
376ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.__lines = None
377ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
378ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __setup(self):
379ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if self.__lines:
380ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return
381ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        data = None
382ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for dir in self.__dirs:
383ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for filename in self.__files:
384ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                filename = os.path.join(dir, filename)
385ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                try:
386ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    fp = file(filename, "rU")
387ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    data = fp.read()
388ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    fp.close()
389ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    break
390ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                except IOError:
391ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    pass
392ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if data:
393ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                break
394ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if not data:
395ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            data = self.__data
396ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.__lines = data.split('\n')
397ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.__linecnt = len(self.__lines)
398ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
399ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __repr__(self):
400ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.__setup()
401ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if len(self.__lines) <= self.MAXLINES:
402ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return "\n".join(self.__lines)
403ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
404ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return "Type %s() to see the full %s text" % ((self.__name,)*2)
405ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
406ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __call__(self):
407ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.__setup()
408ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        prompt = 'Hit Return for more, or q (and Return) to quit: '
409ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        lineno = 0
410ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        while 1:
411ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            try:
412ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                for i in range(lineno, lineno + self.MAXLINES):
413ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    print self.__lines[i]
414ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            except IndexError:
415ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                break
416ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            else:
417ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                lineno += self.MAXLINES
418ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                key = None
419ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                while key is None:
420ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    key = raw_input(prompt)
421ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    if key not in ('', 'q'):
422ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        key = None
423ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                if key == 'q':
424ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    break
425ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
426ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef setcopyright():
427ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Set 'copyright' and 'credits' in __builtin__"""
428ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    __builtin__.copyright = _Printer("copyright", sys.copyright)
429ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if sys.platform[:4] == 'java':
430ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        __builtin__.credits = _Printer(
431ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            "credits",
432ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            "Jython is maintained by the Jython developers (www.jython.org).")
433ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    else:
434ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        __builtin__.credits = _Printer("credits", """\
435ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
436ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    for supporting Python development.  See www.python.org for more information.""")
437ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    here = os.path.dirname(os.__file__)
438ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    __builtin__.license = _Printer(
439ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        "license", "See http://www.python.org/%.3s/license.html" % sys.version,
440ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        ["LICENSE.txt", "LICENSE"],
441ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        [os.path.join(here, os.pardir), here, os.curdir])
442ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
443ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
444ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass _Helper(object):
445ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Define the builtin 'help'.
446ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    This is a wrapper around pydoc.help (with a twist).
447ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
448ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """
449ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
450ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __repr__(self):
451ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return "Type help() for interactive help, " \
452ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot               "or help(object) for help about object."
453ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __call__(self, *args, **kwds):
454ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        import pydoc
455ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return pydoc.help(*args, **kwds)
456ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
457ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef sethelper():
458ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    __builtin__.help = _Helper()
459ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
460ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef aliasmbcs():
461ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """On Windows, some default encodings are not provided by Python,
462ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    while they are always available as "mbcs" in each locale. Make
463ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    them usable by aliasing to "mbcs" in such a case."""
464ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if sys.platform == 'win32':
465ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        import locale, codecs
466ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        enc = locale.getdefaultlocale()[1]
467ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if enc.startswith('cp'):            # "cp***" ?
468ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            try:
469ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                codecs.lookup(enc)
470ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            except LookupError:
471ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                import encodings
472ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                encodings._cache[enc] = encodings._unknown
473ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                encodings.aliases.aliases[enc] = 'mbcs'
474ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
475ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef setencoding():
476ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Set the string encoding used by the Unicode implementation.  The
477ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    default is 'ascii', but if you're willing to experiment, you can
478ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    change this."""
479ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    encoding = "ascii" # Default value set by _PyUnicode_Init()
480ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if 0:
481ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Enable to support locale aware default string encodings.
482ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        import locale
483ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        loc = locale.getdefaultlocale()
484ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if loc[1]:
485ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            encoding = loc[1]
486ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if 0:
487ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Enable to switch off string to Unicode coercion and implicit
488ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Unicode to string conversion.
489ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        encoding = "undefined"
490ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if encoding != "ascii":
491ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # On Non-Unicode builds this will raise an AttributeError...
492ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        sys.setdefaultencoding(encoding) # Needs Python Unicode build !
493ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
494ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
495ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef execsitecustomize():
496ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Run custom site specific code, if available."""
497ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    try:
498ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        import sitecustomize
499ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    except ImportError:
500ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pass
501ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    except Exception:
502ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if sys.flags.verbose:
503ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            sys.excepthook(*sys.exc_info())
504ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
505ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            print >>sys.stderr, \
506ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                "'import sitecustomize' failed; use -v for traceback"
507ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
508ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
509ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef execusercustomize():
510ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Run custom user specific code, if available."""
511ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    try:
512ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        import usercustomize
513ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    except ImportError:
514ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pass
515ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    except Exception:
516ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if sys.flags.verbose:
517ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            sys.excepthook(*sys.exc_info())
518ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
519ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            print>>sys.stderr, \
520ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                "'import usercustomize' failed; use -v for traceback"
521ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
522ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
523ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef main():
524ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    global ENABLE_USER_SITE
525ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
526ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    abs__file__()
527ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    known_paths = removeduppaths()
528ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if ENABLE_USER_SITE is None:
529ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        ENABLE_USER_SITE = check_enableusersite()
530ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    known_paths = addusersitepackages(known_paths)
531ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    known_paths = addsitepackages(known_paths)
532ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if sys.platform == 'os2emx':
533ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        setBEGINLIBPATH()
534ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    setquit()
535ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    setcopyright()
536ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    sethelper()
537ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    aliasmbcs()
538ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    setencoding()
539ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    execsitecustomize()
540ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if ENABLE_USER_SITE:
541ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        execusercustomize()
542ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # Remove sys.setdefaultencoding() so that users cannot change the
543ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # encoding after initialization.  The test for presence is needed when
544ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # this module is run as a script, because this code is executed twice.
545ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if hasattr(sys, "setdefaultencoding"):
546ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        del sys.setdefaultencoding
547ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
548ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotmain()
549ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
550ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef _script():
551ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    help = """\
552ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    %s [--user-base] [--user-site]
553ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
554ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    Without arguments print some useful information
555ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    With arguments print the value of USER_BASE and/or USER_SITE separated
556ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    by '%s'.
557ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
558ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    Exit codes with --user-base or --user-site:
559ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot      0 - user site directory is enabled
560ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot      1 - user site directory is disabled by user
561ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot      2 - uses site directory is disabled by super user
562ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot          or for security reasons
563ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot     >2 - unknown error
564ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """
565ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    args = sys.argv[1:]
566ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if not args:
567ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        print "sys.path = ["
568ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for dir in sys.path:
569ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            print "    %r," % (dir,)
570ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        print "]"
571ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        print "USER_BASE: %r (%s)" % (USER_BASE,
572ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            "exists" if os.path.isdir(USER_BASE) else "doesn't exist")
573ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        print "USER_SITE: %r (%s)" % (USER_SITE,
574ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            "exists" if os.path.isdir(USER_SITE) else "doesn't exist")
575ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        print "ENABLE_USER_SITE: %r" %  ENABLE_USER_SITE
576ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        sys.exit(0)
577ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
578ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    buffer = []
579ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if '--user-base' in args:
580ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        buffer.append(USER_BASE)
581ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if '--user-site' in args:
582ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        buffer.append(USER_SITE)
583ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
584ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    if buffer:
585ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        print os.pathsep.join(buffer)
586ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if ENABLE_USER_SITE:
587ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            sys.exit(0)
588ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        elif ENABLE_USER_SITE is False:
589ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            sys.exit(1)
590ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        elif ENABLE_USER_SITE is None:
591ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            sys.exit(2)
592ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
593ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            sys.exit(3)
594ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    else:
595ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        import textwrap
596ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        print textwrap.dedent(help % (sys.argv[0], os.pathsep))
597ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        sys.exit(10)
598ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
599ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotif __name__ == '__main__':
600ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    _script()
601