virtualenv/setup/create_python_env.py
changeset 47 4ed054be603f
parent 30 83f4abc7568f
child 50 0d59e0522d36
equal deleted inserted replaced
44:20ab9a7f1849 47:4ed054be603f
    30 # - pylucene  - script
    30 # - pylucene  - script
    31 
    31 
    32 src_base = os.path.join(here,"res","src").replace("\\","/")
    32 src_base = os.path.join(here,"res","src").replace("\\","/")
    33 lib_path = os.path.abspath(os.path.join(here,"res","lib")).replace("\\","/")
    33 lib_path = os.path.abspath(os.path.join(here,"res","lib")).replace("\\","/")
    34 
    34 
    35 EXTRA_TEXT  = "URLS = { \n"
    35 EXTRA_TEXT  = "import sys\n"
       
    36 EXTRA_TEXT += "sys.path.append('%s')\n" % (lib_path)
       
    37 f = open(os.path.join(os.path. os.path.join(os.path.dirname(os.path.abspath(__file__)),"res"),'res_create_env.py'), 'r')
       
    38 EXTRA_TEXT += f.read()
       
    39 EXTRA_TEXT += "\n"
       
    40 EXTRA_TEXT += "RES_ENV = ResourcesEnv('%s')\n" % (src_base)
    36 
    41 
    37 EXTRA_TEXT += "    'DISTRIBUTE' : { 'setup': 'distribute', 'url': 'http://pypi.python.org/packages/source/d/distribute/distribute-0.6.14.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"distribute-0.6.14.tar.gz")).replace("\\","/")+"'},\n"
       
    38 EXTRA_TEXT += "    'MERCURIAL' : { 'setup': 'distribute', 'url': 'http://pypi.python.org/packages/source/d/mercurial/mercurial-1.7.5.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"mercurial-1.7.5.tar.gz")).replace("\\","/")+"'},\n"
       
    39 EXTRA_TEXT += "}\n"
       
    40 
       
    41 EXTRA_TEXT += "import sys\n"
       
    42 EXTRA_TEXT += "sys.path.append('"+lib_path+"')\n"
       
    43 
       
    44 EXTRA_TEXT += """
       
    45 
       
    46 import shutil
       
    47 import tarfile
       
    48 import zipfile
       
    49 import urllib
       
    50 import platform
       
    51 
       
    52 
       
    53 INDEX_URL = 'http://pypi.python.org/simple/'
       
    54 
       
    55 
       
    56 def extend_parser(parser):
       
    57     parser.add_option(
       
    58         '--index-url',
       
    59         metavar='INDEX_URL',
       
    60         dest='index_url',
       
    61         default='',
       
    62         help='base URL of Python Package Index')
       
    63     parser.add_option(
       
    64         '--type-install',
       
    65         metavar='type_install',
       
    66         dest='type_install',
       
    67         default='local',
       
    68         help='type install : local, url, setup')
       
    69     parser.add_option(
       
    70         '--ignore-packages',
       
    71         metavar='ignore_packages',
       
    72         dest='ignore_packages',
       
    73         default=None,
       
    74         help='list of comma separated keys for package to ignore')
       
    75 
       
    76 
       
    77 
       
    78 def adjust_options(options, args):
       
    79     pass
       
    80 
       
    81 
       
    82 def after_install(options, home_dir):
       
    83     home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir)
       
    84     base_dir = os.path.dirname(home_dir)
       
    85     src_dir = join(home_dir, 'src')
       
    86     tmp_dir = join(home_dir, 'tmp')
       
    87     ensure_dir(src_dir)
       
    88     ensure_dir(tmp_dir)
       
    89     system_str = platform.system()
       
    90     
       
    91     res_source_key = options.type_install
       
    92     
       
    93     ignore_packages = []
       
    94     
       
    95     if options.ignore_packages :
       
    96         ignore_packages = options.ignore_packages.split(",")
       
    97     
       
    98     logger.indent += 2
       
    99     try:
       
   100         NORMAL_INSTALL = [ #(key,method, option_str, extra_env)
       
   101             ('DISTRIBUTE', 'pip', None, None),
       
   102             ('MERCURIAL', 'pip', None, None),
       
   103             ]
       
   104 
       
   105             
       
   106         for key, method, option_str, extra_env in NORMAL_INSTALL:
       
   107             if key not in ignore_packages:
       
   108                 normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir)
       
   109                         
       
   110         logger.notify("Clear source dir")
       
   111         shutil.rmtree(src_dir)
       
   112 
       
   113     finally:
       
   114         logger.indent -= 2
       
   115     script_dir = join(base_dir, bin_dir)
       
   116     logger.notify('Run "%s Package" to install new packages that provide builds'
       
   117                   % join(script_dir, 'easy_install'))
       
   118 
       
   119 
       
   120 def normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir):
       
   121     logger.notify("Install %s from %s with %s" % (key,URLS[key][res_source_key],method))
       
   122     if method == 'pip':
       
   123         if sys.platform == 'win32':
       
   124             args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'pip')), 'install', '-E', os.path.abspath(home_dir), URLS[key][res_source_key]]
       
   125         else:
       
   126             args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', '-E', os.path.abspath(home_dir), URLS[key][res_source_key]]
       
   127         if option_str :
       
   128             args.insert(4,option_str)
       
   129         call_subprocess(args,
       
   130                 cwd=os.path.abspath(tmp_dir),
       
   131                 filter_stdout=filter_python_develop,
       
   132                 show_stdout=True,
       
   133                 extra_env=extra_env)
       
   134     else:
       
   135         if sys.platform == 'win32':
       
   136             args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'easy_install')), URLS[key][res_source_key]]
       
   137         else:
       
   138             args = [os.path.abspath(os.path.join(home_dir, 'bin', 'easy_install')), URLS[key][res_source_key]]
       
   139         if option_str :
       
   140             args.insert(1,option_str)
       
   141         call_subprocess(args,
       
   142                 cwd=os.path.abspath(tmp_dir),
       
   143                 filter_stdout=filter_python_develop,
       
   144                 show_stdout=True,
       
   145                 extra_env=extra_env)
       
   146     
       
   147 
       
   148 def ensure_dir(dir):
       
   149     if not os.path.exists(dir):
       
   150         logger.notify('Creating directory %s' % dir)
       
   151         os.makedirs(dir)
       
   152 
       
   153 def filter_python_develop(line):
       
   154     if not line.strip():
       
   155         return Logger.DEBUG
       
   156     for prefix in ['Searching for', 'Reading ', 'Best match: ', 'Processing ',
       
   157                    'Moving ', 'Adding ', 'running ', 'writing ', 'Creating ',
       
   158                    'creating ', 'Copying ']:
       
   159         if line.startswith(prefix):
       
   160             return Logger.DEBUG
       
   161     return Logger.NOTIFY
       
   162 """
       
   163 
    42 
   164 def main():
    43 def main():
   165     python_version = ".".join(map(str,sys.version_info[0:2]))
    44     python_version = ".".join(map(str,sys.version_info[0:2]))
   166     text = virtualenv.create_bootstrap_script(EXTRA_TEXT, python_version=python_version)
    45     text = virtualenv.create_bootstrap_script(EXTRA_TEXT, python_version=python_version)
   167     if os.path.exists(script_name):
    46     if os.path.exists(script_name):