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 /setuptools | |
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
Diffstat (limited to 'setuptools')
-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 |
4 files changed, 55 insertions, 12 deletions
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 + |