Commits

Anonymous committed 762210d

fixup commit for tag 'xpr-20031113'

Comments (0)

Files changed (13)

ChangeLog

-2003-10-25  Steve Youngs  <sryoungs@bigpond.net.au>
-
-	* youngs/pkg-build.el (pkg-std-packages): Add missing packages.
-	From Norbert Koch <viteno@xemacs.org>.
-
-2003-10-14  Adrian Aichner  <adrian@xemacs.org>
-
-	* adrian/website/package-info2table.pl (main): Remove $ from RCS
-	keyword to avoid substitution in target file.
-
-2003-09-20  Adrian Aichner  <adrian@xemacs.org>
-
-	* adrian/documentation/texi-structure.pl: Report structure based
-	on dircategory and direntry.
-
-2003-08-29  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-build-version): Bump.
-	(pkg-release-sumo): Error when non-Mule.
-	(pkg-release-packages): Ditto.
-
-2003-07-31  Adrian Aichner  <adrian@xemacs.org>
-
-	* adrian/website/package-info2table.pl: Remove -quiet switch.
-	* adrian/website/package-info2table.pl (main): Put "Produced by
-	..." information inside HTML comment.
-	* adrian/website/package-info2table.pl (handle_all_files): Trace
-	processing of files when -debug is specified.  Most changes are
-	inspired by suggestions from Norbert Koch.
-
-2003-06-28  Adrian Aichner  <adrian@xemacs.org>
-
-	* adrian/website/package-info2table.pl: Convert to use STDERR
-	only.  Clean up some errors, most prominently the listing of
-	unsupported packages.
-
-2003-06-28  Adrian Aichner  <adrian@xemacs.org>
-
-	* adrian/website/package-info2table.pl: New script generating HTML
-	table suitable to update xemacsweb\Develop\packages.content from
-	package-info.in files.
-
-2003-04-16  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/README: Update.
-
-	* youngs/announce-prerelease-sumo: New.
-
-2003-04-14  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-build-version): Bump
-	(pkg-sumo-tarball-directory): New.
-	(pkg-std-sumo-install-directory): New.
-	(pkg-mule-sumo-install-directory): New.
-	(pkg-std-sumo-build-flags): Use 'pkg-std-sumo-install-directory'.
-	(pkg-mule-sumo-build-flags): Use
-	'pkg-mule-sumo-install-directory'.
-	(pkg-release-sumo): Use 'pkg-sumo-tarball-directory'.
-
-2003-04-03  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-build-version): Bump.
-	(pkg-make-targets): Use ` and , so we can expand within the
-	alist. 
-	Add an "install-only" target.
-	(pkg-packages-to-release-file): New.
-	(pkg-release-packages-later): New.
-	(pkg-release-packages-from-file): New.
-	(pkg-clear-release-file): New.
-	(pkg-make-bindist): Use `wrong-type-argument' error datum.
-	(pkg-commit-inc-ver): Ditto.
-	(pkg-tag-package): Ditto.
-	(pkg-release-packages): Use `invalid-argument' error datum.
-	Remove unused local variable 'package'.
-	(pkg-release-sumo): Use `invalid-argument' error datum.
-	(pkg-commentary): New.
-
-2003-03-18  Adrian Aichner  <adrian@xemacs.org>
-
-	* adrian/website/HTMLindex.pl (collect_headlines): Thanks Ville
-	for submitting this patch originally (2003-01-13)!  Get rid of
-	remaining instances of shape attribute.  Be sure for pattern
-	matches to support old files containing shape attributes.
-	* adrian/website/HTMLindex.pl (insert_index): Ditto.
-	* adrian/website/update-about-created-from-article-buffer.el
-	(update-about-created-from-article-buffer): Ditto.
-
-2003-03-17  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-build-version): Bump.
-	(pkg-make-program): New.
-	(pkg-make-targets): New.
-	(pkg-make-bindist): Use them.
-	(pkg-release-sumo): Ditto.
-	(pkg-get-info): Removed.
-
-2003-03-09  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-staging-directory): New.
-	(pkg-upload-packages): Use it.
-	From Norbert Koch <viteno@xeamcs.org>.
-
-2003-02-05  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-build-version): Increment.
-	(pkg-std-packages): Add some new packages.
-	(pkg-std-sumo-build-flags): Update to reflect Ben's variable name
-	changes. 
-	(pkg-mule-sumo-build-flags): Ditto.
-
-2003-01-13  Ville Skytt�  <scop@xemacs.org>
-
-	* xre (announce_web_release): Remove redundant use of
-	shape="rect" in anchors.
-
-2003-01-11  Adrian Aichner  <adrian@xemacs.org>
-
-	* adrian/website/HTMLindex.pl: Typo fix for typo fix.
-
-2003-01-11  Adrian Aichner  <adrian@xemacs.org>
-
-	* adrian/website/HTMLindex.pl: Copycat typo fix.
-
-2002-10-17  Adrian Aichner  <adrian@xemacs.org>
-
-	* adrian/website/update-about-created-from-article-buffer.el
-	(update-about-created-from-article-buffer): Expand definition of
-	`indent-region-or-balanced-expression' which is not in 21.4.
-
-2002-09-26  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-std-packages): Update.
-
-2002-09-19  Rendhalver [Peter Brown]  <rendhalver@xemacs.org>
-
-	* rendhalver New subdirectory
-
-2002-09-01  Ville Skytt�  <ville.skytta@xemacs.org>
-
-	* scop: New subdirectory.
-
-2002-08-18  Adrian Aichner  <adrian@xemacs.org>
-
-	* adrian/website/update-about-created-from-article-buffer.el
-	(update-about-created-from-article-buffer): New.
-
-2002-08-12  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-upload-packages): Temporarily set
-	default-directory when deleting files in pkg-upload-directory.
-	(pkg-build-version): Bump.
-
-2002-08-11  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-copy-cmd): New.
-	(pkg-copy-glob): New.
-	(pkg-make-bindist): Use them.
-	Don't use concat to construct any paths.
-
-2002-08-10  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-std-packages): Add docbookide, ecrypto,
-	ocaml, sasl, and sml-mode.
-	(pkg-build-version): Bump.
-	(pkg-base-directory): Use 'file-name-as-directory'.
-	(pkg-std-directory): Ditto.
-	(pkg-mule-directory): Ditto.
-	(pkg-working-base-directory): Ditto.
-	(pkg-working-std-directory): Ditto.
-	(pkg-working-mule-directory): Ditto.
-	(pkg-upload-directory): Ditto.
-	(pkg-sumo-tar-gzip): Use '--use-compress-program'.
-	(pkg-sumo-tar-bzip): Ditto.
-	(pkg-ftp-username): Remove.
-	(pkg-remote-path): Include username.
-	(pkg-customize): Autoload it.
-	(pkg-version): Ditto.
-	(pkg-release-packages): Ditto.
-	(pkg-release-sumo): Ditto.
-	(pkg-get-info): Ditto.
-	(pkg-release-sumo): Don't use concat to construct any paths.
-	(pkg-release-packages): Ditto.
-	(pkg-upload-packages): Ditto.
-	(pkg-tag-package): Ditto.
-	(pkg-commit-inc-ver): Ditto.
-
-2002-08-02  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el: Checkdoc fixes.
-	(pkg-version): Forgot to make the arg optional and the "P"
-	interactive spec.
-	(pkg-build-version): Bump.
-
-2002-08-01  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-commit-inc-ver): Add a "/" to the
-	constructed directory name.
-	(pkg-tag-package): Ditto.
-	(pkg-release-sumo): Ditto.
-	(pkg-sumo-tar-gzip): New.
-	(pkg-sumo-tar-bzip): New.
-	(pkg-release-sumo): Use them.
-	(pkg-upload-packages): Erase the package-index.gpg buffer before
-	signing package-index.
-	(pkg-release-packages): Fix bug with package version ending with
-	one or more zeroes.
-	(pkg-tag-package): Ditto.
-	(pkg-upload-packages): Optionally delete any file that is in the
-	upload directory before we copy any files into it.
-	(pkg-build-version): New.
-	(pkg-version): New.
-
-2002-07-23  Stephen J. Turnbull  <stephen@xemacs.org>
-
-	* stephen: New subdirectory.
-
-	* xre.py: Moved to stephen/xre-old.py.
-
-2002-07-09  Adrian Aichner  <adrian@xemacs.org>
-
-	* adrian/website/HTMLindex.pl: New script to update "Document
-	Index" in xemacsweb/About/Website.content,
-	xemacsweb/Download/elispPackages.content,
-	xemacsweb/Download/how-to-mirror-ftp.content
-
-2002-07-08  Adrian Aichner  <adrian@xemacs.org>
-
-	* adrian/typology/improper-an-typo.pl: Check improper use of "a"
-	as well.  Whitespace fix.
-	* adrian/typology/improper-form-typo.pl: Whitespace fix.
-	* adrian/typology/phrase-duplication-typo.pl: Ditto.
-
-2002-07-07  Adrian Aichner  <adrian@xemacs.org>
-
-	* adrian/website/avail2table.pl: New script to update commiter
-	table in xemacsweb/About/Website.content.
-	* xemacs-release.texi (Overview): Correct xemacs-builds module
-	reference.
-
-2002-06-30  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/welcome-new-maintainer: New.
-
-	* youngs/announce-public: New.
-
-	* youngs/announce-prerelease: New.
-
-	* youngs/README: Update.
-
-	* youngs/pkg-build.el (TODO): Update.
-
-2002-06-26  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-release-packages): Do a
-	`fill-paragraph' on the ChangeLog entries to keep everything neat
-	and tidy.
-	(pkg-make-bindist): Fix bug that caused building mule packages to
-	fail.  It was a typo.
-
-2002-06-08  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-release-packages): Switch to the log
-	buffer after prompting for args.
-
-2002-06-04  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-upload-directory): New.
-	(pkg-make-bindist): Fix up let form.
-	(pkg-commit-inc-ver): Ditto.
-	(pkg-release-packages): Ditto.
-	(pkg-release-sumo): Ditto.
-	(pkg-upload-packages): Ditto.  Also copy files to be uploaded to
-	'pkg-upload-directory'. 
-	(pkg-get-info): Fix infinite loop.
-
-2002-06-02  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-call-process): New arg "displayp" if
-	non-nil update output buffer on	the fly.
-	(pkg-release-sumo): Use "displayp" arg for 'pkg-call-process'.
-	Use 'start-process-shell-command' to upload Sumo tarballs so it
-	can be done asynchronously.
-	(pkg-release-packages): Use "displayp" arg for
-	'pkg-call-process'. 
-	(pkg-upload-packages): Use 'start-process-shell-command' to upload
-	packages so it can be done asynchronously.
-	(pkg-tag-package): Use "displayp" arg for 'pkg-call-process'.
-	(pkg-commit-inc-ver): Ditto.
-	(pkg-make-bindist): Ditto.
-	(pkg-packages-omit-sumo): Remove "ess".
-	(pkg-commit-inc-ver): Fix bug that was stopping the ChangeLogs
-	from being committed.
-
-2002-06-01  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-upload-packages): Replace a couple of
-	local variables with strings to fix a problem with some loops.
-
-2002-05-28  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-get-info): New.
-
-2002-05-22  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-release-sumo): Fix a wrongly placed ')'
-	which threw the logic off.
-	(pkg-release-sumo): Fix the path where the Sumo tarballs are built
-	from, typo in a filename, change tar flags.
-
-2002-05-21  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el (pkg-upload-packages): Handle adding and
-	removing a GnuPG comment string.
-	(pkg-pgp-default-comment): Change default value.
-
-	* youngs/BuildSumo: Rewrite from scratch using functions to
-	modularise. 
-	(MAKE): New.
-	(LOCAL_CVS_PACKAGE_ROOT): New.
-	(BUILD_PACKAGE_ROOT): New.
-	(STAGING_ROOT): New.
-	(STAGING): New.
-	(MULE_STAGING): New.
-	(XEMACS): New.
-	(SUMO_DATE): New.
-
-	* youngs/pkg-build.el: Major update, implementing lots of nifty
-	features.  Check "Currently Implemented Features" in the file's
-	commentary section.
-	(pkg-directory): New.
-	(pkg-remote): New.
-	(pkg-sumo): New.
-	(pkg-log-buffer): New.
-	(pkg-log-entry-inc-ver): New.
-	(pkg-pgp-default-comment): New.
-	(pkg-increment-version): Removed.
-	(pkg-working-base-directory): New.
-	(pkg-working-std-directory): New.
-	(pkg-working-mule-directory): New.
-	(pkg-packages-omit-sumo): New.
-	(pkg-std-sumo-build-flags): New.
-	(pkg-mule-sumo-build-flags): New.
-	(pkg-online-status-file): New.
-	(pkg-upload-command): New.
-	(pkg-ftp-username): New.
-	(pkg-remote-path): New.
-	(pkg-customize): New.
-	(pkg-call-process): New.
-	(pkg-make-bindist): New.
-	(pkg-commit-inc-ver): New.
-	(pkg-tag-package): New.
-	(pkg-upload-packages): New.
-	(pkg-release-packages): New.
-	(pkg-release-sumo): New.
-
-2002-05-20  Steve Youngs  <youngs@xemacs.org>
-
-	* BuildSumo: Move to ./youngs/
-
-	* youngs/BuildSumo: Moved here from ../
-	Re-written from scratch.
-
-	* youngs/README: New.
-
-2002-04-11  Steve Youngs  <youngs@xemacs.org>
-
-	* youngs/pkg-build.el: New.  Replace me with an elisp library. :-)
-
-2002-04-04  Steve Youngs  <youngs@xemacs.org>
-
-	* BuildSumo (TAR_BZIP): New.
-	(TAR_BZIP): New.
-	Use $SUMO_DATE in building Sumo tarballs and use those 2 new vars
-	to set user and group to root/root.
-
-2002-03-25  Steve Youngs  <youngs@xemacs.org>
-
-	* BuildSumo: Add liece, xslide, and latin-unity. 
-
-2002-03-12  Ben Wing  <ben@xemacs.org>
-
-	* asmcmp, cvs-commit, cvs-diff, cvs-mods, cvs-revert, cvs-rw,
-	cvs-update, cvs2patch, elccmp, syshgrep, sysnmgrep: Move Martin's
-	non-release scripts into the martin/ directory.
-	* martin/README: Create.
-	* README: Update.
-	
-2002-03-12  Steve Youngs  <youngs@xemacs.org>
-
-	* BuildSumo: Add ibuffer, mmm-mode. 
-
-2002-01-13  Steve Youngs  <youngs@xemacs.org>
-
-	* BuildSumo: Add sieve, mule-ucs.
-	Change 'ps-print-nomule' to 'ps-print'.
-
-2001-12-12  Steve Youngs  <youngs@xemacs.org>
-
-	* BuildSumo: Improve sumo tag, also tag as "sumo-current". 
-
-2001-12-27  Adrian Aichner  <adrian@xemacs.org>
-
-	* ben\crw: Convert to repository at SunSITE.dk.
-
-2001-12-27  Adrian Aichner  <adrian@xemacs.org>
-
-	* BuildXEmacs.zsh: Convert to repository at SunSITE.dk.
-	* upload-package.pl: Ditto.
-	* xre: Ditto.
-	* xre.py (xemacs): Ditto.
-
-2001-12-11  Steve Youngs  <youngs@xemacs.org>
-
-	* BuildSumo: Add ClearCase, Tramp & JDE packages.
-	Reorganise to ease maintainability.
-
-2001-09-26  Stephen J. Turnbull  <stephen@xemacs.org>
-
-	* xre.py: New file.  Release engineering script (Python port of xre).
-
-	* xemacs-release.texi: New file.  Documentation for this module.
-
-	* README: Request documentation.
-
-2001-08-16  Steve Youngs  <youngs@xemacs.org>
-
-	* BuildSumo: Re-write for new package tree.
-	Also tag the tree, make the tarballs and upload them.
-
-2001-04-20  Steve Youngs  <youngs@xemacs.org>
-
-	* BuildSumo: Don't include Sun, Eicq, JDE, VC-CC in SUMOs.
-
-2001-02-18  Steve Youngs  <youngs@xemacs.org>
-
-	* BuildSumo: Add libs/eieio and prog/xslt-process.
-
-2001-01-11  Steve Youngs  <youngs@xemacs.org>
-
-	* BuildSumo: Remove vc-cc as it is incompatible with vc.
-
-2001-01-10  Steve Youngs  <youngs@xemacs.org>
-
-	* BuildSumo: Add os/eshell, os/pcomplete.
-
-2000-10-31  Steve Youngs  <youngs@xemacs.org>
-
-	* BuildSumo: Add a 'make autoloads' and move the order of things
-	to match the Makefiles in the package tree.
-
-2000-08-27  Andreas Jaeger  <aj@suse.de>
-
-	* BuildSumo (XEMACS): Add eicq and semantic.
-
-	* upload-package.pl: New file.
-
-2000-01-15  Andreas Jaeger  <aj@suse.de>
-
-	* BuildSumo: Add prog/idlwave.
-
-1999-11-10  SL Baur  <steve@miho.m17n.org>
-
-	* MakeTarballs.zsh: Merge .elcs and .info files back into the main
-	tarball.
-

adrian/documentation/separateChangeLog.pl

-#! /usr/local/bin/perl -w
-
-# Break down entries of a ChangeLog file into their logical components.
-# Adrian Aichner, Teradyne GmbH Munich, Tue., Jun. 30, 1998.
-
-use strict;
-use Data::Dumper;
-use English;
-use File::Spec;
-use File::Basename;
-
-# Read in whole ChangeLog to allow multi-line matching on the entries.
-undef $INPUT_RECORD_SEPARATOR;
-
-# Regular Expression definitions, creating one back-reference each.
-my $dpat = qr{
-    (
-     [0-9]{4}			# 4-digit year number
-     -				# hyphen
-     [0-9]{2}			# 2-digit month number
-     -
-     [0-9]{2}			# 2-digit day number
-    )
-}x;
-my $npat = qr{
-    \s+(.+?)\s+			# A name
-}x;
-my $mpat = qr{
-    (<.+>)			# a mail address
-}x;
-# Don't create back-references for inner parenthetic RE sub-expressions.
-my $tpat = qr{
-    (
-     \n(?:[ \t]+.+\n+)+		# A changelog text block
-    )
-}x;
-my $entry_regex = qr{
-		     ^(\t\*\s+([^:(]+).+(\n\t[^*].+)*)
-}x;
-my @headers;
-my $changelog;
-
-# See whether we got the REs right.
-# print "$dpat:$npat:$mpat:$tpat\n";
-
-while (<>) {
-    chdir(dirname($ARGV)) or die;
-    # Iterate through each ChangeLog entry while there are any.
-    while (m{$dpat$npat$mpat\n$tpat}g) {
-	# Declare variables to store matched text pieces.
-	my ($date, $mail, $name, $text);
-	# Assign matched sub-strings to mnemonic variables.
-	($date, $name, $mail, $text) = ($1, $2, $3, $4);
-	unless ($headers[-1] eq "$date  $name  $mail") {
-	    push @headers, "$date  $name  $mail";
-	}
-	while ($text =~ m{$entry_regex}mg) {
-	    my $entry = $1;
-	    # Split relative path of file in change description.
-	    my ($volume,$directory,$file) = File::Spec->splitpath($2);
-	    my $file_regex = quotemeta($2);
-	    $entry =~ s{$file_regex}{$file};
-	    push @{$changelog->{File::Spec->catfile(($directory or "."), "ChangeLog.new")}->{$headers[-1]}}, "$entry";
-	    # Use these variables throughout the program.
-	    # print "$volume,$directory,$file\n{$date}\n{$name}\n{$mail}\n{$entry}\n";
-	}
-    }
-}
-my $d = Data::Dumper->new([\@headers], [qw(headers)]);
-print $d->Dump;
-# $d = Data::Dumper->new([$changelog], [qw(changelog)]);
-# print $d->Dump;
-my $changelog_file;
-for $changelog_file (keys %{$changelog}) {
-    print "<$changelog_file>\n";
-    open FH, "> $changelog_file";
-    my $date_entries;
-    for $date_entries (@headers) {
-	if (exists $changelog->{$changelog_file}->{$date_entries}) {
-	    print FH "$date_entries\n\n";
-	    my $entry;
-	    for $entry (@{$changelog->{$changelog_file}->{$date_entries}}) {
-		print FH "$entry\n";
-	    }
-	    print FH "\n";
-	}
-    }
-    close FH;
-}

adrian/documentation/texi-structure.pl

-use strict;
-use Data::Dumper;
-use English;
-use File::Find;
-use File::Spec::Unix;
-use Getopt::Long;
-
-# Adrian Aichner (APA), <adrian@xemacs.org>, The XEmacs Project, 2003-09-20.
-my $ID = '$Id$';
-
-# Read in whole file to allow multi-line matching on the entries.
-# undef $INPUT_RECORD_SEPARATOR;
-
-use vars qw($opt_debug $opt_help);
-
-my $texi_structure_regex = qr {
-                               ^\@dircategory\s+(.+)
-                           }x;
-
-my $dircategory;
-
-sub main {
-    my (@cmd_line) = ($0, @ARGV);
-    if (!GetOptions("debug", "help") or defined $opt_help) {
-        die("Usage: perl $0 [-debug] DIR
-
-Report matching lines in XEmacs texi files.\n");
-    }
-    print STDERR "Produced by:\n  @cmd_line\n  $ID\n";
-    unless (scalar @ARGV) {
-        @ARGV = (q{C:\DOCUME~1\AICHNE~1\LOCALS~1\Temp\packages});
-        print STDERR "Defaulting \@ARGV to @ARGV\n";
-    }
-    for (@ARGV) {
-        find(\&handle_all_files , ("$_"));
-    }
-    my $d = Data::Dumper->new([$dircategory], qw(dircategory));
-    print STDERR $d->Dump if (defined $opt_debug);
-    my ($key, $val);
-    #     while (($key, $val) = each(%{sort {
-    #         scalar(keys(%{$dircategory->{$b}})) <=> scalar(keys(%{$dircategory->{$a}}))
-    #     } %{$dircategory}})) {
-    while (($key, $val) = each(%{$dircategory})) {
-        printf(STDERR "dircategory \"%s\" is used by %d .texi files:\n",
-               $key, scalar(keys(%{$val})));
-        foreach (sort keys(%{$val})) {
-            printf(STDERR "\t%s\n", $_);
-        }
-    }
-}
-
-sub handle_all_files {
-    my $file = $_;
-    return unless ($file =~ '.texi\Z');
-    print STDERR "Processing $File::Find::name\n" if (defined $opt_debug);
-    open(IN, $file) or die $!;
-    while (<IN>) {
-        if (/$texi_structure_regex/) {
-            $dircategory->{$1}->{File::Spec::Unix->abs2rel($File::Find::name, $File::Find::topdir)} = 1;
-            printf STDERR "%s:%d:%s",
-              $File::Find::name, $., $_ if (defined $opt_debug);
-            last;
-        }
-        if (eof(IN)) {
-            $dircategory->{"NO DIRCATEGORY IN FILE"}->{File::Spec::Unix->abs2rel($File::Find::name, $File::Find::topdir)} = 1;
-        }
-    }
-    close IN;
-}
-
-main();

adrian/website/package-info2table.pl

-use strict;
-use Data::Dumper;
-use English;
-use File::Find;
-use File::Spec::Unix;
-use Getopt::Long;
-
-# Generate a HTML table suitable to update
-# xemacsweb\Develop\packages.content
-# via ediff from the package-info.in files in a local packages tree.
-# This approach was chosen over reading package-get-base lisp data,
-# because this script may also be used to systematically modify
-# package-info.in files.
-#
-# STDERR is used for progress and table output, because STDOUT may be
-# used in the future to modify package-info.in files.
-#
-# Yes, the local package tree has to be complete to do a full update,
-# but using ediff even selective updates of packages.content are easy
-# to do.
-# Adrian Aichner (APA) <adrian@xemacs.org>, 2003-06-28.
-my $ID = '$Id$';
-
-# Read in whole file to allow multi-line matching on the entries.
-undef $INPUT_RECORD_SEPARATOR;
-
-use vars qw($opt_debug $opt_help);
-
-my $mule_packages;
-my $xemacs_packages;
-
-sub main {
-    my (@cmd_line) = ($0, @ARGV);
-    if (!GetOptions("debug", "help") or defined $opt_help) {
-        die("Usage: perl $0 [-debug] DIR
-
-Generate HTML table from local package-info.in files to update
- xemacsweb/Develop/packages.content.\n");
-    }
-    unless (scalar @ARGV) {
-        @ARGV = ("c:\\Hacking\\cvs.xemacs.org\\XEmacs\\packages");
-    }
-    for (@ARGV) {
-        find(\&handle_all_files , ("$_"));
-    }
-    #     my $d = Data::Dumper->new([$mule_packages], [qw($mule_packages)]);
-    #     print $d->Dump();
-    #     $d = Data::Dumper->new([$xemacs_packages], [qw($xemacs_packages)]);
-    #     print $d->Dump();
-    $ID =~ s'\$''g;
-    print STDERR "  <!-- Produced by:\n  @cmd_line\n  $ID -->\n";
-    #
-    # Begin of section produced by:
-    # C:\Users\AichnerAd\pl\printfize.pl -p
-    #
-    printf(STDERR "  <table align=\"center\" border=\"3\" cellspacing=\"1\" cellpadding=\"1\" width=\"90%%\">\n");
-    printf(STDERR "    <caption>XEmacs packages</caption>\n");
-    printf(STDERR "    <tr><th>Package name</th><th>CVS name</th><th>Tree location</th><th>Description</th></tr>\n");
-    printf(STDERR "    <tr><td align=\"center\" colspan=\"4\"><a name=\"standard\">Standard packages</a></td></tr>\n");
-    my ($key, $value);
-    foreach $key (sort keys %{$xemacs_packages}) {
-        $value = $xemacs_packages->{$key};
-        printf(STDERR "    <tr><td>%s</td><td>%s</td><td><a name=\"%s\" href=\"http://cvs.xemacs.org/viewcvs.cgi/XEmacs/packages/%s/\">%s/</a></td><td>%s</td></tr>\n", $key, $key, $key, $value->{directory}, $value->{directory}, ($value->{description} or "No Description"));
-    }
-    printf(STDERR "    <tr><td align=\"center\" colspan=\"4\"><a name=\"mule\">MULE (MUltiLingual Emacs) packages</a></td></tr>\n");
-    foreach $key (sort keys %{$mule_packages}) {
-        $value = $mule_packages->{$key};
-        printf(STDERR "    <tr><td>%s</td><td>%s</td><td><a name=\"%s\" href=\"http://cvs.xemacs.org/viewcvs.cgi/XEmacs/packages/%s/\">%s/</a></td><td>%s</td></tr>\n", $key, $key, $key, $value->{directory}, $value->{directory}, ($value->{description} or "No Description"));
-    }
-    printf(STDERR "  </table>\n");
-    #
-    # End of section produced by:
-    # C:\Users\AichnerAd\pl\printfize.pl -p
-    #
-}
-
-sub handle_all_files {
-    my $file = $_;
-    return unless ($file =~ '\A(package-info.in)\Z');
-    print STDERR "Processing $File::Find::name\n" if (defined $opt_debug);
-    open(IN, $file) or die $!;
-    while (<IN>) {
-        my $package = "";
-        my $description = "";
-        if (/^\((.*)/) {
-            printf STDERR "%s:%d:%s",
-              $File::Find::name, $., $_ if (defined $opt_debug);
-            $package = $1;
-        }
-        if (/\n\s+description\s+"([^"]+)"/) {
-            $description = $1;
-            printf STDERR "%s:%d:%s",
-              $File::Find::name, $., $_ if (defined $opt_debug);
-            if ($package ne "") {
-                if ($File::Find::dir =~ m{[\\/]mule-packages[\\/]}) {
-                    $mule_packages->{$package}->{description} = $description;
-                    $mule_packages->{$package}->{directory} = File::Spec::Unix->abs2rel("$File::Find::dir", $File::Find::topdir);
-                } elsif ($File::Find::dir =~ m{[\\/]xemacs-packages[\\/]}) {
-                    $xemacs_packages->{$package}->{description} = $description;
-                    $xemacs_packages->{$package}->{directory} = File::Spec::Unix->abs2rel("$File::Find::dir", $File::Find::topdir);
-                }
-            }
-        }
-    }
-    close IN;
-}
-
-main();

stephen/.cvsignore

-*.pyc
-*.pyo

stephen/ChangeLog

-2003-09-05  Stephen J. Turnbull  <stephen@xemacs.org>
-
-	* xre.py:  Many small fixes.
-
-	xre_data.py:  Use None, not "TRUNK", to indicate head.
-
-	xre.texi:  Flesh out description of release procedure.
-
-	xemacs-release.info:  New.  Compiled version of xre.texi.
-
-2003-08-19  Stephen J. Turnbull  <stephen@xemacs.org>
-
-	* msgid-to-url.el: New file, more or less working condition.
-
-2002-12-06  Stephen J. Turnbull  <stephen@xemacs.org>
-
-	* xre.py (Release.__init__):
-	(Release.doit):
-	(Release.tag):
-	Add tagTail handling for tags like r21-4-11rc1.
-	(Release.makeTarball): Add additionalConfigureFlags handling.
-	(Release.tag): Don't use rtag (symlinked Root bug).
-
-2002-12-05  Stephen J. Turnbull  <stephen@xemacs.org>
-
-	* .cvsignore: New.
-
-2002-12-05  Stephen J. Turnbull  <stephen@xemacs.org>
-
-	* xre.py, xre_data.py:
-	53. Fix dict arg not converted to Flags bug.
-	49. Fix the flags argument not used in body bug.
-	48. Fix some cvs method bugs, including deepcopy bug in xre_data.tester
-	46. Exclude Emacs backup files.
-	45. Quote --exclude globs in makepatch and tar commands.
-	41. Fix HTML escape utility.
-	40. Completely rewrite parseChangesFile.
-	39. Generalize getCodenameFromFile.
-	38. Break out makeUploadList method.
-	37. Set up uploads for FTP READMEs.
-	34. Create Flags class to handle global verbosity and dryRun, etc.
-	35. Improve class Access.
-	36. Implement Release.abstract (and immediately obsolete?)
-	33. Implement announcement generators for mail and HTML.
-	31. Lots of small fixes.
-	32. Move upload of READMEs from Release.upload to Release.makePublic.
-	30. Add Access for up/download of READMEs.
-	29. Unify tarball and patchkit exclude generation.
-
-2002-08-23  Stephen J. Turnbull  <stephen@xemacs.org>
-
-	* .cvsignore: New file.  Ignore compiled Python.
-
-2002-07-25  Stephen J. Turnbull  <stephen@xemacs.org>
-
-	* xre.py (Release.prepare): Use checkout -P.  Thx, Steve Y.
-	(Release.makeTarball): --exclude .cvsignore.
-	(Release.package): Ditto.  Thx, Steve Y.
-
-2002-07-23  Stephen J. Turnbull  <stephen@xemacs.org>
-
-	* xre.py:
-	* xre_data.py:
-	* xre.texi:
-	New files.  Implementation and documentation of my procedures.
-
-2002-07-23  Stephen J. Turnbull  <stephen@xemacs.org>
-
-	* xre-old.py: Update to latest used version
-
-2002-07-23  Stephen J. Turnbull  <stephen@xemacs.org>
-
-	* ChangeLog: Created.
-
-	* xre-old.py: Moved from ../xre.py.
-

stephen/msgid-to-url.el

-;;; msg-id-to-url.el --- search XEmacs list archives, and provide URL
-
-;; Copyright (C) 2003 Free Software Foundation
-
-;; Author:   Stephen J. Turnbull <stephen@xemacs.org>
-
-;; Version:  1.0
-;; Created:  2003 August 19
-;; Keywords: maint, mail
-
-;; This file is part of XEmacs.
-
-;; XEmacs is free software; you can redistribute it and/or modify it
-;; under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
-
-;; XEmacs is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with XEmacs; see the file COPYING.  If not, write to the 
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Commentary:
-
-;; Search the XEmacs archives for a message ID, and provide an URL to it.
-;; Alternatively, take the message ID from the region, and wrap an HTML
-;; anchor around it.
-
-;; Entry points (interactive commands):
-;;     wrap-link-around-message-id
-;;     message-id-to-url
-
-;;; Code:
-
-;;; Synched up with: Not in GNU Emacs.
-
-;; candidates for defcustoms
-
-(defvar msgid-to-url-verbose t
-  "Non-nil enables verbose messages.")
-
-(defvar msgid-to-url-truncate-id-length 24
-  "Truncate query strings to this length.
-
-The wilma search engine at list-archive.xemacs.org doesn't like long queries
-\(or maybe just long words in the queries).  The default is 24, but some
-queries seem to work better with even less.")
-
-(defvar msgid-to-url-parse-url-regexp
-  "<A HREF=\"/cgi-bin/wilma_hiliter\\(/.*\\.html\\)\\?"
-  "Regexp to parse part of the URL, expected to be in group 1.")
-
-(defvar msgid-to-url-parse-url-format "http://list-archive.xemacs.org%s"
-  "Format string to make a valid URL from the first match group of
-`msgid-to-url-parse-url-regexp'.")
-
-;; internal variables
-
-(defvar msgid-to-url-working-buffer-name "msgid-to-url-temp-url"
-  "Working buffer to hold fetched documents.")
-
-(defvar msgid-to-url-junk-tag-re "</?[a-zA-Z]+>")
-
-;; the main entry points
-
-(defun wrap-link-around-message-id (begin end)
-  "Wrap an HTML HREF around a Message ID, doing a web search for the URL.
-
-Leaves point at beginning and mark at end of the original text, "
-
-  (interactive "r")
-
-  (let ((target (buffer-substring begin end)))
-
-    (setq end (set-marker (make-marker) end))
-
-    (let ((url (or (message-id-to-url target nil
-				      "xemacs-beta"
-				      "xemacs-nt"
-				      "xemacs-patches")
-		   (error "No URL found.  Too soon?  Typo in Message-ID?"))))
-      (goto-char begin)
-      (insert "<a href=\"")
-      (insert url)
-      (insert "\">\n")
-      (setq begin (point))
-      (setq end (marker-position end))	; freeze end
-      (goto-char end)
-      (insert "\n</a>")
-      (move-marker (mark-marker t) end)
-      (goto-char begin))))
-
-(defun message-id-to-url (id &optional auth &rest lists)
-  "Return URL corresponding to message-id ID posted to LISTS.
-
-AUTH is an authorization in the form USER:PASSWORD.  It has no default.
-LISTS defaults to (\"xemacs-beta\" \"xemacs-nt\" \"xemacs-patches\"); each
-is tried in order and the URL corresponding to the first match is returned.
-BASE-URL may contain the descriptor \"%s\", and the list is substituted into
-the query there.  BASE-URL should contain the query operator \"?\".
-It defaults to \"http://list-archive.xemacs.org/cgi-bin/wilma_glimpse/%s?\"."
-
-    (interactive (let ((args (list (if (region-active-p)
-				       (buffer-substring (region-beginning)
-							 (region-end))
-				     (read-string "Message-ID: "))
-				   (read-string "User:Password: "))))
-		   (let ((l (read-string "List (null to terminate): ")))
-                     (while (> (length l) 0)
-		       (setq args (nconc args (list l)))
-		       (setq l (read-string "List (null to terminate): "))))
-		   args))
-
-    (setq auth (cond ((null auth) "")
-		     ((> (length auth) 0) (concat auth "@"))
-		     (t auth)))
-    (setq lists (or (and lists (> (length (car lists)) 0) lists)
-		    '("xemacs-beta" "xemacs-nt" "xemacs-patches")))
-    (if msgid-to-url-verbose (message id))
-
-    ;; wilma doesn't like long queries
-    (let ((id (substring id 0 (min (length id)
-				   msgid-to-url-truncate-id-length))) 
-	  url)
-      (save-excursion    ; url-retrieve leaves you in the buffer
-	(while lists
-	  (let ((url-working-buffer msgid-to-url-working-buffer-name)
-		(ml (car lists)))
-	    (url-retrieve
-	     (concat "http://"
-		     auth
-		     "list-archive.xemacs.org"
-		     "/cgi-bin/wilma_glimpse/"
-		     ml
-		     "?query="
-		     (url-hexify-string id)
-		     "&partial=on")))
-	  (setq url (msgid-to-url-parse-url-from-response))
-	  (if msgid-to-url-verbose (message url))
-	  (if url
-	      (setq lists nil)
-	    (setq lists (cdr lists)))))
-      url))
-
-;; internal helpers
-
-(defun msgid-to-url-parse-url-from-response ()
-  "Parse an URL from the HTML returned by a web search on message-id.
-
-Expects to be called in the HTML buffer.  Returns `nil' on failure."
-
-  (goto-char (point-min))
-  ;; Aargh, wilma puts so much s**t in the buffer
-  (while (re-search-forward msgid-to-url-junk-tag-re nil t)
-    (replace-match ""))
-  (goto-char (point-min))
-  (if (let ((case-fold-search t))
-        (search-forward "Message-ID" nil t))
-      (let ((eol (progn (end-of-line) (point))))
-        (beginning-of-line)
-        (re-search-forward msgid-to-url-parse-url-regexp eol)
-        (format msgid-to-url-parse-url-format
-                (match-string 1)))))
-
-(provide 'msgid-to-url)
-

stephen/xemacs-release.info

-This is xemacs-release.info, produced by makeinfo version 4.6 from
-xre.texi.
-
-INFO-DIR-SECTION XEmacs Editor
-START-INFO-DIR-ENTRY
-* Releases: (xemacs-release).  XEmacs Release Engineering.
-END-INFO-DIR-ENTRY
-
-
-File: xemacs-release.info,  Node: Top,  Next: Overview,  Up: (dir)
-
-XEmacs Release Engineering
-**************************
-
-Introduction
-************
-
-This is a manual for XEmacs release engineers.  It describes the current
-best practices of the XEmacs project in release engineering.  Most of
-these practices are automated (for the core) by Martin Buchholz's `xre'
-Perl script, which may be considered the reference implementation.
-
-   This manual is freely redistributable under the GNU General Public
-License, version 2 or any later version as published by the FSF.  It is
-not the same license as most core XEmacs documentation, nor is it the
-GNU Free Documentation License.  This manual is distributed in the hope
-that it will be useful, but WITHOUT ANY WARRANTY; without even the
-implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-* Menu:
-
-* Overview::             The why and how of release engineering.
-* Specification::        What needs to be done.
-* xre.py::               Utilities for release engineers, in Python.
-
-
-File: xemacs-release.info,  Node: Overview,  Next: Specification,  Prev: Top,  Up: Top
-
-Overview of Release Engineering
-*******************************
-
-Why do releases need to be "engineered"?
-
-   Because neither bugs nor developers are willing to be disciplined to
-a schedule.  Critical fixes are incorporated at the last moment, testing
-is never sufficient, and support software such as CVS itself is often
-broken, not to mention the hazards of pilot error by management.
-Developers (and software) leave trash such as backup copies in the
-development tree, or edit allegedly pristine copies.
-
-   Dealing with these issues requires attention of an intelligent
-problem solver.  That's the release engineer.
-
-   It's pretty much a routine job.  Mostly you need to make sure you
-devote sufficient resources (primarily time and disk space) so that your
-scripts can complete their tasks.
-
-   The basic tasks the release engineer must accomplish, more or less in
-chronological order are:
-
-  1. Decide to release.  Factors affecting the release decision include
-     recent application of critical fixes, time since last release, and
-     (for the trunk) providing a baseline release in anticipation of
-     large destabilizing merges of code.
-
-  2. Update internal release documents.  These include the `PROBLEMS'
-     file and the `NEWS', `CHANGES-release', or `CHANGES-beta' file.
-     The latter are summaries of the important changes, even briefer
-     than ChangeLog entries.
-
-  3. Create a complete source tree, free of cruft.  This includes
-     updating generated files that for one reason or another are not
-     automatically updated.  In particular, dependency files (make
-     depend) and the configure script (autoconf, v 2.13 is required)
-     must be updated.  Although there should be no "real" changes to be
-     logged, to help readers establish a time line, a herald stating
-     the date, release engineer, and the version information for the
-     release should be added to all ChangeLogs, whether or not any
-     content has changed since the previous release.  Commit these
-     changes.
-
-  4. Tag the CVS repository, so the release can be reproduced for
-     debugging purposes.
-
-  5. Update certain generated files that are part of the distribution.
-     Some because they depend on tools that traditionally were
-     available only on some systems, and not necessarily to the average
-     sysadmin.  Others for convenience of users.
-
-  6. Build the platform-independent objects (compiled Lisp and
-     formatted Info files).  These should not be committed to the
-     repository.
-
-  7. Bundle it up in various ways.
-
-  8. Upload the bundles to the primary distribution point.
-
-  9. Announce the release.
-
-   Most of these tasks can fairly well be automated.
-
-   For more details of current practice, see Martin Buchholz's Perl
-script `xre' and Stephen Turnbull's Python script `xre.py'.  Martin is
-the more experienced engineer; where semantics differ rely more on his
-practices unless the difference is documented to stem from a deliberate
-policy change.  Martin's script is the original, but Steve's script has
-more comments.
-
-   There are also older scripts used by Steve Baur, which I don't know
-about.  Steve Youngs has a set of scripts which are regularly updated,
-but his releases have so far all been betas.  His scripts may or may not
-implement everything required for a public release.  All of these
-scripts are available from the XEmacs CVS repository in the module
-`xemacs-build'.  See <http://cvs.xemacs.org/> for more information
-about checking out modules from CVS.
-
-
-File: xemacs-release.info,  Node: Specification,  Next: xre.py,  Prev: Overview,  Up: Top
-
-Specification of the Release Product
-************************************
-
-This section is preliminary, and reflects the author's (stephen's)
-practices and opinions, not a defined process for XEmacs.  It's probably
-a reasonable place to start, though.  Also, it contains descriptions of
-implementation, and these probably should be moved to a separate node.
-
-Freezing the Workspace
-======================
-
-When the release engineer decides to make a release, he must freeze a
-CVS workspace including committing any remaining changes.  Since CVS
-operates on the basis of the revisions recorded in the workspace, other
-development can continue.  Assuming that the release engineer is
-perfect, of course; if he discovers a problem and changes a file, there
-is a possibility that someone else will check in a change to the same
-file, creating a conflict.  The release engineer needs to be aware of
-this possibility, and implement practices to avoid it or deal with it.
-
-Updating Distribution Files
-===========================
-
-Once the workspace is frozen, there are still some changes that need to
-be made to certain files documenting history.  If in fact regenerating
-the file results in a file identical to the repository version of that
-revision, CVS will update the workspace information, but not commit an
-identical file.  So there is no harm in always regenerating and
-attempting to commit files, as long as this is done before updating
-history files and committing them.
-
-`ChangeLog'
-     The ChangeLog in _each_ subdirectory has a herald added to it to
-     mark patches that were committed before and after the release.
-     Dates on ChangeLog entries reflect the submission, not the
-     application, of a patch, and may lag many weeks.
-
-`NEWS'
-     For a major release (which actually corresponds to a change in the
-     minor version number), the `NEWS' file has already been updated as
-     part of the preparation.  This is not part of the release
-     engineer's responsibility _ex oficio_.
-
-`CHANGES-release'
-`CHANGES-beta'
-     For patch or beta releases, the release engineer updates the
-     appropriate `CHANGES' file.  The `CHANGES' file notes semantic
-     aspects of the changes, rather than be a list of textual edits.
-     (That's what `ChangeLogs' are for.)  It is especially careful to
-     give prominent notice of user interface changes, including
-     unobvious changes to command semantics.  Every contributor with a
-     `ChangeLog' entry should be mentioned here.
-
-`configure'
-     The configure script is updated by running `autoconf'.  Note that
-     as of January 2003, XEmacs _requires_ autoconf 2.13; later
-     versions _will not produce a correct configure script_.
-
-`src/depends'
-     The dependency graph for the src subdirectory is updated by using
-     the script `src/make-src-depend'.  The Make target `depend' runs
-     this script along with a few preparation and cleanup commands.
-
-Updating the Repository
-=======================
-
-The CVS repository is updated to reflect the release versions of all
-source files.  All of the changes described in the previous section
-should be committed to the repository.
-
-   The repository is tagged.  All releases have a corresponding tag of
-the form `rMAJOR-MINOR-PATCH'.  Use the CVS `tag' command to ensure
-that the workspace revisions are assigned to the tag.  General releases
-also have a branch tag of the form `release-MAJOR-MINOR'.  The
-development "branch" has no branch tag because of the peculiarity that
-the CVS trunk has no branch tag.  For convenience of testers who would
-like to always check out the most recent tagged version, a "moving" tag
-named `rMAJOR-MINOR-latest-beta' is updated to correspond to the
-release tag using the `-r rMAJOR-MINOR-PATCH' option to `cvs tag' in
-this case.
-
-   In general, it's probably a good idea to do tagging at the very end,
-when all of the release products have been successfully generated.
-
-Generating the Libraries and Info Documentation
-===============================================
-
-For general releases, we provide pre-compiled Lisp libraries and Info
-files.  These are built in the usual way.  Note that the Lisp libraries
-are built with a Mule-enabled XEmacs.
-
-Generating the Tarballs
-=======================
-
-XEmacs is normally distributed as a gzipped tar archive.  Both a
-comprehensive tarball and a suite of component tarballs are provided for
-download.  The tarball named `xemacs-VERSION.tar.gz' contains all
-sources, including the generated `configure' and `src/depends' files.
-CVS administrative files and directories are omitted.  The
-architecture- and configuration-independent parts of the build are
-included.  These are the compiled Lisp libraries and the generated Info
-files.
-
-   The component suite consists of the tarballs
-`xemacs-VERSION-src.tar.gz' `xemacs-VERSION-elc.tar.gz'
-`xemacs-VERSION-info.tar.gz', with the obvious contents.  These are not
-generated for beta test releases.
-
-Generating the Patch
-====================
-
-For the bandwidth-limited, each release provides a patch to upgrade from
-the previous patch release.  The patch file is named
-`xemacs-PREVIOUS-VERSION.patch.gz'.  "Multimedia" files, CVS
-administrative files, and the generated compiled Lisp and Info files
-are excluded from the patch.
-
-   The utility `makepatch' is very useful.
-
-Signing the Distribution
-========================
-
-Although there is debate about the usefulness of cryptographic
-signatures for verifying the authenticity of the tarballs, PGP/GPG
-signatures also serve as a checksum.  Alternatively, MD5 checksums could
-be used, but using PGP allows a direct path to careful authentication in
-the future if that is desirable.  The tarballs and the patchfile should
-be signed.
-
-Uploading the Distribution
-==========================
-
-The distribution tarballs are placed in minor-version-specific
-directories `/pub/xemacs/xemacs-MAJOR.MINOR' on the primary
-distribution host ftp.xemacs.org.  The directory entries
-`LATEST-IS-MAJOR.MINOR.PATCH' and `LATEST.IS.MAJOR.MINOR.PATCH' are
-created and any earlier such markers removed.  The files `.message' and
-`README' in `/pub/xemacs' are updated to reflect the released version.
-
-Announcements
-=============
-
-Announcements are posted to the <xemacs-announce@xemacs.org> mailing
-list which then forwards to the main channels.  A copy of the
-announcement, suitably edited to `.content' format, in placed in the
-`Releases/MAJOR.MINOR.PATCH.content'.  The index files `index.content'
-and `Releases/index.content' are updated to reflect the current version
-number for the appropriate release series.  By committing these
-changes, the announcement will be propagated to the primary web
-mirrors.  The Freshmeat entry is updated.
-
-
-File: xemacs-release.info,  Node: xre.py,  Prev: Specification,  Up: Top
-
-   `xre.py' is actually not a script, but a library of Python functions
-to be invoked interactively from the Python shell.  In principle, all
-that should need to be done is to start the interpreter, import a
-release object, and invoke the method `doit':
-
-     $ python
-     >>> from xre import gamma
-     >>> gamma.doit((21,4,12))
-     >>> ^D
-     $
-
-   In practice, there's still some amount of updating of the objects
-that must be done by hand.  More important, things go wrong, and need
-to be fixed.  To debug the script and avoid publishing your mistakes,
-most methods provide a dry run facility, in which all the computations
-are done, but commands which would change the repository or the FTP
-archive are echoed rather than executed.  The degree to which methods
-chatter about what they're doing is also adjustable.
-
-   * Objects:  In most cases a new engineer may need to update a
-     `Project' object, create a `Developer' object for himself, and
-     occasionally create new `Access' and `Release' objects.  Once this
-     is done, almost all operations are done by calling the methods of
-     the appropriate `Release' object, as shown in the simple example.
-
-    `Project'
-          A `Project' object contains basic information about a
-          project, such as its name(s), locations of public archives,
-          public and developer repository access, and so on.
-
-    `Developer'
-          A `Developer' object describes the engineer's working
-          practices.  Where he keeps his sources and staging areas, how
-          he accesses archives and repositories, and so on.
-
-    `Access'
-          A less-than-100% successful attempt to provide a uniform API
-          for uploads and downloads.
-
-    `Release'
-          A `Release' object describes how a release is built.  It
-          points to the engineer, gives branch tag and branch point,
-          has provisions for a code name file, a version declaration
-          file, and a CHANGES file (it assumes changelogs are named
-          ChangeLog), and exports a number of public methods
-          implementing operations useful to the engineer.
-
-
-   * Release public methods:  With the exception of `doit', all
-     `Release' methods take a single argument of class `Flags'.  These
-     control the mode of execution.  A few methods implement
-     idiosyncratic flags, but globally defined flags respected by many
-     methods include:
-
-    `verbose'
-          message verbosity (nonnegative integer)
-
-    `dryRun'
-          whether to actually execute or not (Boolean)
-
-    `noNet'
-          don't do operations requiring a network connection (Boolean)
-
-    `dontAsk'
-          don't do operations requiring operator response (Boolean)
-
-     Every Python object has a Boolean value.  The canonical idioms are
-     0 (false) and 1 (true).  A typical construction of a `Flags'
-     object, with assignment to a variable, might use a dictionary as
-
-          flags = { 'verbose': 1, 'dryRun': 1, 'bogusArg': "random noise" }
-
-     The `Flags' class implements other constructors, but this
-     conversion from a dictionary is probably clearest while still being
-     somewhat concise.
-
-     Python allows several different ways to specify actual arguments.
-     My preferred style is to specify the required argument(s) in order,
-     followed by keyword syntax for the optional arguments.
-
-          $ python
-          >>> from xre import gamma
-          >>> gamma.doit ((21, 4, 12), reallyCheckout=1, dontSign=0)
-          >>>
-
-     Here are the descriptions of the methods:
-
-    `doit'
-          Required argument is a (MAJOR, MINOR, PATCH) tuple.  It also
-          takes optional `reallyCheckout' and `dontSign' arguments.
-          These are probably obsolete.  More precisely, VERSION is a
-          version spec, normally a tuple of integers.  REALLYCHECKOUT
-          is an integer: 0 means "check out from CVS repository", 1
-          means "reuse an existing tree verbatim", and 2 means "copy a
-          local tree".  DONTSIGN is tri-state: 0 means "make tarballs
-          and sign gzip files with GnuPG (ASCII armored)", 1 means
-          "fake the signatures (avoid repeated entry of the
-          passphrase)", 2 means "do not make tarballs or try to sign
-          anything".
-
-          `doit((MAJOR, MINOR, PATCH) ...)' performs the following
-          actions in order.  Note the doubled parentheses for the
-          version specification: it is a single argument which is a
-          tuple.
-
-    `prepare'
-          Create a clean source tree, updated to current state of CVS
-          branch, verify consistency.  It takes a `Flags' argument, and
-          respects the `dryRun' and `verbose' flags.
-
-    `finalize'
-          Finalize by adding appropriate `ChangeLog's and incrementing
-          version in `version.sh'.  It takes a `Flags' argument, and
-          respects the `dryRun' and `verbose' flags.
-
-    `abstract'
-          Scarf `ChangeLog's etc for use in announcements.  It takes a
-          `Flags' argument, and respects the `noNet', `dryRun', and
-          `verbose' flags.
-
-    `package'
-          Make tarball(s), patches, PGP signatures, ready for upload.
-          It takes a `Flags' argument, and respects the `dontAsk',
-          `dryRun', and `verbose' flags.
-
-    `check'
-          Do consistency testing.  It takes a `Flags' argument, which
-          currently is ignored, because the method is unimplemented.
-          Most methods do their own checking.
-
-    `tag'
-          Tag the CVS repository.  Expects to find a fresh branch for a
-          .0 release.  It takes a `Flags' argument, and respects the
-          `dryRun' and `verbose' flags.
-
-    `upload'
-          Upload tarball(s), patch, and PGP signatures to distribution
-          host.  It takes a `Flags' argument, and respects the `dryRun'
-          and `verbose' flags.
-
-    `announce'
-          Post announcements to (eg) xemacs-announce, the home page, and
-          FreshMeat.  It takes a `Flags' argument, and respects the
-          `dryRun' and `verbose' flags.  Currently mostly unimplemented.
-
-
-   Here's the implementation of `doit'.  Note that when called as a
-method, the first argument is indicated by the member syntax, as
-`self.doit (version, reallyCheckout, dontSign)'.
-
-         def doit (self, version, reallyCheckout=0, dontSign=0):
-             """Automated release procedure.
-     
-             self is a Release object.
-             version is a version spec, normally a tuple of integers.
-             reallyCheckout is an integer:
-             0 -> check out from CVS repository,
-             1 -> reuse an existing tree verbatim,
-             2 -> copy a local tree.
-             dontSign is tri-state:
-             0 -> make tarballs and sign gzip files with GnuPG (ASCII armored),
-             1 -> fake the signatures (avoid repeated entry of the passphrase),
-             2 -> do not make tarballs or try to sign anything."""
-             # Most of these take some kind of dry run parameter, which
-             # defaults according to stability of implementation.  False (0)
-             # means "full steam ahead", execute a standard release.  However,
-             # there may be degrees of dry run, see the doc for each function.
-             defaultFlags = Flags({ 'dryRun'  : reallyCheckout,
-                                    'dontAsk' : dontSign,
-                                    'noNet'   : 0,
-                                    'verbose' : 0 })
-             packageFlags=Flags(defaultFlags)
-             packageFlags.set('verbose',2)
-     
-             self.setVersion(version[0:3])
-             if len(version) == 4:
-                 self.tagTail = "rc%d" % version[3]
-             self.validate()
-             self.prepare(flags=defaultFlags)
-             self.finalize()
-             self.abstract()
-             self.package(flags=packageFlags)
-             self.check()
-             print "The automated portion is done.  The rest is a dry run."
-             self.tag()
-             self.upload()
-             self.makePublic()
-             self.announce()
-             print """Now apply methods
-             tag (flags={'dryRun':0})
-             upload (flags={'dryRun':0})
-             makePublic (flags={'dryRun':0})
-             announce (flags={'dryRun':0})
-     to the Release object in order."""
-
-   Note that in Python it is not a syntax error to have a multiline
-string, and newlines do not need to be escaped.  Also, the default of
-`verbose = 1, dryRun = 1' is hardcoded in `tag', `upload',
-`makePublic', and `announce', as these functions make changes to a
-repository, and thus are somewhat dangerous.
-
-
-
-Tag Table:
-Node: Top209
-Node: Overview1261
-Node: Specification4867
-Node: xre.py11680
-
-End Tag Table

stephen/xre-old.py

-# XEmacs Release Engineer module
-
-# Copyright (C) 2001, 2002 Free Software Foundation
-
-# Author: Stephen J. Turnbull <stephen@xemacs.org>
-# Created: 26 Sep 2001
-# Last-Modified: 12 Jul 2002
-# Keywords: releases, maint
-
-# This program is part of XEmacs, which is free software; you can
-# redistribute it and/or modify it under the terms of the GNU General
-# Public License as published by the Free Software Foundation; either
-# version 2, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-# for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with XEmacs; see the file COPYING.  If not, write to
-# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-#######################################################################
-# ALL REVIEWERS, FEEL FREE TO MODIFY THIS FILE.  I have my personal   #
-# version checked in on a CVS branch.  If it's a generic improvement, #
-# a courtesy notice to <stephen@xemacs.org> would be appreciated.     #
-#######################################################################
-
-# Usage:
-# Don't.
-# OK, if you must.  This code _requires_ Python 2.  I run the Python
-# interpreter from M-x shell mode.  Then I do "from xre import gamma",
-# followed by "gamma.doit()" which does most of what's necessary for a
-# release.  Note that by default doit() is pretty conservative about what
-# does.  You'll need to create a Developer object for yourself.  The
-# Project, Developer, and Release objects aren't very orthogonal, sorry!
-
-# Kudos:
-# This program is based on Martin Buchholz's excellent Perl program `xre'.
-
-# Apologia:
-# I rewrote it in Python because I understand Python better, and I realized
-# that it would take nearly as much effort to fully understand Martin's
-# program as a Perl program as to rewrite it in Python form, documenting
-# the parts I didn't get on first reading as I go along.
-
-# TODO
-#
-# 2.  Many methods refer to xemacs; this should be abstracted.
-# 4.  Martin's xre has a better way to do os.system()?
-# 5.  Use try ... finally etc to make sure chdirs etc are undone?
-# 6.  Add a dictionary of developer aliases to Project, remove projectAlias
-#     from Developer class.  See comment in Project.updateChangeLogs.
-# 7.  Release.upload now uploads to a ./pretest directory where
-#     pretests are held.
-#     The pretest needs to be announced, and build reports solicited.
-#     The pretest would also be available on a special branch,
-#     pretest-$major-$minor.  The branch would be deleted at commit
-#     time, then recreated with the new release as the node.  This
-#     needs to be implemented
-#     Then, after the results are in, the files would be moved to the
-#     parent directory.  A function to do this is implemented.
-#     Pretests could be announced on xemacs-beta, and progress tracked
-#     on the web site.
-# 8.  There should be a host class to hold info about directories and
-#     anonymous user authorization.
-# 9.  Move the object initializations out of this file.
-# 12. Need to deal with CHANGES-{beta,release} in validation procedures.
-# 13. Deal with all FIXMEs.
-# 14. 
-
-# DONE
-#
-# 10. Update methods to pass dryRun parameters to execAnd*() functions.
-# 11. Rename class Status as class Filter.
-# 1.  Many methods do os.chdir(self.project.stage).  Probably this should
-#     be done in initialization, once.  ## Not is better, more robust.
-# 3.  Change the insane __init__ arglists to use keywords.
-
-## imports
-
-import sys
-import os
-from string import split, strip
-from time import strftime, gmtime, time
-from re import match, search, IGNORECASE
-from os.path import dirname, isdir
-from types import *
-
-## main program
-
-## class definitions
-
-class Developer:
-    """Collects information about a developer.
-
-    Initializer arguments (keyword format recommended):
-        fullName         Full name of the developer for use in sigs, etc.
-        comment          Description of the developer's role.
-        projectAlias     Mail alias at the project, if available (user only).
-        mailingAddress   Non-project (full) mailing address.
-        cvsAuthUser      Login name on CVS host; for commits.
-        uploadAuthUser   Login name on distribution host; for uploads.
-    Other attributes:
-        valid            Has initialization been completed?"""
-    def __init__ (self,
-                  fullName = None,
-                  comment = None,
-                  projectAlias = None,
-                  mailingAddress = None,
-                  cvsAuthUser = None,
-                  uploadAuthUser = None):
-        self.valid = 0
-        self.fullName = fullName
-        self.comment = comment
-        self.projectAlias = projectAlias
-        self.mailingAddress = mailingAddress
-        self.cvsAuthUser = cvsAuthUser
-        self.uploadAuthUser = uploadAuthUser
-        self.validate(0)
-    def validate (self, verbose = 1):
-        """Check whether instance is ready for use.  If so, set valid true.
-
-        If verbose, warn about incomplete or invalid entries.
-        FIXME: currently does nothing."""
-        pass
-
-class Project:
-    """Collects information about a project.
-
-    Initializer arguments (keyword format recommended):
-        alias            Short name used to construct pathnames, lowercase.
-        fullName         Official name of the project.
-        mailDomain       Domain where developers receive mail.
-        homePage         URL of home page.
-        uploadHost       Destination for uploads for distribution.
-        uploadRoot       Root of hierarchy for uploads on uploadHost.
-        cvsAnonUser      Anonymous user for CVS pserver.
-        cvsAnonPasswd    Password for anonymous user of CVS pserver.
-        cvsHost          Host of CVS repository.
-        cvsRoot          Root of CVS repository tree on cvsHost.
-                         Not the same as CVSROOT!
-        cvsModule        CVS module to check out.
-        sourceSize       Approximate disk usage (MB) of distribution.
-        buildSize        Approximate disk usage (MB) of build-generated files.
-        installSize      Approximate disk usage (MB) of files installed.
-        stage            Staging area on local disk.
-        versionFile      Name of file containing version information.
-        versionFormat    Sequence of regexps matching versionFile line-by-line.
-    Attributes:
-        valid            Can the object be used?"""
-
-    def __init__ (self,
-                  fullName,
-                  alias,
-                  mailDomain,
-                  homePage,
-                  uploadHost,
-                  uploadRoot,
-                  cvsAnonUser,
-                  cvsAnonPasswd,
-                  cvsHost,
-                  cvsRoot,
-                  cvsModule,
-                  sourceSize,
-                  buildSize,
-                  installSize,
-                  versionFile,
-                  versionFormat,
-                  stage="/tmp/staging"):
-        self.valid = 0
-        self.alias = alias
-        self.fullName = fullName
-        self.homePage = homePage
-        self.mailDomain = mailDomain
-        self.uploadHost = uploadHost
-        self.uploadRoot = uploadRoot
-        self.cvsHost = cvsHost
-        self.cvsRoot = cvsRoot
-        self.cvsAnonUser = cvsAnonUser
-        self.cvsAnonPasswd = cvsAnonPasswd
-        self.cvsModule = cvsModule
-        self.sourceSize = sourceSize
-        self.installSize = installSize
-        self.buildSize = buildSize
-        self.versionFile = versionFile
-        self.versionFormat = versionFormat
-        self.stage = stage
-        self.validate()
-
-    def validate (self, verbose = 1):
-        """Check whether instance is ready for use.  If so, set valid true.
-
-        If verbose, warn about incomplete or invalid entries.
-        FIXME: currently does nothing."""
-        pass
-
-class Release:
-    """Represents a release of a software project.
-
-    Successful instantiation of a release creates an object with methods
-    for finalizing the release in CVS with appropriate ChangeLog entries,
-    tagging the tree, rolling distribution tarballs, uploading them, and
-    announcing the release.  FIXME: It should execute these, and also
-    produce a state object that will allow restarting the process if it
-    stalls in an idempotent way.
-
-    All paths below are relative to the project staging directory.
-
-    Initializer arguments:
-        cvsTag                 CVS branch tag for checkout and update.
-        versionString          String in dotted triple format (1.2.3),
-                               indicates current version.  #### advisory?
-        ancestorVersionString  String in dotted triple format (1.2.3),
-                               indicates version from which branch forked.
-        codenameFile           Path to file containing version/codename pairs.
-        project                Project object.
-        engineer               Developer object.
-        copySource             Source for copying in dry runs.
-        isBeta                 0 for public release, 1 for beta release.
-                               Defaulted according to odd/even rule, but can be
-                               overridden explicitly.
-        branchPointTag         Tag to branch from for initial public release.
-    Attributes:
-        majorVersion           Nonnegative integer.
-        minorVersion           Nonnegative integer.
-        releaseVersion         Nonnegative integer.  May be beta version.
-        stem                   Stem of names, eg, root of distribution tree.
-        versionDir             Directory on upload host for this series.
-        herald                 String announcing release in one line.
-        reallyCheckout         Kludge to substitute local cp for cvs checkout.
-    Public methods:
-        prepare                Create a clean source tree, updated to current
-                               state of CVS branch, verify consistency.
-        finalize               Finalize by adding appropriate ChangeLogs and
-                               incrementing version in version.sh.
-        abstract               Scarf ChangeLogs etc for use in announcements.
-        package                Make tarball(s), patches, PGP signatures, ready
-                               for upload.
-        check                  Do consistency testing.
-        tag                    Tag the CVS repository.  Expects to find a fresh
-                               branch for a .0 release.
-        upload                 Upload tarball(s), patch, and PGP signatures to
-                               distribution host.
-        announce               Post announcements to (eg) xemacs-announce,
-                               the home page, and FreshMeat."""
-
-    def __init__ (self,
-                  cvsTag,
-                  versionString,
-                  ancestorVersionString,
-                  codenameFile,
-                  project,
-                  engineer,
-                  copySource,
-                  isBeta = -1,
-                  branchPointTag = None
-                  ):
-        self.valid = 0
-        self.state = None
-        self.project = project
-        self.engineer = engineer
-        self.cvsTag = cvsTag
-        self.versionString = versionString
-        self.ancestorVersionString = ancestorVersionString
-        self.codenameFile = codenameFile
-        self.copySource = copySource
-        m = match(r"(\d+)\.(\d+)\.(\d+)", versionString)
-        if m:
-            self.majorVersion = int(m.group(1))
-            self.minorVersion = int(m.group(2))
-            self.releaseVersion = int(m.group(3)) # or beta version
-        else:
-            self.majorVersion = self.minorVersion = self.releaseVersion = None
-        self.stem = project.alias + "-" + self.versionString
-        if self.releaseVersion:
-            self.previousStem = "%s-%d.%d.%d" % (self.project.alias,
-                                                 self.majorVersion,
-                                                 self.minorVersion,
-                                                 self.releaseVersion-1)
-            self.versionDir = "%s-%d.%d" % (self.project.alias,
-                                            self.majorVersion,
-                                            self.minorVersion)
-        else:
-            self.previousStem = self.project.alias + "-" \
-                                + self.ancestorVersionString
-            # not great but should be safe ... error here?
-            self.versionDir = self.project.alias + "-" + self.versionString
-        if isBeta < 0:
-            self.isBeta = self.minorVersion % 2
-        else:
-            self.isBeta = isBeta
-        self.branchPointTag = branchPointTag
-        self.validate()
-
-    def validate (self, verbose = 1, raiseOnError = 0):
-        """Check whether instance is ready for use.  If so, set valid true.
-
-        If verbose, warn about incomplete or invalid entries.  If abort,
-        raise an error in those cases, too.
-        FIXME: currently does almost nothing."""
-
-        self.valid = 1
-        if not self.engineer.valid:
-            print "Error: engineer of release invalid."
-            self.valid = 0
-        if not self.codenameFile:       # FIXME: validate file readability.
-            print "Error: no codename file."
-            self.valid = 0
-        # check only majorVersion because version string didn't match
-        # r"\d+\.\d+\.\d+"
-        if not self.majorVersion:
-            print "Error: version string invalid."
-            self.valid = 0
-        if not self.project.valid:
-            print "Error: project of release invalid."
-            self.valid = 0
-
-    def checkNoSpace (self, raiseOnInsufficient=0, verbose=2, dryRun=0):
-        """Check whether space available is sufficient for building a release.
-
-        Returns true if space insufficient, otherwise false.
-        `raiseOnInsufficient' if true means raise an error condition rather
-        than return.  `verbose' and `dryRun' are ignored."""
-
-        # FIXME: better to use statfs?
-        p = self.project
-        os.chdir(p.stage)
-            
-        dfOut = os.popen('df -k ' + p.stage).readlines()
-        avail = int(split(dfOut[1])[3])
-
-        sNeeds = 18*p.sourceSize/5
-        sbiNeeds = 6*(2*p.sourceSize + p.buildSize + p.installSize)/5
-
-        format = "insufficient staging space (%d) for release (%s = %d)."
-        if sNeeds > avail/1024:
-            print format % (avail/1024,"sNeeds",sNeeds)
-        if sbiNeeds > avail/1024:
-            print format % (avail/1024,"sbiNeeds",sbiNeeds)
-        if sNeeds > avail/1024 or sbiNeeds > avail/1024:
-            if raiseOnInsufficient:
-                raise ValueError, "Aborting!"
-            else:
-                return 1
-        return 0
-
-    def doit (self, reallyCheckout=0, dontSign=0):
-        """Automated release procedure.
-
-        release is a Release object.  reallyCheckout is an integer:
-        0 -> check out from CVS repository,
-        1 -> reuse an existing tree verbatim,
-        2 -> copy a local tree.
-        dontSign is tri-state:
-        0 -> make tarballs and sign gzip files with GnuPG (ASCII armored),
-        1 -> fake the signatures (avoid repeated entry of the passphrase),
-        2 -> do not make tarballs or try to sign anything."""
-        # Most of these take some kind of dry run parameter, which
-        # defaults according to stability of implementation.  False (0)
-        # means "full steam ahead", execute a standard release.  However,
-        # there may be degrees of dry run, see the doc for each function.
-        self.prepare(reallyCheckout)
-        self.finalize()
-        self.abstract()
-        self.package(2,dontSign)
-        self.check()
-        print "The automated portion is done.  The rest is a dry run."
-        self.tag()
-        self.upload()
-        self.makePublic()
-        self.announce()
-        print """Now apply methods
-        tag(2,0)
-        upload(2,0)
-        makePublic(2,0)
-        announce(2,0)
-to the Release object in order."""
-
-    def prepare (self, reallyCheckout):
-        """Create clean source trees for current and previous release.
-
-        Update to current state of relevant CVS branch, and verify
-        consistency.  reallyCheckout is an integer:
-        0 -> check out from CVS repository,
-        1 -> reuse an existing tree verbatim,
-        2 -> copy a local tree.
-        0 and 2 remove an existing current tree, but leave the `previous'
-        tree alone."""
-
-        # Procedure
-        p = self.project
-        # 1. CD to an appropriate staging area.  Check space and modes.
-        print "Prepare a source tree:"
-        print "  Change to " + p.stage
-        os.chdir(p.stage)
-        print " OK."
-
-        # 2. Remove existing trees and annoying generated cruft
-        self.checkNoSpace()
-        #    like GPG signatures
-        execAndTrace("rm -f *%s.%s.%s*.asc" % \
-                     (self.majorVersion,self.minorVersion,self.releaseVersion))
-        execAndTrace("rm -rf " + self.previousStem)
-        if reallyCheckout == 0 or reallyCheckout == 2:
-            execAndTrace("rm -rf " + self.stem)
-            self.checkNoSpace(1)
-
-        # 3. Checkout the current tip of the CVS branch.  (Theoretically
-        #    we could reuse a work area, but this is safest.)
-        #    FIXME: assumes pserver, and cvs login already done.
-        #    FIXME: probably should also clean out previousStem?
-	#    FIXME: now it assumes ssh/:ext:
-	#    FIXME: the cvsAnonUser below only works by accident!
-        if reallyCheckout == 0:
-            cmd = "cvs -d :pserver:" + p.cvsAnonUser + "@" + p.cvsHost \
-                  + ":" + p.cvsRoot + " checkout -d " \
-                  + self.stem
-            if self.cvsTag != "TRUNK":
-                cmd += " -r " + self.cvsTag
-            cmd += " " + p.cvsModule
-            updateCarefully(cmd)
-        elif reallyCheckout == 1:
-            # FIXME: need to barf here if the checked-out tree doesn't exist.
-            pass
-        elif reallyCheckout == 2:
-            # The following probably doesn't really make sense; it's
-            # defensive for the case where stem is more than
-            # one level of subdirectory
-            execAndTrace("mkdir -p " + self.stem)
-            execAndTrace("rmdir " + self.stem)
-            execAndTrace("cp -pR " + self.copySource + " " \
-                      + self.stem)
-        else:
-            # Fake it.
-            # Actually, should probably cp over the munged files.
-            print "(cp -pR " + self.copySource + " " \
-                  + self.stem + ") ... done."
-
-        # make sure that configure is up to date
-        # NB: cvs will not commit unless it's different (according to diff)
-        os.chdir(self.stem)
-	# FIXME:  need to detect this.
-        execAndTrace("autoconf2.13")
-        os.chdir("..")
-
-        # 4. Check that version.sh is consistent with (ie, immediate
-        #    predecessor of) the release in preparation.
-        #    FIXME: omitted.
-        # 5. Prepare the previous release tree.  (#### Not for x.y.0 releases?)
-        #    Local copy and CVS update in reverse needs care, because of
-        #    file add and removal.
-
-        previousTarball = self.previousStem + "-src.tar.gz"
-        if not os.access(previousTarball,os.R_OK):
-            previousTarball = self.previousStem + ".tar.gz"
-        # FIXME: need to clean up previous workspace
-        # FIXME: use the local copy, this should be if not exist tarball
-        # FIXME: if exists but not readable and not writable, this is going
-        # to fail.
-        execAndTrace("rm -rf " + self.previousStem)
-        if not os.access(previousTarball,os.R_OK) and self.releaseVersion:
-            # FIXME: this should not refer to xemacs explicitly
-            print "Can't find readable " + previousTarball + "."
-            cmd =  "wget --non-verbose --passive"
-            cmd += " ftp://ftp.xemacs.org/pub/xemacs/"
-            if self.isBeta:
-                cmd += "beta/"
-            cmd += "%s-%d.%d/%s" % (p.alias, self.majorVersion,
-                                    self.minorVersion, previousTarball)
-            cmd='ls'
-            execAndTrace(cmd)
-        if os.access(previousTarball,os.R_OK):
-            cmd = "tar xzvf " + previousTarball
-            execAndTrace(cmd)
-        else:
-            #raise Error, "Couldn't explode previous tarball: " \
-            #      + previousTarball
-            cmd = "cvs -d :pserver:cvs@cvs.xemacs.org:/pack/xemacscvs checkout -d xemacs-21.4.5 -r r21-4-5 xemacs"
-            execAndTrace(cmd)
-
-    def parseChangeLog (self, filename, verbose=2, dryRun=0):
-
-        """Parse a ChangeLog and return a status message (None is the normal
-        return), a tuple of the version string from the most recent herald, the
-        codename string (without quotes), the line number (one-based) where
-        found, and a string containing the entire contents of the file.  FIXME:
-        The list of regexps below is the official definition of the herald
-        format.  It needs to be moved to a spec document."""
-
-        # better definitions of names and email addresses would be nice
-        # NB. end-of-file needs to be handled carefully
-        heraldREList = [ r"^\d\d\d\d-\d\d-\d\d  .*  <.*>[ \t]*(\n)?$",
-                         r"^[ \t]*(\n)?$",
-                         r'^\t* XEmacs (.*) "(.*)" is released.[ \t]*(\n)?$',
-                         r"^[ \t]*(\n)?$" ]
-
-        file = open (filename, "r")
-        if not file: raise Error, "Couldn't open file: " + filename
-
-        foundLine = None
-        log = ""
-        regexpNo = 0
-        lineNo = 0
-        line = file.readline()
-        while line and regexpNo < 3:
-            m = match (heraldREList[regexpNo], line)
-            if m:
-                if regexpNo == 2:
-                    if not foundLine:
-                        foundLine = lineNo
-                        version = m.group(1)
-                        codename = m.group(2)
-                    eol = m.group(3)
-                eol = m.group(1)
-                regexpNo += 1
-            else:
-                regexpNo = 0
-            log += line
-            lineNo += 1
-
-        # OK, we've stopped.  Here are the possibilities:
-        #
-        # 1. We've read a herald and it is followed by a newline-terminated
-        #    blank line
-        # 2. We've read a herald and it is not followed by a newline-terminated
-        #    blank line
-        # 3. We've run out of lines
-
-
-    def finalize (self, verbose=2, dryRun=0):
-        """Add herald to ChangeLogs and increment version in version.sh.
-
-        We do _not_ commit or tag here because that is externally visible."""
-
-        print "Constructing herald:  ",
-        self.herald = self.codename = None
-        os.chdir(self.project.stage + "/" + self.stem)
-        infile = open(self.codenameFile,"r")
-        if infile:
-            if self.codenameFile == "etc/OXYMORONS":
-                for line in infile.readlines():
-                    m = match(self.versionString + ":\s*(\S.*)$",line)
-                    if m:
-                        self.codename = strip(m.group(1))
-                        self.herald = 'XEmacs %s "%s" is released.' \
-                                      % (self.versionString, self.codename)
-            # Sigh.  Steve is one-based ...
-            elif self.codenameFile == "../Codenames-21.2":
-                lines = infile.readlines()
-                if len(lines) >= self.releaseVersion:
-                    self.codename = strip(lines[self.releaseVersion-1])
-                    self.herald = 'XEmacs %s "%s" is released.' \
-                                  % (self.versionString, self.codename)
-            # ... and Martin is zero-based.
-            elif self.codenameFile == "etc/VEGETABLES":
-                lines = infile.readlines()
-                if len(lines) >= self.releaseVersion:
-                    self.codename = strip(lines[self.releaseVersion])
-                    self.herald = 'XEmacs %s "%s" is released.' \
-                                  % (self.versionString, self.codename)
-            infile.close()
-        if not self.herald:
-            print "\nError: couldn't determine codename."
-            self.herald = 'XEmacs %s is released.' % (self.versionString)
-        print self.herald
-
-        print "Updating ChangeLogs ..."
-        self.updateChangeLogs()
-        # version file (XEmacs specific)
-        lines = []
-        # FIXME: this is youguly
-        offset = 0
-        # ensure dirname() returns non-false
-        old = "./" + self.project.versionFile
-        print "Munge version file " + old + " ..."
-        infile = open(old,"r")
-        if not infile:
-            print "\nError: can't open version file."
-        else:
-            values = [None, None, None, None, None, None]
-            format = self.project.versionFormat
-            lines = infile.readlines()
-            infile.close()
-            # For XEmacs < 21.4.6, this needs to be len(format) - 1
-            expectedLines = len(format)
-            if len(lines) != expectedLines:
-                print "\nWarning: file has %d lines, expected %d." \
-                      % (len(lines), expectedLines)
-            # FIXME: this is youguly
-            # rewrite to use dictionaries
-            for i in range(len(lines)):
-                m = match(format[i + offset],strip(lines[i]))
-                if not m:
-                    offset = 1
-                    m = match(format[i + offset],strip(lines[i]))
-                    if m and not offset:
-                        values[i+offset-1] = ''
-                    else:
-                        print "\nWarning: unexpected format in line %d." % i
-                elif 0 < i < 7:
-                    values[i+offset-1] = m.group(1)
-            if self.isBeta and values[0] != "t" \
-               or not self.isBeta and values[0] != "":
-                print "\nWarning: unexpected emacs_is_beta value."
-            # FIXME: bogus if releaseVersion same but others differ
-            # FIXME: gloss should be used only if already finalized
-            # Probably this file _should_ be finalized by hand.
-            if int(values[1]) != self.majorVersion \
-               or int(values[2]) != self.minorVersion \
-               or int(values[3]) != self.releaseVersion - 1:
-                if int(values[3]) == self.releaseVersion:
-                    print "\nWarning: version.sh seems to be finalized."
-                else:
-                    print "\nWarning: version not consecutive."
-            # In candidates there may be a trailing gloss in the version name.
-            # If so, use it.
-            print self.codename, values
-            if match(self.codename,values[4]):
-                self.codename = values[4]
-        new = os.tempnam(dirname(old))
-        outfile = open(new,"w")
-        if self.isBeta:
-            ib = "t"
-        else:
-            ib = ""
-        ekvline = "emacs_kit_version=%s\n" % (values[5],)
-        outfile.write('''#!/bin/sh
-emacs_is_beta=%s
-emacs_major_version=%d
-emacs_minor_version=%d
-emacs_beta_version=%d
-xemacs_codename="%s"
-%s''' % (ib, self.majorVersion, self.minorVersion, self.releaseVersion,
-       self.codename, ekvline))
-        for i in range(7+offset,len(lines)):
-            outfile.write(lines[i])
-        outfile.close()
-        # FIXME: do some verification
-        os.unlink(old)
-        os.rename(new,old)
-        # Martin's xre also manipulates CHANGES-beta.
-        # I should do CHANGES-release.
-        print "done."
-
-
-    def abstract (self, verbose=0, dryRun=0):
-        """Extract recent logs and other info useful in announcements.
-
-        Write them to a file in the staging directory."""
-
-        re0 = r'XEmacs.* (\d+)\.(\d+)(\.|-beta)(\d+).*is released'
-        re1 = r'^to( XEmacs)? (\d+)\.(\d+)\.(\d+) "(.+)"$'
-        os.chdir(self.project.stage + "/" + self.stem)
-
-        # handle CHANGES-{beta,release}
-        lines = ['Brief summary of Changes to %s "%s"\n\n' %
-                 (self.versionString,self.codename)]
-        if self.isBeta and os.access("CHANGES-beta",os.W_OK):
-            changesFile = "CHANGES-beta"
-        else: