[Stackless-checkins] CVS: slpdev/src/2.2/src/Lib/distutils/command register.py, NONE, 1.1 __init__.py, 1.1.1.1, 1.2 bdist.py, 1.1.1.1, 1.2 bdist_dumb.py, 1.1.1.2, 1.2 bdist_rpm.py, 1.3, 1.4 bdist_wininst.py, 1.1.1.3, 1.2 build.py, 1.1.1.1, 1.2 build_clib.py, 1.1.1.1, 1.2 build_ext.py, 1.1.1.1, 1.2 build_py.py, 1.1.1.2, 1.2 build_scripts.py, 1.1.1.1, 1.2 clean.py, 1.1.1.1, 1.2 config.py, 1.1.1.2, 1.2 install.py, 1.1.1.2, 1.2 install_data.py, 1.1.1.1, 1.2 install_headers.py, 1.1.1.1, 1.2 install_lib.py, 1.1.1.1, 1.2 install_scripts.py, 1.1.1.2, 1.2 sdist.py, 1.1.1.1, 1.2

Christian Tismer tismer at centera.de
Tue May 4 20:33:31 CEST 2004


Update of /home/cvs/slpdev/src/2.2/src/Lib/distutils/command
In directory centera.de:/tmp/cvs-serv2641/distutils/command

Modified Files:
	__init__.py bdist.py bdist_dumb.py bdist_rpm.py 
	bdist_wininst.py build.py build_clib.py build_ext.py 
	build_py.py build_scripts.py clean.py config.py install.py 
	install_data.py install_headers.py install_lib.py 
	install_scripts.py sdist.py 
Added Files:
	register.py 
Log Message:
upgraded distutils

--- NEW FILE: register.py ---
"""distutils.command.register

Implements the Distutils 'register' command (register with the repository).
"""

# created 2002/10/21, Richard Jones

__revision__ = "$Id: register.py,v 1.1 2004/05/04 18:33:28 tismer Exp $"

import sys, os, string, urllib2, getpass, urlparse
import StringIO, ConfigParser

from distutils.core import Command
from distutils.errors import *

class register(Command):

    description = ("register the distribution with the Python package index")

    DEFAULT_REPOSITORY = 'http://www.python.org/pypi'

    user_options = [
        ('repository=', 'r',
         "url of repository [default: %s]"%DEFAULT_REPOSITORY),
        ('list-classifiers', None,
         'list the valid Trove classifiers'),
        ('show-response', None,
         'display full response text from server'),
        ]
    boolean_options = ['verify', 'show-response', 'list-classifiers']

    def initialize_options(self):
        self.repository = None
        self.show_response = 0
        self.list_classifiers = 0

    def finalize_options(self):
        if self.repository is None:
            self.repository = self.DEFAULT_REPOSITORY

    def run(self):
        self.check_metadata()
        if self.dry_run:
            self.verify_metadata()
        elif self.list_classifiers:
            self.classifiers()
        else:
            self.send_metadata()

    def check_metadata(self):
        """Ensure that all required elements of meta-data (name, version,
           URL, (author and author_email) or (maintainer and
           maintainer_email)) are supplied by the Distribution object; warn if
           any are missing.
        """
        metadata = self.distribution.metadata

        missing = []
        for attr in ('name', 'version', 'url'):
            if not (hasattr(metadata, attr) and getattr(metadata, attr)):
                missing.append(attr)

        if missing:
            self.warn("missing required meta-data: " +
                      string.join(missing, ", "))

        if metadata.author:
            if not metadata.author_email:
                self.warn("missing meta-data: if 'author' supplied, " +
                          "'author_email' must be supplied too")
        elif metadata.maintainer:
            if not metadata.maintainer_email:
                self.warn("missing meta-data: if 'maintainer' supplied, " +
                          "'maintainer_email' must be supplied too")
        else:
            self.warn("missing meta-data: either (author and author_email) " +
                      "or (maintainer and maintainer_email) " +
                      "must be supplied")

    def classifiers(self):
        ''' Fetch the list of classifiers from the server.
        '''
        response = urllib2.urlopen(self.repository+'?:action=list_classifiers')
        print response.read()

    def verify_metadata(self):
        ''' Send the metadata to the package index server to be checked.
        '''
        # send the info to the server and report the result
        (code, result) = self.post_to_server(self.build_post_data('verify'))
        print 'Server response (%s): %s'%(code, result)

    def send_metadata(self):
        ''' Send the metadata to the package index server.

            Well, do the following:
            1. figure who the user is, and then
            2. send the data as a Basic auth'ed POST.

            First we try to read the username/password from $HOME/.pypirc,
            which is a ConfigParser-formatted file with a section
            [server-login] containing username and password entries (both
            in clear text). Eg:

                [server-login]
                username: fred
                password: sekrit

            Otherwise, to figure who the user is, we offer the user three
            choices:

             1. use existing login,
             2. register as a new user, or
             3. set the password to a random string and email the user.

        '''
        choice = 'x'
        username = password = ''

        # see if we can short-cut and get the username/password from the
        # config
        config = None
        if os.environ.has_key('HOME'):
            rc = os.path.join(os.environ['HOME'], '.pypirc')
            if os.path.exists(rc):
                print 'Using PyPI login from %s'%rc
                config = ConfigParser.ConfigParser()
                config.read(rc)
                username = config.get('server-login', 'username')
                password = config.get('server-login', 'password')
                choice = '1'

        # get the user's login info
        choices = '1 2 3 4'.split()
        while choice not in choices:
            print '''We need to know who you are, so please choose either:
 1. use your existing login,
 2. register as a new user,
 3. have the server generate a new password for you (and email it to you), or
 4. quit
Your selection [default 1]: ''',
            choice = raw_input()
            if not choice:
                choice = '1'
            elif choice not in choices:
                print 'Please choose one of the four options!'

        if choice == '1':
            # get the username and password
            while not username:
                username = raw_input('Username: ')
            while not password:
                password = getpass.getpass('Password: ')

            # set up the authentication
            auth = urllib2.HTTPPasswordMgr()
            host = urlparse.urlparse(self.repository)[1]
            auth.add_password('pypi', host, username, password)

            # send the info to the server and report the result
            code, result = self.post_to_server(self.build_post_data('submit'),
                auth)
            print 'Server response (%s): %s'%(code, result)

            # possibly save the login
            if os.environ.has_key('HOME') and config is None and code == 200:
                rc = os.path.join(os.environ['HOME'], '.pypirc')
                print 'I can store your PyPI login so future submissions will be faster.'
                print '(the login will be stored in %s)'%rc
                choice = 'X'
                while choice.lower() not in 'yn':
                    choice = raw_input('Save your login (y/N)?')
                    if not choice:
                        choice = 'n'
                if choice.lower() == 'y':
                    f = open(rc, 'w')
                    f.write('[server-login]\nusername:%s\npassword:%s\n'%(
                        username, password))
                    f.close()
                    try:
                        os.chmod(rc, 0600)
                    except:
                        pass
        elif choice == '2':
            data = {':action': 'user'}
            data['name'] = data['password'] = data['email'] = ''
            data['confirm'] = None
            while not data['name']:
                data['name'] = raw_input('Username: ')
            while data['password'] != data['confirm']:
                while not data['password']:
                    data['password'] = getpass.getpass('Password: ')
                while not data['confirm']:
                    data['confirm'] = getpass.getpass(' Confirm: ')
                if data['password'] != data['confirm']:
                    data['password'] = ''
                    data['confirm'] = None
                    print "Password and confirm don't match!"
            while not data['email']:
                data['email'] = raw_input('   EMail: ')
            code, result = self.post_to_server(data)
            if code != 200:
                print 'Server response (%s): %s'%(code, result)
            else:
                print 'You will receive an email shortly.'
                print 'Follow the instructions in it to complete registration.'
        elif choice == '3':
            data = {':action': 'password_reset'}
            data['email'] = ''
            while not data['email']:
                data['email'] = raw_input('Your email address: ')
            code, result = self.post_to_server(data)
            print 'Server response (%s): %s'%(code, result)

    def build_post_data(self, action):
        # figure the data to send - the metadata plus some additional
        # information used by the package server
        meta = self.distribution.metadata
        data = {
            ':action': action,
            'metadata_version' : '1.0',
            'name': meta.get_name(),
            'version': meta.get_version(),
            'summary': meta.get_description(),
            'home_page': meta.get_url(),
            'author': meta.get_contact(),
            'author_email': meta.get_contact_email(),
            'license': meta.get_licence(),
            'description': meta.get_long_description(),
            'keywords': meta.get_keywords(),
            'platform': meta.get_platforms(),
            'classifiers': meta.get_classifiers(),
            'download_url': meta.get_download_url(),
        }
        return data

    def post_to_server(self, data, auth=None):
        ''' Post a query to the server, and return a string response.
        '''

        # Build up the MIME payload for the urllib2 POST data
        boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
        sep_boundary = '\n--' + boundary
        end_boundary = sep_boundary + '--'
        body = StringIO.StringIO()
        for key, value in data.items():
            # handle multiple entries for the same name
            if type(value) != type([]):
                value = [value]
            for value in value:
                value = str(value)
                body.write(sep_boundary)
                body.write('\nContent-Disposition: form-data; name="%s"'%key)
                body.write("\n\n")
                body.write(value)
                if value and value[-1] == '\r':
                    body.write('\n')  # write an extra newline (lurve Macs)
        body.write(end_boundary)
        body.write("\n")
        body = body.getvalue()

        # build the Request
        headers = {
            'Content-type': 'multipart/form-data; boundary=%s'%boundary,
            'Content-length': str(len(body))
        }
        req = urllib2.Request(self.repository, body, headers)

        # handle HTTP and include the Basic Auth handler
        opener = urllib2.build_opener(
            urllib2.HTTPBasicAuthHandler(password_mgr=auth)
        )
        data = ''
        try:
            result = opener.open(req)
        except urllib2.HTTPError, e:
            if self.show_response:
                data = e.fp.read()
            result = e.code, e.msg
        except urllib2.URLError, e:
            result = 500, str(e)
        else:
            if self.show_response:
                data = result.read()
            result = 200, 'OK'
        if self.show_response:
            print '-'*75, data, '-'*75
        return result


Index: __init__.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/__init__.py,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** __init__.py	21 Jan 2002 00:57:50 -0000	1.1.1.1
--- __init__.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 4,7 ****
--- 4,9 ----
  commands."""
  
+ # This module should be kept compatible with Python 1.5.2.
+ 
  __revision__ = "$Id$"
  
***************
*** 18,24 ****
--- 20,33 ----
             'install_data',
             'sdist',
+            'register',
             'bdist',
             'bdist_dumb',
             'bdist_rpm',
             'bdist_wininst',
+            # These two are reserved for future use:
+            #'bdist_sdux',
+            #'bdist_pkgtool',
+            # Note:
+            # bdist_packager is not included because it only provides
+            # an abstract base class
            ]

Index: bdist.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/bdist.py,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** bdist.py	21 Jan 2002 00:57:46 -0000	1.1.1.1
--- bdist.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 4,8 ****
  distribution)."""
  
! # created 2000/03/29, Greg Ward
  
  __revision__ = "$Id$"
--- 4,8 ----
  distribution)."""
  
! # This module should be kept compatible with Python 1.5.2.
  
  __revision__ = "$Id$"
***************
*** 41,46 ****
--- 41,50 ----
                       "directory to put final built distributions in "
                       "[default: dist]"),
+                     ('skip-build', None,
+                      "skip rebuilding everything (for testing/debugging)"),
                     ]
  
+     boolean_options = ['skip-build']
+ 
      help_options = [
          ('help-formats', None,
***************
*** 49,65 ****
  
      # The following commands do not take a format option from bdist
!     no_format_option = ('bdist_rpm',)
  
      # This won't do in reality: will need to distinguish RPM-ish Linux,
      # Debian-ish Linux, Solaris, FreeBSD, ..., Windows, Mac OS.
      default_format = { 'posix': 'gztar',
!                        'nt': 'zip', }
  
      # Establish the preferred order (for the --help-formats option).
      format_commands = ['rpm', 'gztar', 'bztar', 'ztar', 'tar',
!                        'wininst', 'zip']
  
      # And the real information.
      format_command = { 'rpm':   ('bdist_rpm',  "RPM distribution"),
                         'gztar': ('bdist_dumb', "gzip'ed tar file"),
                         'bztar': ('bdist_dumb', "bzip2'ed tar file"),
--- 53,75 ----
  
      # The following commands do not take a format option from bdist
!     no_format_option = ('bdist_rpm',
!                         #'bdist_sdux', 'bdist_pkgtool'
!                         )
  
      # This won't do in reality: will need to distinguish RPM-ish Linux,
      # Debian-ish Linux, Solaris, FreeBSD, ..., Windows, Mac OS.
      default_format = { 'posix': 'gztar',
!                        'nt': 'zip',
!                        'os2': 'zip', }
  
      # Establish the preferred order (for the --help-formats option).
      format_commands = ['rpm', 'gztar', 'bztar', 'ztar', 'tar',
!                        'wininst', 'zip',
!                        #'pkgtool', 'sdux'
!                        ]
  
      # And the real information.
      format_command = { 'rpm':   ('bdist_rpm',  "RPM distribution"),
+                        'zip':   ('bdist_dumb', "ZIP file"),
                         'gztar': ('bdist_dumb', "gzip'ed tar file"),
                         'bztar': ('bdist_dumb', "bzip2'ed tar file"),
***************
*** 69,73 ****
                                     "Windows executable installer"),
                         'zip':   ('bdist_dumb', "ZIP file"),
!                      }
  
  
--- 79,86 ----
                                     "Windows executable installer"),
                         'zip':   ('bdist_dumb', "ZIP file"),
!                        #'pkgtool': ('bdist_pkgtool', 
!                        #            "Solaris pkgtool distribution"),
!                        #'sdux':  ('bdist_sdux', "HP-UX swinstall depot"),
!                       }
  
  
***************
*** 77,80 ****
--- 90,94 ----
          self.formats = None
          self.dist_dir = None
+         self.skip_build = 0
  
      # initialize_options()
***************
*** 126,132 ****
                  sub_cmd.format = self.formats[i]
  
-             print ("bdist.run: format=%s, command=%s, rest=%s" %
-                    (self.formats[i], cmd_name, commands[i+1:]))
- 
              # If we're going to need to run this command again, tell it to
              # keep its temporary files around so subsequent runs go faster.
--- 140,143 ----

Index: bdist_dumb.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/bdist_dumb.py,v
retrieving revision 1.1.1.2
retrieving revision 1.2
diff -C2 -d -r1.1.1.2 -r1.2
*** bdist_dumb.py	15 Oct 2002 22:23:24 -0000	1.1.1.2
--- bdist_dumb.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 5,9 ****
  $exec_prefix)."""
  
! # created 2000/03/29, Greg Ward
  
  __revision__ = "$Id$"
--- 5,9 ----
  $exec_prefix)."""
  
! # This module should be kept compatible with Python 1.5.2.
  
  __revision__ = "$Id$"
***************
*** 12,17 ****
  from distutils.core import Command
  from distutils.util import get_platform
! from distutils.dir_util import create_tree, remove_tree
  from distutils.errors import *
  
  class bdist_dumb (Command):
--- 12,18 ----
  from distutils.core import Command
  from distutils.util import get_platform
! from distutils.dir_util import create_tree, remove_tree, ensure_relative
  from distutils.errors import *
+ from distutils import log
  
  class bdist_dumb (Command):
***************
*** 31,40 ****
                      ('dist-dir=', 'd',
                       "directory to put final built distributions in"),
                     ]
  
!     boolean_options = ['keep-temp']
  
      default_format = { 'posix': 'gztar',
!                        'nt': 'zip', }
  
  
--- 32,47 ----
                      ('dist-dir=', 'd',
                       "directory to put final built distributions in"),
+                     ('skip-build', None,
+                      "skip rebuilding everything (for testing/debugging)"),
+                     ('relative', None,
+                      "build the archive using relative paths"
+                      "(default: false)"),
                     ]
  
!     boolean_options = ['keep-temp', 'skip-build', 'relative']
  
      default_format = { 'posix': 'gztar',
!                        'nt': 'zip',
!                        'os2': 'zip' }
  
  
***************
*** 45,49 ****
          self.keep_temp = 0
          self.dist_dir = None
! 
      # initialize_options()
  
--- 52,58 ----
          self.keep_temp = 0
          self.dist_dir = None
!         self.skip_build = 0
!         self.relative = 0
!         
      # initialize_options()
  
***************
*** 72,82 ****
      def run (self):
  
!         self.run_command('build')
  
          install = self.reinitialize_command('install', reinit_subcommands=1)
          install.root = self.bdist_dir
          install.warn_dir = 0
  
!         self.announce("installing to %s" % self.bdist_dir)
          self.run_command('install')
  
--- 81,93 ----
      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')
  
***************
*** 85,94 ****
          archive_basename = "%s.%s" % (self.distribution.get_fullname(),
                                        self.plat_name)
!         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, self.verbose, self.dry_run)
  
      # run()
--- 96,126 ----
          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(":", "-")
! 
!         pseudoinstall_root = os.path.join(self.dist_dir, archive_basename)
!         if not self.relative:
!             archive_root = self.bdist_dir
!         else:
!             if (self.distribution.has_ext_modules() and
!                 (install.install_base != install.install_platbase)):
!                 raise DistutilsPlatformError, \
!                       ("can't make a dumb built distribution where "
!                        "base and platbase are different (%s, %s)"
!                        % (repr(install.install_base),
!                           repr(install.install_platbase)))
!             else:
!                 archive_root = os.path.join(self.bdist_dir,
!                                    ensure_relative(install.install_base))
! 
!         # Make the archive
!         self.make_archive(pseudoinstall_root,
!                           self.format, root_dir=archive_root)
  
          if not self.keep_temp:
!             remove_tree(self.bdist_dir, dry_run=self.dry_run)
  
      # run()

Index: bdist_rpm.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/bdist_rpm.py,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** bdist_rpm.py	30 Apr 2004 22:11:27 -0000	1.3
--- bdist_rpm.py	4 May 2004 18:33:28 -0000	1.4
***************
*** 4,8 ****
  distributions)."""
  
! # created 2000/04/25, by Harry Henry Gebel
  
  __revision__ = "$Id$"
--- 4,8 ----
  distributions)."""
  
! # This module should be kept compatible with Python 1.5.2.
  
  __revision__ = "$Id$"
***************
*** 11,18 ****
  import glob
  from types import *
! from distutils.core import Command, DEBUG
  from distutils.util import get_platform
  from distutils.file_util import write_file
  from distutils.errors import *
  
  class bdist_rpm (Command):
--- 11,20 ----
  import glob
  from types import *
! from distutils.core import Command
! from distutils.debug import DEBUG
  from distutils.util import get_platform
  from distutils.file_util import write_file
  from distutils.errors import *
+ from distutils import log
  
  class bdist_rpm (Command):
***************
*** 128,131 ****
--- 130,134 ----
          self.install_script = None
          self.clean_script = None
+         self.verify_script = None
          self.pre_install = None
          self.post_install = None
***************
*** 207,210 ****
--- 210,214 ----
          self.ensure_filename('install_script')
          self.ensure_filename('clean_script')
+         self.ensure_filename('verify_script')
          self.ensure_filename('pre_install')
          self.ensure_filename('post_install')
***************
*** 279,283 ****
  
          # build package
!         self.announce('building RPMs')
          rpm_cmd = ['rpm']
          if os.path.exists('/usr/bin/rpmbuild') or \
--- 283,287 ----
  
          # build package
!         log.info("building RPMs")
          rpm_cmd = ['rpm']
          if os.path.exists('/usr/bin/rpmbuild') or \
***************
*** 351,355 ****
  
          spec_file.extend([
!             'Copyright: ' + self.distribution.get_license(),
              'Group: ' + self.group,
              'BuildRoot: %{_tmppath}/%{name}-buildroot',
--- 355,359 ----
  
          spec_file.extend([
!             'License: ' + self.distribution.get_license(),
              'Group: ' + self.group,
              'BuildRoot: %{_tmppath}/%{name}-buildroot',
***************
*** 423,426 ****
--- 427,431 ----
                "--record=INSTALLED_FILES") % self.python),
              ('clean', 'clean_script', "rm -rf $RPM_BUILD_ROOT"),
+             ('verifyscript', 'verify_script', None),
              ('pre', 'pre_install', None),
              ('post', 'post_install', None),
***************
*** 430,434 ****
  
          for (rpm_opt, attr, default) in script_options:
!             # Insert contents of file referred to, if no file is refered to
              # use 'default' as contents of script
              val = getattr(self, attr)
--- 435,439 ----
  
          for (rpm_opt, attr, default) in script_options:
!             # Insert contents of file referred to, if no file is referred to
              # use 'default' as contents of script
              val = getattr(self, attr)

Index: bdist_wininst.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/bdist_wininst.py,v
retrieving revision 1.1.1.3
retrieving revision 1.2
diff -C2 -d -r1.1.1.3 -r1.2
*** bdist_wininst.py	15 Oct 2002 22:23:25 -0000	1.1.1.3
--- bdist_wininst.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 4,8 ****
  exe-program."""
  
! # created 2000/06/02, Thomas Heller
  
  __revision__ = "$Id$"
--- 4,8 ----
  exe-program."""
  
! # This module should be kept compatible with Python 1.5.2.
  
  __revision__ = "$Id$"
***************
*** 13,16 ****
--- 13,18 ----
  from distutils.dir_util import create_tree, remove_tree
  from distutils.errors import *
+ from distutils.sysconfig import get_python_version
+ from distutils import log
  
  class bdist_wininst (Command):
***************
*** 37,40 ****
--- 39,47 ----
                      ('title=', 't',
                       "title to display on the installer background instead of default"),
+                     ('skip-build', None,
+                      "skip rebuilding everything (for testing/debugging)"),
+                     ('install-script=', None,
+                      "basename of installation script to be run after"
+                      "installation or before deinstallation"),
                     ]
  
***************
*** 51,54 ****
--- 58,63 ----
          self.bitmap = None
          self.title = None
+         self.skip_build = 0
+         self.install_script = None
  
      # initialize_options()
***************
*** 62,66 ****
              self.target_version = ""
          if self.distribution.has_ext_modules():
!             short_version = sys.version[:3]
              if self.target_version and self.target_version != short_version:
                  raise DistutilsOptionError, \
--- 71,75 ----
              self.target_version = ""
          if self.distribution.has_ext_modules():
!             short_version = get_python_version()
              if self.target_version and self.target_version != short_version:
                  raise DistutilsOptionError, \
***************
*** 70,73 ****
--- 79,90 ----
          self.set_undefined_options('bdist', ('dist_dir', 'dist_dir'))
  
+         if self.install_script:
+             for script in self.distribution.scripts:
+                 if self.install_script == os.path.basename(script):
+                     break
+             else:
+                 raise DistutilsOptionError, \
+                       "install_script '%s' not found in scripts" % \
+                       self.install_script
      # finalize_options()
  
***************
*** 81,88 ****
                     "must be compiled on a Windows 32 platform")
  
!         self.run_command('build')
  
!         install = self.reinitialize_command('install')
          install.root = self.bdist_dir
          install.warn_dir = 0
  
--- 98,107 ----
                     "must be compiled on a Windows 32 platform")
  
!         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
  
***************
*** 102,106 ****
                      value)
  
!         self.announce("installing to %s" % self.bdist_dir)
          install.ensure_finalized()
  
--- 121,125 ----
                      value)
  
!         log.info("installing to %s", self.bdist_dir)
          install.ensure_finalized()
  
***************
*** 123,131 ****
          self.create_exe(arcname, fullname, self.bitmap)
          # remove the zip-file again
!         self.announce("removing temporary file '%s'" % arcname)
          os.remove(arcname)
  
          if not self.keep_temp:
!             remove_tree(self.bdist_dir, self.verbose, self.dry_run)
  
      # run()
--- 142,150 ----
          self.create_exe(arcname, fullname, self.bitmap)
          # remove the zip-file again
!         log.debug("removing temporary file '%s'", arcname)
          os.remove(arcname)
  
          if not self.keep_temp:
!             remove_tree(self.bdist_dir, dry_run=self.dry_run)
  
      # run()
***************
*** 157,160 ****
--- 176,181 ----
          # the installer runtime.
          lines.append("\n[Setup]")
+         if self.install_script:
+             lines.append("install_script=%s" % self.install_script)
          lines.append("info=%s" % repr(info)[1:-1])
          lines.append("target_compile=%d" % (not self.no_target_compile))
***************
*** 215,570 ****
  
      def get_exe_bytes (self):
!         import base64
!         return base64.decodestring(EXEDATA)
  # class bdist_wininst
- 
- if __name__ == '__main__':
-     # recreate EXEDATA from wininst.exe by rewriting this file
-     import re, base64
-     moddata = open("bdist_wininst.py", "r").read()
-     exedata = open("../../misc/wininst.exe", "rb").read()
-     print "wininst.exe length is %d bytes" % len(exedata)
-     print "wininst.exe encoded length is %d bytes" % len(base64.encodestring(exedata))
-     exp = re.compile('EXE'+'DATA = """\\\\(\n.*)*\n"""', re.M)
-     data = exp.sub('EXE' + 'DATA = """\\\\\n%s"""' %
-                     base64.encodestring(exedata), moddata)
-     open("bdist_wininst.py", "w").write(data)
-     print "bdist_wininst.py recreated"
- 
- EXEDATA = """\
- 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
- AXf3gD8BdfKLB4pfBGbB6AjBwBCGxCn4gOvoAfCJB4PHBYnY4tmNvgDAAACLBwnAdDyLXwSNhDAw
- 8QAAAfNQg8cI/5a88QAAlYoHRwjAdNyJ+VdI8q5V/5bA8QAACcB0B4kDg8ME6+H/lsTxAABh6Vhs
- //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAAAIAAAgAUAAABgAACAAAAA
- AAAAAAAAAAAAAAABAG4AAAA4AACAAAAAAAAAAAAAAAAAAAABAAAAAABQAAAAMLEAAAgKAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAABABrAAAAkAAAgGwAAAC4AACAbQAAAOAAAIBuAAAACAEAgAAAAAAA
- AAAAAAAAAAAAAQAJBAAAqAAAADi7AACgAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEACQQAANAA
- AADYvAAABAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAkEAAD4AAAA4L4AAFoCAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAQAJBAAAIAEAAEDBAABcAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0AQEA
- vAEBAAAAAAAAAAAAAAAAAAECAQDMAQEAAAAAAAAAAAAAAAAADgIBANQBAQAAAAAAAAAAAAAAAAAb
- AgEA3AEBAAAAAAAAAAAAAAAAACUCAQDkAQEAAAAAAAAAAAAAAAAAMAIBAOwBAQAAAAAAAAAAAAAA
- AAAAAAAAAAAAADoCAQBIAgEAWAIBAAAAAABmAgEAAAAAAHQCAQAAAAAAhAIBAAAAAACOAgEAAAAA
- AJQCAQAAAAAAS0VSTkVMMzIuRExMAEFEVkFQSTMyLmRsbABDT01DVEwzMi5kbGwAR0RJMzIuZGxs
- AE1TVkNSVC5kbGwAVVNFUjMyLmRsbAAATG9hZExpYnJhcnlBAABHZXRQcm9jQWRkcmVzcwAARXhp
- dFByb2Nlc3MAAABSZWdDbG9zZUtleQAAAFByb3BlcnR5U2hlZXRBAABUZXh0T3V0QQAAZXhpdAAA
- R2V0REMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAA=
- """
- 
- # --- EOF ---
--- 236,242 ----
  
      def get_exe_bytes (self):
!         # wininst.exe is in the same directory as this file
!         directory = os.path.dirname(__file__)
!         filename = os.path.join(directory, "wininst.exe")
!         return open(filename, "rb").read()
  # class bdist_wininst

Index: build.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/build.py,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** build.py	21 Jan 2002 00:57:48 -0000	1.1.1.1
--- build.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 3,7 ****
  Implements the Distutils 'build' command."""
  
! # created 1999/03/08, Greg Ward
  
  __revision__ = "$Id$"
--- 3,7 ----
  Implements the Distutils 'build' command."""
  
! # This module should be kept compatible with Python 1.5.2.
  
  __revision__ = "$Id$"

Index: build_clib.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/build_clib.py,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** build_clib.py	21 Jan 2002 00:57:48 -0000	1.1.1.1
--- build_clib.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 5,10 ****
  module."""
  
! # created (an empty husk) 1999/12/18, Greg Ward
! # fleshed out 2000/02/03-04
  
  __revision__ = "$Id$"
--- 5,9 ----
  module."""
  
! # This module should be kept compatible with Python 1.5.2.
  
  __revision__ = "$Id$"
***************
*** 25,29 ****
  from distutils.errors import *
  from distutils.sysconfig import customize_compiler
! 
  
  def show_compilers ():
--- 24,28 ----
  from distutils.errors import *
  from distutils.sysconfig import customize_compiler
! from distutils import log
  
  def show_compilers ():
***************
*** 112,116 ****
          from distutils.ccompiler import new_compiler
          self.compiler = new_compiler(compiler=self.compiler,
-                                      verbose=self.verbose,
                                       dry_run=self.dry_run,
                                       force=self.force)
--- 111,114 ----
***************
*** 214,218 ****
              sources = list(sources)
  
!             self.announce("building '%s' library" % lib_name)
  
              # First, compile the source code to object files in the library
--- 212,216 ----
              sources = list(sources)
  
!             log.info("building '%s' library", lib_name)
  
              # First, compile the source code to object files in the library

Index: build_ext.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/build_ext.py,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** build_ext.py	21 Jan 2002 00:57:49 -0000	1.1.1.1
--- build_ext.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 5,9 ****
  extensions ASAP)."""
  
! # created 1999/08/09, Greg Ward
  
  __revision__ = "$Id$"
--- 5,9 ----
  extensions ASAP)."""
  
! # This module should be kept compatible with Python 1.5.2.
  
  __revision__ = "$Id$"
***************
*** 13,19 ****
  from distutils.core import Command
  from distutils.errors import *
! from distutils.sysconfig import customize_compiler
  from distutils.dep_util import newer_group
  from distutils.extension import Extension
  
  # An extension name is just a dot-separated list of Python NAMEs (ie.
--- 13,20 ----
  from distutils.core import Command
  from distutils.errors import *
! from distutils.sysconfig import customize_compiler, get_python_version
  from distutils.dep_util import newer_group
  from distutils.extension import Extension
+ from distutils import log
  
  # An extension name is just a dot-separated list of Python NAMEs (ie.
***************
*** 168,177 ****
                  self.build_temp = os.path.join(self.build_temp, "Release")
  
!         # for extensions under Cygwin Python's library directory must be
          # appended to library_dirs
!         if sys.platform[:6] == 'cygwin':
              if string.find(sys.executable, sys.exec_prefix) != -1:
                  # building third party extensions
!                 self.library_dirs.append(os.path.join(sys.prefix, "lib", "python" + sys.version[:3], "config"))
              else:
                  # building python standard extensions
--- 169,190 ----
                  self.build_temp = os.path.join(self.build_temp, "Release")
  
!             # Append the source distribution include and library directories,
!             # this allows distutils on windows to work in the source tree
!             self.include_dirs.append(os.path.join(sys.exec_prefix, 'PC'))
!             self.library_dirs.append(os.path.join(sys.exec_prefix, 'PCBuild'))
! 
!         # OS/2 (EMX) doesn't support Debug vs Release builds, but has the 
!         # import libraries in its "Config" subdirectory
!         if os.name == 'os2':
!             self.library_dirs.append(os.path.join(sys.exec_prefix, 'Config'))
! 
!         # for extensions under Cygwin and AtheOS Python's library directory must be
          # appended to library_dirs
!         if sys.platform[:6] == 'cygwin' or sys.platform[:6] == 'atheos':
              if string.find(sys.executable, sys.exec_prefix) != -1:
                  # building third party extensions
!                 self.library_dirs.append(os.path.join(sys.prefix, "lib",
!                                                       "python" + get_python_version(),
!                                                       "config"))
              else:
                  # building python standard extensions
***************
*** 280,286 ****
  
              (ext_name, build_info) = ext
!             self.warn(("old-style (ext_name, build_info) tuple found in "
!                        "ext_modules for extension '%s'"
!                        "-- please convert to Extension instance" % ext_name))
              if type(ext) is not TupleType and len(ext) != 2:
                  raise DistutilsSetupError, \
--- 293,299 ----
  
              (ext_name, build_info) = ext
!             log.warn(("old-style (ext_name, build_info) tuple found in "
!                       "ext_modules for extension '%s'"
!                       "-- please convert to Extension instance" % ext_name))
              if type(ext) is not TupleType and len(ext) != 2:
                  raise DistutilsSetupError, \
***************
*** 318,323 ****
              ext.runtime_library_dirs = build_info.get('rpath')
              if build_info.has_key('def_file'):
!                 self.warn("'def_file' element of build info dict "
!                           "no longer supported")
  
              # Non-trivial stuff: 'macros' split into 'define_macros'
--- 331,336 ----
              ext.runtime_library_dirs = build_info.get('rpath')
              if build_info.has_key('def_file'):
!                 log.warn("'def_file' element of build info dict "
!                          "no longer supported")
  
              # Non-trivial stuff: 'macros' split into 'define_macros'
***************
*** 376,380 ****
  
      def build_extensions(self):
- 
          # First, sanity-check the 'extensions' list
          self.check_extensions_list(self.extensions)
--- 389,392 ----
***************
*** 384,388 ****
  
      def build_extension(self, ext):
- 
          sources = ext.sources
          if sources is None or type(sources) not in (ListType, TupleType):
--- 396,399 ----
***************
*** 409,419 ****
              ext_filename = os.path.join(self.build_lib,
                                          self.get_ext_filename(fullname))
! 
!         if not (self.force or newer_group(sources, ext_filename, 'newer')):
!             self.announce("skipping '%s' extension (up-to-date)" %
!                           ext.name)
              return
          else:
!             self.announce("building '%s' extension" % ext.name)
  
          # First, scan the sources for SWIG definition files (.i), run
--- 420,429 ----
              ext_filename = os.path.join(self.build_lib,
                                          self.get_ext_filename(fullname))
!         depends = sources + ext.depends
!         if not (self.force or newer_group(depends, ext_filename, 'newer')):
!             log.debug("skipping '%s' extension (up-to-date)", ext.name)
              return
          else:
!             log.info("building '%s' extension", ext.name)
  
          # First, scan the sources for SWIG definition files (.i), run
***************
*** 442,453 ****
              macros.append((undef,))
  
-         # XXX and if we support CFLAGS, why not CC (compiler
-         # executable), CPPFLAGS (pre-processor options), and LDFLAGS
-         # (linker options) too?
-         # XXX should we use shlex to properly parse CFLAGS?
- 
-         if os.environ.has_key('CFLAGS'):
-             extra_args.extend(string.split(os.environ['CFLAGS']))
- 
          objects = self.compiler.compile(sources,
                                          output_dir=self.build_temp,
--- 452,455 ----
***************
*** 455,459 ****
                                          include_dirs=ext.include_dirs,
                                          debug=self.debug,
!                                         extra_postargs=extra_args)
  
          # XXX -- this is a Vile HACK!
--- 457,462 ----
                                          include_dirs=ext.include_dirs,
                                          debug=self.debug,
!                                         extra_postargs=extra_args,
!                                         depends=ext.depends)
  
          # XXX -- this is a Vile HACK!
***************
*** 475,478 ****
--- 478,483 ----
          extra_args = ext.extra_link_args or []
  
+         # Detect target language, if not provided
+         language = ext.language or self.compiler.detect_language(sources)
  
          self.compiler.link_shared_object(
***************
*** 484,488 ****
              export_symbols=self.get_export_symbols(ext),
              debug=self.debug,
!             build_temp=self.build_temp)
  
  
--- 489,494 ----
              export_symbols=self.get_export_symbols(ext),
              debug=self.debug,
!             build_temp=self.build_temp,
!             target_lang=language)
  
  
***************
*** 512,516 ****
              (base, ext) = os.path.splitext(source)
              if ext == ".i":             # SWIG interface file
!                 new_sources.append(base + target_ext)
                  swig_sources.append(source)
                  swig_targets[source] = new_sources[-1]
--- 518,522 ----
              (base, ext) = os.path.splitext(source)
              if ext == ".i":             # SWIG interface file
!                 new_sources.append(base + '_wrap' + target_ext)
                  swig_sources.append(source)
                  swig_targets[source] = new_sources[-1]
***************
*** 522,526 ****
  
          swig = self.find_swig()
!         swig_cmd = [swig, "-python", "-dnone", "-ISWIG"]
          if self.swig_cpp:
              swig_cmd.append("-c++")
--- 528,532 ----
  
          swig = self.find_swig()
!         swig_cmd = [swig, "-python"]
          if self.swig_cpp:
              swig_cmd.append("-c++")
***************
*** 528,532 ****
          for source in swig_sources:
              target = swig_targets[source]
!             self.announce("swigging %s to %s" % (source, target))
              self.spawn(swig_cmd + ["-o", target, source])
  
--- 534,538 ----
          for source in swig_sources:
              target = swig_targets[source]
!             log.info("swigging %s to %s", source, target)
              self.spawn(swig_cmd + ["-o", target, source])
  
***************
*** 555,558 ****
--- 561,568 ----
                  return "swig.exe"
  
+         elif os.name == "os2":
+             # assume swig available in the PATH.
+             return "swig.exe"
+ 
          else:
              raise DistutilsPlatformError, \
***************
*** 579,582 ****
--- 589,595 ----
          from distutils.sysconfig import get_config_var
          ext_path = string.split(ext_name, '.')
+         # OS/2 has an 8 character module (extension) limit :-(
+         if os.name == "os2":
+             ext_path[len(ext_path) - 1] = ext_path[len(ext_path) - 1][:8]
          # extensions in debug_mode are named 'module_d.pyd' under windows
          so_ext = get_config_var('SO')
***************
*** 600,604 ****
          """Return the list of libraries to link against when building a
          shared extension.  On most platforms, this is just 'ext.libraries';
!         on Windows, we add the Python library (eg. python20.dll).
          """
          # The python library is always needed on Windows.  For MSVC, this
--- 613,617 ----
          """Return the list of libraries to link against when building a
          shared extension.  On most platforms, this is just 'ext.libraries';
!         on Windows and OS/2, we add the Python library (eg. python20.dll).
          """
          # The python library is always needed on Windows.  For MSVC, this
***************
*** 607,616 ****
          # to need it mentioned explicitly, though, so that's what we do.
          # Append '_d' to the python import library on debug builds.
!         from distutils.msvccompiler import MSVCCompiler
!         if sys.platform == "win32" and \
!            not isinstance(self.compiler, MSVCCompiler):
              template = "python%d%d"
!             if self.debug:
!                 template = template + '_d'
              pythonlib = (template %
                     (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff))
--- 620,644 ----
          # to need it mentioned explicitly, though, so that's what we do.
          # Append '_d' to the python import library on debug builds.
!         if sys.platform == "win32":
!             from distutils.msvccompiler import MSVCCompiler
!             if not isinstance(self.compiler, MSVCCompiler):
!                 template = "python%d%d"
!                 if self.debug:
!                     template = template + '_d'
!                 pythonlib = (template %
!                        (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff))
!                 # don't extend ext.libraries, it may be shared with other
!                 # extensions, it is a reference to the original list
!                 return ext.libraries + [pythonlib]
!             else:
!                 return ext.libraries
!         elif sys.platform == "os2emx":
!             # EMX/GCC requires the python library explicitly, and I
!             # believe VACPP does as well (though not confirmed) - AIM Apr01
              template = "python%d%d"
!             # debug versions of the main DLL aren't supported, at least 
!             # not at this time - AIM Apr01
!             #if self.debug:
!             #    template = template + '_d'
              pythonlib = (template %
                     (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff))
***************
*** 625,628 ****
--- 653,672 ----
              # extensions, it is a reference to the original list
              return ext.libraries + [pythonlib]
+         elif sys.platform[:6] == "atheos":
+             from distutils import sysconfig
+ 
+             template = "python%d.%d"
+             pythonlib = (template %
+                    (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff))
+             # Get SHLIBS from Makefile
+             extra = []
+             for lib in sysconfig.get_config_var('SHLIBS').split():
+                 if lib.startswith('-l'):
+                     extra.append(lib[2:])
+                 else:
+                     extra.append(lib)
+             # don't extend ext.libraries, it may be shared with other
+             # extensions, it is a reference to the original list
+             return ext.libraries + [pythonlib, "m"] + extra
          else:
              return ext.libraries

Index: build_py.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/build_py.py,v
retrieving revision 1.1.1.2
retrieving revision 1.2
diff -C2 -d -r1.1.1.2 -r1.2
*** build_py.py	9 May 2002 18:27:22 -0000	1.1.1.2
--- build_py.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 3,7 ****
  Implements the Distutils 'build_py' command."""
  
! # created 1999/03/08, Greg Ward
  
  __revision__ = "$Id$"
--- 3,7 ----
  Implements the Distutils 'build_py' command."""
  
! # This module should be kept compatible with Python 1.5.2.
  
  __revision__ = "$Id$"
***************
*** 14,18 ****
  from distutils.errors import *
  from distutils.util import convert_path
! 
  
  class build_py (Command):
--- 14,18 ----
  from distutils.errors import *
  from distutils.util import convert_path
! from distutils import log
  
  class build_py (Command):
***************
*** 87,109 ****
          # and 'py_modules'.  The former lets us work with whole packages, not
          # specifying individual modules at all; the latter is for
!         # specifying modules one-at-a-time.  Currently they are mutually
!         # exclusive: you can define one or the other (or neither), but not
!         # both.  It remains to be seen how limiting this is.
! 
!         # Dispose of the two "unusual" cases first: no pure Python modules
!         # at all (no problem, just return silently), and over-specified
!         # 'packages' and 'py_modules' options.
! 
!         if not self.py_modules and not self.packages:
!             return
!         if self.py_modules and self.packages:
!             raise DistutilsOptionError, \
!                   "build_py: supplying both 'packages' and 'py_modules' " + \
!                   "options is not allowed"
  
-         # Now we're down to two cases: 'py_modules' only and 'packages' only.
          if self.py_modules:
              self.build_modules()
!         else:
              self.build_packages()
  
--- 87,95 ----
          # and 'py_modules'.  The former lets us work with whole packages, not
          # specifying individual modules at all; the latter is for
!         # specifying modules one-at-a-time.
  
          if self.py_modules:
              self.build_modules()
!         if self.packages:
              self.build_packages()
  
***************
*** 177,186 ****
                  return init_py
              else:
!                 self.warn(("package init file '%s' not found " +
!                            "(or not a regular file)") % init_py)
  
          # Either not in a package at all (__init__.py not expected), or
          # __init__.py doesn't exist -- so don't return the filename.
!         return
  
      # check_package ()
--- 163,172 ----
                  return init_py
              else:
!                 log.warn(("package init file '%s' not found " +
!                           "(or not a regular file)"), init_py)
  
          # Either not in a package at all (__init__.py not expected), or
          # __init__.py doesn't exist -- so don't return the filename.
!         return None
  
      # check_package ()
***************
*** 189,194 ****
      def check_module (self, module, module_file):
          if not os.path.isfile(module_file):
!             self.warn("file %s (for module %s) not found" %
!                       (module_file, module))
              return 0
          else:
--- 175,179 ----
      def check_module (self, module, module_file):
          if not os.path.isfile(module_file):
!             log.warn("file %s (for module %s) not found", module_file, module)
              return 0
          else:
***************
*** 278,285 ****
          'find_package_modules()' do."""
  
          if self.py_modules:
!             modules = self.find_modules()
!         else:
!             modules = []
              for package in self.packages:
                  package_dir = self.get_package_dir(package)
--- 263,270 ----
          'find_package_modules()' do."""
  
+         modules = []
          if self.py_modules:
!             modules.extend(self.find_modules())
!         if self.packages:
              for package in self.packages:
                  package_dir = self.get_package_dir(package)
***************
*** 390,401 ****
          if self.compile:
              byte_compile(files, optimize=0,
!                          force=self.force,
!                          prefix=prefix,
!                          verbose=self.verbose, dry_run=self.dry_run)
          if self.optimize > 0:
              byte_compile(files, optimize=self.optimize,
!                          force=self.force,
!                          prefix=prefix,
!                          verbose=self.verbose, dry_run=self.dry_run)
  
  # class build_py
--- 375,382 ----
          if self.compile:
              byte_compile(files, optimize=0,
!                          force=self.force, prefix=prefix, dry_run=self.dry_run)
          if self.optimize > 0:
              byte_compile(files, optimize=self.optimize,
!                          force=self.force, prefix=prefix, dry_run=self.dry_run)
  
  # class build_py

Index: build_scripts.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/build_scripts.py,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** build_scripts.py	21 Jan 2002 00:57:49 -0000	1.1.1.1
--- build_scripts.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 3,18 ****
  Implements the Distutils 'build_scripts' command."""
  
! # created 2000/05/23, Bastian Kleineidam
  
  __revision__ = "$Id$"
  
  import sys, os, re
  from distutils import sysconfig
  from distutils.core import Command
  from distutils.dep_util import newer
  from distutils.util import convert_path
  
  # check if Python is called on the first line with this expression
! first_line_re = re.compile(r'^#!.*python(\s+.*)?$')
  
  class build_scripts (Command):
--- 3,20 ----
  Implements the Distutils 'build_scripts' command."""
  
! # This module should be kept compatible with Python 1.5.2.
  
  __revision__ = "$Id$"
  
  import sys, os, re
+ from stat import ST_MODE
  from distutils import sysconfig
  from distutils.core import Command
  from distutils.dep_util import newer
  from distutils.util import convert_path
+ from distutils import log
  
  # check if Python is called on the first line with this expression
! first_line_re = re.compile('^#!.*python[0-9.]*([ \t].*)?$')
  
  class build_scripts (Command):
***************
*** 54,64 ****
          """
          self.mkpath(self.build_dir)
          for script in self.scripts:
              adjust = 0
              script = convert_path(script)
              outfile = os.path.join(self.build_dir, os.path.basename(script))
  
              if not self.force and not newer(script, outfile):
!                 self.announce("not copying %s (up-to-date)" % script)
                  continue
  
--- 56,68 ----
          """
          self.mkpath(self.build_dir)
+         outfiles = []
          for script in self.scripts:
              adjust = 0
              script = convert_path(script)
              outfile = os.path.join(self.build_dir, os.path.basename(script))
+             outfiles.append(outfile)
  
              if not self.force and not newer(script, outfile):
!                 log.debug("not copying %s (up-to-date)", script)
                  continue
  
***************
*** 84,89 ****
  
              if adjust:
!                 self.announce("copying and adjusting %s -> %s" %
!                               (script, self.build_dir))
                  if not self.dry_run:
                      outf = open(outfile, "w")
--- 88,93 ----
  
              if adjust:
!                 log.info("copying and adjusting %s -> %s", script,
!                          self.build_dir)
                  if not self.dry_run:
                      outf = open(outfile, "w")
***************
*** 93,97 ****
                                      post_interp))
                      else:
!                         outf.write("#!%s%s" %
                                     (os.path.join(
                              sysconfig.get_config_var("BINDIR"),
--- 97,101 ----
                                      post_interp))
                      else:
!                         outf.write("#!%s%s\n" %
                                     (os.path.join(
                              sysconfig.get_config_var("BINDIR"),
***************
*** 106,109 ****
--- 110,125 ----
                  self.copy_file(script, outfile)
  
+         if os.name == 'posix':
+             for file in outfiles:
+                 if self.dry_run:
+                     log.info("changing mode of %s", file)
+                 else:
+                     oldmode = os.stat(file)[ST_MODE] & 07777
+                     newmode = (oldmode | 0555) & 07777
+                     if newmode != oldmode:
+                         log.info("changing mode of %s from %o to %o",
+                                  file, oldmode, newmode)
+                         os.chmod(file, newmode)
+ 
      # copy_scripts ()
  

Index: clean.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/clean.py,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** clean.py	21 Jan 2002 00:57:49 -0000	1.1.1.1
--- clean.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 5,8 ****
--- 5,10 ----
  # contributed by Bastian Kleineidam <calvin at cs.uni-sb.de>, added 2000-03-18
  
+ # This module should be kept compatible with Python 1.5.2.
+ 
  __revision__ = "$Id$"
  
***************
*** 10,13 ****
--- 12,16 ----
  from distutils.core import Command
  from distutils.dir_util import remove_tree
+ from distutils import log
  
  class clean (Command):
***************
*** 52,58 ****
          # gone)
          if os.path.exists(self.build_temp):
!             remove_tree(self.build_temp, self.verbose, self.dry_run)
          else:
!             self.warn("'%s' does not exist -- can't clean it" %
                        self.build_temp)
  
--- 55,61 ----
          # gone)
          if os.path.exists(self.build_temp):
!             remove_tree(self.build_temp, dry_run=self.dry_run)
          else:
!             log.debug("'%s' does not exist -- can't clean it",
                        self.build_temp)
  
***************
*** 63,70 ****
                                self.build_scripts):
                  if os.path.exists(directory):
!                     remove_tree(directory, self.verbose, self.dry_run)
                  else:
!                     self.warn("'%s' does not exist -- can't clean it" %
!                               directory)
  
          # just for the heck of it, try to remove the base build directory:
--- 66,73 ----
                                self.build_scripts):
                  if os.path.exists(directory):
!                     remove_tree(directory, dry_run=self.dry_run)
                  else:
!                     log.warn("'%s' does not exist -- can't clean it",
!                              directory)
  
          # just for the heck of it, try to remove the base build directory:
***************
*** 73,77 ****
              try:
                  os.rmdir(self.build_base)
!                 self.announce("removing '%s'" % self.build_base)
              except OSError:
                  pass
--- 76,80 ----
              try:
                  os.rmdir(self.build_base)
!                 log.info("removing '%s'", self.build_base)
              except OSError:
                  pass

Index: config.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/config.py,v
retrieving revision 1.1.1.2
retrieving revision 1.2
diff -C2 -d -r1.1.1.2 -r1.2
*** config.py	15 Oct 2002 22:23:27 -0000	1.1.1.2
--- config.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 10,14 ****
  """
  
! # created 2000/05/29, Greg Ward
  
  __revision__ = "$Id$"
--- 10,14 ----
  """
  
! # This module should be kept compatible with Python 1.5.2.
  
  __revision__ = "$Id$"
***************
*** 18,22 ****
  from distutils.core import Command
  from distutils.errors import DistutilsExecError
! 
  
  LANG_EXT = {'c': '.c',
--- 18,23 ----
  from distutils.core import Command
  from distutils.errors import DistutilsExecError
! from distutils.sysconfig import customize_compiler
! from distutils import log
  
  LANG_EXT = {'c': '.c',
***************
*** 104,110 ****
          if not isinstance(self.compiler, CCompiler):
              self.compiler = new_compiler(compiler=self.compiler,
!                                          verbose=self.noisy,
!                                          dry_run=self.dry_run,
!                                          force=1)
              if self.include_dirs:
                  self.compiler.set_include_dirs(self.include_dirs)
--- 105,110 ----
          if not isinstance(self.compiler, CCompiler):
              self.compiler = new_compiler(compiler=self.compiler,
!                                          dry_run=self.dry_run, force=1)
!             customize_compiler(self.compiler)
              if self.include_dirs:
                  self.compiler.set_include_dirs(self.include_dirs)
***************
*** 151,157 ****
          self.compiler.link_executable([obj], prog,
                                        libraries=libraries,
!                                       library_dirs=library_dirs)
  
!         prog = prog + self.compiler.exe_extension
          self.temp_files.append(prog)
  
--- 151,159 ----
          self.compiler.link_executable([obj], prog,
                                        libraries=libraries,
!                                       library_dirs=library_dirs,
!                                       target_lang=lang)
  
!         if self.compiler.exe_extension is not None:
!             prog = prog + self.compiler.exe_extension
          self.temp_files.append(prog)
  
***************
*** 162,166 ****
              filenames = self.temp_files
              self.temp_files = []
!         self.announce("removing: " + string.join(filenames))
          for filename in filenames:
              try:
--- 164,168 ----
              filenames = self.temp_files
              self.temp_files = []
!         log.info("removing: %s", string.join(filenames))
          for filename in filenames:
              try:
***************
*** 240,244 ****
              ok = 0
  
!         self.announce(ok and "success!" or "failure.")
          self._clean()
          return ok
--- 242,246 ----
              ok = 0
  
!         log.info(ok and "success!" or "failure.")
          self._clean()
          return ok
***************
*** 261,265 ****
              ok = 0
  
!         self.announce(ok and "success!" or "failure.")
          self._clean()
          return ok
--- 263,267 ----
              ok = 0
  
!         log.info(ok and "success!" or "failure.")
          self._clean()
          return ok
***************
*** 283,287 ****
              ok = 0
  
!         self.announce(ok and "success!" or "failure.")
          self._clean()
          return ok
--- 285,289 ----
              ok = 0
  
!         log.info(ok and "success!" or "failure.")
          self._clean()
          return ok

Index: install.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/install.py,v
retrieving revision 1.1.1.2
retrieving revision 1.2
diff -C2 -d -r1.1.1.2 -r1.2
*** install.py	9 May 2002 18:27:22 -0000	1.1.1.2
--- install.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 3,7 ****
  Implements the Distutils 'install' command."""
  
! # created 1999/03/13, Greg Ward
  
  __revision__ = "$Id$"
--- 3,9 ----
  Implements the Distutils 'install' command."""
  
! from distutils import log
! 
! # This module should be kept compatible with Python 1.5.2.
  
  __revision__ = "$Id$"
***************
*** 9,13 ****
  import sys, os, string
  from types import *
! from distutils.core import Command, DEBUG
  from distutils.sysconfig import get_config_vars
  from distutils.errors import DistutilsPlatformError
--- 11,16 ----
  import sys, os, string
  from types import *
! from distutils.core import Command
! from distutils.debug import DEBUG
  from distutils.sysconfig import get_config_vars
  from distutils.errors import DistutilsPlatformError
***************
*** 56,59 ****
--- 59,69 ----
          'scripts': '$base/Scripts',
          'data'   : '$base',
+         },
+     'os2': {
+         'purelib': '$base/Lib/site-packages',
+         'platlib': '$base/Lib/site-packages',
+         'headers': '$base/Include/$dist_name',
+         'scripts': '$base/Scripts',
+         'data'   : '$base',
          }
      }
***************
*** 362,367 ****
                  self.install_data is None):
                  raise DistutilsOptionError, \
!                       "install-base or install-platbase supplied, but " + \
!                       "installation scheme is incomplete"
              return
  
--- 372,377 ----
                  self.install_data is None):
                  raise DistutilsOptionError, \
!                       ("install-base or install-platbase supplied, but "
!                       "installation scheme is incomplete")
              return
  
***************
*** 458,463 ****
              else:
                  raise DistutilsOptionError, \
!                       "'extra_path' option must be a list, tuple, or " + \
!                       "comma-separated string with 1 or 2 elements"
  
              # convert to local form in case Unix notation used (as it
--- 468,473 ----
              else:
                  raise DistutilsOptionError, \
!                       ("'extra_path' option must be a list, tuple, or "
!                       "comma-separated string with 1 or 2 elements")
  
              # convert to local form in case Unix notation used (as it
***************
*** 516,523 ****
              not (self.path_file and self.install_path_file) and
              install_lib not in sys_path):
!             self.warn(("modules installed to '%s', which is not in " +
!                        "Python's module search path (sys.path) -- " +
!                        "you'll have to change the search path yourself") %
!                       self.install_lib)
  
      # run ()
--- 526,533 ----
              not (self.path_file and self.install_path_file) and
              install_lib not in sys_path):
!             log.debug(("modules installed to '%s', which is not in "
!                        "Python's module search path (sys.path) -- " 
!                        "you'll have to change the search path yourself"),
!                        self.install_lib)
  
      # run ()

Index: install_data.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/install_data.py,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** install_data.py	21 Jan 2002 00:57:50 -0000	1.1.1.1
--- install_data.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 6,9 ****
--- 6,11 ----
  # contributed by Bastian Kleineidam
  
+ # This module should be kept compatible with Python 1.5.2.
+ 
  __revision__ = "$Id$"
  
***************
*** 47,51 ****
          self.mkpath(self.install_dir)
          for f in self.data_files:
!             if type(f) == StringType:
                  # it's a simple file, so copy it
                  f = convert_path(f)
--- 49,53 ----
          self.mkpath(self.install_dir)
          for f in self.data_files:
!             if type(f) is StringType:
                  # it's a simple file, so copy it
                  f = convert_path(f)

Index: install_headers.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/install_headers.py,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** install_headers.py	21 Jan 2002 00:57:50 -0000	1.1.1.1
--- install_headers.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 4,8 ****
  files to the Python include directory."""
  
! # created 2000/05/26, Greg Ward
  
  __revision__ = "$Id$"
--- 4,8 ----
  files to the Python include directory."""
  
! # This module should be kept compatible with Python 1.5.2.
  
  __revision__ = "$Id$"

Index: install_lib.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/install_lib.py,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** install_lib.py	21 Jan 2002 00:57:50 -0000	1.1.1.1
--- install_lib.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 1,3 ****
! # created 1999/03/13, Greg Ward
  
  __revision__ = "$Id$"
--- 1,3 ----
! # This module should be kept compatible with Python 1.5.2.
  
  __revision__ = "$Id$"
***************
*** 7,11 ****
  from distutils.core import Command
  from distutils.errors import DistutilsOptionError
- from distutils.dir_util import copy_tree
  
  class install_lib (Command):
--- 7,10 ----
***************
*** 126,136 ****
          if self.compile:
              byte_compile(files, optimize=0,
!                          force=self.force,
!                          prefix=install_root,
!                          verbose=self.verbose, dry_run=self.dry_run)
          if self.optimize > 0:
              byte_compile(files, optimize=self.optimize,
!                          force=self.force,
!                          prefix=install_root,
                           verbose=self.verbose, dry_run=self.dry_run)
  
--- 125,133 ----
          if self.compile:
              byte_compile(files, optimize=0,
!                          force=self.force, prefix=install_root,
!                          dry_run=self.dry_run)
          if self.optimize > 0:
              byte_compile(files, optimize=self.optimize,
!                          force=self.force, prefix=install_root,
                           verbose=self.verbose, dry_run=self.dry_run)
  

Index: install_scripts.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/install_scripts.py,v
retrieving revision 1.1.1.2
retrieving revision 1.2
diff -C2 -d -r1.1.1.2 -r1.2
*** install_scripts.py	9 May 2002 18:27:22 -0000	1.1.1.2
--- install_scripts.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 6,13 ****
--- 6,16 ----
  # contributed by Bastian Kleineidam
  
+ # This module should be kept compatible with Python 1.5.2.
+ 
  __revision__ = "$Id$"
  
  import os
  from distutils.core import Command
+ from distutils import log
  from stat import ST_MODE
  
***************
*** 49,56 ****
              for file in self.get_outputs():
                  if self.dry_run:
!                     self.announce("changing mode of %s" % file)
                  else:
!                     mode = ((os.stat(file)[ST_MODE]) | 0111) & 07777
!                     self.announce("changing mode of %s to %o" % (file, mode))
                      os.chmod(file, mode)
  
--- 52,59 ----
              for file in self.get_outputs():
                  if self.dry_run:
!                     log.info("changing mode of %s", file)
                  else:
!                     mode = ((os.stat(file)[ST_MODE]) | 0555) & 07777
!                     log.info("changing mode of %s to %o", file, mode)
                      os.chmod(file, mode)
  

Index: sdist.py
===================================================================
RCS file: /home/cvs/slpdev/src/2.2/src/Lib/distutils/command/sdist.py,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -C2 -d -r1.1.1.1 -r1.2
*** sdist.py	21 Jan 2002 00:57:50 -0000	1.1.1.1
--- sdist.py	4 May 2004 18:33:28 -0000	1.2
***************
*** 3,7 ****
  Implements the Distutils 'sdist' command (create a source distribution)."""
  
! # created 1999/09/22, Greg Ward
  
  __revision__ = "$Id$"
--- 3,7 ----
  Implements the Distutils 'sdist' command (create a source distribution)."""
  
! # This module should be kept compatible with Python 1.5.2.
  
  __revision__ = "$Id$"
***************
*** 15,18 ****
--- 15,19 ----
  from distutils.errors import *
  from distutils.filelist import FileList
+ from distutils import log
  
  
***************
*** 234,262 ****
                             "(using default file list)") %
                            self.template)
- 
              self.filelist.findall()
  
-             # Add default file set to 'files'
              if self.use_defaults:
                  self.add_defaults()
- 
-             # Read manifest template if it exists
              if template_exists:
                  self.read_template()
- 
-             # Prune away any directories that don't belong in the source
-             # distribution
              if self.prune:
                  self.prune_file_list()
  
-             # File list now complete -- sort it so that higher-level files
-             # come first
              self.filelist.sort()
- 
-             # Remove duplicates from the file list
              self.filelist.remove_duplicates()
- 
-             # And write complete file list (including default file set) to
-             # the manifest.
              self.write_manifest()
  
--- 235,249 ----
***************
*** 322,332 ****
  
      def read_template (self):
  
!         """Read and parse the manifest template file named by
!         'self.template' (usually "MANIFEST.in").  The parsing and
!         processing is done by 'self.filelist', which updates itself
!         accordingly.
          """
!         self.announce("reading manifest template '%s'" % self.template)
          template = TextFile(self.template,
                              strip_comments=1,
--- 309,318 ----
  
      def read_template (self):
+         """Read and parse manifest template file named by self.template.
  
!         (usually "MANIFEST.in") The parsing and processing is done by
!         'self.filelist', which updates itself accordingly.
          """
!         log.info("reading manifest template '%s'", self.template)
          template = TextFile(self.template,
                              strip_comments=1,
***************
*** 385,389 ****
          distribution.
          """
!         self.announce("reading manifest file '%s'" % self.manifest)
          manifest = open(self.manifest)
          while 1:
--- 371,375 ----
          distribution.
          """
!         log.info("reading manifest file '%s'", self.manifest)
          manifest = open(self.manifest)
          while 1:
***************
*** 411,416 ****
          # if the manifest happens to be empty.
          self.mkpath(base_dir)
!         dir_util.create_tree(base_dir, files,
!                              verbose=self.verbose, dry_run=self.dry_run)
  
          # And walk over the list of files, either making a hard link (if
--- 397,401 ----
          # if the manifest happens to be empty.
          self.mkpath(base_dir)
!         dir_util.create_tree(base_dir, files, dry_run=self.dry_run)
  
          # And walk over the list of files, either making a hard link (if
***************
*** 429,438 ****
  
          if not files:
!             self.warn("no files to distribute -- empty manifest?")
          else:
!             self.announce(msg)
          for file in files:
              if not os.path.isfile(file):
!                 self.warn("'%s' not a regular file -- skipping" % file)
              else:
                  dest = os.path.join(base_dir, file)
--- 414,423 ----
  
          if not files:
!             log.warn("no files to distribute -- empty manifest?")
          else:
!             log.info(msg)
          for file in files:
              if not os.path.isfile(file):
!                 log.warn("'%s' not a regular file -- skipping" % file)
              else:
                  dest = os.path.join(base_dir, file)
***************
*** 465,469 ****
  
          if not self.keep_temp:
!             dir_util.remove_tree(base_dir, self.verbose, self.dry_run)
  
      def get_archive_files (self):
--- 450,454 ----
  
          if not self.keep_temp:
!             dir_util.remove_tree(base_dir, dry_run=self.dry_run)
  
      def get_archive_files (self):


_______________________________________________
Stackless-checkins mailing list
Stackless-checkins at stackless.com
http://www.stackless.com/mailman/listinfo/stackless-checkins



More information about the Stackless-checkins mailing list