virtualenv/web/create_python_env.py
changeset 17 ab47434f9ffc
parent 13 97ab7b3191cf
child 22 03d02cf0bea7
equal deleted inserted replaced
15:ad8856219008 17:ab47434f9ffc
    31 # - PIL -> pip
    31 # - PIL -> pip
    32 # - pyxml -> pip
    32 # - pyxml -> pip
    33 # - 4Suite-xml - easy_install ftp://ftp.4suite.org/pub/4Suite/4Suite-XML-1.0.2.tar.bz2
    33 # - 4Suite-xml - easy_install ftp://ftp.4suite.org/pub/4Suite/4Suite-XML-1.0.2.tar.bz2
    34 # - pylucene  - script
    34 # - pylucene  - script
    35 
    35 
    36 src_base = os.path.join(here,"res","src")
    36 src_base = os.path.join(here,"res","src").replace("\\","/")
    37 lib_path = os.path.abspath(os.path.join(here,"res","lib"))
    37 lib_path = os.path.abspath(os.path.join(here,"res","lib")).replace("\\","/")
    38 patch_path = os.path.abspath(os.path.join(here,"res","patch"))
    38 patch_path = os.path.abspath(os.path.join(here,"res","patch")).replace("\\","/")
    39 
    39 
    40 EXTRA_TEXT  = "URLS = { \n"
    40 EXTRA_TEXT  = "URLS = { \n"
    41 
    41 
    42 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"))+"'},\n"
    42 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"
    43 EXTRA_TEXT += "    'PSYCOPG2' : { 'setup': 'psycopg2','url': 'http://initd.org/psycopg/tarballs/PSYCOPG-2-3/psycopg2-2.3.2.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"psycopg2-2.3.2.tar.gz"))+"'},\n"
    43 if sys.platform == 'win32':
    44 EXTRA_TEXT += "    'MYSQL' : { 'setup': 'mysql-python', 'url': 'http://sourceforge.net/projects/mysql-python/files/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz/download', 'local' : '"+ os.path.abspath(os.path.join(src_base,"MySQL-python-1.2.3.tar.gz"))+"'},\n"
    44     EXTRA_TEXT += "    'PSYCOPG2' : { 'setup': 'psycopg2','url': 'D:/wakimd/dev/hg/platform/virtualenv/web/res/src/psycopg2-2.0.10.win32-py2.6-pg8.3.7-release.zip', 'local': '"+ os.path.abspath(os.path.join(src_base,"psycopg2-2.0.10.win32-py2.6-pg8.3.7-release.zip")).replace("\\","/")+"'},\n"
    45 EXTRA_TEXT += "    'PYLUCENE' : { 'setup': 'http://apache.crihan.fr/dist/lucene/pylucene/pylucene-3.0.3-1-src.tar.gz', 'url': 'http://apache.crihan.fr/dist/lucene/pylucene/pylucene-3.0.3-1-src.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"pylucene-3.0.3-1-src.tar.gz"))+"'},\n"
    45 else:
    46 EXTRA_TEXT += "    'PIL' : { 'setup': 'pil', 'url': 'http://effbot.org/downloads/Imaging-1.1.7.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"Imaging-1.1.7.tar.gz"))+"'},\n"
    46     EXTRA_TEXT += "    'PSYCOPG2' : { 'setup': 'psycopg2','url': 'http://initd.org/psycopg/tarballs/PSYCOPG-2-3/psycopg2-2.3.2.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"psycopg2-2.3.2.tar.gz")).replace("\\","/")+"'},\n"
    47 EXTRA_TEXT += "    'DJANGO' : { 'setup': 'django', 'url': 'http://www.djangoproject.com/download/1.2.4/tarball/', 'local': '"+ os.path.abspath(os.path.join(src_base,"Django-1.2.4.tar.gz"))+"'},\n"
    47 EXTRA_TEXT += "    'MYSQL' : { 'setup': 'mysql-python', 'url': 'http://sourceforge.net/projects/mysql-python/files/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz/download', 'local' : '"+ os.path.abspath(os.path.join(src_base,"MySQL-python-1.2.3.tar.gz")).replace("\\","/")+"'},\n"
    48 EXTRA_TEXT += "    'JOGGING' : { 'setup': 'jogging', 'url': 'http://github.com/zain/jogging/tarball/v0.2.2', 'local': '"+ os.path.abspath(os.path.join(src_base,"jogging-0.2.2.tar.gz"))+"'},\n"
    48 if sys.platform == 'win32':
    49 EXTRA_TEXT += "    'DJANGO-EXTENSIONS' : { 'setup': 'django-extensions', 'url':'https://github.com/django-extensions/django-extensions/tarball/0.6', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-extensions-0.6.tar.gz"))+"' },\n"
    49     EXTRA_TEXT += "    'PYLUCENE' : { 'setup': 'http://pylucene-win32-binary.googlecode.com/files/lucene-3.0.2-py2.6-win32.egg', 'local': '"+ os.path.abspath(os.path.join(src_base,"lucene-3.0.2-py2.6-win32.egg")).replace("\\","/")+"'},\n"
    50 EXTRA_TEXT += "    'DJANGO-REGISTRATION' : { 'setup': 'django-registration', 'url':'http://bitbucket.org/ubernostrum/django-registration/get/tip.tar.gz', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-registration.tar.gz"))+"' },\n"
    50     EXTRA_TEXT += "    'JCC' : { 'setup': 'http://pylucene-win32-binary.googlecode.com/files/JCC-2.6-py2.6-win32.egg', 'local': '"+ os.path.abspath(os.path.join(src_base,"JCC-2.6-py2.6-win32.egg")).replace("\\","/")+"'},\n"
    51 EXTRA_TEXT += "    'DJANGO-TAGGING' : { 'setup': 'django-tagging', 'url':'http://django-tagging.googlecode.com/files/django-tagging-0.3.1.tar.gz', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-tagging-0.3.1.tar.gz"))+"' },\n"
    51 else:
    52 EXTRA_TEXT += "    'DJANGO-PISTON' : { 'setup': 'django-piston', 'url':'http://bitbucket.org/jespern/django-piston/downloads/django-piston-0.2.2.tar.gz', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-piston-0.2.2.tar.gz"))+"' },\n"
    52     EXTRA_TEXT += "    'PYLUCENE' : { 'setup': 'http://apache.crihan.fr/dist/lucene/pylucene/pylucene-3.0.3-1-src.tar.gz', 'url': 'http://apache.crihan.fr/dist/lucene/pylucene/pylucene-3.0.3-1-src.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"pylucene-3.0.3-1-src.tar.gz")).replace("\\","/")+"'},\n"
    53 EXTRA_TEXT += "    'LXML' : { 'setup': 'lxml', 'url': '"+ os.path.abspath(os.path.join(src_base,"lxml_2.2.8.tar.gz"))+"', 'local': '"+ os.path.abspath(os.path.join(src_base,"lxml-2.2.8.tar.gz"))+"'},\n"
    53 if sys.platform == 'win32':
       
    54     EXTRA_TEXT += "    'PIL' : { 'setup': 'pil', 'url': 'http://effbot.org/media/downloads/PIL-1.1.7.win32-py2.6.exe', 'local': '"+ os.path.abspath(os.path.join(src_base,"PIL-1.1.7.win32-py2.6.exe")).replace("\\","/")+"'},\n"
       
    55 else:
       
    56     EXTRA_TEXT += "    'PIL' : { 'setup': 'pil', 'url': 'http://effbot.org/downloads/Imaging-1.1.7.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"Imaging-1.1.7.tar.gz")).replace("\\","/")+"'},\n"
       
    57 EXTRA_TEXT += "    'DJANGO' : { 'setup': 'django', 'url': 'http://www.djangoproject.com/download/1.2.4/tarball/', 'local': '"+ os.path.abspath(os.path.join(src_base,"Django-1.2.4.tar.gz")).replace("\\","/")+"'},\n"
       
    58 EXTRA_TEXT += "    'JOGGING' : { 'setup': 'jogging', 'url': 'http://github.com/zain/jogging/tarball/v0.2.2', 'local': '"+ os.path.abspath(os.path.join(src_base,"jogging-0.2.2.tar.gz")).replace("\\","/")+"'},\n"
       
    59 EXTRA_TEXT += "    'DJANGO-EXTENSIONS' : { 'setup': 'django-extensions', 'url':'https://github.com/django-extensions/django-extensions/tarball/0.6', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-extensions-0.6.tar.gz")).replace("\\","/")+"' },\n"
       
    60 EXTRA_TEXT += "    'DJANGO-REGISTRATION' : { 'setup': 'django-registration', 'url':'http://bitbucket.org/ubernostrum/django-registration/get/tip.tar.gz', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-registration.tar.gz")).replace("\\","/")+"' },\n"
       
    61 EXTRA_TEXT += "    'DJANGO-TAGGING' : { 'setup': 'django-tagging', 'url':'http://django-tagging.googlecode.com/files/django-tagging-0.3.1.tar.gz', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-tagging-0.3.1.tar.gz")).replace("\\","/")+"' },\n"
       
    62 EXTRA_TEXT += "    'DJANGO-PISTON' : { 'setup': 'django-piston', 'url':'http://bitbucket.org/jespern/django-piston/downloads/django-piston-0.2.2.tar.gz', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-piston-0.2.2.tar.gz")).replace("\\","/")+"' },\n"
       
    63 if sys.platform == 'win32':
       
    64     EXTRA_TEXT += "    'LXML' : { 'setup': 'lxml', 'url': 'http://pypi.python.org/packages/2.6/l/lxml/lxml-2.2.8-py2.6-win32.egg', 'local': '"+ os.path.abspath(os.path.join(src_base,"lxml-2.2.8-py2.6-win32.egg")).replace("\\","/")+"'},\n"
       
    65 else:
       
    66     EXTRA_TEXT += "    'LXML' : { 'setup': 'lxml', 'url': '"+ os.path.abspath(os.path.join(src_base,"lxml_2.2.8.tar.gz"))+"', 'local': '"+ os.path.abspath(os.path.join(src_base,"lxml-2.2.8.tar.gz")).replace("\\","/")+"'},\n"
    54 EXTRA_TEXT += "}\n"
    67 EXTRA_TEXT += "}\n"
    55 
    68 
    56 EXTRA_TEXT += "import sys\n"
    69 EXTRA_TEXT += "import sys\n"
    57 EXTRA_TEXT += "sys.path.append('"+lib_path+"')\n"
    70 EXTRA_TEXT += "sys.path.append('"+lib_path+"')\n"
    58 
    71 
    59 EXTRA_TEXT += """
    72 EXTRA_TEXT += """
    60 
    73 
    61 import shutil
    74 import shutil
    62 import tarfile
    75 import tarfile
       
    76 import zipfile
    63 import urllib
    77 import urllib
    64 import platform
    78 import platform
    65 import patch
    79 import patch
    66 
    80 
    67 
    81 
   111         ignore_packages = options.ignore_packages.split(",")
   125         ignore_packages = options.ignore_packages.split(",")
   112     
   126     
   113     logger.indent += 2
   127     logger.indent += 2
   114     try:
   128     try:
   115         
   129         
   116         if 'PYLUCENE' not in ignore_packages:
   130         if 'PYLUCENE' not in ignore_packages and system_str != "Windows":
   117             #get pylucene
   131             #get pylucene
   118             logger.notify("Get Pylucene from %s " % URLS['PYLUCENE'][res_source_key])
   132             logger.notify("Get Pylucene from %s " % URLS['PYLUCENE'][res_source_key])
   119             pylucene_src = os.path.join(src_dir,"pylucene.tar.gz")
   133             pylucene_src = os.path.join(src_dir,"pylucene.tar.gz")
   120             urllib.urlretrieve(URLS['PYLUCENE'][res_source_key], pylucene_src)
   134             if res_source_key == 'local':
       
   135                 shutil.copy(URLS['PYLUCENE'][res_source_key], pylucene_src)
       
   136             else:
       
   137                 urllib.urlretrieve(URLS['PYLUCENE'][res_source_key], pylucene_src)
   121             tf = tarfile.open(pylucene_src,'r:gz')
   138             tf = tarfile.open(pylucene_src,'r:gz')
   122             pylucene_base_path = os.path.join(src_dir,"pylucene") 
   139             pylucene_base_path = os.path.join(src_dir,"pylucene") 
   123             logger.notify("Extract Pylucene to %s " % pylucene_base_path)
   140             logger.notify("Extract Pylucene to %s " % pylucene_base_path)
   124             tf.extractall(pylucene_base_path)
   141             tf.extractall(pylucene_base_path)
   125             tf.close()
   142             tf.close()
   200 
   217 
   201         if system_str == 'Linux'  and 'DISTRIBUTE' not in ignore_packages:
   218         if system_str == 'Linux'  and 'DISTRIBUTE' not in ignore_packages:
   202             normal_install('DISTRIBUTE', 'pip', None, None, res_source_key, home_dir, tmp_dir)
   219             normal_install('DISTRIBUTE', 'pip', None, None, res_source_key, home_dir, tmp_dir)
   203 
   220 
   204         NORMAL_INSTALL = [ #(key,method, option_str, extra_env)
   221         NORMAL_INSTALL = [ #(key,method, option_str, extra_env)
   205             #('LXML', 'easy_install', None, {'STATIC_DEPS': 'true'}),
       
   206             ('PSYCOPG2', 'pip', None, None),
       
   207             ('MYSQL', 'pip', None, None),
   222             ('MYSQL', 'pip', None, None),
   208             ('PIL', 'pip', None, None), 
   223             ('PIL', 'easy_install', None, None), 
   209             ('DJANGO','pip', None, None),
   224             ('DJANGO','pip', None, None),
   210             ('JOGGING','pip', None, None),
   225             ('JOGGING','pip', None, None),
   211             ('DJANGO-EXTENSIONS', 'pip', None, None),
   226             ('DJANGO-EXTENSIONS', 'pip', None, None),
   212             ('DJANGO-REGISTRATION', 'easy_install', '-Z', None),
   227             ('DJANGO-REGISTRATION', 'easy_install', '-Z', None),
   213             ('DJANGO-TAGGING', 'pip', None, None),
   228             ('DJANGO-TAGGING', 'pip', None, None),
   214             ('DJANGO-PISTON', 'pip', None, None),
   229             ('DJANGO-PISTON', 'pip', None, None),
   215             ]
   230             ]
   216             
   231 
       
   232         if 'PYLUCENE' not in ignore_packages and system_str == "Windows":
       
   233             NORMAL_INSTALL.append(('JCC','easy_install',None,None))
       
   234             NORMAL_INSTALL.append(('PYLUCENE','easy_install',None,None))
       
   235              
   217         if system_str == "Darwin":
   236         if system_str == "Darwin":
   218             NORMAL_INSTALL.append(('LXML', 'easy_install', None, {'STATIC_DEPS': 'true'}))
   237             NORMAL_INSTALL.append(('LXML', 'easy_install', None, {'STATIC_DEPS': 'true'}))
   219         else:
   238         else:
   220             NORMAL_INSTALL.append(('LXML', 'easy_install', None, None))
   239             NORMAL_INSTALL.append(('LXML', 'easy_install', None, None))
   221         
   240         
       
   241         if system_str == "Windows":
       
   242             #get psycopg2
       
   243             psycopg2_src = os.path.join(src_dir,"psycopg2.zip")
       
   244             shutil.copy(URLS['PSYCOPG2'][res_source_key], psycopg2_src)
       
   245             #extract psycopg2
       
   246             zf = zipfile.ZipFile(psycopg2_src)
       
   247             psycopg2_base_path = os.path.join(src_dir,"psycopg2")
       
   248             zf.extractall(psycopg2_base_path)
       
   249             zf.close()
       
   250             
       
   251             psycopg2_src_path = os.path.join(psycopg2_base_path, os.listdir(psycopg2_base_path)[0])
       
   252             shutil.copytree(os.path.join(psycopg2_src_path, 'psycopg2'), os.path.abspath(os.path.join(home_dir, 'Lib', 'psycopg2')))
       
   253             shutil.copy(os.path.join(psycopg2_src_path, 'psycopg2-2.0.10-py2.6.egg-info'), os.path.abspath(os.path.join(home_dir, 'Lib', 'site-packages')))
       
   254         else:
       
   255             NORMAL_INSTALL.append(('PSYCOPG2', 'pip', None, None))
       
   256 
   222             
   257             
   223         for key, method, option_str, extra_env in NORMAL_INSTALL:
   258         for key, method, option_str, extra_env in NORMAL_INSTALL:
   224             if key not in ignore_packages:
   259             if key not in ignore_packages:
   225                 normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir)
   260                 normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir)
   226                         
   261                         
   227         logger.notify("Clear source dir")
   262         logger.notify("Clear source dir")
   228         shutil.rmtree(src_dir)
   263         shutil.rmtree(src_dir)
   229 
   264 
   230     finally:
   265     finally:
   231         logger.indent -= 2
   266         logger.indent -= 2
   232     script_dir = join(base_dir, 'bin')
   267     script_dir = join(base_dir, bin_dir)
   233     logger.notify('Run "%s Package" to install new packages that provide builds'
   268     logger.notify('Run "%s Package" to install new packages that provide builds'
   234                   % join(script_dir, 'easy_install'))
   269                   % join(script_dir, 'easy_install'))
   235 
   270 
   236 
   271 
   237 def normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir):
   272 def normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir):
   238     logger.notify("Install %s from %s with %s" % (key,URLS[key][res_source_key],method))
   273     logger.notify("Install %s from %s with %s" % (key,URLS[key][res_source_key],method))
   239     if method == 'pip':
   274     if method == 'pip':
   240         args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', '-E', os.path.abspath(home_dir), URLS[key][res_source_key]]
   275         if sys.platform == 'win32':
       
   276             args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'pip')), 'install', '-E', os.path.abspath(home_dir), URLS[key][res_source_key]]
       
   277         else:
       
   278             args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', '-E', os.path.abspath(home_dir), URLS[key][res_source_key]]
   241         if option_str :
   279         if option_str :
   242             args.insert(4,option_str)
   280             args.insert(4,option_str)
   243         call_subprocess(args,
   281         call_subprocess(args,
   244                 cwd=os.path.abspath(tmp_dir),
   282                 cwd=os.path.abspath(tmp_dir),
   245                 filter_stdout=filter_python_develop,
   283                 filter_stdout=filter_python_develop,
   246                 show_stdout=True,
   284                 show_stdout=True,
   247                 extra_env=extra_env)
   285                 extra_env=extra_env)
   248     else:
   286     else:
   249         args = [os.path.abspath(os.path.join(home_dir, 'bin', 'easy_install')), URLS[key][res_source_key]]
   287         if sys.platform == 'win32':
       
   288             args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'easy_install')), URLS[key][res_source_key]]
       
   289         else:
       
   290             args = [os.path.abspath(os.path.join(home_dir, 'bin', 'easy_install')), URLS[key][res_source_key]]
   250         if option_str :
   291         if option_str :
   251             args.insert(1,option_str)
   292             args.insert(1,option_str)
   252         call_subprocess(args,
   293         call_subprocess(args,
   253                 cwd=os.path.abspath(tmp_dir),
   294                 cwd=os.path.abspath(tmp_dir),
   254                 filter_stdout=filter_python_develop,
   295                 filter_stdout=filter_python_develop,