#! /usr/bin/env python
#  -*- Python -*-

"""%(program)s - script to create the latex source distribution

usage:
     %(program)s [-t|--tools] release [tag]

with -t|--tools:  doesn't include the documents, only the framework

without [tag]:  generate from the current version that's checked in
     	   (*NOT* what's in the current directory!)

with [tag]:  generate from the named tag
"""
#* should be modified to get the Python version number automatically
#  from the Makefile or someplace.

__version__ = "$Revision$"

import getopt
import glob
import os
import shutil
import sys
import tempfile


quiet = 0


def main():
     global quiet
     try:
          opts, args = getopt.getopt(sys.argv[1:], "abgtzq",
                                     ["all", "bzip2", "gzip", "tools", "zip",
                                      "quiet"])
     except getopt.error, e:
          usage(warning=str(e))
          sys.exit(2)
     if len(args) not in (1, 2):
          usage(warning="wrong number of parameters")
          sys.exit(2)
     tools = 0
     formats = {}
     for opt, arg in opts:
          if opt in ("-t", "--tools"):
               tools = 1
          elif opt in ("-q", "--quiet"):
               quiet = quiet + 1
          elif opt in ("-b", "--bzip2"):
               formats["bzip2"] = 1
          elif opt in ("-g", "--gzip"):
               formats["gzip"] = 1
          elif opt in ("-z", "--zip"):
               formats["zip"] = 1
          elif opt in ("-a", "--all"):
               formats["bzip2"] = 1
               formats["gzip"] = 1
               formats["zip"] = 1
     formats = formats.keys()
     if formats:
          # make order human-predictable
          formats.sort()
     else:
          formats = ["gzip"]
     release = args[0]
     cvstag = None
     if len(args) > 1:
          cvstag = args[1]
     tempdir = tempfile.mktemp()
     os.mkdir(tempdir)
     os.mkdir(os.path.join(tempdir, "Python-%s" % release))
     docdir = os.path.join(tempdir, "Python-%s" % release, "Doc")
     os.mkdir(docdir)
     mydir = os.getcwd()
     if cvstag:
          run("cvs export -r %s -d %s/Python-%s/Doc python/dist/src/Doc"
              % (cvstag, tempdir, release))
     else:
          run("cvs checkout -d %s/Python-%s/Doc python/dist/src/Doc"
              % (tempdir, release))
          # remove CVS directories
          os.chdir("%s/Python-%s" % (tempdir, release))
          for p in ('*/CVS', '*/*/CVS', '*/*/*/CVS'):
               map(shutil.rmtree, glob.glob(p))
          os.chdir(mydir)
     if tools:
          archive = "tools-" + release
          # we don't want the actual documents in this case:
          for d in ("api", "doc", "ext", "lib", "mac", "ref", "tut"):
               shutil.rmtree(os.path.join(docdir, d))
     else:
          archive = "latex-" + release

     # XXX should also remove the .cvsignore files at this point

     os.chdir(tempdir)
     archive = os.path.join(mydir, archive)
     for format in formats:
          if format == "bzip2":
               run("tar cf - Python-%s | bzip2 -9 >%s.tar.bz2"
                   % (release, archive))
          elif format == "gzip":
               run("tar cf - Python-%s | gzip -9 >%s.tgz"
                   % (release, archive))
          elif format == "zip":
               if os.path.exists(archive + ".zip"):
                    os.unlink(archive + ".zip")
               run("zip -q -r9 %s.zip Python-%s"
                   % (archive, release))

     # clean up the work area:
     os.chdir(mydir)
     shutil.rmtree(tempdir)


def run(cmd):
     if quiet < 2:
          print "+++", cmd
     if quiet:
          cmd = "(%s) >/dev/null" % cmd
     rc = os.system(cmd)
     if rc:
          sys.exit(rc)


def usage(warning=None):
     stdout = sys.stdout
     sys.stdout = sys.stderr
     program = os.path.basename(sys.argv[0])
     try:
          if warning:
               print "%s: %s\n" % (program, warning)
          print __doc__ % {"program": program}
     finally:
          sys.stdout = stdout


if __name__ == "__main__":
     main()
