diff options
author | PJ Eby <distutils-sig@python.org> | 2005-12-14 23:47:22 +0000 |
---|---|---|
committer | PJ Eby <distutils-sig@python.org> | 2005-12-14 23:47:22 +0000 |
commit | 1b77dd8e7845b5ac38fc7367796290dd65b8c531 (patch) | |
tree | bbb46c896f6e332e227e6d8983ea55cb6b7a9bd9 | |
parent | b9ef25271341903cdf75ea50a49f5d8b5d6cfd66 (diff) | |
download | external_python_setuptools-1b77dd8e7845b5ac38fc7367796290dd65b8c531.tar.gz external_python_setuptools-1b77dd8e7845b5ac38fc7367796290dd65b8c531.tar.bz2 external_python_setuptools-1b77dd8e7845b5ac38fc7367796290dd65b8c531.zip |
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.
--HG--
branch : setuptools
extra : convert_revision : svn%3A6015fed2-1504-0410-9fe1-9d1591cc4771/sandbox/trunk/setuptools%4041692
-rwxr-xr-x | EasyInstall.txt | 6 | ||||
-rwxr-xr-x | setuptools.egg-info/entry_points.txt | 1 | ||||
-rwxr-xr-x | setuptools.txt | 7 | ||||
-rw-r--r-- | setuptools/command/__init__.py | 2 | ||||
-rwxr-xr-x | setuptools/command/easy_install.py | 18 | ||||
-rw-r--r-- | setuptools/command/install.py | 7 | ||||
-rwxr-xr-x | setuptools/command/install_scripts.py | 40 |
7 files changed, 69 insertions, 12 deletions
diff --git a/EasyInstall.txt b/EasyInstall.txt index f0cf23f7..2725e440 100755 --- a/EasyInstall.txt +++ b/EasyInstall.txt @@ -878,6 +878,12 @@ Known Issues 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 diff --git a/setuptools.egg-info/entry_points.txt b/setuptools.egg-info/entry_points.txt index dfdc0289..08ab2ab4 100755 --- a/setuptools.egg-info/entry_points.txt +++ b/setuptools.egg-info/entry_points.txt @@ -33,6 +33,7 @@ upload = setuptools.command.upload:upload 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 diff --git a/setuptools.txt b/setuptools.txt index 54f4d3e1..811eb8b8 100755 --- a/setuptools.txt +++ b/setuptools.txt @@ -2252,6 +2252,13 @@ Release Notes/Change History 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. diff --git a/setuptools/command/__init__.py b/setuptools/command/__init__.py index 3b4024b8..d5e965e6 100644 --- a/setuptools/command/__init__.py +++ b/setuptools/command/__init__.py @@ -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', ] diff --git a/setuptools/command/easy_install.py b/setuptools/command/easy_install.py index a79c6452..40504afc 100755 --- a/setuptools/command/easy_install.py +++ b/setuptools/command/easy_install.py @@ -579,20 +579,19 @@ class easy_install(Command): 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 @@ class easy_install(Command): 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) diff --git a/setuptools/command/install.py b/setuptools/command/install.py index 2cc0cb84..760a416c 100644 --- a/setuptools/command/install.py +++ b/setuptools/command/install.py @@ -15,8 +15,11 @@ class install(_install): '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 @@ class install(_install): 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 diff --git a/setuptools/command/install_scripts.py b/setuptools/command/install_scripts.py new file mode 100755 index 00000000..470d4be4 --- /dev/null +++ b/setuptools/command/install_scripts.py @@ -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 + |