| #! /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. |
| |
| import getopt |
| import glob |
| import os |
| import re |
| import shutil |
| import sys |
| import tempfile |
| |
| import cvsinfo |
| |
| |
| quiet = 0 |
| rx = re.compile(r":ext:(?:[a-zA-Z0-9]+)@cvs\.([a-zA-Z0-9]+).sourceforge.net:" |
| r"/cvsroot/\1") |
| |
| |
| 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 |
| if formats: |
| # make order human-predictable |
| formats = formats.keys() |
| formats.sort() |
| else: |
| formats = ["gzip"] |
| release = args[0] |
| cvstag = None |
| if len(args) > 1: |
| cvstag = args[1] |
| tempdir = tempfile.mktemp() |
| os.mkdir(tempdir) |
| pkgdir = os.path.join(tempdir, "Python-Docs-" + release) |
| os.mkdir(pkgdir) |
| pwd = os.getcwd() |
| mydir = os.path.abspath(os.path.dirname(sys.argv[0])) |
| info = cvsinfo.RepositoryInfo(mydir) |
| cvsroot = info.get_cvsroot() |
| m = rx.match(cvsroot) |
| if m: |
| # If this is an authenticated SourceForge repository, convert to |
| # anonymous usage for the export/checkout, since that avoids the |
| # SSH overhead. |
| group = m.group(1) |
| cvsroot = ":pserver:anonymous@cvs.%s.sourceforge.net:/cvsroot/%s" \ |
| % (group, group) |
| # For some reason, SourceForge/CVS doesn't seem to care that we |
| # might not have done a "cvs login" to the anonymous server. |
| # That avoids a lot of painful gunk here. |
| os.chdir(tempdir) |
| if not quiet: |
| print "--- current directory is:", pkgdir |
| if cvstag: |
| run("cvs -d%s export -r %s -d Python-Docs-%s python/dist/src/Doc" |
| % (cvsroot, cvstag, release)) |
| else: |
| run("cvs -Q -d%s checkout -d Python-Docs-%s python/dist/src/Doc" |
| % (cvsroot, release)) |
| # remove CVS directories |
| for p in ('*/CVS', '*/*/CVS', '*/*/*/CVS'): |
| map(shutil.rmtree, glob.glob(p)) |
| for f in ('.cvsignore', '*/.cvsignore'): |
| map(os.unlink, glob.glob(f)) |
| LICENSE = os.path.normpath( |
| os.path.join(mydir, os.pardir, os.pardir, "LICENSE")) |
| shutil.copyfile(LICENSE, "LICENSE") |
| if tools: |
| archive = "doctools-" + release |
| # we don't want the actual documents in this case: |
| for d in ("api", "dist", "doc", "ext", "inst", |
| "lib", "mac", "ref", "tut"): |
| shutil.rmtree(os.path.join(pkgdir, d)) |
| else: |
| archive = "latex-" + release |
| |
| # XXX should also remove the .cvsignore files at this point |
| |
| os.chdir(tempdir) |
| archive = os.path.join(pwd, archive) |
| for format in formats: |
| if format == "bzip2": |
| run("tar cf - Python-Docs-%s | bzip2 -9 >%s.tar.bz2" |
| % (release, archive)) |
| elif format == "gzip": |
| run("tar cf - Python-Docs-%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-Docs-%s" |
| % (archive, release)) |
| |
| # clean up the work area: |
| os.chdir(pwd) |
| 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() |