[Python-checkins] commit of r41692 - in sandbox/trunk/setuptools: EasyInstall.txt setuptools.egg-info/entry_points.txt setuptools.txt setuptools/command/__init__.py setuptools/command/easy_install.py setuptools/command/install.py setuptools/command/install_scripts.py

phillip.eby python-checkins at python.org
Thu Dec 15 00:47:23 CET 2005


Author: phillip.eby
Date: Thu Dec 15 00:47:22 2005
New Revision: 41692

Added:
   sandbox/trunk/setuptools/setuptools/command/install_scripts.py   (contents, props changed)
Modified:
   sandbox/trunk/setuptools/EasyInstall.txt
   sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt
   sandbox/trunk/setuptools/setuptools.txt
   sandbox/trunk/setuptools/setuptools/command/__init__.py
   sandbox/trunk/setuptools/setuptools/command/easy_install.py
   sandbox/trunk/setuptools/setuptools/command/install.py
Log:
Support full roundtrip translation of eggs to and from ``bdist_wininst``
format.  Running ``bdist_wininst`` on a setuptools-based package wraps the
egg in an .exe that will safely install it as an egg (i.e., with metadata
and entry-point wrapper scripts), and ``easy_install`` can turn the .exe
back into an ``.egg`` file or directory and install it as such.

At this point, it should also be possible to "system package" any egg,
complete with wrapper scripts, and at least bdist_wininst works now.
More testing is needed for at least bdist_dumb and bdist_rpm.


Modified: sandbox/trunk/setuptools/EasyInstall.txt
==============================================================================
--- sandbox/trunk/setuptools/EasyInstall.txt	(original)
+++ sandbox/trunk/setuptools/EasyInstall.txt	Thu Dec 15 00:47:22 2005
@@ -878,6 +878,12 @@
    when Python (or a script) is installed in a directory whose name contains
    spaces on Windows.
 
+ * Support full roundtrip translation of eggs to and from ``bdist_wininst``
+   format.  Running ``bdist_wininst`` on a setuptools-based package wraps the
+   egg in an .exe that will safely install it as an egg (i.e., with metadata
+   and entry-point wrapper scripts), and ``easy_install`` can turn the .exe
+   back into an ``.egg`` file or directory and install it as such.
+
 0.6a8
  * Update for changed SourceForge mirror format
  

Modified: sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt
==============================================================================
--- sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt	(original)
+++ sandbox/trunk/setuptools/setuptools.egg-info/entry_points.txt	Thu Dec 15 00:47:22 2005
@@ -33,6 +33,7 @@
 install_egg_info = setuptools.command.install_egg_info:install_egg_info
 alias = setuptools.command.alias:alias
 easy_install = setuptools.command.easy_install:easy_install
+install_scripts = setuptools.command.install_scripts:install_scripts
 bdist_egg = setuptools.command.bdist_egg:bdist_egg
 install = setuptools.command.install:install
 test = setuptools.command.test:test

Modified: sandbox/trunk/setuptools/setuptools.txt
==============================================================================
--- sandbox/trunk/setuptools/setuptools.txt	(original)
+++ sandbox/trunk/setuptools/setuptools.txt	Thu Dec 15 00:47:22 2005
@@ -2252,6 +2252,13 @@
    don't rely on a ``.pth`` file.  The ``--no-egg`` option has been removed,
    since all RPMs are now built in a more backwards-compatible format.
 
+ * Support full roundtrip translation of eggs to and from ``bdist_wininst``
+   format.  Running ``bdist_wininst`` on a setuptools-based package wraps the
+   egg in an .exe that will safely install it as an egg (i.e., with metadata
+   and entry-point wrapper scripts), and ``easy_install`` can turn the .exe
+   back into an ``.egg`` file or directory and install it as such.
+
+
 0.6a8
  * Fixed some problems building extensions when Pyrex was installed, especially
    with Python 2.4 and/or packages using SWIG.

Modified: sandbox/trunk/setuptools/setuptools/command/__init__.py
==============================================================================
--- sandbox/trunk/setuptools/setuptools/command/__init__.py	(original)
+++ sandbox/trunk/setuptools/setuptools/command/__init__.py	Thu Dec 15 00:47:22 2005
@@ -1,7 +1,7 @@
 __all__ = [
     'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop',
     'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts',
-    'sdist', 'setopt', 'test', 'upload', 'install_egg_info',
+    'sdist', 'setopt', 'test', 'upload', 'install_egg_info', 'install_scripts',
 ]
 
 

Modified: sandbox/trunk/setuptools/setuptools/command/easy_install.py
==============================================================================
--- sandbox/trunk/setuptools/setuptools/command/easy_install.py	(original)
+++ sandbox/trunk/setuptools/setuptools/command/easy_install.py	Thu Dec 15 00:47:22 2005
@@ -579,20 +579,19 @@
             raise DistutilsError(
                 "%s is not a valid distutils Windows .exe" % dist_filename
             )
-
         # Create a dummy distribution object until we build the real distro
         dist = Distribution(None,
             project_name=cfg.get('metadata','name'),
-            version=cfg.get('metadata','version'),
-            platform="win32"
+            version=cfg.get('metadata','version'), platform="win32"
         )
 
         # Convert the .exe to an unpacked egg
         egg_path = dist.location = os.path.join(tmpdir, dist.egg_name()+'.egg')
         egg_tmp  = egg_path+'.tmp'
-        pkg_inf = os.path.join(egg_tmp, 'EGG-INFO', 'PKG-INFO')
+        egg_info = os.path.join(egg_tmp, 'EGG-INFO') 
+        pkg_inf = os.path.join(egg_info, 'PKG-INFO')
         ensure_directory(pkg_inf)   # make sure EGG-INFO dir exists
-
+        dist._provider = PathMetadata(egg_tmp, egg_info)    # XXX
         self.exe_to_egg(dist_filename, egg_tmp)
 
         # Write EGG-INFO/PKG-INFO
@@ -603,13 +602,14 @@
                 if k<>'target_version':
                     f.write('%s: %s\n' % (k.replace('_','-').title(), v))
             f.close()
-
+        script_dir = os.path.join(egg_info,'scripts')
+        self.delete_blockers(   # delete entry-point scripts to avoid duping
+            [os.path.join(script_dir,args[0]) for args in get_script_args(dist)]
+        )       
         # Build .egg file from tmpdir
         bdist_egg.make_zipfile(
-            egg_path, egg_tmp,
-            verbose=self.verbose, dry_run=self.dry_run
+            egg_path, egg_tmp, verbose=self.verbose, dry_run=self.dry_run
         )
-
         # install the .egg
         return self.install_egg(egg_path, tmpdir)
 

Modified: sandbox/trunk/setuptools/setuptools/command/install.py
==============================================================================
--- sandbox/trunk/setuptools/setuptools/command/install.py	(original)
+++ sandbox/trunk/setuptools/setuptools/command/install.py	Thu Dec 15 00:47:22 2005
@@ -15,8 +15,11 @@
         'old-and-unmanageable', 'single-version-externally-managed',
     ]
 
-    sub_commands = _install.sub_commands + [
+    sub_commands = [
+        cmd for cmd in _install.sub_commands if cmd[0] != 'install_scripts'
+    ] + [
         ('install_egg_info', lambda self: True),
+        ('install_scripts',  lambda self: True),
     ]
 
     def initialize_options(self):
@@ -53,7 +56,7 @@
 
         cmd = easy_install(
             self.distribution, args="x", ignore_conflicts_at_my_risk=1,
-            root=self.root
+            root=self.root, record=self.record,
         )
         cmd.ensure_finalized()  # finalize before bdist_egg munges install cmd
 

Added: sandbox/trunk/setuptools/setuptools/command/install_scripts.py
==============================================================================
--- (empty file)
+++ sandbox/trunk/setuptools/setuptools/command/install_scripts.py	Thu Dec 15 00:47:22 2005
@@ -0,0 +1,40 @@
+from distutils.command.install_scripts import install_scripts \
+     as _install_scripts
+from easy_install import get_script_args
+from pkg_resources import Distribution, PathMetadata, ensure_directory
+import os
+from distutils import log
+
+
+class install_scripts(_install_scripts):
+    """Do normal script install, plus any egg_info wrapper scripts"""
+
+    def run(self):
+        self.run_command("egg_info")
+        _install_scripts.run(self)  # run first to set up self.outfiles
+
+        ei_cmd = self.get_finalized_command("egg_info")       
+        dist = Distribution(
+            ei_cmd.egg_base, PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info),
+            ei_cmd.egg_name, ei_cmd.egg_version,
+        )
+        for args in get_script_args(dist):
+            self.write_script(*args)
+
+    def write_script(self, script_name, contents, mode="t", *ignored):
+        """Write an executable file to the scripts directory"""
+
+        log.info("Installing %s script to %s", script_name, self.install_dir)
+        target = os.path.join(self.install_dir, script_name)
+        self.outfiles.append(target)
+
+        if not self.dry_run:
+            ensure_directory(target)
+            f = open(target,"w"+mode)
+            f.write(contents)
+            f.close()
+            try:
+                os.chmod(target,0755)
+            except (AttributeError, os.error):
+                pass
+


More information about the Python-checkins mailing list