[Python-checkins] CVS: distutils/distutils/command bdist_rpm.py,1.10,1.11

Greg Ward python-dev@python.org
Sun, 4 Jun 2000 08:00:37 -0700


Update of /cvsroot/python/distutils/distutils/command
In directory slayer.i.sourceforge.net:/tmp/cvs-serv13785

Modified Files:
	bdist_rpm.py 
Log Message:
Patch from Harry Henry Gebel:
Fills in question marks in help

Reads scripts in from files rather than strings

Adds RPM 2 compatibility mode (untested). Use of this mode requires that
--bdist-base be specified because bdist_rpm has no way of detecting where
RPM wants to find spec files and source files. An unmodified RedHat 5.0
system would require '--bdist-base=/usr/src/RedHat'. (You would also have
to be root.) If the rpmrc file has been modified to allow RPMs to be built
by normal users then --build-base would need to be changed accordingly.

Formats the changelog.

GPW: tweaked formatting, added some editorial comments.


Index: bdist_rpm.py
===================================================================
RCS file: /cvsroot/python/distutils/distutils/command/bdist_rpm.py,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -r1.10 -r1.11
*** bdist_rpm.py	2000/06/04 14:20:57	1.10
--- bdist_rpm.py	2000/06/04 15:00:34	1.11
***************
*** 6,10 ****
  # created 2000/04/25, by Harry Henry Gebel
  
! __revision__ = "$Id: bdist_rpm.py,v 1.10 2000/06/04 14:20:57 gward Exp $"
  
  import os, string
--- 6,10 ----
  # created 2000/04/25, by Harry Henry Gebel
  
! __revision__ = "$Id: bdist_rpm.py,v 1.11 2000/06/04 15:00:34 gward Exp $"
  
  import os, string
***************
*** 43,47 ****
           "RPM release number"),
          ('serial', None,
!          "???"),
          ('vendor', None,
           "RPM \"vendor\" (eg. \"Joe Blow <joe@example.com>\") "
--- 43,47 ----
           "RPM release number"),
          ('serial', None,
!          "RPM serial number"),
          ('vendor', None,
           "RPM \"vendor\" (eg. \"Joe Blow <joe@example.com>\") "
***************
*** 53,68 ****
           "list of documentation files (space or comma-separated)"),
          ('changelog', None,
!          "RPM changelog"),
          ('icon', None,
           "name of icon file"),
! 
!         ('prep-cmd', None,
!          "?? pre-build command(s) ??"),
!         ('build-cmd', None,
!          "?? build command(s) ??"),
!         ('install-cmd', None,
!          "?? installation command(s) ??"),
!         ('clean-cmd', None,
!          "?? clean command(s) ??"),
          ('pre-install', None,
           "pre-install script (Bourne shell code)"),
--- 53,67 ----
           "list of documentation files (space or comma-separated)"),
          ('changelog', None,
!          "path to RPM changelog"),
          ('icon', None,
           "name of icon file"),
!         ('prep-script', None,
!          "pre-build script  (Bourne shell code)"),
!         ('build-script', None,
!          "build script (Bourne shell code)"),
!         ('install-script', None,
!          "installation script (Bourne shell code)"),
!         ('clean-script', None,
!          "clean script (Bourne shell code)"),
          ('pre-install', None,
           "pre-install script (Bourne shell code)"),
***************
*** 73,87 ****
          ('post-uninstall', None,
           "post-uninstall script (Bourne shell code)"),
- 
          ('provides', None,
!          "???"),
          ('requires', None,
!          "???"),
          ('conflicts', None,
!          "???"),
          ('build-requires', None,
!          "???"),
          ('obsoletes', None,
!          "???"),
  
          # Actions to take when building RPM
--- 72,85 ----
          ('post-uninstall', None,
           "post-uninstall script (Bourne shell code)"),
          ('provides', None,
!          "capabilities provided by this package"),
          ('requires', None,
!          "capabilities required by this package"),
          ('conflicts', None,
!          "capabilities which conflict with this package"),
          ('build-requires', None,
!          "capabilities required to build this package"),
          ('obsoletes', None,
!          "capabilities made obsolete by this package"),
  
          # Actions to take when building RPM
***************
*** 94,101 ****
          ('no-rpm-opt-flags', None,
           "do not pass any RPM CFLAGS to compiler"),
         ]
  
      negative_opt = {'no-clean': 'clean',
!                     'no-rpm-opt-flags': 'use-rpm-opt-flags'}
  
                      
--- 92,104 ----
          ('no-rpm-opt-flags', None,
           "do not pass any RPM CFLAGS to compiler"),
+         ('rpm3-mode', None,
+          "RPM 3 compatibility mode (default)"),
+         ('rpm2-mode', None,
+          "RPM 2 compatibility mode"),
         ]
  
      negative_opt = {'no-clean': 'clean',
!                     'no-rpm-opt-flags': 'use-rpm-opt-flags',
!                     'rpm2-mode': 'rpm3-mode'}
  
                      
***************
*** 117,124 ****
          self.icon = None
  
!         self.prep_cmd = None
!         self.build_cmd = None
!         self.install_cmd = None
!         self.clean_cmd = None
          self.pre_install = None
          self.post_install = None
--- 120,127 ----
          self.icon = None
  
!         self.prep_script = None
!         self.build_script = None
!         self.install_script = None
!         self.clean_script = None
          self.pre_install = None
          self.post_install = None
***************
*** 134,137 ****
--- 137,141 ----
          self.clean = 1
          self.use_rpm_opt_flags = 1
+         self.rpm3_mode = 1
  
      # initialize_options()
***************
*** 161,165 ****
                             "%s <%s>" % (self.distribution.get_contact(),
                                          self.distribution.get_contact_email()))
!         self.ensure_string('packager', self.vendor) # or nothing?
          self.ensure_string_list('doc_files')
          if type(self.doc_files) is ListType:
--- 165,169 ----
                             "%s <%s>" % (self.distribution.get_contact(),
                                          self.distribution.get_contact_email()))
!         self.ensure_string('packager') 
          self.ensure_string_list('doc_files')
          if type(self.doc_files) is ListType:
***************
*** 168,189 ****
                      self.doc.append(readme)
  
!         self.ensure_string('release', "1")   # should it be an int?
          self.ensure_string('serial')   # should it be an int?
  
-         self.ensure_string('icon')
          self.ensure_string('distribution_name')
  
!         self.ensure_string('prep_cmd', "%setup") # string or filename?
  
!         if self.use_rpm_opt_flags:
!             def_build = 'env CFLAGS="$RPM_OPT_FLAGS" python setup.py build'
!         else:
!             def_build = 'python setup.py build'
!         self.ensure_string('build_cmd', def_build)
!         self.ensure_string('install_cmd',
!                            "python setup.py install --root=$RPM_BUILD_ROOT "
!                            "--record=INSTALLED_FILES")
!         self.ensure_string('clean_cmd',
!                            "rm -rf $RPM_BUILD_ROOT")
          self.ensure_filename('pre_install')
          self.ensure_filename('post_install')
--- 172,190 ----
                      self.doc.append(readme)
  
!         self.ensure_string('release', "1")
          self.ensure_string('serial')   # should it be an int?
  
          self.ensure_string('distribution_name')
  
!         self.ensure_string('changelog')
!           # Format changelog correctly
!         self.changelog = self._format_changelog(self.changelog)
  
!         self.ensure_filename('icon')
!         
!         self.ensure_filename('prep_script')
!         self.ensure_filename('build_script')
!         self.ensure_filename('install_script')
!         self.ensure_filename('clean_script')
          self.ensure_filename('pre_install')
          self.ensure_filename('post_install')
***************
*** 218,222 ****
              self.mkpath(spec_dir)       # XXX should be configurable
          else:
!             rpm_base = os.path.join(self.bdist_base, "rpm")
              rpm_dir = {}
              for d in ('SOURCES', 'SPECS', 'BUILD', 'RPMS', 'SRPMS'):
--- 219,227 ----
              self.mkpath(spec_dir)       # XXX should be configurable
          else:
!             if self.rpm3_mode:
!                 rpm_base = os.path.join(self.bdist_base, "rpm")
!             else:
!                 # complete path must be specified in RPM 2 mode
!                 rpm_base = self.bdist_base
              rpm_dir = {}
              for d in ('SOURCES', 'SPECS', 'BUILD', 'RPMS', 'SRPMS'):
***************
*** 267,272 ****
          else:
              rpm_args.append('-ba')
!         rpm_args.extend(['--define',
!                          '_topdir %s/%s' % (os.getcwd(), rpm_base),])
          if self.clean:
              rpm_args.append('--clean')
--- 272,278 ----
          else:
              rpm_args.append('-ba')
!         if self.rpm3_mode:
!             rpm_args.extend(['--define',
!                              '_topdir %s/%s' % (os.getcwd(), rpm_base),])
          if self.clean:
              rpm_args.append('--clean')
***************
*** 364,388 ****
  
          # rpm scripts
!         for (rpm_opt, attr) in (('prep', 'prep_cmd'),
!                                 ('build', 'build_cmd'),
!                                 ('install', 'install_cmd'),
!                                 ('clean', 'clean_cmd'),
!                                 ('pre', 'pre_install'),
!                                 ('post', 'post_install'),
!                                 ('preun', 'pre_uninstall'),
!                                 ('postun', 'post_uninstall')):
!             # XXX oops, this doesn't distinguish between "raw code"
!             # options and "script filename" options -- well, we probably
!             # should settle on one or the other, and not make the
!             # distinction!
              val = getattr(self, attr)
!             if val:
                  spec_file.extend([
                      '',
!                     '%' + rpm_opt,
!                     val
!                     ])
  
!         
          # files section
          spec_file.extend([
--- 370,412 ----
  
          # rpm scripts
!         # figure out default build script
!         if self.use_rpm_opt_flags:
!             def_build = 'env CFLAGS="$RPM_OPT_FLAGS" python setup.py build'
!         else:
!             def_build = 'python setup.py build'
!         # insert contents of files
! 
!         # XXX this is kind of misleading: user-supplied options are files
!         # that we open and interpolate into the spec file, but the defaults
!         # are just text that we drop in as-is.  Hmmm.
! 
!         script_options = [
!             ('prep', 'prep_script', "%setup"),
!             ('build', 'build_script', def_build),
!             ('install', 'install_script',
!              "python setup.py install "
!              "--root=$RPM_BUILD_ROOT "
!              "--record=INSTALLED_FILES"),
!             ('clean', 'clean_script', "rm -rf $RPM_BUILD_ROOT"),
!             ('pre', 'pre_install', None),
!             ('post', 'post_install', None),
!             ('preun', 'pre_uninstall', None),
!             ('postun', 'post_uninstall', None))
!         ]
! 
!         for (rpm_opt, attr, default) in script_options:
!             # Insert contents of file refered to, if no file is refered to
!             # use 'default' as contents of script
              val = getattr(self, attr)
!             if val or default:
                  spec_file.extend([
                      '',
!                     '%' + rpm_opt,])
!                 if val:
!                     spec_file.extend(string.split(open(val, 'r').read(), '\n'))
!                 else:
!                     spec_file.append(default)
  
! 
          # files section
          spec_file.extend([
***************
*** 398,408 ****
              spec_file.extend([
                  '',
!                 '%changelog',
!                 self.changelog
!                 ])
  
          return spec_file
  
      # _make_spec_file ()
  
  # class bdist_rpm
--- 422,452 ----
              spec_file.extend([
                  '',
!                 '%changelog',])
!             spec_file.extend(self.changelog)
  
          return spec_file
  
      # _make_spec_file ()
+ 
+     def _format_changelog(self, changelog):
+         """Format the changelog correctly and convert it to a list of strings
+         """
+         new_changelog = []
+         for line in string.split(string.strip(changelog), '\n'):
+             line = string.strip(line)
+             if line[0] == '*':
+                 new_changelog.extend(['', line])
+             elif line[0] == '-':
+                 new_changelog.append(line)
+             else:
+                 new_changelog.append('  ' + line)
+                 
+         # strip trailing newline inserted by first changelog entry
+         if not new_changelog[0]:
+             del new_changelog[0]
+         
+         return new_changelog
+ 
+     # _format_changelog()
  
  # class bdist_rpm