"""distutils.command.bdist_dumb

Implements the Distutils 'bdist_dumb' command (create a "dumb" built
distribution -- i.e., just an archive to be unpacked under $prefix or
$exec_prefix)."""

# This module should be kept compatible with Python 1.5.2.

__revision__ = "$Id$"

import os
from distutils.core import Command
from distutils.util import get_platform
from distutils.dir_util import create_tree, remove_tree
from distutils.errors import *
from distutils import log

class bdist_dumb (Command):

    description = "create a \"dumb\" built distribution"

    user_options = [('bdist-dir=', 'd',
                     "temporary directory for creating the distribution"),
                    ('plat-name=', 'p',
                     "platform name to embed in generated filenames "
                     "(default: %s)" % get_platform()),
                    ('format=', 'f',
                     "archive format to create (tar, ztar, gztar, zip)"),
                    ('keep-temp', 'k',
                     "keep the pseudo-installation tree around after " +
                     "creating the distribution archive"),
                    ('dist-dir=', 'd',
                     "directory to put final built distributions in"),
                    ('skip-build', None,
                     "skip rebuilding everything (for testing/debugging)"),
                   ]

    boolean_options = ['keep-temp', 'skip-build']

    default_format = { 'posix': 'gztar',
                       'nt': 'zip',
                       'os2': 'zip' }


    def initialize_options (self):
        self.bdist_dir = None
        self.plat_name = None
        self.format = None
        self.keep_temp = 0
        self.dist_dir = None
        self.skip_build = 0

    # initialize_options()


    def finalize_options (self):

        if self.bdist_dir is None:
            bdist_base = self.get_finalized_command('bdist').bdist_base
            self.bdist_dir = os.path.join(bdist_base, 'dumb')

        if self.format is None:
            try:
                self.format = self.default_format[os.name]
            except KeyError:
                raise DistutilsPlatformError, \
                      ("don't know how to create dumb built distributions " +
                       "on platform %s") % os.name

        self.set_undefined_options('bdist',
                                   ('dist_dir', 'dist_dir'),
                                   ('plat_name', 'plat_name'))

    # finalize_options()


    def run (self):

        if not self.skip_build:
            self.run_command('build')

        install = self.reinitialize_command('install', reinit_subcommands=1)
        install.root = self.bdist_dir
        install.skip_build = self.skip_build
        install.warn_dir = 0

        log.info("installing to %s" % self.bdist_dir)
        self.run_command('install')

        # And make an archive relative to the root of the
        # pseudo-installation tree.
        archive_basename = "%s.%s" % (self.distribution.get_fullname(),
                                      self.plat_name)

        # OS/2 objects to any ":" characters in a filename (such as when
        # a timestamp is used in a version) so change them to hyphens.
        if os.name == "os2":
            archive_basename = archive_basename.replace(":", "-")

        self.make_archive(os.path.join(self.dist_dir, archive_basename),
                          self.format,
                          root_dir=self.bdist_dir)

        if not self.keep_temp:
            remove_tree(self.bdist_dir, dry_run=self.dry_run)

    # run()

# class bdist_dumb

@@ -407,16 +407,33 @@
 ove_tree
+, ensure_relative
 %0Afrom di
@@ -1356,24 +1356,167 @@
 bugging)%22),%0A
+                    ('relative', None,%0A                     %22build the archive using relative paths%22%0A                     %22(default: false)%22),%0A
             
@@ -1573,16 +1573,28 @@
 p-build'
+, 'relative'
 %5D%0A%0A    d
@@ -1907,24 +1907,58 @@
 p_build = 0%0A
+        self.relative = 0%0A        
 %0A    # initi
@@ -3536,26 +3536,29 @@
     
+p
 se
-lf.make_archive(
+udoinstall_root = 
 os.p
@@ -3598,17 +3598,16 @@
 asename)
-,
 %0A       
@@ -3611,88 +3611,793 @@
     
-                  self.format,%0A                          root_dir=self.bdist_dir
+if not self.relative:%0A            archive_root = self.bdist_dir%0A        else:%0A            if (self.distribution.has_ext_modules() and%0A                (install.install_base != install.install_platbase)):%0A                raise DistutilsPlatformError, %5C%0A                      (%22can't make a dumb built distribution where %22%0A                       %22base and platbase are different (%25s, %25s)%22%0A                       %25 (repr(install.install_base),%0A                          repr(install.install_platbase)))%0A            else:%0A                archive_root = os.path.join(self.bdist_dir,%0A                                   ensure_relative(install.install_base))%0A%0A        # Make the archive%0A        self.make_archive(pseudoinstall_root,%0A                          self.format, root_dir=archive_root
 )%0A%0A 

Fix for bug #410541: bdist builds bogus .zips This adds a --relative option to the bdist_dumb command that defaults to false; if true, the .tar.gz or .zip will be assembled using relative paths.