"""distutils.command.bdist_pkgtool Implements the Distutils 'bdist_sdux' command to create HP-UX swinstall depot""" # Mark Alexander __revision__ = "$Id: bdist_sdux.py,v 0.1 " #import pdb import os, string 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 * import sys from commands import getoutput class bdist_sdux(Command): """ Does not support sub-packages, multiple filesets or individual files in a fileset. In other words, the python package has to be self- contained in it's own directory. Since this is the python package standard, it should not be too much of a problem.""" description = "create an HP swinstall depot" user_options = [ ('bdist-base', None, "Build directory"), ('name', None, "Module name"), ('copyright', None, "Copyright"), ('os-name', None, "OS Name"), ('readme', None, "README file"), ('vendor-tag=', None, "Vendor identification tag"), ('vender-title', None, "Name of vendor "), ('vendor-description', None, "Description of vendor"), ('psf-only', None, "Produce just the psf file"), ('product-tag', None, "Name of product"), ('product-title', None, "Title of product"), ('version', None, "Package version"), ('product-description', None, "Description of product"), ('product-architecture', None, "Machine architecture"), ('product-machine-type', None, "Type of hardware"), ('product-os-release', None, "Operating system level"), ('produt-os-version', None, "Operating system version"), ('fileset-tag', None, "Name of fileset"), ('fileset-revision', None, "Rev level of fileset"), ('fileset-title', None, "Name of fileset"), ('fileset-directory', None, "Directory for module files") ] def initialize_options (self): self.name = None self.vendor_tag = None self.bdist_base = None self.dist_dir = None self.vendor_title = None self.vendor_description = None self.psf_only = None self.product_tag = None self.product_title = None self.product_description = None self.copyright = None self.readme = None self.os_name = None self.version = None self.product_architecture = None self.product_machine_type = None self.product_os_release = None self.product_os_version = None self.fileset_tag = None self.fileset_revision = None self.fileset_title = None self.fileset_directory = None # initialize_options() def finalize_options (self): self.set_undefined_options('bdist', ('bdist_base', 'bdist_base')) self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) self.finalize_package_data() # finalize_options() def finalize_package_data (self): self.ensure_string('name',self.distribution.get_name()), self.ensure_string('vendor_tag',self.distribution.get_author()) self.ensure_string('vendor_title',self.distribution.get_author_email()) self.ensure_string('vendor_description',self.distribution.get_author()) self.ensure_string('product_tag',self.name) self.ensure_string('product_title',self.distribution.get_description()) self.ensure_string('os_name','HP-UX') self.ensure_string('version',self.distribution.get_version()) self.ensure_string('product_architecture',"*") self.ensure_string('product_machine_type',"*") self.ensure_string('product_os_release',"*") self.ensure_string('product_os_version',"*") self.ensure_string('fileset_tag',"FILES") self.ensure_string('fileset_revision',self.version) self.ensure_string('fileset_title',self.name) site=None for i in sys.path: if i[-13:]=="site-packages": site=i break if not site: raise AttributeError, "Cannot file site-packages" self.site=site self.ensure_string('fileset_directory',self.name) #if site: #self.ensure_string('fileset_directory',site) #else: #raise AttributeError, "fileset_directory is not specified" self.pkg_dir = os.path.join(self.bdist_base, "depot") # finalize_package_data () def run (self): if DEBUG: print "before _get_package_data():" print "vendor =", self.vendor print "packager =", self.packager # make directories self.mkpath(self.pkg_dir) # Spec file goes into 'dist_dir' if '--psf-only specified', # build/bdist./pkgtool otherwise. psf_path = os.path.join(self.pkg_dir, "%s.psf" % self.distribution.get_name()) # build package self.announce('Building package') self.spawn(string.split("%s/bin/python setup.py build" % sys.exec_prefix)) self.announce('Creating psf file') self.execute(write_file, (psf_path, self._make_info_file()), "writing '%s'" % psf_path) if self.psf_only: # stop if requested return #self.announce('Creating prototype file') #psf_path = os.path.join(self.pkg_dir, "prototype") #self.execute(write_file, #(psf_path, #self._make_prototype()), #"writing '%s'" % psf_path) #self.announce('Creating relocation request script') #req_path = os.path.join(self.pkg_dir, "request") #self.execute(write_file,(req_path,string.split(REQ,"\012")), #"writing '%s'" % req_path) #if self.psf_only: # stop if requested #return self.announce('Creating package') spawn_cmd = ['swpackage', '-s'] spawn_cmd.append(psf_path) spawn_cmd.append('-x') spawn_cmd.append('target_type=tape') spawn_cmd.append('@') spawn_cmd.append(self.pkg_dir+"/"+self.name+'-'+self.version+'.depot') self.spawn(spawn_cmd) # XXX this is a nasty hack -- we really should have a proper way to # find out the names of the RPM files created; also, this assumes # that RPM creates exactly one source and one binary RPM. # run() def _make_info_file(self): # Generate a psf file and return it as list of strings (one per line). # definitions and headers psf_file = [ 'vendor', # Vendor information ' tag %s' % string.replace(self.vendor_tag," ","_"), ' title %s' % self.vendor_title, ' description %s' % self.vendor_description, 'end', # end of vendor 'product', # Product information ' tag %s' % self.product_tag, ' title %s' % self.product_title, ' revision %s' % self.version, #' architecture %s' % self.product_architecture, ' machine_type %s' % self.product_machine_type, ' os_name %s' % self.os_name, ' os_release %s' % self.product_os_release, ' directory %s' % self.site, ' is_locatable true', ] if self.product_description: psf_file.extend([self.product_description]) if self.copyright: # XX make a copyright file XXX psf_file.extend([' copyright