This commit was generated by cvs2svn to compensate for changes in r9048,
authortomo <tomo>
Fri, 25 Jun 2004 16:13:17 +0000 (16:13 +0000)
committertomo <tomo>
Fri, 25 Jun 2004 16:13:17 +0000 (16:13 +0000)
which included commits to RCS files with non-trunk default branches.

54 files changed:
PROBLEMS
aclocal.m4
configure.usage
etc/PACKAGES
etc/package-index.LATEST.gpg [new file with mode: 0644]
lib-src/ChangeLog
lib-src/Makefile.in.in
lisp/about.el
lisp/help.el
lisp/info.el
lisp/itimer.el
lisp/menubar-items.el
lisp/package-admin.el
lisp/package-get.el
lisp/package-info.el
lisp/package-ui.el
lisp/packages.el
lisp/specifier.el
lisp/window-xemacs.el
lwlib/ChangeLog
man/ChangeLog
man/custom.texi
man/internals/internals.texi
man/lispref/backups.texi
man/lispref/display.texi
man/lispref/ldap.texi
man/lispref/lispref.texi
man/lispref/markers.texi
man/lispref/menus.texi
man/lispref/numbers.texi
man/lispref/specifiers.texi
man/lispref/tips.texi
man/new-users-guide/custom2.texi
man/new-users-guide/files.texi
man/new-users-guide/search.texi
man/xemacs-faq.texi
man/xemacs/custom.texi
man/xemacs/packages.texi
man/xemacs/reading.texi
man/xemacs/xemacs.texi
nt/ChangeLog
nt/minitar.c
nt/xemacs.mak
src/device-x.c
src/elhash.c
src/event-msw.c
src/frame-x.c
src/opaque.h
src/s/sol2.h
src/window.c
tests/ChangeLog
tests/automated/hash-table-tests.el
tests/automated/test-harness.el
version.sh

index 7dca91c..93f8825 100644 (file)
--- a/PROBLEMS
+++ b/PROBLEMS
@@ -445,7 +445,14 @@ for just those modules.  (Or use gcc).
 
 This only occurs if you have LANG != C.  This is a known bug with
 /bin/sh fixed by installing Patch-ID# 101613-01.  Or, you can use
-bash, as a workaround.
+bash by setting the environment variable CONFIG_SHELL to /bin/bash
+
+*** Solaris 2.x configure fails: ./config.status: test: argument expected
+
+This is a known bug with /bin/sh and /bin/test, i.e. they do not
+support the XPG4 standard.  You can use bash as a workaround or an
+XPG4-compliant Bourne shell such as the Sun-supplied /usr/xpg4/bin/sh
+by setting the environment variable CONFIG_SHELL to /usr/xpg4/bin/sh
 
 *** On SunOS, you get linker errors
     ld: Undefined symbol
index 08c81c1..0dcfd2e 100644 (file)
@@ -84,7 +84,7 @@ AC_MSG_CHECKING(how to produce PIC code)
 wl=
 
 can_build_shared=yes
-if test "$XEGCC" = yes; then
+if test "$XEGCC" = yes -o "$__ICC" = yes; then
   wl='-Wl,'
 
   case "$xehost_os" in
@@ -243,7 +243,7 @@ cc_produces_so=no
 xldf=
 xcldf=
 AC_MSG_CHECKING(if C compiler can produce shared libraries)
-if test "$XEGCC" = yes; then
+if test "$XEGCC" = yes -o "$__ICC" = yes; then
   xcldf="-shared"
   xldf="-shared"
 else # Not using GCC
index 0983d73..2647128 100644 (file)
@@ -139,7 +139,7 @@ explicitly specify which library to link against.
                         *WARNING*  The Motif menubar is currently broken.
 --with-scrollbars=TYPE  (Enum) Types: `lucid'(*), `motif', `athena', or `no'.
 --with-dialogs=TYPE     (Enum) Types: `lucid'(*), `motif', `athena', or `no'.
---with-widgets=TYPE     (Enum) Types: `lucid'(*), `motif', `athena', or `no'.
+--with-widgets=TYPE     (Enum) Types: `lucid', `motif', `athena', or `no'(*).
 --with-athena=TYPE      (Enum) Link with the TYPE Athena library.  Types:
                         `xaw' [flat], `3d', `next', `95', or `xpm'.
 --with-dragndrop (*)    Support generic drag and drop API. (EXPERIMENTAL)
index fddf29b..5d30487 100644 (file)
@@ -97,6 +97,9 @@ Portable Emacs Lisp utilities library.
 *** emerge
 Another interface over GNU patch.
 
+*** erc
+ERC is an Emacs InternetRelayChat client.
+
 *** eshell
 Command shell implemented entirely in Emacs Lisp.
 
@@ -161,7 +164,8 @@ Spell-checking with GNU ispell.
 Integrated Development Environment for Java.
 
 *** liece
-IRC (Internet Relay Chat) client for Emacs.
+IRC (Internet Relay Chat) client for Emacs.  Note, this package is
+deprecated and will be removed, use riece instead.
 
 *** mail-lib
 Fundamental lisp files for providing email support.
@@ -173,7 +177,7 @@ Support for messaging encryption with PGP.
 Messaging in an Emacs World.
 
 *** mh-e
-Front end support for MH.
+The XEmacs Interface to the MH Mail System.
 
 *** mine
 Minehunt Game.
@@ -230,6 +234,9 @@ Python support.
 *** reftex
 Emacs support for LaTeX cross-references, citations.
 
+*** riece
+IRC (Internet Relay Chat) client for Emacs.
+
 *** rmail
 An obsolete Emacs mailer.  If you do not already use it don't start.
 
diff --git a/etc/package-index.LATEST.gpg b/etc/package-index.LATEST.gpg
new file mode 100644 (file)
index 0000000..40ff6d3
--- /dev/null
@@ -0,0 +1,2611 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+;; Package Index file -- Do not edit manually.
+;;;@@@
+(package-get-update-base-entry (quote
+(general-docs
+  (standards-version 1.1
+   version "1.01"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority high
+   category "standard"
+   dump nil
+   description "General XEmacs documentation."
+   filename "general-docs-1.01-pkg.tar.gz"
+   md5sum "06c3e4e0aeddd995f2697c91a6b8cc00"
+   size 1435
+   provides ()
+   requires ()
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(riece
+  (standards-version 1.1
+   version "1.12"
+   author-version "0.1.5"
+   date "2003-10-29"
+   build-date "2003-10-29"
+   maintainer "Daiki Ueno <ueno@unixuser.org>"
+   distribution xemacs
+   priority high
+   category "standard"
+   dump nil
+   description "IRC (Internet Relay Chat) client for Emacs."
+   filename "riece-1.12-pkg.tar.gz"
+   md5sum "8859cfde4a93a31407e29c35a35e9669"
+   size 106360
+   provides (riece-compat riece-xemacs riece-globals riece-options riece-version riece-coding riece-complete riece-identity riece-channel riece-user riece-misc riece-layout riece-display riece-server riece-naming riece-message riece-filter riece-handle riece-000 riece-200 riece-300 riece-400 riece-500 riece-commands riece riece-ctcp riece-highlight riece-log riece-mini riece-rdcc riece-url riece-unread riece-doctor riece-alias riece-guess riece-history riece-button riece-keyword riece-menu riece-icon)
+   requires (xemacs-base mail-lib)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(oo-browser
+  (standards-version 1.1
+   version "1.04"
+   author-version "4.08"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Jake Colman <jake.colman@xemacs.org>"
+   distribution xemacs
+   priority high
+   category "standard"
+   dump nil
+   description "OO-Browser: The Multi-Language Object-Oriented Code Browser"
+   filename "oo-browser-1.04-pkg.tar.gz"
+   md5sum "72cb3bbfbe985d8989c564ca53cffe3c"
+   size 515713
+   provides (c++-browse clos-browse eif-browse hasht hmouse-br info-browse java-brows objc-brows pyth-brows smt-browse)
+   requires (xemacs-base hyperbole)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(hyperbole
+  (standards-version 1.0
+   version "1.13"
+   author-version "4.18"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Mats Lidell <matsl@xemacs.org>"
+   distribution stable
+   priority high
+   category "standard"
+   dump nil
+   description "Hyperbole: The Everyday Info Manager"
+   filename "hyperbole-1.13-pkg.tar.gz"
+   md5sum "fed416810d33560f433c4ad0bef605bc"
+   size 634192
+   provides (hact hactypes hargs hbdata hbmap hbut hgnus hhist hib-doc-id hib-kbd hibtypes hinit hlvar hmail hmh hmoccur hmous-info hmouse-drv hmouse-key hmouse-mod hmouse-tag hpath hrmail hsite hsmail hsys-w3 hsys-wais htz hui-menu hui-mini hui-mouse hui-window hui-xe-but hui hvar hversion hvm hypb hyperbole set wconfig wrolo-logic wrolo-menu wrolo)
+   requires (xemacs-base mail-lib calendar vm text-modes gnus mh-e rmail apel tm sh-script net-utils)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(ecb
+  (standards-version 1.1
+   version "1.13"
+   author-version "1.96"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Klaus Berndl <klaus.berndl@sdm.de>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Emacs source code browser."
+   filename "ecb-1.13-pkg.tar.gz"
+   md5sum "dbbc4f68db8f2f294b89f0ee11ae6156"
+   size 525836
+   provides (ecb-buffertab ecb-compilation ecb-create-layout ecb-cycle ecb ecb-eshell ecb-examples ecb-face ecb-help ecb-layout ecb-layout-defs ecb-mode-line ecb-navigate ecb-speedbar ecb-tod ecb-autogen ecb-jde ecb-upgrade ecb-util ecb-winman-support silentcomp tree-buffer)
+   requires (xemacs-base semantic eieio fsf-compat edit-utils jde mail-lib eshell ediff xemacs-devel speedbar c-support)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(pgg
+  (standards-version 1.1
+   version "1.04"
+   author-version "0.1"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Simon Josefsson <simon@josefsson.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Emacs interface to various PGP implementations."
+   filename "pgg-1.04-pkg.tar.gz"
+   md5sum "8f4d77a0e99edbd3040c8d3988109ee8"
+   size 31307
+   provides (pgg pgg-def pgg-parse pgg-gpg pgg-pgp pgg-pgp5)
+   requires (xemacs-base fsf-compat edebug)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(perl-modes
+  (standards-version 1.1
+   version "1.05"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Perl support."
+   filename "perl-modes-1.05-pkg.tar.gz"
+   md5sum "cbfc241502bb708e878bcb2d587a78b1"
+   size 161184
+   provides (cperl-mode perl-mode)
+   requires (xemacs-base ispell ps-print edit-utils fsf-compat)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(python-modes
+  (standards-version 1.1
+   version "1.03"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Python support."
+   filename "python-modes-1.03-pkg.tar.gz"
+   md5sum "537b318e5901cfc95ba7dfcce32d24bf"
+   size 82105
+   provides (pydoc python-mode)
+   requires (xemacs-base mail-lib)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(ruby-modes
+  (standards-version 1.1
+   version "1.02"
+   author-version "1.6.8"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Ruby support."
+   filename "ruby-modes-1.02-pkg.tar.gz"
+   md5sum "d2a1ca596592bafba72c76158d26747b"
+   size 21889
+   provides (inf-ruby ruby-mode rubydb)
+   requires (xemacs-base debug)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(fortran-modes
+  (standards-version 1.1
+   version "1.03"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Fortran support."
+   filename "fortran-modes-1.03-pkg.tar.gz"
+   md5sum "413d2f5ea1497c29b436fee52073563b"
+   size 66719
+   provides (f90 fortran)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(psgml-dtds
+  (standards-version 1.1
+   version "1.03"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Deprecated collection of DTDs for psgml."
+   filename "psgml-dtds-1.03-pkg.tar.gz"
+   md5sum "6d2d68e928a540581ef564d1111fcbf2"
+   size 367476
+   provides ()
+   requires (xemacs-base psgml edit-utils mail-lib fsf-compat eterm sh-script)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(docbookide
+  (standards-version 1.1
+   version "0.07"
+   author-version "0.1"
+   date "2003-10-28"
+   build-date "2003-10-28"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "DocBook editing support."
+   filename "docbookide-0.07-pkg.tar.gz"
+   md5sum "2e83cb54d4c0d9fd4b22a81d8792e9e6"
+   size 32091
+   provides (dbide-abbrev dbide-data dbide-font dbide-process docbookide)
+   requires (xemacs-base ispell mail-lib)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(ecrypto
+  (standards-version 1.1
+   version "0.14"
+   author-version "2.0"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Simon Josefsson <simon@josefsson.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Crypto functionality in Emacs Lisp."
+   filename "ecrypto-0.14-pkg.tar.gz"
+   md5sum "59207e5f5a5300ccf0d21f27b018de91"
+   size 68741
+   provides (ascii-armor blowfish des hex-util md4 md5-dl md5-el md5 paranoid rander rc16 rijndael sha1-dl sha1-el sha1)
+   requires ()
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(ocaml
+  (standards-version 1.1
+   version "0.05"
+   author-version "3.06"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Objective Caml editing support."
+   filename "ocaml-0.05-pkg.tar.gz"
+   md5sum "2ca033386cade4dbdb05abe2e6f324f4"
+   size 64887
+   provides (caml-compat camldebug caml caml-font caml-help inf-caml)
+   requires (xemacs-base fsf-compat)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(sasl
+  (standards-version 1.1
+   version "1.14"
+   author-version "1.14.4"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Simon Josefsson <simon@josefsson.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Simple Authentication and Security Layer (SASL) library."
+   filename "sasl-1.14-pkg.tar.gz"
+   md5sum "a00a2f0e7e6f1614ae95cdbef50e333e"
+   size 27045
+   provides (hmac-def hmac-md5 hmac-sha1 ntlm sasl sasl-cram sasl-digest sasl-ntlm sasl-plain sasl-login sasl-anonymous)
+   requires (ecrypto)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(sml-mode
+  (standards-version 1.1
+   version "0.10"
+   author-version "3.9.5"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "SML editing support."
+   filename "sml-mode-0.10-pkg.tar.gz"
+   md5sum "87914cf428610799a98815b17393f6e0"
+   size 81763
+   provides (sml-compat sml-defs sml-mode sml-move sml-proc sml-util)
+   requires (xemacs-base edebug fsf-compat)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(ess
+  (standards-version 1.1
+   version "1.06"
+   author-version "5.1.21"
+   date "2003-11-10"
+   build-date "2003-11-10"
+   maintainer "A.J. Rossini <rossini@xemacs.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "ESS: Emacs Speaks Statistics."
+   filename "ess-1.06-pkg.tar.gz"
+   md5sum "46e105b2fd715790f6358d9f637cdf32"
+   size 445788
+   provides (ess-batch ess-comp ess-cust ess-dump ess-emcs ess-font-lock ess-help ess-inf ess-iw32 ess-latex-mode ess-menu ess-mode ess-mous ess-noweb ess-site ess-sysdp ess-utils ess-vars ess essa-r essa-sas essd-arc essd-els essd-r essd-omg essd-r essd-s3 essd-s4 essd-sas essd-sp3 essd-sp4 essd-sp5 essd-sp6 essd-sta essd-vst essd-xls essddr essdsp6w essl-bug essl-lsp essl-omg essl-py essl-s essl-sas essl-sta make-regexp mouseme msdos noweb-font-lock-mode noweb-mode)
+   requires (xemacs-base mail-lib fsf-compat edit-utils speedbar sh-script eterm)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(haskell-mode
+  (standards-version 1.1
+   version "1.06"
+   author-version "1.44"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Haskell editing support."
+   filename "haskell-mode-1.06-pkg.tar.gz"
+   md5sum "75c3dcb6fbe0a8824c865d8b989866cc"
+   size 94315
+   provides (haskell-decl-scan haskell-doc haskell-font-lock haskell-indent haskell-mode haskell-simple-indent)
+   requires (dired mail-lib xemacs-base edit-utils)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(xslide
+  (standards-version 1.1
+   version "1.09"
+   author-version "0.2.2"
+   date "2003-10-28"
+   build-date "2003-10-28"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "XSL editing support."
+   filename "xslide-1.09-pkg.tar.gz"
+   md5sum "998f787ea80d98cdd7ca06c25ae96647"
+   size 39199
+   provides (xslide-abbrev xslide-data xslide-font xslide-process xslide)
+   requires (ispell mail-lib xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(liece
+  (standards-version 1.1
+   version "1.12"
+   author-version "1.4.9"
+   date "2003-04-22"
+   build-date "2003-04-22"
+   maintainer "Daiki Ueno <ueno@unixuser.org>"
+   distribution xemacs
+   priority high
+   category "standard"
+   dump nil
+   description "IRC (Internet Relay Chat) client for Emacs."
+   filename "liece-1.12-pkg.tar.gz"
+   md5sum "c7f2aab45f8ada9398d4b0807e80433a"
+   size 199275
+   provides (liece-xemacs gettext liece-clfns liece-handler liece-compat liece-version liece-vars liece-globals liece-inlines liece-filter liece-coding liece-dcc liece-menu liece-000 liece-200 liece-300 liece-400 liece-500 liece-nick liece-channel liece-commands liece-ctcp liece-q-el liece-message liece-handle liece-hilit liece-intl liece-mail liece-minibuf liece-misc liece-tcp liece-url liece-x-face liece-window liece)
+   requires (apel mail-lib fsf-compat xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(latin-unity
+  (standards-version 1.1
+   version "1.09"
+   author-version "1.09"
+   date "2003-11-09"
+   build-date "2003-11-09"
+   maintainer "Stephen J. Turnbull <stephen@xemacs.org>"
+   distribution mule
+   priority high
+   category "mule"
+   dump nil
+   description "MULE: find single ISO 8859 character set to encode a buffer."
+   filename "latin-unity-1.09-pkg.tar.gz"
+   md5sum "83b7fd603ad7cd5d9c459a0035501cac"
+   size 106267
+   provides (latin-unity latin-unity-tables latin-unity-utils)
+   requires (mule-base mule-ucs leim fsf-compat dired)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(mmm-mode
+  (standards-version 1.1
+   version "1.01"
+   author-version "0.4.7"
+   date "2003-10-29"
+   build-date "2003-10-29"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Multiple major modes in a single buffer"
+   filename "mmm-mode-1.01-pkg.tar.gz"
+   md5sum "28cf0136d0d8e59e74a464074a98ef4b"
+   size 175927
+   provides (mmm-auto mmm-class mmm-cmds mmm-compat mmm-mason mmm-mode mmm-region mmm-rpm mmm-sample mmm-univ mmm-utils mmm-vars)
+   requires (xemacs-base fsf-compat )
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(ibuffer
+  (standards-version 1.1
+   version "1.09"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "John Paul Wallington <jpw@shootybangbang.com>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Advanced replacement for buffer-menu"
+   filename "ibuffer-1.09-pkg.tar.gz"
+   md5sum "5132ee34ac4640fdb7a53706ee928e33"
+   size 89926
+   provides (ibuf-ext ibuf-macs ibuffer)
+   requires (ibuffer xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(xemacs-base
+  (standards-version 1.1
+   version "1.82"
+   author-version "No-Upstream-Ver"
+   date "2003-10-29"
+   build-date "2003-10-29"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority high
+   category "standard"
+   dump nil
+   description "Fundamental XEmacs support, you almost certainly need this."
+   filename "xemacs-base-1.82-pkg.tar.gz"
+   md5sum "7ba84839d26de61e4cb62741531d59ba"
+   size 472771
+   provides (add-log advice-preload advice annotations assoc case-table chistory comint-xemacs comint compile debug ebuff-menu echistory edmacro ehelp electric enriched env facemenu ffap helper imenu iso-syntax macros novice outline passwd pp regexp-opt regi ring shell skeleton sort thing time-stamp timezone tq xbm-button xpm-button)
+   requires ()
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(tramp
+  (standards-version 1.1
+   version "1.16"
+   author-version "2.0.35"
+   date "2003-07-21"
+   build-date "2003-07-21"
+   maintainer "Kai Großjohann <kai.grossjohann@gmx.net>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Remote shell-based file editing."
+   filename "tramp-1.16-pkg.tar.gz"
+   md5sum "ec5a21c4462d48ebe8dc01ea0e32373c"
+   size 251091
+   provides (tramp tramp-efs tramp-ftp tramp-smb tramp-util tramp-uu
+             tramp-vc trampcache)
+   requires (tramp xemacs-base vc fsf-compat efs dired mail-lib gnus ediff)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(text-modes
+  (standards-version 1.1
+   version "1.71"
+   author-version "No-Upstream-Ver"
+   date "2003-11-13"
+   build-date "2003-11-13"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority high
+   category "standard"
+   dump nil
+   description "Miscellaneous support for editing text files."
+   filename "text-modes-1.71-pkg.tar.gz"
+   md5sum "39be167962dc1a547a13f8bb1788327f"
+   size 377506
+   provides (ansi-color autoinsert crontab-edit desktop-entry-mode filladapt flyspell folding fold-isearch hexl htmlize image-mode iso-acc iso-ascii iso-cvt iso-insert iso-swed rtf-support swedish tabify whitespace-mode winmgr-mode xpm-mode xrdb-mode apache-mode po-mode po-compat css-mode)
+   requires (ispell fsf-compat xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(pcl-cvs
+  (standards-version 1.1
+   version "1.65"
+   author-version "R-2_9_9"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "CVS frontend."
+   filename "pcl-cvs-1.65-pkg.tar.gz"
+   md5sum "53b8cbd4d0b7709cfaf9d51e11888324"
+   size 161016
+   provides (cvs-compat cvs-edit cvs-log cvs-status easy-mmode pcl-cvs-defs pcl-cvs-info pcl-cvs-parse pcl-cvs-util pcl-cvs)
+   requires (xemacs-base elib vc dired edebug ediff edit-utils mail-lib prog-modes)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(mail-lib
+  (standards-version 1.1
+   version "1.63"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Simon Josefsson <simon@josefsson.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Fundamental lisp files for providing email support."
+   filename "mail-lib-1.63-pkg.tar.gz"
+   md5sum "99b3f341e8c29ad2dc3fec5196e32549"
+   size 198134
+   provides (base64 browse-url-xemacs browse-url highlight-headers mail-abbrevs mail-extr mail-utils mailheader netrc pop3 reporter rfc2104 rfc822 rmail rmail-mini rmailout sendmail smtpmail starttls tls)
+   requires (eterm xemacs-base fsf-compat sh-script ecrypto)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(jde
+  (standards-version 1.1
+   version "1.46"
+   author-version "2.3.2"
+   date "2003-10-08"
+   build-date "2003-10-08"
+   maintainer "Andy Piper <andy@xemacs.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Integrated Development Environment for Java."
+   filename "jde-1.46-pkg.tar.gz"
+   md5sum "60f5d299a53be811f6ef6006f2566c20"
+   size 2403395
+   provides (beanshell efc jde-ant jde-bug jde-checkstyle jde-compat jde-compile jde-complete jde-db jde-dbo jde-dbs jde-ejb jde-gen jde-help jde-imenu jde-import jde-java-font-lock jde-java-grammar jde-javadoc-gen jde-javadoc jde-jdb jde-make jde-open-source jde-package jde-parse-class jde-parse jde-run jde-setnu jde-stat jde-util jde-which-method jde-widgets jde-wiz jde-xref jde tree-widget)
+   requires (jde cc-mode semantic debug speedbar edit-utils eterm mail-lib xemacs-base xemacs-devel eieio elib sh-script fsf-compat)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(fsf-compat
+  (standards-version 1.1
+   version "1.13"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority high
+   category "standard"
+   dump nil
+   description "FSF Emacs compatibility files."
+   filename "fsf-compat-1.13-pkg.tar.gz"
+   md5sum "270a9deea6166bb38ac00f6191c7e8c0"
+   size 21687
+   provides (overlay thingatpt timer x-popup-menu goto-addr)
+   requires (xemacs-base)
+   type single
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(edit-utils
+  (standards-version 1.1
+   version "2.10"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority high
+   category "standard"
+   dump nil
+   description "Miscellaneous editor extensions, you probably need this."
+   filename "edit-utils-2.10-pkg.tar.gz"
+   md5sum "8d3c77a3ae8fb443a608a148e32e0d48"
+   size 925330
+   provides (abbrevlist after-save-commands atomic-extents avoid backup-dir balloon-help big-menubar blink-cursor blink-paren bookmark compare-w completion dabbrev desktop detached-minibuf edit-toolbar fast-lock file-part floating-toolbar flow-ctrl foldout func-menu hippie-exp icomplete id-select info-look iswitchb lazy-lock lazy-shot live-icon makesum man mic-paren paren mode-motion+ outl-mouse outln-18 page-ext blink-paren paren permanent-buffers popper power-macros recent-files redo reportmail resume rsz-minibuf saveconf savehist saveplace scroll-in-place setnu shell-font tempo toolbar-utils tree-menu uniquify vertical-mode where-was-i-db winring autorevert align allout outline narrow-stack highline)
+   requires (xemacs-base xemacs-devel fsf-compat dired mail-lib)
+   type single
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(skk
+  (standards-version 1.1
+   version "1.23"
+   author-version "10.62a"
+   date "2002-09-25"
+   build-date "2002-09-25"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution mule
+   priority medium
+   category "mule"
+   dump nil
+   description "MULE: Japanese Language Input Method."
+   filename "skk-1.23-pkg.tar.gz"
+   md5sum "dc35f20896a56c8cf2e7ba16b15e453b"
+   size 1506691
+   provides (skk-auto skk-comp skk-cursor skk-develop skk-foreword skk-gadget skk-isearch skk-kakasi skk-kcode skk-leim skk-look skk-num skk-obsolete skk-server skk-tut skk-vars skk-viper skk vip)
+   requires (viper mule-base elib xemacs-base apel)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(ps-print
+  (standards-version 1.1
+   version "1.09"
+   author-version "6.5.6"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Printing functions and utilities"
+   filename "ps-print-1.09-pkg.tar.gz"
+   md5sum "9055fe7244e253e2a12cc7e4d69df041"
+   size 155737
+   provides (lpr ps-bdf ps-mule ps-print)
+   requires (text-modes)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(sieve
+  (standards-version 1.1
+   version "1.14"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Simon Josefsson <simon@josefsson.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Manage Sieve email filtering scripts."
+   filename "sieve-1.14-pkg.tar.gz"
+   md5sum "6a9234ad3e59c485869db92a3637d91f"
+   size 25677
+   provides (sieve sieve-mode sieve-manage)
+   requires (xemacs-base mail-lib cc-mode sasl)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(mule-ucs
+  (standards-version 1.1
+   version "1.05"
+   author-version "0.84"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Stephen J. Turnbull <stephen@xemacs.org>"
+   distribution mule
+   priority high
+   category "mule"
+   dump nil
+   description "MULE: Extended coding systems (including Unicode) for XEmacs."
+   filename "mule-ucs-1.05-pkg.tar.gz"
+   md5sum "772c06a697d0b3b4d7b78e8df76c019c"
+   size 1314530
+   provides (mccl-font mucs-ccl mucs-error mucs-type mucs mule-uni tae tbl-mg trans-util txt-tbl un-data un-define un-supple un-tools un-trbase unicode unidata utf u-cns-1 u-cns-2 u-cns-3 u-cns-4 u-cns-5 u-cns-6 u-cns-7 uascii ubig5 uetiopic ugb2312 uipa uiscii uiso8859-1 uiso8859-14 uiso8859-15 uiso8859-2 uiso8859-3 uiso8859-4 uiso8859-5 uiso8859-6 uiso8859-7 uiso8859-8 uiso8859-9 ujisx0201 ujisx0208 ujisx0212 uksc5601 usisheng usupple utibetan utis620 uviscii)
+   requires (mule-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(clearcase
+  (standards-version 1.0
+   version "1.08"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Michael Diers <mdiers@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "New Clearcase Version Control for XEmacs (UNIX, Windows)."
+   filename "clearcase-1.08-pkg.tar.gz"
+   md5sum "6fedc7464137eae08c25517276f8a7ab"
+   size 94543
+   provides (clearcase)
+   requires (dired fsf-compat mail-lib xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(dictionary
+  (standards-version 1.1
+   version "1.12"
+   author-version "1.8"
+   date "2003-06-22"
+   build-date "2003-06-22"
+   maintainer "Torsten Hilbrich <dictionary@myrkr.in-berlin.de>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Interface to RFC2229 dictionary servers."
+   filename "dictionary-1.12-pkg.tar.gz"
+   md5sum "717517bbad4e241f18941fd6c289b868"
+   size 39658
+   provides (dictionary connection link)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(build
+  (standards-version 1.0
+   version "1.14"
+   author-version "2.02"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Adrian Aichner <adrian@xemacs.org>"
+   distribution stable
+   priority low
+   category "standard"
+   dump nil
+   description "Build XEmacs from within (UNIX, Windows)."
+   filename "build-1.14-pkg.tar.gz"
+   md5sum "927263daa5b6d8097b916f0be5887a62"
+   size 49484
+   provides (build)
+   requires (xemacs-base pcl-cvs dired w3 prog-modes)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(xslt-process
+  (standards-version 1.0
+   version "1.11"
+   author-version "1.2.1"
+   date "2002-10-08"
+   build-date "2002-10-08"
+   maintainer "Ovidiu Predescu <ovidiu@xemacs.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "XSLT processing support."
+   filename "xslt-process-1.11-pkg.tar.gz"
+   md5sum "30273cbe2e90ae703ea410879412e68b"
+   size 199873
+   provides (xslt-process)
+   requires (jde cc-mode semantic debug speedbar edit-utils eterm mail-lib xemacs-base elib eieio sh-script fsf-compat xemacs-devel)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(eieio
+  (standards-version 1.1
+   version "1.05"
+   author-version "0.17"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Eric Ludlam <zappo@gnu.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Enhanced Implementation of Emacs Interpreted Objects"
+   filename "eieio-1.05-pkg.tar.gz"
+   md5sum "b31f8f71fc5afa41196954f04f955654"
+   size 165803
+   provides (call-tree chart compare-strings eieio-base eieio-comp eieio-custom eieio-doc eieio-opt eieio-speedbar eieio-tests eieio linemark tree)
+   requires (speedbar xemacs-base edebug)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(egg-its
+  (standards-version 1.1
+   version "1.27"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution mule
+   priority high
+   category "mule"
+   dump nil
+   description "MULE: Wnn (4.2 and 6) support.  SJ3 support."
+   filename "egg-its-1.27-pkg.tar.gz"
+   md5sum "6027d90327043f918d8a4ea3143ae7d2"
+   size 261339
+   provides (egg-cnpinyin egg-cnzhuyin egg-cwnn-leim egg-jisx0201 egg-jsymbol egg-kwnn-leim egg-leim egg-sj3-client egg-sj3-leim egg-sj3 egg-wnn egg)
+   requires (leim mule-base fsf-compat xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(edict
+  (standards-version 1.1
+   version "1.16"
+   author-version "0.9.9"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Stephen J. Turnbull <stephen@xemacs.org>"
+   distribution mule
+   priority high
+   category "mule"
+   dump nil
+   description "MULE: Lisp Interface to EDICT, Kanji Dictionary."
+   filename "edict-1.16-pkg.tar.gz"
+   md5sum "406e55fda150ec0ea22b79580279be95"
+   size 96111
+   provides (dui-registry dui edict-edit edict-english edict-japanese edict-morphology edict-test edict ts-mode)
+   requires (mule-base xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(lookup
+  (standards-version 1.1
+   version "1.14"
+   author-version "1.0"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution mule
+   priority high
+   category "mule"
+   dump nil
+   description "MULE: Dictionary support"
+   filename "lookup-1.14-pkg.tar.gz"
+   md5sum "f48776563d7fbd0852ad73ac9c513260"
+   size 225996
+   provides (evi-mule evi lookup-content lookup-defs lookup-entry lookup-select lookup-package lookup-select lookup-types lookup-utils lookup-vars lookup-vse lookup ndcookie ndeb ndic ndict ndkks ndmisc ndnmz ndspell ndsrd ndtp sdicf stem)
+   requires (mule-base cookie lookup)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(leim
+  (standards-version 1.1
+   version "1.22"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution mule
+   priority medium
+   category "mule"
+   dump nil
+   description "MULE: Quail.  All non-English and non-Japanese language support."
+   filename "leim-1.22-pkg.tar.gz"
+   md5sum "942fbcd4d56eb59529bbd15c3b6c0b3b"
+   size 1708319
+   provides ()
+   requires (leim mule-base fsf-compat xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(locale
+  (standards-version 1.1
+   version "1.21"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution mule
+   priority high
+   category "mule"
+   dump nil
+   description "MULE: Localized menubars and localized splash screens."
+   filename "locale-1.21-pkg.tar.gz"
+   md5sum "2256243bb8cdd282af7b40bc2cf30018"
+   size 36961
+   provides ()
+   requires (mule-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(mule-base
+  (standards-version 1.1
+   version "1.44"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution mule
+   priority high
+   category "mule"
+   dump nil
+   description "MULE: Basic Mule support, required for building with Mule."
+   filename "mule-base-1.44-pkg.tar.gz"
+   md5sum "9eaa93208008617bd8f0d34448dcfaa3"
+   size 444749
+   provides (canna-leim canna char-table china-util cyril-util isearch-ext japan-util ccl can-n-egg mule-help)
+   requires (fsf-compat xemacs-base apel)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(strokes
+  (standards-version 1.1
+   version "1.10"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Mouse enhancement utility."
+   filename "strokes-1.10-pkg.tar.gz"
+   md5sum "946a6e0bb3e9384a94a79ecdffdd85d8"
+   size 43728
+   provides (strokes)
+   requires (text-modes edit-utils mail-lib xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(time
+  (standards-version 1.1
+   version "1.14"
+   author-version "1.17"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Display time & date on the modeline."
+   filename "time-1.14-pkg.tar.gz"
+   md5sum "8956073a18694a8ad91a52c7374c3d66"
+   size 20431
+   provides (time)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(slider
+  (standards-version 1.1
+   version "1.15"
+   author-version "0.3x1"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "User interface tool."
+   filename "slider-1.15-pkg.tar.gz"
+   md5sum "00bb43e4f3997c0c493cb7f29a75494b"
+   size 12516
+   provides (slider color-selector)
+   requires ()
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(sgml
+  (standards-version 1.1
+   version "1.10"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "SGML/Linuxdoc-SGML editing."
+   filename "sgml-1.10-pkg.tar.gz"
+   md5sum "ab80262877e3547dfb97e80a0a778e09"
+   size 27462
+   provides (sgml linuxdoc-sgml)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(psgml
+  (standards-version 1.1
+   version "1.41"
+   author-version "1.3.1"
+   date "2003-08-29"
+   build-date "2003-08-29"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Validated HTML/SGML editing."
+   filename "psgml-1.41-pkg.tar.gz"
+   md5sum "33baca4b85d3d9c48df682b748c9a273"
+   size 301000
+   provides (iso-sgml psgml-api psgml-charent psgml-debug psgml-dtd psgml-edit psgml-fs psgml-html psgml-info psgml-parse psgml-sysdep psgml-xemacs psgml sgml-mode)
+   requires (xemacs-base edit-utils edebug xemacs-devel mail-lib fsf-compat eterm sh-script ps-print)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(pc
+  (standards-version 1.1
+   version "1.26"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "PC style interface emulation."
+   filename "pc-1.26-pkg.tar.gz"
+   md5sum "47189d077b363012c4b17f527eef2ec7"
+   size 17611
+   provides (delbs fusion pc-select pending-del s-region)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(ispell
+  (standards-version 1.1
+   version "1.26"
+   author-version "3.3"
+   date "2003-11-02"
+   build-date "2003-11-02"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Spell-checking with GNU ispell."
+   filename "ispell-1.26-pkg.tar.gz"
+   md5sum "85a9da0fe8ed41199388b5f41a0f7769"
+   size 72869
+   provides (ispell)
+   requires ()
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(hm--html-menus
+  (standards-version 1.1
+   version "1.23"
+   author-version "5.9"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "HTML editing."
+   filename "hm--html-menus-1.23-pkg.tar.gz"
+   md5sum "c625e8070a7abfed6fb1f13d04a38e51"
+   size 179091
+   provides (adapt hm--date hm--html-configuration hm--html-drag-and-drop hm--html-indentation hm--html-keys hm--html-menu hm--html-mode hm--html-not-standard hm--html html-view internal-drag-and-drop tmpl-minor-mode)
+   requires (dired xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(frame-icon
+  (standards-version 1.1
+   version "1.11"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Set up mode-specific icons for each frame under XEmacs"
+   filename "frame-icon-1.11-pkg.tar.gz"
+   md5sum "6fbd58bc7f37328aaf31b420c9a2891f"
+   size 33800
+   provides (forms forms-mode)
+   requires ()
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(forms
+  (standards-version 1.1
+   version "1.15"
+   author-version "2.37"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Forms editing support (obsolete, use Widget instead)."
+   filename "forms-1.15-pkg.tar.gz"
+   md5sum "5f5cc842399040018bab20f776cf1cf8"
+   size 48747
+   provides (forms forms-mode)
+   requires ()
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(calendar
+  (standards-version 1.1
+   version "1.22"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Calendar and diary support."
+   filename "calendar-1.22-pkg.tar.gz"
+   md5sum "c9f0bdbcb3cbbb9eff338e4edd9d7f95"
+   size 253996
+   provides (appt cal-china cal-coptic cal-dst cal-french cal-hebrew cal-islam cal-iso cal-japanese cal-julian cal-mayan cal-move cal-persia cal-tex cal-x cal-xemacs calendar diary-lib holidays lunar solar)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(calc
+  (standards-version 1.1
+   version "1.24"
+   author-version "2.02fX3"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Emacs calculator"
+   filename "calc-1.24-pkg.tar.gz"
+   md5sum "61fa56abe04492e448a8549b5978ca3a"
+   size 1600141
+   provides (calc-ext calc-macs calc)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(speedbar
+  (standards-version 1.1
+   version "1.27"
+   author-version "0.14beta4"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Eric M. Ludlam <zappo@gnu.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Provides a separate frame with convenient references."
+   filename "speedbar-1.27-pkg.tar.gz"
+   md5sum "4df8d109364493dca814ef7429d560d2"
+   size 163245
+   provides (bigclock dframe rpm sb-ant sb-gud sb-html sb-image sb-info sb-rmail sb-texinfo sb-w3 speedbar)
+   requires (xemacs-base edebug)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(pcomplete
+  (standards-version 1.1
+   version "1.03"
+   author-version "1.1.6"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "John Wiegley <johnw@gnu.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Provides programmatic completion."
+   filename "pcomplete-1.03-pkg.tar.gz"
+   md5sum "43bad91be873dd6ae2f9483e90c42226"
+   size 37443
+   provides (pcomplete)
+   requires (sh-script xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(eshell
+  (standards-version 1.1
+   version "1.06"
+   author-version "2.4.1"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "John Wiegley <johnw@gnu.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Command shell implemented entirely in Emacs Lisp"
+   filename "eshell-1.06-pkg.tar.gz"
+   md5sum "737f4d5caed7ffe8cb987f0e2459d6e8"
+   size 232041
+   provides (em-alias em-banner em-basic em-cmpl em-dirs em-glob em-hist em-ls em-pred em-prompt em-rebind em-script em-smart em-term em-unix em-xtra esh-arg esh-cmd esh-ext esh-io esh-maint esh-mode esh-module esh-opt esh-proc esh-test esh-toggle esh-util esh-var eshell)
+   requires (xemacs-base eterm)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(view-process
+  (standards-version 1.1
+   version "1.13"
+   author-version "2.4"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "A Unix process browsing tool."
+   filename "view-process-1.13-pkg.tar.gz"
+   md5sum "05eca7ec61259b47f2a741fc30dcc65f"
+   size 60814
+   provides (view-process-mode)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(os-utils
+  (standards-version 1.1
+   version "1.34"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Miscellaneous O/S utilities."
+   filename "os-utils-1.34-pkg.tar.gz"
+   md5sum "98fa67e0d1b89febd16bfc952d552171"
+   size 225849
+   provides (archive-mode background crypt++ crypt ftelnet inf-lisp jka-compr mchat rlogin ssh tar-mode telnet terminal uncompress)
+   requires (xemacs-base)
+   type single
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(ilisp
+  (standards-version 1.1
+   version "1.33"
+   author-version "5.12.0"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "ilisp Maintainers <ilisp@cons.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Front-end for Inferior Lisp."
+   filename "ilisp-1.33-pkg.tar.gz"
+   md5sum "a0edbe80726e199f3cfc7a367c3fd772"
+   size 344245
+   provides (bridge comint-ipc completer ilcompat compat-fsf18 compat-fsf-19 compat-fsf-20 ilisp-chs ilisp-cl-easy-menu ilisp-ext ilisp-lw ilisp-key ilisp-menu ilisp-mnb ilisp-scheme-easy-menu ilisp il-luc19 il-luc19)
+   requires (xemacs-base mail-lib fsf-compat eterm sh-script)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(igrep
+  (standards-version 1.1
+   version "1.12"
+   author-version "2.95"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Enhanced front-end for Grep."
+   filename "igrep-1.12-pkg.tar.gz"
+   md5sum "a46e749b903ad526dad1a898496e9812"
+   size 17316
+   provides (igrep)
+   requires (dired xemacs-base efs)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(eterm
+  (standards-version 1.1
+   version "1.15"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Terminal emulation."
+   filename "eterm-1.15-pkg.tar.gz"
+   md5sum "4821611600abfb6f7e6d2d91b361e5dc"
+   size 109135
+   provides (eterm)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(viper
+  (standards-version 1.1
+   version "1.37"
+   author-version "3.09"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Michael Kifer <kifer@cs.sunysb.edu>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "VI emulation support."
+   filename "viper-1.37-pkg.tar.gz"
+   md5sum "5bd6157ea98d1cc9399e91eb3b684c8c"
+   size 327719
+   provides (viper-cmd viper-ex viper-init viper-keym viper-macs viper-mous viper-util viper)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(tpu
+  (standards-version 1.1
+   version "1.14"
+   author-version "4.2X"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Kevin Oberman <oberman@es.net>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "DEC EDIT/TPU support."
+   filename "tpu-1.14-pkg.tar.gz"
+   md5sum "f3f5ef913e958e5532a2a682288eac05"
+   size 59529
+   provides (tpu)
+   requires ()
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(textools
+  (standards-version 1.1
+   version "1.15"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Miscellaneous TeX support."
+   filename "textools-1.15-pkg.tar.gz"
+   md5sum "43d33c2e35569a434e7787e7ded2eade"
+   size 79966
+   provides (bib-mode bibtex refer-to-bibtex)
+   requires (xemacs-base)
+   type single
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(texinfo
+  (standards-version 1.1
+   version "1.25"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority high
+   category "standard"
+   dump nil
+   description "XEmacs TeXinfo support."
+   filename "texinfo-1.25-pkg.tar.gz"
+   md5sum "a2755f74e1f4c76ba36d844abc718d3a"
+   size 133884
+   provides (makeinfo tex-mode texinfmt texinfo texnfo-tex texnfo-upd)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(reftex
+  (standards-version 1.1
+   version "1.33"
+   author-version "4.21"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Carsten Dominik <dominik@science.uva.nl>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Emacs support for LaTeX cross-references, citations.."
+   filename "reftex-1.33-pkg.tar.gz"
+   md5sum "4d9a603199ad55c5d3f3cd31413a56de"
+   size 352053
+   provides (reftex-auc reftex-cite reftex-dcr reftex-vcr reftex-global reftex-index reftex-parse reftex-ref reftex-sel reftex-toc reftex-vars reftex)
+   requires (fsf-compat xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(edt
+  (standards-version 1.1
+   version "1.13"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "DEC EDIT/EDT emulation."
+   filename "edt-1.13-pkg.tar.gz"
+   md5sum "1ca337b8b41799394068717d8d716516"
+   size 62754
+   provides (edt)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(crisp
+  (standards-version 1.1
+   version "1.14"
+   author-version "1.34"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Crisp/Brief emulation."
+   filename "crisp-1.14-pkg.tar.gz"
+   md5sum "ba1bbc29153b1849e71d123b9f2021b1"
+   size 10361
+   provides (crisp scroll-lock)
+   requires ()
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(auctex
+  (standards-version 1.1
+   version "1.35"
+   author-version "11.13"
+   date "2003-01-03"
+   build-date "2003-01-03"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Basic TeX/LaTeX support."
+   filename "auctex-1.35-pkg.tar.gz"
+   md5sum "168e82155e152dab8c7c913bc9a4788b"
+   size 406466
+   provides (auc-old auc-tex bib-cite font-latex latex multi-prompt tex-buf tex-info tex-jp tex-mik tex-site tex texmathp)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(vhdl
+  (standards-version 1.1
+   version "1.18"
+   author-version "3.31.20"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Support for VHDL."
+   filename "vhdl-1.18-pkg.tar.gz"
+   md5sum "6a38f9e4428754114593b94089c71943"
+   size 273202
+   provides (vhdl-mode)
+   requires (xemacs-base edit-utils c-support speedbar ps-print os-utils)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(x-symbol
+  (standards-version 1.1
+   version "1.07"
+   author-version "4.5.1"
+   date "2003-10-26"
+   build-date "2003-10-26"
+   maintainer "Steve Youngs <sryoungs@bigpond.net.au>"
+   distribution xemacs
+   priority high
+   category "standard"
+   dump nil
+   description "Semi WYSIWYG for LaTeX, HTML, etc, using additional fonts."
+   filename "x-symbol-1.07-pkg.tar.gz"
+   md5sum "c4a1cfc1318d5eb87eb186f0972abad6"
+   size 679781
+   provides (x-symbol-bib x-symbol-hooks x-symbol-image x-symbol-macs x-symbol-mule x-symbol-nomule x-symbol-sgml x-symbol-tex x-symbol-texi x-symbol-vars x-symbol-xmacs x-symbol)
+   requires (x-symbol xemacs-base auctex mail-lib)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(vc
+  (standards-version 1.1
+   version "1.38"
+   author-version "No-Upstream-Ver"
+   date "2003-10-27"
+   build-date "2003-10-27"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Version Control for Free systems."
+   filename "vc-1.38-pkg.tar.gz"
+   md5sum "b19fa9b253ec9335829c3289ea1b046b"
+   size 93835
+   provides (vc vc-hooks)
+   requires (dired xemacs-base vc mail-lib ediff)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(vc-cc
+  (standards-version 1.1
+   version "1.22"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Version Control for ClearCase (UnFree) systems."
+   filename "vc-cc-1.22-pkg.tar.gz"
+   md5sum "ee4ce6853773d36dd92b53ce2513fd73"
+   size 95028
+   provides (vc-cc vc-cc-hooks)
+   requires (dired xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(sh-script
+  (standards-version 1.1
+   version "1.18"
+   author-version "2.0e"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Support for editing shell scripts."
+   filename "sh-script-1.18-pkg.tar.gz"
+   md5sum "4a0e2de6d1006c987dfd9e861b8562cd"
+   size 37055
+   provides (sh-script executable)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(scheme
+  (standards-version 1.1
+   version "1.14"
+   author-version "No-Upstream-Ver"
+   date "2003-10-28"
+   build-date "2003-10-28"
+   maintainer "Karl M. Hegbloom <karlheg@bittersweet.inetarena.com>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Front-end support for Inferior Scheme."
+   filename "scheme-1.14-pkg.tar.gz"
+   md5sum "0d64efd541819d9ba12cdafa9036edc7"
+   size 37770
+   provides (scheme xscheme cmuscheme cmuscheme48)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(prog-modes
+  (standards-version 1.1
+   version "1.91"
+   author-version "No-Upstream-Ver"
+   date "2003-10-29"
+   build-date "2003-10-29"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Support for various programming languages."
+   filename "prog-modes-1.91-pkg.tar.gz"
+   md5sum "b0203d7e022fdf730845ffbceaf41bf0"
+   size 715961
+   provides (autoconf-mode awk-mode c-mode cvs diff-mode eiffel-mode icon javascript-mode ksh-mode m4-mode make-mode makefile mode-compile mode-compile-kill modula2 p4 php-mode postscript rexx-mode rpm-spec-mode simula-mode sql tcl teco uil-mode verilog-mode)
+   requires (mail-lib xemacs-devel xemacs-base cc-mode fsf-compat edit-utils ediff emerge efs vc speedbar dired ilisp sh-script)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(idlwave
+  (standards-version 1.1
+   version "1.31"
+   author-version "5.1"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Carsten Dominik <dominik@astro.uva.nl>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Editing and Shell mode for the Interactive Data Language"
+   filename "idlwave-1.31-pkg.tar.gz"
+   md5sum "c5e8e00757efddd5d83d9acb31247102"
+   size 520952
+   provides (idlw-rinfo idlwave-rinfo idlw-shell idlwave-shell idlw-toolbar idlwave-toolbar idlwave)
+   requires (fsf-compat xemacs-base mail-lib)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(emerge
+  (standards-version 1.1
+   version "1.11"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Another interface over GNU patch."
+   filename "emerge-1.11-pkg.tar.gz"
+   md5sum "f47b98cdf120c123bee14ff9d1ff0862"
+   size 61367
+   provides (emerge)
+   requires ()
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(ediff
+  (standards-version 1.1
+   version "1.49"
+   author-version "2.75"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Michael Kifer <kifer@cs.sunysb.edu>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Interface over GNU patch."
+   filename "ediff-1.49-pkg.tar.gz"
+   md5sum "de66f77ac38f2df7dd4c5a94d9582f55"
+   size 305252
+   provides (ediff-diff ediff-help ediff-hook ediff-init ediff-merg ediff-mult ediff-ptch ediff-tbar ediff-util ediff-vers ediff-wind ediff)
+   requires (pcl-cvs elib dired xemacs-base edebug prog-modes)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(debug
+  (standards-version 1.1
+   version "1.17"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "GUD, gdb, dbx debugging support."
+   filename "debug-1.17-pkg.tar.gz"
+   md5sum "e45715132f64e4dbc7f14a22128b9279"
+   size 108073
+   provides (dbx debug-toolbar gdb-highlight gdb gdbsrc gud history)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(c-support
+  (standards-version 1.1
+   version "1.18"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Basic single-file add-ons for editing C code."
+   filename "c-support-1.18-pkg.tar.gz"
+   md5sum "950c5d610fb614bd418863075cde1c4c"
+   size 70705
+   provides (c-comment-edit cmacexp ctypes hideif hideshow)
+   requires (cc-mode xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(ada
+  (standards-version 1.1
+   version "1.14"
+   author-version "2.27"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Ada language support."
+   filename "ada-1.14-pkg.tar.gz"
+   md5sum "f2635d2b432f2a7cd456df760d622e3c"
+   size 55836
+   provides (ada-mode ada-stmt)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(cc-mode
+  (standards-version 1.1
+   version "1.41"
+   author-version "5.30.7"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Martin Stjernholm <bug-cc-mode@gnu.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "C, C++, Objective-C, Java, CORBA IDL, Pike and AWK language support."
+   filename "cc-mode-1.41-pkg.tar.gz"
+   md5sum "31b9f8e38d95e6b5dd079c14f88ef360"
+   size 513369
+   provides (cc-align cc-awk cc-bytecomp cc-cmds cc-compat cc-defs cc-engine cc-fix cc-fonts cc-guess cc-langs cc-lobotomy cc-menus cc-mode cc-styles cc-vars)
+   requires (xemacs-base mail-lib)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(semantic
+  (standards-version 1.1
+   version "1.18"
+   author-version "1.4.2"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Eric M. Ludlam <zappo@gnu.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Semantic bovinator (Yacc/Lex for XEmacs). Includes Senator."
+   filename "semantic-1.18-pkg.tar.gz"
+   md5sum "bb333c47f371748a1e923893c98d7b3f"
+   size 443092
+   provides (document-vars document semantic-analyze semantic-bnf semantic-c semantic-cb semantic-chart semantic-ctxt semantic-el semantic-example semantic-ia-sb semantic-ia semantic-imenu semantic-java semantic-load semantic-make semantic-sb semantic-scm semantic-skel semantic-texi semantic-util-modes semantic-util semantic semanticdb senator sformat working)
+   requires (eieio xemacs-base xemacs-devel edit-utils speedbar texinfo fsf-compat cc-mode edebug)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(misc-games
+  (standards-version 1.1
+   version "1.18"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Other amusements and diversions."
+   filename "misc-games-1.18-pkg.tar.gz"
+   md5sum "c68c91ee7eb296669388645c467fdede"
+   size 166817
+   provides (decipher gomoku hanoi life morse rot13)
+   requires (xemacs-base)
+   type single
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(mine
+  (standards-version 1.1
+   version "1.16"
+   author-version "1.9"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Minehunt Game."
+   filename "mine-1.16-pkg.tar.gz"
+   md5sum "3875c5eb3c58306db3c875a18ba56ff6"
+   size 67161
+   provides (xmine)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(games
+  (standards-version 1.1
+   version "1.15"
+   author-version "1.04"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Glynn Clements <glynn@sensei.co.uk>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Tetris, Sokoban, and Snake."
+   filename "games-1.15-pkg.tar.gz"
+   md5sum "e50c1cd9ae0e9d32a022f52e795119b4"
+   size 37242
+   provides (gamegrid snake tetris sokoban)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(cookie
+  (standards-version 1.1
+   version "1.15"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Spook and Yow (Zippy quotes)."
+   filename "cookie-1.15-pkg.tar.gz"
+   md5sum "70b4bde06580ec71df2a23aa95808bb7"
+   size 35035
+   provides (cookie1 yow)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(bbdb
+  (standards-version 1.1
+   version "1.24"
+   author-version "2.34"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Ronan Waide <waider@waider.ie>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "The Big Brother Data Base"
+   filename "bbdb-1.24-pkg.tar.gz"
+   md5sum "bb9a7c33c742e28076643be7fda317ed"
+   size 373736
+   provides (bbdb-com bbdb-ftp bbdb-gnus bbdb-gui bbdb-hooks bbdb-merge bbdb-mhe bbdb-migrate bbdb-print bbdb-reportmail bbdb-rmail bbdb-sc bbdb-snarf bbdb-srv bbdb-vm bbdb-w3 bbdb-whois bbdb-xemacs bbdb)
+   requires (bbdb edit-utils gnus mh-e rmail supercite vm tm apel mail-lib xemacs-base w3 fsf-compat eterm sh-script net-utils os-utils)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(zenirc
+  (standards-version 1.1
+   version "1.14"
+   author-version "2.112"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "ZENIRC IRC Client."
+   filename "zenirc-1.14-pkg.tar.gz"
+   md5sum "9e40efa659a867dae6aac4673b474322"
+   size 277304
+   provides (zenirc-18 zenirc-8ball zenirc-away zenirc-bork zenirc-color zenirc-command-queue zenirc-complete zenirc-ctcp-flood zenirc-dcc zenirc-doto zenirc-fill zenirc-finnish zenirc-format zenirc-fortran zenirc-french zenirc-history zenirc-ignore zenirc-iwantop zenirc-klingon zenirc-latin zenirc-meditate zenirc-netsplit zenirc-notify zenirc-oink zenirc-ojnk zenirc-pjg zenirc-popup zenirc-random-away zenirc-random-nick zenirc-signal zenirc-stamp zenirc-swedish zenirc-trigger zenirc-yow-filter zenirc-yow zenirc)
+   requires (zenirc)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(mew
+  (standards-version 1.1
+   version "1.18"
+   author-version "1.94.2"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Messaging in an Emacs World."
+   filename "mew-1.18-pkg.tar.gz"
+   md5sum "09533ddf67f0948c6b4a40b996d82fbd"
+   size 745829
+   provides (mew-addrbook mew-attach mew-bq mew-cache mew-complete mew-decode mew-demo mew-draft mew-encode mew-env mew-ext mew-fib mew-func mew-header mew-highlight mew-lang-jp mew-mark mew-message mew-mime mew-minibuf mew-mule mew-mule0 mew-mule2 mew-mule3 mew-os2 mew-pgp mew-pick mew-refile mew-scan mew-sort mew-summary mew-syntax mew-temacs mew-unix mew-vars mew-virtual mew-win32 mew-xemacs mew)
+   requires (mew w3 efs mail-lib xemacs-base fsf-compat)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(tm
+  (standards-version 1.1
+   version "1.37"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Emacs MIME support. Not needed for gnus >= 5.8.0"
+   filename "tm-1.37-pkg.tar.gz"
+   md5sum "9cd28b13243debe9a986dcbd332f1ccd"
+   size 334179
+   provides (char-util cless gnus-art-mime gnus-charset gnus-mime gnus-sum-mime latex-math-symbol mel-b mel-g mel-q mel-u mel message-mime mime-setup mu-bbdb mu-cite range sc-setup signature texi-util tl-atype tl-list tl-misc tl-num tl-seq tl-str tm-bbdb tm-def tm-edit-mc tm-edit tm-ew-d tm-ew-e tm-file tm-ftp tm-html tm-image tm-latex tm-mail tm-mh-e tm-parse tm-partial tm-pgp tm-play tm-rmail tm-setup tm-tar tm-text tm-view tm-vm tmh-comp)
+   requires (gnus mh-e rmail vm mailcrypt mail-lib apel xemacs-base fsf-compat sh-script net-utils)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(gnus
+  (standards-version 1.1
+   version "1.73"
+   author-version "5.10.2"
+   date "2003-10-13"
+   build-date "2003-10-13"
+   maintainer "Steve Youngs <sryoungs@bigpond.net.au>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "The Gnus Newsreader and Mailreader."
+   filename "gnus-1.73-pkg.tar.gz"
+   md5sum "a1259caa28482a71bc4dfa1e434f9511"
+   size 3245188
+   provides (binhex canlock compface deuglify earcon flow-fill format-spec gnus-agent gnus-art gnus-async gnus-audio gnus-bcklg gnus-cache gnus-cite gnus-cus gnus-delay gnus-demon gnus-diary gnus-dired gnus-draft gnus-dup gnus-eform gnus-ems gnus-fun gnus-gl gnus-group gnus-int gnus-kill gnus-logic gnus-mh gnus-ml gnus-mlspl gnus-move gnus-msg gnus-nocem gnus-picon gnus-range gnus-registry gnus-salt gnus-score gnus-setup gnus-sieve gnus-soup gnus-spec gnus-srvr gnus-start gnus-sum gnus-topic gnus-undo gnus-util gnus-uu gnus-vm gnus-win gnus-xmas gnus ietf-drums imap mail-parse mail-prsvr mail-source mailcap message messagexmas messcompat mm-bodies mm-decode mm-encode mm-extern mm-partial mm-url mm-util mm-uu mm-view mml-sec mml-smime mml mml1991 mml2015 nnagent nnbabyl nndb nndiary nndir nndoc nndraft nneething nnfolder nngateway nnheader nnheaderxm nnimap nnkiboze nnlistserv nnmail nnmaildir nnmbox nnmh nnml nnnil nnoo nnrss nnslashdot nnsoup nnspool nntp nnultimate nnvirtual nnwarchive nnweb nnwfm parse-time qp rfc1843 rfc2045 rfc2047 rfc2231 score-mode smiley smime spam-report spam-stat spam time-date utf7 uudecode webmail yenc gnus-idna gpg-ring gpg hashcash vcard)
+   requires (gnus w3 mh-e mailcrypt rmail eterm mail-lib xemacs-base fsf-compat ecrypto tm apel pgg net-utils sh-script os-utils dired sieve sasl)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(rmail
+  (standards-version 1.1
+   version "1.14"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "An obsolete Emacs mailer."
+   filename "rmail-1.14-pkg.tar.gz"
+   md5sum "4409fc7ff5134ff562ff1357a014a41b"
+   size 96995
+   provides (rmail-kill rmail-xemacs rmail rmailsort)
+   requires (tm apel mail-lib xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(mailcrypt
+  (standards-version 1.1
+   version "2.13"
+   author-version "3.5.8"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Support for messaging encryption with PGP."
+   filename "mailcrypt-2.13-pkg.tar.gz"
+   md5sum "efe51870b559239cf48a102ea8a89e2f"
+   size 154111
+   provides (expect mailcrypt)
+   requires (mail-lib fsf-compat xemacs-base cookie gnus mh-e rmail vm)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(supercite
+  (standards-version 1.1
+   version "1.20"
+   author-version "3.55x3"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "An Emacs citation tool for News & Mail messages."
+   filename "supercite-1.20-pkg.tar.gz"
+   md5sum "277fb688d3765c0434e34013e811e94d"
+   size 100553
+   provides (supercite)
+   requires (mail-lib xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(mh-e
+  (standards-version 1.1
+   version "1.27"
+   author-version "7.4.2"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Steve Youngs <mh-e-devel@lists.sf.net>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Front end support for MH."
+   filename "mh-e-1.27-pkg.tar.gz"
+   md5sum "5b886efc6e93f97a61237dade2f360ee"
+   size 577724
+   provides (mh-alias mh-comp mh-customize mh-e mh-funcs mh-gnus mh-identity mh-inc mh-index mh-junk mh-loaddefs mh-mime mh-pick mh-seq mh-speed mh-unit mh-utils mh-xemacs-compat mh-xemacs-icons)
+   requires (gnus mail-lib xemacs-base speedbar rmail tm apel sh-script fsf-compat xemacs-devel net-utils eterm os-utils)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(gnats
+  (standards-version 1.1
+   version "1.16"
+   author-version "3.101"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority high
+   category "standard"
+   dump nil
+   description "XEmacs bug reports."
+   filename "gnats-1.16-pkg.tar.gz"
+   md5sum "678c190f7cd184426dcccc0f3a6d10b2"
+   size 188963
+   provides (gnats gnats-admin send-pr)
+   requires (mail-lib xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(footnote
+  (standards-version 1.1
+   version "1.16"
+   author-version "0.18x"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "SL Baur <steve@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Footnoting in mail message editing modes."
+   filename "footnote-1.16-pkg.tar.gz"
+   md5sum "79dc557f3be890dc6f3e7793fef6f1b6"
+   size 22152
+   provides (footnote-cyrillic footnote-greek footnote-han footnote-hebrew footnote-kana footnote)
+   requires (mail-lib xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(eudc
+  (standards-version 1.1
+   version "1.39"
+   author-version "1.32"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Oscar Figueiredo <oscar@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Emacs Unified Directory Client (LDAP, PH)."
+   filename "eudc-1.39-pkg.tar.gz"
+   md5sum "1c725e74136dc51c02f4e7b7642140a7"
+   size 79488
+   provides (eudc eudc-vars eudc-hotlist eudc-export eudc-bob eudcb-ldap eudcb-ph eudcb-bbdb)
+   requires (fsf-compat xemacs-base bbdb mail-lib gnus rmail tm apel eterm sh-script net-utils)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(net-utils
+  (standards-version 1.1
+   version "1.33"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Miscellaneous Networking Utilities."
+   filename "net-utils-1.33-pkg.tar.gz"
+   md5sum "9470e0dc21c8dd3c1d859ce7541f31c0"
+   size 137514
+   provides (ilisp-browse-cltl2 xemacsbug feedmail metamail net-utils rcompile shadowfile webjump webster-www dig dns xml)
+   requires (bbdb w3 efs mail-lib xemacs-base fsf-compat eterm sh-script gnus rmail tm apel)
+   type single
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(w3
+  (standards-version 1.1
+   version "1.29"
+   author-version "4.0pre47"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority high
+   category "standard"
+   dump nil
+   description "A Web browser."
+   filename "w3-1.29-pkg.tar.gz"
+   md5sum "088e276b855e95b2032aa58160ffeba2"
+   size 694178
+   provides (css devices w3-auto dsssl-flow dsssl font images mm mule-sysdp socks ssl urlauth url-cache url-cookie url-file url-gopher url-gw url-http url-ldap url-mail url-misc url-news url-ns url-parse url-vars url w3-about w3-auto w3-cfg w3-cus w3-display w3-emacs19 w3-e19 w3-e20 w3-elisp w3-emulate w3-forms w3-hot w3-hotindex w3-imap w3-java w3-jscript w3-keyword w3-latex w3-menu w3-mouse w3-parse w3-print w3-props w3-script w3-structure w3-speak w3-style w3-sysdp w3-toolbar w3-vars w3-widget w3-xemacs w3-xemac w3)
+   requires (w3 mail-lib xemacs-base ecrypto)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(vm
+  (standards-version 1.1
+   version "7.18"
+   author-version "7.17"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Kyle Jones <kyle_jones@wonderworks.com>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "An Emacs mailer."
+   filename "vm-7.18-pkg.tar.gz"
+   md5sum "25a353d78f64c2dd2e1001719158a315"
+   size 812340
+   provides (tapestry vm-byteopts vm-delete vm-digest vm-easymenu vm-edit vm-folder vm-imap vm-license vm-macro vm-mark vm-menu vm-message vm-mime vm-minibuf vm-misc vm-motion vm-mouse vm-page vm-pop vm-reply vm-save vm-search vm-sort vm-startup vm-summary vm-thread vm-toolbar vm-undo vm-user vm-vars vm vm-version vm-virtual vm-window)
+   requires (mail-lib xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(sounds-wav
+  (standards-version 1.1
+   version "1.12"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority high
+   category "standard"
+   dump nil
+   description "XEmacs Microsoft sound files."
+   filename "sounds-wav-1.12-pkg.tar.gz"
+   md5sum "3045a90ca53b22ebb7aa52f611bafcd3"
+   size 149624
+   provides ()
+   requires ()
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(sounds-au
+  (standards-version 1.1
+   version "1.12"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority high
+   category "standard"
+   dump nil
+   description "XEmacs Sun sound files."
+   filename "sounds-au-1.12-pkg.tar.gz"
+   md5sum "9bf0b5a2ac38a4fe2d710063ddcaadd3"
+   size 126817
+   provides ()
+   requires ()
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(xemacs-devel
+  (standards-version 1.1
+   version "1.60"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority medium
+   category "standard"
+   dump nil
+   description "Emacs Lisp developer support."
+   filename "xemacs-devel-1.60-pkg.tar.gz"
+   md5sum "db789317a15bf3a73bacd7b337ec7a34"
+   size 232116
+   provides (checkdoc docref eldoc elp eval-expr find-func hide-copyleft ielm patcher pp trace patch-keywords)
+   requires (xemacs-base ispell mail-lib gnus rmail tm apel sh-script net-utils eterm)
+   type single
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(tooltalk
+  (standards-version 1.1
+   version "1.15"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Support for building with Tooltalk."
+   filename "tooltalk-1.15-pkg.tar.gz"
+   md5sum "3d1a4ddbd0da23033a6dc8a8c90849e2"
+   size 9749
+   provides ()
+   requires ()
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(elib
+  (standards-version 1.1
+   version "1.11"
+   author-version "1.0"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority high
+   category "standard"
+   dump nil
+   description "Portable Emacs Lisp utilities library."
+   filename "elib-1.11-pkg.tar.gz"
+   md5sum "914b735704c60f7d534398025ae725db"
+   size 73387
+   provides (avltree bintree cookie dll elib-node queue-f queue-m read stack-f stack-m string)
+   requires ()
+   type single
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(edebug
+  (standards-version 1.1
+   version "1.20"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "An Emacs Lisp debugger."
+   filename "edebug-1.20-pkg.tar.gz"
+   md5sum "ff397fa7dba09ab0a52a83649b8a14d8"
+   size 115244
+   provides (edebug cl-read cust-print eval-reg cl-specs)
+   requires (xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(Sun
+  (standards-version 1.1
+   version "1.15"
+   author-version "No-Upstream-Ver"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Support for Sparcworks."
+   filename "Sun-1.15-pkg.tar.gz"
+   md5sum "ac4b09817681596ba032cf868c7c6dac"
+   size 64660
+   provides (sccs eos-browser eos-common eos-debugger eos-debugger eos-editor eos-init eos-load eos-menubar eos-toolbar sunpro)
+   requires (cc-mode xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(apel
+  (standards-version 1.1
+   version "1.27"
+   author-version "10.2"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority high
+   category "standard"
+   dump nil
+   description "A Portable Emacs Library.  Used by XEmacs MIME support."
+   filename "apel-1.27-pkg.tar.gz"
+   md5sum "2f35080836afe0730b2fe664f90b01be"
+   size 108585
+   provides (atype emu-20 emu-e19 emu-x20 emu-xemacs emu file-detect filename install mule-caesar path-util richtext std11-parse std11 tinyrich)
+   requires (fsf-compat xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(efs
+  (standards-version 1.0
+   version "1.32"
+   author-version "1.22"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Mike Sperber <sperber@informatik.uni-tuebingen.de>"
+   distribution stable
+   priority medium
+   category "standard"
+   dump nil
+   description "Treat files on remote systems the same as local files."
+   filename "efs-1.32-pkg.tar.gz"
+   md5sum "6123c11bc7a9c993429e9976f7bf42c4"
+   size 375800
+   provides (efs)
+   requires (xemacs-base dired)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(dired
+  (standards-version 1.0
+   version "1.15"
+   author-version "7.11"
+   date "2003-10-31"
+   build-date "2003-10-31"
+   maintainer "Mike Sperber <sperber@informatik.uni-tuebingen.de>"
+   distribution stable
+   priority medium
+   category "standard"
+   dump nil
+   description "Manage file systems."
+   filename "dired-1.15-pkg.tar.gz"
+   md5sum "3bd864d76ba88c2a8a42772222a2743f"
+   size 198282
+   provides (diff dired)
+   requires (xemacs-base prog-modes)
+   type regular
+))
+))
+;;;@@@
+;; Package Index file ends here
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.3 (FreeBSD)
+Comment: The XEmacs Development Team
+
+iD4DBQE/s2HKgu3ywdHdhM0RAsIRAJiVkwgHSIPBMZBJlZdA06kOtKV2AKCqhmSb
+/TUbeZRrIemjq9es9VqYJg==
+=n9fY
+-----END PGP SIGNATURE-----
index 2a80629..d5ffb05 100644 (file)
@@ -1,3 +1,7 @@
+2004-02-02  Vin Shelton <acs@xemacs.org>
+
+       * XEmacs 21.4.15 is released
+
 2003-09-03  Vin Shelton <acs@xemacs.org>
 
        * XEmacs 21.4.14 is released
index a90d682..30fbb7b 100644 (file)
@@ -387,11 +387,11 @@ gnuserv: ${srcdir}/gnuserv.c gnuslib.o ${srcdir}/gnuserv.h
 ## mmencode binary is used by tm - but is really part of the metamail package
 ## mmencode.c was merged copy of mmencode.c and codes.c of metamail
 mmencode : ${srcdir}/mmencode.c
-       $(CC) $(cflags) ${srcdir}/mmencode.c -o $@
+       $(CC) $(cflags) ${srcdir}/mmencode.c $(ldflags) -o $@
 
 
 ## The timer utility (timer.c, getdate.y) is not used in XEmacs
 ## because XEmacs provides built-in timer facilities.
 
 make-path: ${srcdir}/make-path.c ../src/config.h
-       $(CC) -Demacs $(cflags) ${srcdir}/make-path.c -o $@
+       $(CC) -Demacs $(cflags) ${srcdir}/make-path.c $(ldflags) -o $@
index b55845f..3d1d5af 100644 (file)
                   :format "%t"
                   :tag-glyph xemacs-logo)
     (widget-insert "\n")
-    (let* ((emacs-short-version (format "%d.%d"
+    (let* ((emacs-short-version (format "%d.%d.%d"
                                        emacs-major-version
-                                       emacs-minor-version))
-          (emacs-about-version (format "version %s; April 2001"
-                                       emacs-short-version)))
+                                       emacs-minor-version
+                                       emacs-patch-level))
+          (emacs-about-version (format "version %s; %s %s"
+                                       emacs-short-version
+                                       (cdr (assoc (substring emacs-build-time
+                                                              4 7)
+                                                   '(("Jan" . "January")
+                                                     ("Feb" . "February")
+                                                     ("Mar" . "March")
+                                                     ("Apr" . "April")
+                                                     ("May" . "May")
+                                                     ("Jun" . "June")
+                                                     ("Jul" . "July")
+                                                     ("Aug" . "August")
+                                                     ("Sep" . "September")
+                                                     ("Oct" . "October")
+                                                     ("Nov" . "November")
+                                                     ("Dec" . "December"))))
+                                       (substring emacs-build-time -4))))
       (widget-insert (about-center emacs-about-version))
       (widget-create 'link :help-echo "What's new in XEmacs"
                     :action 'about-news
@@ -1288,7 +1304,7 @@ Assistant Professor of Biostatistics at the University of Washington
 and the Fred Hutchinson Cancer Research Center.
 
 See ")
-     (about-url-link 'rossini nil "Visit Anothony's home page")
+     (about-url-link 'rossini nil "Visit Anthony's home page")
      (widget-insert ".\n"))
     (slb
      (widget-insert "\
index 1835b7d..3bde4cd 100644 (file)
@@ -1095,7 +1095,7 @@ part of the documentation of internal subroutines."
           (princ object)
           (put-nonduplicable-text-property
            pos (marker-position standard-output) 'face face buf)))
-       (t princ object)))
+       (t (princ object))))
 
 ;; replacement for `prin1' that puts the text in the specified face,
 ;; if possible
@@ -1111,7 +1111,7 @@ part of the documentation of internal subroutines."
           (prin1 object)
           (put-nonduplicable-text-property
            pos (marker-position standard-output) 'face face buf)))
-       (t prin1 object)))
+       (t (prin1 object))))
 
 (defvar help-symbol-regexp
   (let ((sym-char "[+a-zA-Z0-9_:*]")
index 8296b9c..41cfc46 100644 (file)
@@ -1510,7 +1510,7 @@ versions of NAME. Only the suffixes are tried."
                           (format (cdr (car suff)) file)
                         (concat (cdr (car suff)) " < " file))))
          (message "%s..." command)
-         (call-process shell-file-name nil t nil "-c" command)
+         (call-process shell-file-name nil t nil shell-command-switch command)
          (message "")
          (when visit
            (setq buffer-file-name file)
index 705df24..6c2d793 100644 (file)
@@ -406,6 +406,14 @@ its FUNCTION will be called when it expires, and so on."
        (error "itimer named \"%s\" already existing and activated"
               (itimer-name itimer))))
   (let ((inhibit-quit t))
+    (if itimer-timer
+       ;; Modify the itimer timeout value as if it were begun
+       ;; at the last time when the itimer driver was woken up.
+       (set-itimer-value
+        itimer
+        (+ (itimer-value itimer)
+           (itimer-time-difference (current-time)
+                                   itimer-timer-last-wakeup))))
     ;; add the itimer to the global list
     (setq itimer-list (cons itimer itimer-list))
     ;; If the itimer process is scheduled to wake up too late for
index 1c410a3..58473b9 100644 (file)
@@ -128,6 +128,95 @@ which will not be used as accelerators."
             "")))
        (t "")))
 
+(defcustom menu-max-items 25
+  "*Maximum number of items in generated menus.
+If number of entries in such a menu is larger than this value, split menu
+into submenus of nearly equal length (see `menu-submenu-max-items').  If
+nil, never split menu into submenus."
+  :group 'menu
+  :type '(choice (const :tag "no submenus" nil)
+                (integer)))
+
+(defcustom menu-submenu-max-items 20
+  "*Maximum number of items in submenus when splitting menus.
+We split large menus into submenus of this many items, and then balance
+them out as much as possible (otherwise the last submenu may have very few
+items)."
+  :group 'menu
+  :type 'integer)
+
+(defcustom menu-submenu-name-format "%-12.12s ... %.12s"
+  "*Format specification of the submenu name when splitting menus.
+Used by `menu-split-long-menu' if the number of entries in a menu is
+larger than `menu-menu-max-items'.
+This string should contain one %s for the name of the first entry and
+one %s for the name of the last entry in the submenu.
+If the value is a function, it should return the submenu name.  The
+function is be called with two arguments, the names of the first and
+the last entry in the menu."
+  :group 'menu
+  :type '(choice (string :tag "Format string")
+                (function)))
+
+(defun menu-split-long-menu (menu)
+  "Split MENU according to `menu-max-items' and add accelerator specs.
+
+You should normally use the idiom
+
+\(menu-split-long-menu (menu-sort-menu menu))
+
+See also `menu-sort-menu'."
+  (let ((len (length menu)))
+    (if (or (null menu-max-items)
+           (<= len menu-max-items))
+       (submenu-generate-accelerator-spec menu)
+      (let* ((outer (/ (+ len (1- menu-submenu-max-items))
+                      menu-submenu-max-items))
+            (inner (/ (+ len (1- outer)) outer))
+            (result nil))
+       (while menu
+         (let ((sub nil)
+               (from (car menu)))
+           (dotimes (foo (min inner len))
+             (setq sub  (cons (car menu) sub)
+                   menu (cdr menu)))
+           (setq len (- len inner))
+           (let ((to (car sub)))
+             (setq sub (nreverse sub))
+             (setq result
+                   (cons (cons (if (stringp menu-submenu-name-format)
+                                   (format menu-submenu-name-format
+                                           (menu-item-strip-accelerator-spec
+                                            (aref from 0))
+                                           (menu-item-strip-accelerator-spec
+                                            (aref to 0)))
+                                 (funcall menu-submenu-name-format
+                                          (menu-item-strip-accelerator-spec
+                                           (aref from 0))
+                                          (menu-item-strip-accelerator-spec
+                                           (aref to 0))))
+                               (submenu-generate-accelerator-spec sub))
+                         result)))))
+       (submenu-generate-accelerator-spec (nreverse result))))))
+
+(defun menu-sort-menu (menu)
+  "Sort MENU alphabetically.
+
+You should normally use the idiom
+
+\(menu-split-long-menu (menu-sort-menu menu))
+
+See also `menu-split-long-menu'."
+  (sort menu
+       #'(lambda (a b) (string-lessp (aref a 0) (aref b 0)))))
+
+(defun menu-item-search ()
+  "Bring up a search dialog if possible and desired, else do interactive search"
+  (interactive)
+  (if (should-use-dialog-box-p)
+      (make-search-dialog)
+    (isearch-forward)))
+
 (defconst default-menubar
 ; (purecopy-menubar ;purespace is dead
    ;; note backquote.
@@ -201,7 +290,7 @@ which will not be used as accelerators."
       ["Select %_All" mark-whole-buffer]
       ["Select Pa%_ge" mark-page]
       "----"
-      ["%_Find..." make-search-dialog]
+      ["%_Find..." menu-item-search]
       ["R%_eplace..." query-replace]
       ["Replace (Rege%_xp)..." query-replace-regexp]
       ["%_List Matching Lines..." list-matching-lines]
@@ -404,23 +493,26 @@ which will not be used as accelerators."
 
      ("%_Tools"
       ("%_Packages"
-       ("%_Add Download Site"
-        :filter (lambda (&rest junk)
-                  (submenu-generate-accelerator-spec
-                  (package-get-download-menu))))
+       ("%_Set Download Site"
+       ("%_Official Releases"
+        :filter (lambda (&rest junk)
+                  (menu-split-long-menu
+                   (submenu-generate-accelerator-spec
+                    (package-ui-download-menu)))))
+       ("%_Pre-Releases"
+        :filter (lambda (&rest junk)
+                  (menu-split-long-menu
+                   (submenu-generate-accelerator-spec
+                    (package-ui-pre-release-download-menu)))))
+       ("%_Site Releases"
+        :filter (lambda (&rest junk)
+                  (menu-split-long-menu
+                   (submenu-generate-accelerator-spec
+                    (package-ui-site-release-download-menu))))))
+       "--:shadowEtchedIn"
        ["%_Update Package Index" package-get-update-base]
        ["%_List and Install" pui-list-packages]
        ["U%_pdate Installed Packages" package-get-update-all]
-       ;; hack-o-matic, we can't force a load of package-base here
-       ;; since it triggers dialog box interactions which we can't
-       ;; deal with while using a menu
-       ("Using %_Custom"
-       :filter (lambda (&rest junk)
-                 (if package-get-base
-                     (submenu-generate-accelerator-spec
-                      (cdr (custom-menu-create 'packages)))
-                   '("Please load Package Index"))))
-
        ["%_Help" (Info-goto-node "(xemacs)Packages")])
       ("%_Internet"
        ["Read Mail %_1 (VM)..." vm
index 925f6de..efa527a 100644 (file)
@@ -1,6 +1,7 @@
 ;;; package-admin.el --- Installation and Maintenance of XEmacs packages
 
 ;; Copyright (C) 1997 by Free Software Foundation, Inc.
+;; Copyright (C) 2003, Steve Youngs.
 
 ;; Author: SL Baur <steve@xemacs.org>
 ;; Keywords: internal
@@ -114,25 +115,6 @@ the install directory.")
 hook is called *before* the package is deleted. The hook function is passed
 two arguments: the package name, and the install directory.")
 
-;;;###autoload
-(defun package-admin-add-single-file-package (file destdir &optional pkg-dir)
-  "Install a single file Lisp package into XEmacs package hierarchy.
-`file' should be the full path to the lisp file to install.
-`destdir' should be a simple directory name.
-The optional `pkg-dir' can be used to override the default package hierarchy
-\(car \(last late-packages))."
-  (interactive "fLisp File: \nsDestination: ")
-  (when (null pkg-dir)
-    (setq pkg-dir (car (last late-packages))))
-  (let ((destination (concat pkg-dir "/lisp/" destdir))
-       (buf (get-buffer-create package-admin-temp-buffer)))
-    (call-process "add-little-package.sh"
-                 nil
-                 buf
-                 t
-                 ;; rest of command line follows
-                 package-admin-xemacs file destination)))
-
 (defun package-admin-install-function-mswindows (file pkg-dir buffer)
   "Install function for mswindows."
   (let ((default-directory (file-name-as-directory pkg-dir)))
@@ -152,80 +134,193 @@ to BUFFER."
     ;; Don't assume GNU tar.
     (if (shell-command (concat "gunzip -c " filename " | tar xvf -") buffer)
        0
-      1)
-    ))
-
-;  (call-process "add-big-package.sh"
-;              nil
-;              buffer
-;              t
-;              ;; rest of command line follows
-;              package-admin-xemacs file pkg-dir))
-
-(defun package-admin-get-install-dir (package pkg-dir &optional mule-related)
-  "If PKG-DIR is non-nil return that,
-else return the current location of the package if it is already installed
-or return a location appropriate for the package otherwise."
-  (if pkg-dir
+      1)))
+
+;; A few things needed by the following 2 functions.
+(eval-when-compile
+  (require 'packages)
+  (autoload 'package-get-info "package-get")
+  (autoload 'paths-decode-directory-path "find-paths")
+  (defvar package-get-install-to-user-init-directory))
+
+(defun package-admin-find-top-directory (type &optional user-dir)
+  "Return the top level directory for a package.
+
+Argument TYPE is a symbol that determines the type of package we're
+trying to find a directory for.
+
+Optional Argument USER-DIR if non-nil use directories off
+`user-init-directory'.  This overrides everything except
+\"EMACSPACKAGEPATH\".
+
+This function honours the environment variable \"EMACSPACKAGEPATH\"
+and returns directories found there as a priority.  If that variable
+doesn't exist and USER-DIR is nil, check in the normal places.
+
+If we still can't find a suitable directory, return nil.
+
+Possible values for TYPE are:
+
+    std  == For \"standard\" packages that go in '/xemacs-packages/'
+    mule == For \"mule\" packages that go in '/mule-packages/'
+    site == For \"unsupported\" packages that go in '/site-packages/'
+
+Note:  Type \"site\" is not yet fully supported."
+  (let* ((env-value (getenv "EMACSPACKAGEPATH"))
+        top-dir)
+    ;; First, check the environment var.
+    (if env-value
+       (let ((path-list (paths-decode-directory-path env-value 'drop-empties)))
+         (cond ((eq type 'std)
+                (while path-list
+                  (if (equal (substring (car path-list) -16) 
+                             (concat "xemacs-packages" (char-to-string directory-sep-char)))
+                      (setq top-dir (car path-list)))
+                  (setq path-list (cdr path-list))))
+               ((eq type 'mule)
+                (while path-list
+                  (if (equal (substring (car path-list) -14) 
+                             (concat "mule-packages" (char-to-string directory-sep-char)))
+                      (setq top-dir (car path-list)))
+                  (setq path-list (cdr path-list)))))))
+    ;; Wasn't in the environment, try `user-init-directory' if
+    ;; USER-DIR is non-nil.
+    (if (and user-dir
+            (not top-dir))
+       (cond ((eq type 'std)
+              (setq top-dir (file-name-as-directory
+                             (expand-file-name "xemacs-packages" user-init-directory))))
+             ((eq type 'mule)
+              (setq top-dir (file-name-as-directory
+                             (expand-file-name "mule-packages" user-init-directory))))))
+    ;; Finally check the normal places
+    (if (not top-dir)
+       (let ((path-list (nth 1 (packages-find-packages
+                                emacs-roots
+                                (packages-compute-package-locations user-init-directory)))))
+         (cond ((eq type 'std)
+                (while path-list
+                  (if (equal (substring (car path-list) -16) 
+                             (concat "xemacs-packages" (char-to-string directory-sep-char)))
+                      (setq top-dir (car path-list)))
+                  (setq path-list (cdr path-list))))
+               ((eq type 'mule)
+                (while path-list
+                  (if (equal (substring (car path-list) -14) 
+                             (concat "mule-packages" (char-to-string directory-sep-char)))
+                      (setq top-dir (car path-list)))
+                  (setq path-list (cdr path-list)))))))
+    ;; Now return either the directory or nil.
+    top-dir))
+
+(defun package-admin-get-install-dir (package &optional pkg-dir)
+  "Find a suitable installation directory for a package.
+
+Argument PACKAGE is the package to find a installation directory for.
+Optional Argument PKG-DIR, if non-nil is a directory to use for
+installation.
+
+If PKG-DIR is non-nil and writable, return that.  Otherwise check to
+see if the PACKAGE is already installed and return that location, if
+it is writable.  Finally, fall back to the `user-init-directory' if
+all else fails.  As a side effect of installing packages under
+`user-init-directory' these packages become part of `early-packages'."
+  ;; If pkg-dir specified, return that if writable.
+  (if (and pkg-dir
+          (file-writable-p (directory-file-name pkg-dir)))
       pkg-dir
-    (let ((package-feature (intern-soft (concat
-                                        (symbol-name package) "-autoloads")))
-         autoload-dir)
-      (when (and (not (eq package 'unknown))
-                (featurep package-feature)
-                (setq autoload-dir (feature-file package-feature))
-                (setq autoload-dir (file-name-directory autoload-dir))
-                (member autoload-dir (append early-package-load-path late-package-load-path)))
-       ;; Find the corresponding entry in late-package
-       (setq pkg-dir
-             (car-safe (member-if (lambda (h)
-                          (string-match (concat "^" (regexp-quote h))
-                                        autoload-dir))
-                        (append (cdr early-packages) late-packages)))))
-      (if pkg-dir
-         pkg-dir
-       ;; Ok we need to guess
-       (if mule-related
-           (package-admin-get-install-dir 'mule-base nil nil)
-         (if (eq package 'xemacs-base)
-             (car (last late-packages))
-           (package-admin-get-install-dir 'xemacs-base nil nil)))))))
-
-
+    ;; If the user want her packages under ~/.xemacs/, do so.
+    (let ((type (package-get-info package 'category)))
+      (if package-get-install-to-user-init-directory
+         (progn
+           (cond ((equal type "standard")
+                  (setq pkg-dir (package-admin-find-top-directory 'std 'user-dir)))
+                 ((equal type "mule")
+                  (setq pkg-dir (package-admin-find-top-directory 'mule 'user-dir))))
+           pkg-dir)
+       ;; Maybe the package has been installed before, if so, return
+       ;; that directory.
+       (let ((package-feature (intern-soft (concat
+                                            (symbol-name package) "-autoloads")))
+             autoload-dir)
+         (when (and (not (eq package 'unknown))
+                    (featurep package-feature)
+                    (setq autoload-dir (feature-file package-feature))
+                    (setq autoload-dir (file-name-directory autoload-dir))
+                    (member autoload-dir (append early-package-load-path late-package-load-path)))
+           ;; Find the corresponding entry in late-package
+           (setq pkg-dir
+                 (car-safe (member-if (lambda (h)
+                                        (string-match (concat "^" (regexp-quote h))
+                                                      autoload-dir))
+                                      (append (cdr early-packages) late-packages)))))
+         (if (and pkg-dir
+                  (file-writable-p (directory-file-name pkg-dir)))
+             pkg-dir
+           ;; OK, the package hasn't been previously installed so we need
+           ;; to guess where it should go.
+           (cond ((equal type "standard")
+                  (setq pkg-dir (package-admin-find-top-directory 'std)))
+                 ((equal type "mule")
+                  (setq pkg-dir (package-admin-find-top-directory 'mule)))
+                 (t
+                  (error 'invalid-operation
+                         "Invalid package type")))
+           (if (and pkg-dir
+                    (file-writable-p (directory-file-name pkg-dir)))
+               pkg-dir
+             ;; Oh no!  Either we still haven't found a suitable
+             ;; directory, or we can't write to the one we did find.
+             ;; Drop back to the `user-init-directory'.
+             (if (y-or-n-p (format "Directory isn't writable, use %s instead? "
+                                   user-init-directory))
+                 (progn
+                   (cond ((equal type "standard")
+                          (setq pkg-dir (package-admin-find-top-directory 'std 'user-dir)))
+                         ((equal type "mule")
+                          (setq pkg-dir (package-admin-find-top-directory 'mule 'user-dir)))
+                         (t
+                          (error 'invalid-operation
+                                 "Invalid package type")))
+                   ;; Turn on `package-get-install-to-user-init-directory'
+                   ;; so we don't get asked for each package we try to
+                   ;; install in this session.
+                   (setq package-get-install-to-user-init-directory t)
+                   pkg-dir)
+               ;; If we get to here XEmacs can't make up its mind and
+               ;; neither can the user, nothing left to do except barf. :-(
+               (error 'search-failed
+                      (format
+                       "Can't find suitable installation directory for package: %s" 
+                       package))))))))))
 
 (defun package-admin-get-manifest-file (pkg-topdir package)
   "Return the name of the MANIFEST file for package PACKAGE.
 Note that PACKAGE is a symbol, and not a string."
-  (let (dir)
-    (setq dir (expand-file-name "pkginfo" pkg-topdir))
-    (expand-file-name (concat "MANIFEST." (symbol-name package)) dir)
-    ))
+  (let ((dir (file-name-as-directory
+             (expand-file-name "pkginfo" pkg-topdir))))
+    (expand-file-name (concat "MANIFEST." (symbol-name package)) dir)))
 
 (defun package-admin-check-manifest (pkg-outbuf pkg-topdir)
   "Check for a MANIFEST.<package> file in the package distribution.
 If it doesn't exist, create and write one.
 PKG-OUTBUF is the buffer that holds the output from `tar', and PKG-TOPDIR
 is the top-level directory under which the package was installed."
-  (let ( (manifest-buf " *pkg-manifest*")
-        old-case-fold-search regexp package-name pathname regexps)
-    ;; Save and restore the case-fold-search status.
-    ;; We do this in case we have to screw with it (as it the case of
-    ;; case-insensitive filesystems such as MS Windows).
-    (setq old-case-fold-search case-fold-search)
+  (let ((manifest-buf " *pkg-manifest*")
+       (old-case-fold-search case-fold-search)
+       regexp package-name pathname regexps)
     (unwind-protect
        (save-excursion                         ;; Probably redundant.
-         (set-buffer (get-buffer pkg-outbuf))  ;; Probably already the
-                                               ;; current buffer.
+         (set-buffer (get-buffer pkg-outbuf))  ;; Probably already the current buffer.
          (goto-char (point-min))
 
          ;; Make filenames case-insensitive, if necessary
          (if (eq system-type 'windows-nt)
              (setq case-fold-search t))
 
-         ;; We really should compute the regexp.
-         ;; However, directory-sep-char is currently broken, but we need
-         ;; functional code *NOW*.
-         (setq regexp "\\bpkginfo[\\/]MANIFEST\\...*")
+         (setq regexp (concat "\\bpkginfo" 
+                              (char-to-string directory-sep-char)
+                              "MANIFEST\\...*"))
 
          ;; Look for the manifest.
          (if (not (re-search-forward regexp nil t))
@@ -234,22 +329,18 @@ is the top-level directory under which the package was installed."
 
                ;; Yuk.  We weren't passed the package name, and so we have
                ;; to dig for it.  Look for it as the subdirectory name below
-               ;; "lisp", "man", "info", or "etc".
+               ;; "lisp", or "man".
                ;; Here, we don't use a single regexp because we want to search
                ;; the directories for a package name in a particular order.
-               ;; The problem is that packages could have directories like
-               ;; "etc/sounds/" or "etc/photos/" and we don't want to get
-               ;; these confused with the actual package name (although, in
-               ;; the case of "etc/sounds/", it's probably correct).
                (if (catch 'done
-                     (let ( (dirs '("lisp" "info" "man" "etc")) rexp)
+                     (let ((dirs '("lisp" "man")) 
+                           rexp)
                        (while dirs
                          (setq rexp (concat "\\b" (car dirs)
                                             "[\\/]\\([^\\/]+\\)[\//]"))
                          (if (re-search-forward rexp nil t)
                              (throw 'done t))
-                         (setq dirs (cdr dirs))
-                         )))
+                         (setq dirs (cdr dirs)))))
                    (progn
                      (setq package-name (buffer-substring (match-beginning 1)
                                                           (match-end 1)))
@@ -277,22 +368,16 @@ is the top-level directory under which the package was installed."
                                            (buffer-substring
                                             (match-beginning 1)
                                             (match-end 1)))
-                                     (throw 'found-path t)
-                                     ))
-                               (setq regexps (cdr regexps))
-                               )
-                             )
+                                     (throw 'found-path t)))
+                               (setq regexps (cdr regexps))))
                            (progn
                              ;; found a pathname -- add it to the manifest
                              ;; buffer
                              (save-excursion
                                (set-buffer manifest-buf)
                                (goto-char (point-max))
-                               (insert pathname "\n")
-                               )
-                             ))
-                       (forward-line 1)
-                       )
+                               (insert pathname "\n"))))
+                       (forward-line 1))
 
                      ;; Processed all lines.
                      ;; Now, create the file, pkginfo/MANIFEST.<pkgname>
@@ -310,24 +395,18 @@ is the top-level directory under which the package was installed."
                      (save-excursion
                        (set-buffer manifest-buf)
                        ;; Put the files in sorted order
-                       (sort-lines nil (point-min) (point-max))
+                       (if (fboundp 'sort-lines)
+                           (sort-lines nil (point-min) (point-max))
+                         (warn "`xemacs-base' not installed, MANIFEST.%s not sorted"
+                               package-name))
                        ;; Write the file.
                        ;; Note that using `write-region' *BYPASSES* any check
                        ;; to see if XEmacs is currently editing/visiting the
                        ;; file.
-                       (write-region (point-min) (point-max) pathname)
-                       )
-                     (kill-buffer manifest-buf)
-                     )
-                 (progn
-                   ;; We can't determine the package name from an extracted
-                   ;; file in the tar output buffer.
-                   ))
-               ))
-         )
+                       (write-region (point-min) (point-max) pathname))
+                     (kill-buffer manifest-buf))))))
       ;; Restore old case-fold-search status
-      (setq case-fold-search old-case-fold-search))
-    ))
+      (setq case-fold-search old-case-fold-search))))
 
 ;;;###autoload
 (defun package-admin-add-binary-package (file &optional pkg-dir)
@@ -335,8 +414,7 @@ is the top-level directory under which the package was installed."
   (interactive "fPackage tarball: ")
   (let ((buf (get-buffer-create package-admin-temp-buffer))
        (status 1)
-       start err-list
-       )
+       start err-list)
     (setq pkg-dir (package-admin-get-install-dir 'unknown pkg-dir))
     ;; Ensure that the current directory doesn't change
     (save-excursion
@@ -358,17 +436,11 @@ is the top-level directory under which the package was installed."
                (if (re-search-forward (car err-list) nil t)
                    (progn
                      (setq status 1)
-                     (throw 'done nil)
-                     ))
-               (setq err-list (cdr err-list))
-               )
-             )
+                     (throw 'done nil)))
+               (setq err-list (cdr err-list))))
            ;; Make sure that the MANIFEST file exists
-           (package-admin-check-manifest buf pkg-dir)
-           ))
-      )
-    status
-    ))
+           (package-admin-check-manifest buf pkg-dir))))
+    status))
 
 (defun package-admin-rmtree (directory)
   "Delete a directory and all of its contents, recursively.
@@ -403,13 +475,12 @@ This is a feeble attempt at making a portable rmdir."
             (setq package-lispdir (expand-file-name (symbol-name package)
                                                     package-lispdir))
             (file-accessible-directory-p package-lispdir))
-       package-lispdir)
-    ))
+       package-lispdir)))
 
 (defun package-admin-delete-binary-package (package pkg-topdir)
   "Delete a binary installation of PACKAGE below directory PKG-TOPDIR.
 PACKAGE is a symbol, not a string."
-  (let ( (tmpbuf " *pkg-manifest*") manifest-file package-lispdir dirs file)
+  (let (manifest-file package-lispdir dirs file)
     (setq pkg-topdir (package-admin-get-install-dir package pkg-topdir))
     (setq manifest-file (package-admin-get-manifest-file pkg-topdir package))
     (run-hook-with-args 'package-delete-hook package pkg-topdir)
@@ -418,8 +489,7 @@ PACKAGE is a symbol, not a string."
          ;; The manifest file exists!  Use it to delete the old distribution.
          (message "Removing old files for package \"%s\" ..." package)
          (sit-for 0)
-         (setq tmpbuf (get-buffer-create tmpbuf))
-         (with-current-buffer tmpbuf
+         (with-temp-buffer
            (buffer-disable-undo)
            (erase-buffer)
            (insert-file-contents manifest-file)
@@ -451,66 +521,31 @@ PACKAGE is a symbol, not a string."
 
            ;; Delete empty directories.
            (if dirs
-               (let ( (orig-default-directory default-directory)
-                      ;; directory files file
-                      )
-                 ;; Make sure we preserve the existing `default-directory'.
-                 ;; JV, why does this change the default directory? Does it indeed?
-                 (unwind-protect
-                     (progn
-                       ;; Warning: destructive sort!
-                       (setq dirs (nreverse (sort dirs 'string<)))
-;                      ;; For each directory ...
-;                      (while dirs
-;                        (setq directory (file-name-as-directory (car dirs)))
-;                        (setq files (directory-files directory))
-;                        ;; Delete the directory if it's empty.
-;                        (if (catch 'done
-;                              (while files
-;                                (setq file (car files))
-;                                (if (and (not (string= file "."))
-;                                         (not (string= file "..")))
-;                                    (throw 'done nil))
-;                                (setq files (cdr files))
-;                                )
-;                              t)
-;                            (
-;                            (delete-directory directory))
-;                        (setq dirs (cdr dirs))
-;                        )
-                       ;; JV, On all OS's that I know of delete-directory fails on
-                       ;; on non-empty dirs anyway
-                       (mapc
-                          (lambda (dir)
-                            (condition-case ()
-                                (delete-directory dir)))
-                          dirs))
-                   (setq default-directory orig-default-directory)
-                   )))
-           )
-         (kill-buffer tmpbuf)
+               (progn
+                 (mapc
+                  (lambda (dir)
+                    (condition-case ()
+                        (delete-directory dir)))
+                  dirs)))
          ;; Delete the MANIFEST file
          ;; (set-file-modes manifest-file 438) ;; 438 -> #o666
          ;; Note. Packages can have MANIFEST in MANIFEST.
          (condition-case ()
              (delete-file manifest-file)
            (error nil)) ;; Do warning?
-         (message "Removing old files for package \"%s\" ... done" package))
-       ;; The manifest file doesn't exist.  Fallback to just deleting the
-       ;; package-specific lisp directory, if it exists.
-       ;;
-       ;; Delete old lisp directory, if any
-       ;; Gads, this is ugly.  However, we're not supposed to use `concat'
-       ;; in the name of portability.
-       (when (setq package-lispdir (package-admin-get-lispdir pkg-topdir
-                                                            package))
-             (message "Removing old lisp directory \"%s\" ..."
-                      package-lispdir)
-             (sit-for 0)
-             (package-admin-rmtree package-lispdir)
-             (message "Removing old lisp directory \"%s\" ... done"
-                      package-lispdir)
-             ))
+         (message "Removing old files for package \"%s\" ... done" package)))
+      ;; The manifest file doesn't exist.  Fallback to just deleting the
+      ;; package-specific lisp directory, if it exists.
+      ;;
+      ;; Delete old lisp directory, if any
+      ;; Gads, this is ugly.  However, we're not supposed to use `concat'
+      ;; in the name of portability.
+      (setq package-lispdir (package-admin-get-lispdir pkg-topdir package))
+      (when package-lispdir
+       (message "Removing old lisp directory \"%s\" ..." package-lispdir)
+       (sit-for 0)
+       (package-admin-rmtree package-lispdir)
+       (message "Removing old lisp directory \"%s\" ... done" package-lispdir)))
     ;; Delete the package from the database of installed packages.
     (package-delete-name package)))
 
index 5ae5de3..4222b78 100644 (file)
@@ -1,10 +1,13 @@
 ;;; package-get.el --- Retrieve XEmacs package
 
 ;; Copyright (C) 1998 by Pete Ware
+;; Copyright (C) 2002 Ben Wing.
+;; Copyright (C) 2003, Steve Youngs
 
 ;; Author: Pete Ware <ware@cis.ohio-state.edu>
 ;; Heavy-Modifications: Greg Klanderman <greg@alphatech.com>
 ;;                      Jan Vroonhof    <vroonhof@math.ethz.ch>
+;;                      Steve Youngs    <youngs@xemacs.org>
 ;; Keywords: internal
 
 ;; This file is part of XEmacs.
@@ -166,80 +169,82 @@ one version of a package available.")
   :type 'directory
   :group 'package-get)
 
+;;;###autoload
+(defcustom package-get-package-index-file-location 
+  (or (getenv "EMACSPACKAGEPATH")
+      user-init-directory)
+  "*The directory where the package-index file can be found."
+  :type 'directory
+  :group 'package-get)
+
+;;;###autoload
+(defcustom package-get-install-to-user-init-directory nil
+  "*If non-nil install packages under `user-init-directory'."
+  :type 'boolean
+  :group 'package-get)
+
 (define-widget 'host-name 'string
   "A Host name."
   :tag "Host")
 
 (defcustom package-get-remote nil
-  "*List of remote sites to contact for downloading packages.
-List format is '(site-name directory-on-site).  Each site is tried in
-order until the package is found.  As a special case, `site-name' can be
-`nil', in which case `directory-on-site' is treated as a local directory."
+  "*The remote site to contact for downloading packages.
+Format is '(site-name directory-on-site).  As a special case, `site-name'
+can be `nil', in which case `directory-on-site' is treated as a local
+directory."
   :tag "Package repository"
-  :type '(repeat (choice (list :tag "Local" (const :tag "Local" nil) directory )
-                        (list :tag "Remote" host-name directory) ))
+  :type '(set (choice (const :tag "None" nil)
+                     (list :tag "Local" (const :tag "Local" nil) directory)
+                     (list :tag "Remote" host-name directory)))
   :group 'package-get)
 
 ;;;###autoload
 (defcustom package-get-download-sites
   '(
-    ;; North America
-    ("Pre-Releases" "ftp.xemacs.org" "pub/xemacs/beta/experimental/packages")
-    ("xemacs.org" "ftp.xemacs.org" "pub/xemacs/packages")
-    ("ca.xemacs.org (Canada)" "ftp.ca.xemacs.org" "pub/Mirror/xemacs/packages")
-    ("crc.ca (Canada)" "ftp.crc.ca" "pub/packages/editors/xemacs/packages")
-    ("us.xemacs.org (United States)" "ftp.us.xemacs.org" "pub/xemacs/packages")
-    ("ibiblio.org (United States)" "ibiblio.org" "pub/packages/editors/xemacs/packages")
-    ("stealth.net (United States)" "ftp.stealth.net" "pub/mirrors/ftp.xemacs.org/pub/xemacs/packages")
-    ;("uiuc.edu (United States)" "uiarchive.uiuc.edu" "pub/packages/xemacs/packages")
-
-    ;; South America
-    ("br.xemacs.org (Brazil)" "ftp.br.xemacs.org" "pub/xemacs/packages")
-
-    ;; Europe
-    ("at.xemacs.org (Austria)" "ftp.at.xemacs.org" "editors/xemacs/packages")
-    ("be.xemacs.org (Belgium)" "ftp.be.xemacs.org" "xemacs/packages")
-    ("cz.xemacs.org (Czech Republic)" "ftp.cz.xemacs.org" "MIRRORS/ftp.xemacs.org/pub/xemacs/packages")
-    ("dk.xemacs.org (Denmark)" "ftp.dk.xemacs.org" "pub/emacs/xemacs/packages")
-    ("fi.xemacs.org (Finland)" "ftp.fi.xemacs.org" "pub/mirrors/ftp.xemacs.org/pub/tux/xemacs/packages")
-    ("fr.xemacs.org (France)" "ftp.fr.xemacs.org" "pub/xemacs/packages")
-    ("pasteur.fr (France)" "ftp.pasteur.fr" "pub/computing/xemacs/packages")
-    ("de.xemacs.org (Germany)" "ftp.de.xemacs.org" "pub/ftp.xemacs.org/tux/xemacs/packages")
-    ("tu-darmstadt.de (Germany)" "ftp.tu-darmstadt.de" "pub/editors/xemacs/packages")
-    ;("hu.xemacs.org (Hungary)" "ftp.hu.xemacs.org" "pub/packages/xemacs/packages")
-    ("ie.xemacs.org (Ireland)" "ftp.ie.xemacs.org" "mirrors/ftp.xemacs.org/pub/xemacs/packages")
-    ("it.xemacs.org (Italy)" "ftp.it.xemacs.org" "unix/packages/XEMACS/packages")
-    ("no.xemacs.org (Norway)" "ftp.no.xemacs.org" "pub/xemacs/packages")
-    ("pl.xemacs.org (Poland)" "ftp.pl.xemacs.org" "pub/unix/editors/xemacs/packages")
-    ("ru.xemacs.org (Russia)" "ftp.ru.xemacs.org" "pub/xemacs/packages")
-    ("sk.xemacs.org (Slovakia)" "ftp.sk.xemacs.org" "pub/mirrors/xemacs/packages")
-    ("se.xemacs.org (Sweden)" "ftp.se.xemacs.org" "pub/gnu/xemacs/packages")
-    ("ch.xemacs.org (Switzerland)" "ftp.ch.xemacs.org" "mirror/xemacs/packages")
-    ("uk.xemacs.org (United Kingdom)" "ftp.uk.xemacs.org" "sites/ftp.xemacs.org/pub/xemacs/packages")
-
-    ;; Asia
-    ("jp.xemacs.org (Japan)" "ftp.jp.xemacs.org" "pub/GNU/xemacs/packages")
-    ("aist.go.jp (Japan)" "ring.aist.go.jp" "pub/text/xemacs/packages")
-    ("asahi-net.or.jp (Japan)" "ring.asahi-net.or.jp" "pub/text/xemacs/packages")
-    ("dti.ad.jp (Japan)" "ftp.dti.ad.jp" "pub/unix/editor/xemacs/packages")
-    ("jaist.ac.jp (Japan)" "ftp.jaist.ac.jp" "pub/GNU/xemacs/packages")
-    ("nucba.ac.jp (Japan)" "mirror.nucba.ac.jp" "mirror/xemacs/packages")
-    ("sut.ac.jp (Japan)" "sunsite.sut.ac.jp" "pub/archives/packages/xemacs/packages")
-    ("kr.xemacs.org (Korea)" "ftp.kr.xemacs.org" "pub/tools/emacs/xemacs/packages")
-    ;("tw.xemacs.org (Taiwan)" "ftp.tw.xemacs.org" "Editors/xemacs/packages")
-
-    ;; Africa
-    ("za.xemacs.org (South Africa)" "ftp.za.xemacs.org" "mirrorsites/ftp.xemacs.org/packages")
-
-    ;; Middle East
-    ("sa.xemacs.org (Saudi Arabia)" "ftp.sa.xemacs.org" "pub/mirrors/ftp.xemacs.org/xemacs/packages")
-
-    ;; Australia
-    ("au.xemacs.org (Australia)" "ftp.au.xemacs.org" "pub/xemacs/packages")
-    ("aarnet.edu.au (Australia)" "mirror.aarnet.edu.au" "pub/xemacs/packages")
-
-    ;; Oceania
-    ("nz.xemacs.org (New Zealand)" "ftp.nz.xemacs.org" "mirror/ftp.xemacs.org/packages")
+    ;; Main XEmacs Site (ftp.xemacs.org)
+    ("US (Main XEmacs Site)"
+     "ftp.xemacs.org" "pub/xemacs/packages")
+    ;; In alphabetical order of Country, our mirrors...
+    ("Australia (aarnet.edu.au)" "mirror.aarnet.edu.au" "pub/xemacs/packages")
+    ("Australia (au.xemacs.org)" "ftp.au.xemacs.org" "pub/xemacs/packages")
+    ("Austria (at.xemacs.org)" "ftp.at.xemacs.org" "editors/xemacs/packages")
+    ("Belgium (be.xemacs.org)" "ftp.be.xemacs.org" "xemacs/packages")
+    ("Brazil (br.xemacs.org)" "ftp.br.xemacs.org" "pub/xemacs/packages")
+    ("Canada (ca.xemacs.org)" "ftp.ca.xemacs.org" "pub/Mirror/xemacs/packages")
+    ("Canada (crc.ca)" "ftp.crc.ca" "pub/packages/editors/xemacs/packages")
+    ("Canada (ualberta.ca)" "sunsite.ualberta.ca" "pub/Mirror/xemacs/packages")
+    ("Czech Republic (cz.xemacs.org)" "ftp.cz.xemacs.org" "MIRRORS/ftp.xemacs.org/pub/xemacs/packages")
+    ("Denmark (dk.xemacs.org)" "ftp.dk.xemacs.org" "pub/emacs/xemacs/packages")
+    ("Finland (fi.xemacs.org)" "ftp.fi.xemacs.org" "pub/mirrors/ftp.xemacs.org/pub/tux/xemacs/packages")
+    ("France (fr.xemacs.org)" "ftp.fr.xemacs.org" "pub/xemacs/packages")
+    ("France (mirror.cict.fr)" "mirror.cict.fr" "xemacs/packages")
+    ("France (pasteur.fr)" "ftp.pasteur.fr" "pub/computing/xemacs/packages")
+    ("Germany (de.xemacs.org)" "ftp.de.xemacs.org" "pub/ftp.xemacs.org/tux/xemacs/packages")
+    ("Germany (tu-darmstadt.de)" "ftp.tu-darmstadt.de" "pub/editors/xemacs/packages")
+    ("Ireland (ie.xemacs.org)" "ftp.ie.xemacs.org" "mirrors/ftp.xemacs.org/pub/xemacs/packages")
+    ("Italy (it.xemacs.org)" "ftp.it.xemacs.org" "unix/packages/XEMACS/packages")
+    ("Japan (aist.go.jp)" "ring.aist.go.jp" "pub/text/xemacs/packages")
+    ("Japan (asahi-net.or.jp)" "ring.asahi-net.or.jp" "pub/text/xemacs/packages")
+    ("Japan (dti.ad.jp)" "ftp.dti.ad.jp" "pub/unix/editor/xemacs/packages")
+    ("Japan (jaist.ac.jp)" "ftp.jaist.ac.jp" "pub/GNU/xemacs/packages")
+    ("Japan (jp.xemacs.org)" "ftp.jp.xemacs.org" "pub/GNU/xemacs/packages")
+    ("Japan (nucba.ac.jp)" "mirror.nucba.ac.jp" "mirror/xemacs/packages")
+    ("Japan (sut.ac.jp)" "sunsite.sut.ac.jp" "pub/archives/packages/xemacs/packages")
+    ("Korea (kr.xemacs.org)" "ftp.kr.xemacs.org" "pub/tools/emacs/xemacs/packages")
+    ("New Zealand (nz.xemacs.org)" "ftp.nz.xemacs.org" "mirror/ftp.xemacs.org/packages")
+    ("Norway (no.xemacs.org)" "ftp.no.xemacs.org" "pub/xemacs/packages")
+    ("Poland (pl.xemacs.org)" "ftp.pl.xemacs.org" "pub/unix/editors/xemacs/packages")
+    ("Russia (ru.xemacs.org)" "ftp.ru.xemacs.org" "pub/xemacs/packages")
+    ("Slovakia (sk.xemacs.org)" "ftp.sk.xemacs.org" "pub/mirrors/xemacs/packages")
+    ("South Africa (za.xemacs.org)" "ftp.za.xemacs.org" "mirrorsites/ftp.xemacs.org/packages")
+    ("Sweden (se.xemacs.org)" "ftp.se.xemacs.org" "pub/gnu/xemacs/packages")
+    ("Switzerland (ch.xemacs.org)" "ftp.ch.xemacs.org" "mirror/xemacs/packages")
+    ("UK (uk.xemacs.org)" "ftp.uk.xemacs.org" "sites/ftp.xemacs.org/pub/xemacs/packages")
+    ("US (ibiblio.org)" "ibiblio.org" "pub/packages/editors/xemacs/packages")
+    ("US (stealth.net)" "ftp.stealth.net" "pub/mirrors/ftp.xemacs.org/pub/xemacs/packages")
+    ("US (unc.edu)" "metalab.unc.edu" "pub/packages/editors/xemacs/packages")
+    ("US (us.xemacs.org)" "ftp.us.xemacs.org" "pub/xemacs/packages")
+    ("US (utk.edu)" "ftp.sunsite.utk.edu" "pub/xemacs/packages")
     )
   "*List of remote sites available for downloading packages.
 List format is '(site-description site-name directory-on-site).
@@ -252,6 +257,113 @@ variable actually used to specify package download sites."
   :type '(repeat (list (string :tag "Name") host-name directory))
   :group 'package-get)
 
+;;;###autoload
+(defcustom package-get-pre-release-download-sites
+  '(
+    ;; Main XEmacs Site (ftp.xemacs.org)
+    ("Pre-Releases (Main XEmacs Site)" "ftp.xemacs.org"
+     "pub/xemacs/beta/experimental/packages")
+    ;; In alphabetical order of Country, our mirrors...
+    ("Australia Pre-Releases (aarnet.edu.au)" "mirror.aarnet.edu.au"
+     "pub/xemacs/beta/experimental/packages")
+    ("Australia Pre-Releases (au.xemacs.org)" "ftp.au.xemacs.org"
+     "pub/xemacs/beta/experimental/packages")
+    ("Austria Pre-Releases (at.xemacs.org)" "ftp.at.xemacs.org"
+     "editors/xemacs/beta/experimentsl/packages")
+    ("Brazil Pre-Releases (br.xemacs.org)" "ftp.br.xemacs.org"
+     "pub/xemacs/xemacs-21.5/experimental/packages")
+    ("Canada Pre-Releases (ca.xemacs.org)" "ftp.ca.xemacs.org"
+     "pub/Mirror/xemacs/beta/experimental/packages")
+    ("Canada Pre-Releases (crc.ca)" "ftp.crc.ca"
+     "pub/packages/editors/xemacs/beta/experimental/packages")
+    ("Canada Pre-Releases (ualberta.ca)" "sunsite.ualberta.ca"
+     "pub/Mirror/xemacs/beta/experimental/packages")
+    ("Czech Republic Pre-Releases (cz.xemacs.org)" "ftp.cz.xemacs.org"
+     "MIRRORS/ftp.xemacs.org/pub/xemacs/xemacs-21.5/experimental/packages")
+    ("Denmark Pre-Releases (dk.xemacs.org)" "ftp.dk.xemacs.org"
+     "pub/emacs/xemacs/beta/experimental/packages")
+    ("Finland Pre-Releases (fi.xemacs.org)" "ftp.fi.xemacs.org"
+     "pub/mirrors/ftp.xemacs.org/pub/tux/xemacs/beta/experimental/packages")
+    ("France Pre-Releases (fr.xemacs.org)" "ftp.fr.xemacs.org"
+     "pub/xemacs/beta/experimental/packages")
+    ("France Pre-Releases (mirror.cict.fr)" "mirror.cict.fr"
+     "xemacs/beta/experimental/packages")
+    ("France Pre-Releases (pasteur.fr)" "ftp.pasteur.fr"
+     "pub/computing/xemacs/beta/experimental/packages")
+    ("Germany Pre-Releases (de.xemacs.org)" "ftp.de.xemacs.org"
+     "pub/ftp.xemacs.org/tux/xemacs/beta/experimental/packages")
+    ("Germany Pre-Releases (tu-darmstadt.de)" "ftp.tu-darmstadt.de"
+     "pub/editors/xemacs/beta/experimental/packages")
+    ("Ireland Pre-Releases (ie.xemacs.org)" "ftp.ie.xemacs.org"
+     "mirrors/ftp.xemacs.org/pub/xemacs/beta/experimental/packages")
+    ("Italy Pre-Releases (it.xemacs.org)" "ftp.it.xemacs.org"
+     "unix/packages/XEMACS/beta/experimental/packages")
+    ("Japan Pre-Releases (aist.go.jp)" "ring.aist.go.jp"
+     "pub/text/xemacs/beta/experimental/packages")
+    ("Japan Pre-Releases (asahi-net.or.jp)" "ring.asahi-net.or.jp"
+     "pub/text/xemacs/beta/experimental/packages")
+    ("Japan Pre-Releases (dti.ad.jp)" "ftp.dti.ad.jp"
+     "pub/unix/editor/xemacs/beta/experimental/packages")
+    ("Japan Pre-Releases (jaist.ac.jp)" "ftp.jaist.ac.jp"
+     "pub/GNU/xemacs/beta/experimental/packages")
+    ("Japan Pre-Releases (jp.xemacs.org)" "ftp.jp.xemacs.org"
+     "pub/GNU/xemacs/beta/experimental/packages")
+    ("Japan Pre-Releases (sut.ac.jp)" "sunsite.sut.ac.jp"
+     "pub/archives/packages/xemacs/xemacs-21.5/experimental/packages")
+    ("New Zealand Pre-Releases (nz.xemacs.org)" "ftp.nz.xemacs.org" "mirror/ftp.xemacs.org/packages")
+    ("Norway Pre-Releases (no.xemacs.org)" "ftp.no.xemacs.org"
+     "pub/xemacs/beta/experimental/packages")
+    ("Poland Pre-Releases (pl.xemacs.org)" "ftp.pl.xemacs.org"
+     "pub/unix/editors/xemacs/beta/experimental/packages")
+    ("Russia Pre-Releases (ru.xemacs.org)" "ftp.ru.xemacs.org"
+     "pub/xemacs/beta/experimental/packages")
+    ("Saudi Arabia Pre-Releases (sa.xemacs.org)" "ftp.sa.xemacs.org"
+     "pub/mirrors/ftp.xemacs.org/xemacs/xemacs-21.5/experimental/packages")
+    ("Slovakia Pre-Releases (sk.xemacs.org)" "ftp.sk.xemacs.org"
+     "pub/mirrors/xemacs/beta/experimental/packages")
+    ("South Africa Pre-Releases (za.xemacs.org)" "ftp.za.xemacs.org"
+     "mirrorsites/ftp.xemacs.org/beta/experimental/packages")
+    ("Sweden Pre-Releases (se.xemacs.org)" "ftp.se.xemacs.org"
+     "pub/gnu/xemacs/beta/experimental/packages")
+    ("Switzerland Pre-Releases (ch.xemacs.org)" "ftp.ch.xemacs.org"
+     "mirror/xemacs/beta/experimental/packages")
+    ("UK Pre-Releases (uk.xemacs.org)" "ftp.uk.xemacs.org"
+     "sites/ftp.xemacs.org/pub/xemacs/beta/experimental/packages")
+    ("US Pre-Releases (ibiblio.org)" "ibiblio.org"
+     "pub/packages/editors/xemacs/beta/experimental/packages")
+    ("US Pre-Releases (stealth.net)" "ftp.stealth.net"
+     "pub/mirrors/ftp.xemacs.org/pub/xemacs/beta/experimental/packages")
+    ("US Pre-Releases (unc.edu)" "metalab.unc.edu"
+     "pub/packages/editors/xemacs/beta/experimental/packages")
+    ("US Pre-Releases (us.xemacs.org)" "ftp.us.xemacs.org"
+     "pub/xemacs/beta/experimental/packages")
+    ("US Pre-Releases (utk.edu)" "ftp.sunsite.utk.edu"
+     "pub/xemacs/beta/experimental/packages"))
+  "*List of remote sites available for downloading \"Pre-Release\" packages.
+List format is '(site-description site-name directory-on-site).
+SITE-DESCRIPTION is a textual description of the site.  SITE-NAME
+is the internet address of the download site.  DIRECTORY-ON-SITE
+is the directory on the site in which packages may be found.
+This variable is used to initialize `package-get-remote', the
+variable actually used to specify package download sites."
+  :tag "Pre-Release Package download sites"
+  :type '(repeat (list (string :tag "Name") host-name directory))
+  :group 'package-get)
+
+;;;###autoload
+(defcustom package-get-site-release-download-sites
+  nil
+  "*List of remote sites available for downloading \"Site Release\" packages.
+List format is '(site-description site-name directory-on-site).
+SITE-DESCRIPTION is a textual description of the site.  SITE-NAME
+is the internet address of the download site.  DIRECTORY-ON-SITE
+is the directory on the site in which packages may be found.
+This variable is used to initialize `package-get-remote', the
+variable actually used to specify package download sites."
+  :tag "Site Release Package download sites"
+  :type '(repeat (list (string :tag "Name") host-name directory))
+  :group 'package-get)
+
 (defcustom package-get-remove-copy t
   "*After copying and installing a package, if this is t, then remove the
 copy.  Otherwise, keep it around."
@@ -261,50 +373,68 @@ copy.  Otherwise, keep it around."
 ;; #### it may make sense for this to be a list of names.
 ;; #### also, should we rename "*base*" to "*index*" or "*db*"?
 ;;      "base" is a pretty poor name.
-(defcustom package-get-base-filename "package-index.LATEST.pgp"
+(defcustom package-get-base-filename "package-index.LATEST.gpg"
   "*Name of the default package-get database file.
 This may either be a relative path, in which case it is interpreted
 with respect to `package-get-remote', or an absolute path."
   :type 'file
   :group 'package-get)
 
-(defvar package-get-user-index-filename
-  (paths-construct-path (list user-init-directory package-get-base-filename))
-  "Name for the user-specific location of the package-get database file.")
-
 (defcustom package-get-always-update nil
   "*If Non-nil always make sure we are using the latest package index (base).
 Otherwise respect the `force-current' argument of `package-get-require-base'."
   :type 'boolean
   :group 'package-get)
 
-(defcustom package-get-require-signed-base-updates nil
-  "*If set to a non-nil value, require explicit user confirmation for updates
-to the package-get database which cannot have their signature verified via PGP.
-When nil, updates which are not PGP signed are allowed without confirmation."
+(defun package-get-pgp-available-p ()
+  "Checks the availability of Mailcrypt and PGP executable.
+
+Returns t if both are found, nil otherwise.  As a side effect, set
+`mc-default-scheme' dependent on the PGP executable found."
+  (let (result)
+    (when (featurep 'mailcrypt-autoloads)
+      (autoload 'mc-setversion "mc-setversion"))
+    (when (fboundp 'mc-setversion)
+      (cond ((locate-file "gpg" exec-path
+                         '("" ".btm" ".bat" ".cmd" ".exe" ".com")
+                         'executable)
+            (mc-setversion "gpg")
+            (setq result t))
+           ((locate-file "pgpe" exec-path
+                         '("" ".btm" ".bat" ".cmd" ".exe" ".com")
+                         'executable)
+            (mc-setversion "5.0")
+            (setq result t))
+           ((locate-file "pgp" exec-path
+                         '("" ".btm" ".bat" ".cmd" ".exe" ".com")
+                         'executable)
+            (mc-setversion "2.6")
+            (setq result t))))
+    (if result
+       result
+      nil)))
+
+(defcustom package-get-require-signed-base-updates (package-get-pgp-available-p)
+  "*If non-nil, try to verify the package index database via PGP.
+
+If nil, no PGP verification is done.  If the package index database
+entries are not PGP signed and this variable is non-nil, require user
+confirmation to continue with the package-get procedure.
+
+The default for this variable is the return value of
+`package-get-pgp-available-p', non-nil if both the \"Mailcrypt\"
+package and a suitable PGP executable are available, nil otherwise."
   :type 'boolean
   :group 'package-get)
 
-(defvar package-get-was-current nil
-  "Non-nil we did our best to fetch a current database.")
+(defvar package-entries-are-signed nil
+  "Non-nil when the package index file has been PGP signed.")
 
+(defvar package-get-continue-update-base nil
+  "Non-nil update the index even if it hasn't been signed.")
 
-;Shouldn't this be in package-ui?
-;;;###autoload
-(defun package-get-download-menu ()
-  "Build the `Add Download Site' menu."
-  (mapcar (lambda (site)
-           (vector (car site)
-                   `(if (member (quote ,(cdr site))
-                                package-get-remote)
-                        (setq package-get-remote
-                              (delete (quote ,(cdr site))
-                                      package-get-remote))
-                      (package-ui-add-site (quote ,(cdr site))))
-                   :style 'toggle
-                   :selected `(member (quote ,(cdr site))
-                                      package-get-remote)))
-         package-get-download-sites))
+(defvar package-get-was-current nil
+  "Non-nil we did our best to fetch a current database.")
 
 ;;;###autoload
 (defun package-get-require-base (&optional force-current)
@@ -323,7 +453,8 @@ and remote access is likely in the near future."
     (package-get-update-base nil force-current))
   (if (or (not (boundp 'package-get-base))
          (not package-get-base))
-      (error "Package-get database not loaded")
+      (error 'void-variable
+            "Package-get database not loaded")
     (setq package-get-was-current force-current)))
 
 (defconst package-get-pgp-signed-begin-line "^-----BEGIN PGP SIGNED MESSAGE-----"
@@ -339,8 +470,7 @@ and remote access is likely in the near future."
   (let ((existing (assq (car entry) package-get-base)))
     (if existing
         (setcdr existing (cdr entry))
-      (setq package-get-base (cons entry package-get-base))
-      (package-get-custom-add-entry (car entry) (car (cdr entry))))))
+      (setq package-get-base (cons entry package-get-base)))))
 
 (defun package-get-locate-file (file &optional nil-if-not-found no-remote)
   "Locate an existing FILE with respect to `package-get-remote'.
@@ -350,27 +480,48 @@ if FILE can not be located.
 If NO-REMOTE is non-nil never search remote locations."
   (if (file-name-absolute-p file)
       file
-    (let ((entries package-get-remote)
+    (let ((site package-get-remote)
           (expanded nil))
-      (while entries
-       (unless (and no-remote (caar entries))
-         (let ((expn (package-get-remote-filename (car entries) file)))
+      (when site
+       (unless (and no-remote (caar (list site)))
+         (let ((expn (package-get-remote-filename (car (list site)) file)))
            (if (and expn (file-exists-p expn))
-               (setq entries  nil
-                     expanded expn))))
-        (setq entries (cdr entries)))
+               (setq site nil
+                     expanded expn)))))
       (or expanded
           (and (not nil-if-not-found)
                file)))))
 
 (defun package-get-locate-index-file (no-remote)
-  "Locate the package-get index file.  Do not return remote paths if NO-REMOTE
-is non-nil."
+  "Locate the package-get index file.  
+
+Do not return remote paths if NO-REMOTE is non-nil.  If the index
+file doesn't exist in `package-get-package-index-file-location', ask
+the user if one should be created using the index file in core as a
+template."
   (or (package-get-locate-file package-get-base-filename t no-remote)
-      (if (file-exists-p package-get-user-index-filename)
-         package-get-user-index-filename)
-      (locate-data-file package-get-base-filename)
-      (error "Can't locate a package index file.")))
+      (if (file-exists-p (expand-file-name package-get-base-filename
+                                          package-get-package-index-file-location))
+         (expand-file-name package-get-base-filename
+                           package-get-package-index-file-location)
+       (if (y-or-n-p (format "No index file, shall I create one in %s? "
+                             package-get-package-index-file-location))
+           (progn
+             (save-excursion
+               (set-buffer 
+                (find-file-noselect (expand-file-name
+                                     package-get-base-filename
+                                     package-get-package-index-file-location)))
+               (let ((coding-system-for-write 'binary))
+                 (erase-buffer)
+                 (insert-file-contents-literally
+                  (locate-data-file package-get-base-filename))
+                 (save-buffer (current-buffer))
+                 (kill-buffer (current-buffer))))
+             (expand-file-name package-get-base-filename
+                               package-get-package-index-file-location))
+         (error 'search-failed
+                "Can't locate a package index file.")))))
 
 (defun package-get-maybe-save-index (filename)
   "Offer to save the current buffer as the local package index file,
@@ -382,13 +533,18 @@ if different."
                          (with-temp-buffer
                            (insert-file-contents-literally location)
                            (md5 (current-buffer)))))
-       (unless (and location (file-writable-p location))
-         (setq location package-get-user-index-filename))
+       (when (not (file-writable-p location))
+         (if (y-or-n-p (format "Sorry, %s is read-only, can I use %s? "
+                               location user-init-directory))
+             (setq location (expand-file-name
+                             package-get-base-filename
+                             package-get-package-index-file-location))
+           (error 'file-error
+                  (format "%s is read-only" location))))
        (when (y-or-n-p (concat "Update package index in " location "? "))
          (let ((coding-system-for-write 'binary))
            (write-file location)))))))
 
-
 ;;;###autoload
 (defun package-get-update-base (&optional db-file force-current)
   "Update the package-get database file with entries from DB-FILE.
@@ -404,9 +560,11 @@ Unless FORCE-CURRENT is non-nil never try to update the database."
                                       (package-get-locate-index-file
                                         (not force-current)))))
   (if (not (file-exists-p db-file))
-      (error "Package-get database file `%s' does not exist" db-file))
+      (error 'file-error
+            (format "Package-get database file `%s' does not exist" db-file)))
   (if (not (file-readable-p db-file))
-      (error "Package-get database file `%s' not readable" db-file))
+      (error 'file-error
+            (format "Package-get database file `%s' not readable" db-file)))
   (let ((buf (get-buffer-create "*package database*")))
     (unwind-protect
         (save-excursion
@@ -425,49 +583,45 @@ BUFFER defaults to the current buffer.  This command can be
 used interactively, for example from a mail or news buffer."
   (interactive)
   (setq buf (or buf (current-buffer)))
-  (let (content-beg content-end beg end)
+  (let (content-beg content-end)
     (save-excursion
       (set-buffer buf)
       (goto-char (point-min))
       (setq content-beg (point))
       (setq content-end (save-excursion (goto-char (point-max)) (point)))
       (when (re-search-forward package-get-pgp-signed-begin-line nil t)
-        (setq beg (match-beginning 0))
         (setq content-beg (match-end 0)))
       (when (re-search-forward package-get-pgp-signature-begin-line nil t)
-        (setq content-end (match-beginning 0)))
-      (when (re-search-forward package-get-pgp-signature-end-line nil t)
-        (setq end (point)))
-      (if (not (and content-beg content-end beg end))
-          (or (not package-get-require-signed-base-updates)
-              (yes-or-no-p "Package-get entries not PGP signed, continue? ")
-              (error "Package-get database not updated")))
-      (if (and content-beg content-end beg end)
-          (if (not (condition-case nil
-                       (or (fboundp 'mc-pgp-verify-region)
-                           (load-library "mc-pgp")
-                           (fboundp 'mc-pgp-verify-region))
-                     (error nil)))
-              (or (not package-get-require-signed-base-updates)
-                  (yes-or-no-p
-                   "No mailcrypt; can't verify package-get DB signature, continue? ")
-                  (error "Package-get database not updated"))))
-      (if (and beg end
-               (fboundp 'mc-pgp-verify-region)
-               (or (not
-                    (condition-case err
-                        (mc-pgp-verify-region beg end)
-                      (file-error
-                       (and (string-match "No such file" (nth 2 err))
-                            (or (not package-get-require-signed-base-updates)
-                                (yes-or-no-p
-                                 (concat "Can't find PGP, continue without "
-                                         "package-get DB verification? ")))))
-                      (t nil)))))
-          (error "Package-get PGP signature failed to verify"))
+        (setq content-end (match-beginning 0))
+       (setq package-entries-are-signed t))
+      (re-search-forward package-get-pgp-signature-end-line nil t)
+      (setq package-get-continue-update-base t)
+      ;; This is a little overkill because the default value of
+      ;; `package-get-require-signed-base-updates' is the return of
+      ;; `package-get-pgp-available-p', but we have to allow for
+      ;; someone explicitly setting
+      ;; `package-get-require-signed-base-updates' to t. --SY
+      (when (and package-get-require-signed-base-updates
+                (package-get-pgp-available-p))
+       (if package-entries-are-signed
+           (let (good-sig)
+             (setq package-get-continue-update-base nil)
+             (autoload 'mc-verify "mc-toplev")
+             (when (mc-verify)
+               (setq good-sig t))
+             (if good-sig
+                 (setq package-get-continue-update-base t)
+               (error 'process-error 
+                      "GnuPG error.  Package database not updated")))
+         (if (yes-or-no-p
+              "Package Index is not PGP signed.  Continue anyway? ")
+             (setq package-get-continue-update-base t)
+           (setq package-get-continue-update-base nil)
+           (warn "Package database not updated"))))
       ;; ToDo: We should call package-get-maybe-save-index on the region
-      (package-get-update-base-entries content-beg content-end)
-      (message "Updated package-get database"))))
+      (when package-get-continue-update-base
+       (package-get-update-base-entries content-beg content-end)
+       (message "Updated package database")))))
 
 (defun package-get-update-base-entries (start end)
   "Update the package-get database with the entries found between
@@ -475,7 +629,8 @@ START and END in the current buffer."
   (save-excursion
     (goto-char start)
     (if (not (re-search-forward "^(package-get-update-base-entry" nil t))
-        (error "Buffer does not contain package-get database entries"))
+        (error 'search-failed
+              "Buffer does not contain package-get database entries"))
     (beginning-of-line)
     (let ((count 0))
       (while (and (< (point) end)
@@ -484,7 +639,8 @@ START and END in the current buffer."
         (let ((entry (read (current-buffer))))
           (if (or (not (consp entry))
                   (not (eq (car entry) 'package-get-update-base-entry)))
-              (error "Invalid package-get database entry found"))
+              (error 'syntax-error
+                    "Invalid package-get database entry found"))
           (package-get-update-base-entry
            (car (cdr (car (cdr entry)))))
           (setq count (1+ count))))
@@ -547,12 +703,10 @@ The return value is suitable for direct passing to `interactive'."
                   'version))
            (while (string=
                    (setq version (read-string "Version: " default-version))
-                   "")
-             )
+                   ""))
            (if package-symbol
                (list package-symbol version)
-             (list package version))
-           )
+             (list package version)))
        (if package-symbol
            (list package-symbol)
          (list package))))))
@@ -574,8 +728,7 @@ This is just an interactive wrapper for `package-admin-delete-binary-package'."
   (catch 'exit
     (mapcar (lambda (pkg)
              (if (not (package-get (car pkg) nil 'never))
-                 (throw 'exit nil)             ;; Bail out if error detected
-                 ))
+                 (throw 'exit nil)))           ;; Bail out if error detected
            packages-package-list))
   (package-net-update-installed-db))
 
@@ -595,8 +748,7 @@ Returns nil upon error."
                                                     package))
         (this-package (package-get-info-version
                        the-package version))
-        (this-requires (package-get-info-prop this-package 'requires))
-        )
+        (this-requires (package-get-info-prop this-package 'requires)))
     (catch 'exit
       (setq version (package-get-info-prop this-package 'version))
       (unless (package-get-installedp package version)
@@ -619,18 +771,16 @@ Returns nil upon error."
                   (reqd-version (cadr reqd-package))
                   (reqd-name (car reqd-package)))
              (if (null reqd-name)
-                 (error "Unable to find a provider for %s"
-                        (car this-requires)))
+                 (error 'search-failed
+                        (format "Unable to find a provider for %s"
+                                (car this-requires))))
              (if (not (setq fetched-packages
                             (package-get-all reqd-name reqd-version
                                              fetched-packages
                                               install-dir)))
-                 (throw 'exit nil)))
-         )
-       (setq this-requires (cdr this-requires)))
-      )
-    fetched-packages
-    ))
+                 (throw 'exit nil))))
+       (setq this-requires (cdr this-requires))))
+    fetched-packages))
 
 ;;;###autoload
 (defun package-get-dependencies (packages)
@@ -654,7 +804,8 @@ required by PACKAGES."
                                   (let* ((reqd-package (package-get-package-provider reqd))
                                          (reqd-name    (car reqd-package)))
                                     (if (null reqd-name)
-                                        (error "Unable to find a provider for %s" reqd))
+                                        (error 'search-failed
+                                              (format "Unable to find a provider for %s" reqd)))
                                     reqd-name))
                               this-requires)
                              dependencies))
@@ -692,20 +843,136 @@ Return `t' upon complete success, `nil' if any errors occurred."
        (progn
          ;; Add lispdir to load-path if it doesn't already exist.
          ;; NOTE: this does not take symlinks, etc., into account.
-         (if (let ( (dirs load-path) )
+         (if (let ((dirs load-path))
                (catch 'done
                  (while dirs
                    (if (string-equal (car dirs) lispdir)
                        (throw 'done nil))
-                   (setq dirs (cdr dirs))
-                   )
+                   (setq dirs (cdr dirs)))
                  t))
              (setq load-path (cons lispdir load-path)))
          (if (not (package-get-load-package-file lispdir "auto-autoloads"))
              (package-get-load-package-file lispdir "_pkg"))
          t)
-      nil)
-    ))
+      nil)))
+
+;;;###autoload
+(defun package-get-info (package information &optional arg remote)
+  "Get information about a package.
+
+Quite similar to `package-get-info-prop', but can retrieve a lot more
+information.
+
+Argument PACKAGE is the name of an XEmacs package (a symbol).  It must
+be a valid package, ie, a member of `package-get-base'.
+
+Argument INFORMATION is a symbol that can be any one of:
+
+   standards-version     Package system version (not used).
+   version               Version of the XEmacs package.
+   author-version        The upstream version of the package.
+   date                  The date the package was last modified.
+   build-date            The date the package was last built.
+   maintainer            The maintainer of the package.
+   distribution          Will always be \"xemacs\" (not used).
+   priority              \"low\", \"medium\", or \"high\" (not used).
+   category              Either \"standard\", \"mule\", or \"unsupported\"..
+   dump                  Is the package dumped (not used).
+   description           A description of the package.
+   filename              The filename of the binary tarball of the package.
+   md5sum                The md5sum of filename.
+   size                  The size in bytes of filename.
+   provides              A list of symbols that this package provides.
+   requires              A list of packages that this package requires.
+   type                  Can be either \"regular\" or \"single-file\".
+
+If optional argument ARG is non-nil insert INFORMATION into current
+buffer at point.  This is very useful for doing things like inserting
+a maintainer's email address into a mail buffer.
+
+If optional argument REMOTE is non-nil use a package list from a
+remote site.  For this to work `package-get-remote' must be non-nil.
+
+If this function is called interactively it will display INFORMATION
+in the minibuffer."
+  (interactive "SPackage: \nSInfo: \nP")
+    (if remote
+       (package-get-require-base t)
+      (package-get-require-base nil))
+    (let ((all-pkgs package-get-base)
+         info)
+      (loop until (equal package (caar all-pkgs))
+       do (setq all-pkgs (cdr all-pkgs))
+       do (if (not all-pkgs)
+              (error 'invalid-argument
+                     (format "%s is not a valid package" package))))
+      (setq info (plist-get (cadar all-pkgs) information))
+      (if (interactive-p)
+         (if arg
+             (insert (format "%s" info))
+           (if (package-get-key package :version)
+               (message "%s" info)
+             (message "%s (Package: %s is not installed)" info package)))
+       (if arg
+           (insert (format "%s" info))
+         info))))
+
+;;;###autoload
+(defun package-get-list-packages-where (item field &optional arg)
+  "Return a list of packages that fulfill certain criteria.
+
+Argument ITEM, a symbol, is what you want to check for.  ITEM must be a
+symbol even when it doesn't make sense to be a symbol \(think, searching
+maintainers, descriptions, etc\).  The function will convert the symbol
+to a string if a string is what is needed.  The downside to this is that
+ITEM can only ever be a single word.
+
+Argument FIELD, a symbol, is the field to check in.  You can specify
+any one of:
+
+      Field            Sane or Allowable Content
+    description          any single word
+    category             `standard' or `mule'
+    maintainer           any single word
+    build-date           yyyy-mm-dd
+    date                 yyyy-mm-dd
+    type                 `regular' or `single'
+    requires             any package name
+    provides             any symbol
+    priority             `low', `medium', or `high'
+
+Optional Argument ARG, a prefix arg, insert output at point in the
+current buffer."
+  (interactive "SList packages that have (item): \nSin their (field): \nP")
+  (package-get-require-base nil)
+  (let ((pkgs package-get-base)
+       (strings '(description category maintainer build-date date))
+       (symbols '(type requires provides priority))
+       results)
+    (cond ((memq field strings)
+          (setq item (symbol-name item))
+          (while pkgs
+            (when (string-match item (package-get-info (caar pkgs) field))
+              (setq results (push (caar pkgs) results)))
+            (setq pkgs (cdr pkgs))))
+         ((memq field symbols)
+          (if (or (eq field 'type)
+                  (eq field 'priority))
+              (while pkgs
+                (when (eq item (package-get-info (caar pkgs) field))
+                  (setq results (push (caar pkgs) results)))
+                (setq pkgs (cdr pkgs)))
+            (while pkgs
+              (when (memq item (package-get-info (caar pkgs) field))
+                (setq results (push (caar pkgs) results)))
+              (setq pkgs (cdr pkgs)))))
+         (t 
+          (error 'wrong-type-argument field)))
+    (if (interactive-p)
+       (if arg
+           (insert (format "%s" results))
+         (message "%s" results)))
+    results))
 
 ;;;###autoload
 (defun package-get (package &optional version conflict install-dir)
@@ -720,8 +987,7 @@ fetched packages should be installed.
 
 The value of `package-get-base' is used to determine what files should
 be retrieved.  The value of `package-get-remote' is used to determine
-where a package should be retrieved from.  The sites are tried in
-order so one is better off listing easily reached sites first.
+where a package should be retrieved from.
 
 Once the package is retrieved, its md5 checksum is computed.  If that
 sum does not match that stored in `package-get-base' for this version
@@ -738,23 +1004,27 @@ successfully installed but errors occurred during initialization, or
                                          package) version))
          (latest (package-get-info-prop this-package 'version))
          (installed (package-get-key package :version))
-        (this-requires (package-get-info-prop this-package 'requires))
         (found nil)
-        (search-dirs package-get-remote)
+        (search-dir package-get-remote)
         (base-filename (package-get-info-prop this-package 'filename))
         (package-status t)
         filenames full-package-filename)
+    (if (and (equal (package-get-info package 'category) "mule")
+            (not (featurep 'mule)))
+       (error 'invalid-state 
+              "Mule packages can't be installed with a non-Mule XEmacs"))
     (if (null this-package)
        (if package-get-remote
-           (error "Couldn't find package %s with version %s"
-                  package version)
-         (error "No download sites or local package locations specified.")))
+           (error 'search-failed
+                  (format "Couldn't find package %s with version %s"
+                          package version))
+         (error 'syntax-error
+                "No download site or local package location specified.")))
     (if (null base-filename)
-       (error "No filename associated with package %s, version %s"
-              package version))
-    (setq install-dir
-         (package-admin-get-install-dir package install-dir
-               (or (eq package 'mule-base) (memq 'mule-base this-requires))))
+       (error 'syntax-error
+              (format "No filename associated with package %s, version %s"
+                      package version)))
+    (setq install-dir (package-admin-get-install-dir package install-dir))
 
     ;; If they asked for the latest using version=nil, don't get an older
     ;; version than we already have.
@@ -767,9 +1037,9 @@ successfully installed but errors occurred during initialization, or
                  latest))
             (if (not (null version))
                 (warn "Installing %s package version %s, you had a newer version %s"
-                      package latest installed)
+                 package latest installed)
               (warn "Skipping %s package, you have a newer version %s"
-                    package installed)
+               package installed)
               (throw 'skip-update t))))
 
     ;; Contrive a list of possible package filenames.
@@ -787,15 +1057,12 @@ successfully installed but errors occurred during initialization, or
       ;; and copy it into the staging directory.  Then validate
       ;; the checksum.  Finally, install the package.
       (catch 'done
-       (let (search-filenames current-dir-entry host dir current-filename
-                              dest-filename)
+       (let (search-filenames host dir current-filename dest-filename)
          ;; In each search directory ...
-         (while search-dirs
-           (setq current-dir-entry (car search-dirs)
-                 host (car current-dir-entry)
-                 dir (car (cdr current-dir-entry))
-                 search-filenames filenames
-                 )
+         (when search-dir
+           (setq host (car search-dir)
+                 dir (car (cdr search-dir))
+                 search-filenames filenames)
 
            ;; Look for one of the possible package filenames ...
            (while search-filenames
@@ -803,56 +1070,45 @@ successfully installed but errors occurred during initialization, or
                    dest-filename (package-get-staging-dir current-filename))
              (cond
               ;; No host means look on the current system.
-              ( (null host)
-                (setq full-package-filename
-                      (substitute-in-file-name
-                       (expand-file-name current-filename
-                                         (file-name-as-directory dir))))
-                )
+              ((null host)
+               (setq full-package-filename
+                     (substitute-in-file-name
+                      (expand-file-name current-filename
+                                        (file-name-as-directory dir)))))
 
               ;; If it's already on the disk locally, and the size is
-              ;; greater than zero ...
-              ( (and (file-exists-p dest-filename)
-                     (let (attrs)
-                       ;; file-attributes could return -1 for LARGE files,
-                       ;; but, hopefully, packages won't be that large.
-                       (and (setq attrs (file-attributes dest-filename))
-                            (> (nth 7 attrs) 0))))
-                (setq full-package-filename dest-filename)
-                )
+              ;; correct
+              ((and (file-exists-p dest-filename)
+                    (eq (nth 7 (file-attributes dest-filename))
+                        (package-get-info package 'size)))
+                (setq full-package-filename dest-filename))
 
               ;; If the file exists on the remote system ...
-              ( (file-exists-p (package-get-remote-filename
-                                current-dir-entry current-filename))
-                ;; Get it
-                (setq full-package-filename dest-filename)
-                (message "Retrieving package `%s' ..."
-                         current-filename)
-                (sit-for 0)
-                (copy-file (package-get-remote-filename current-dir-entry
-                                                        current-filename)
-                           full-package-filename t)
-                )
-              )
+              ((file-exists-p (package-get-remote-filename
+                               search-dir current-filename))
+               ;; Get it
+               (setq full-package-filename dest-filename)
+               (message "Retrieving package `%s' ..."
+                        current-filename)
+               (sit-for 0)
+               (copy-file (package-get-remote-filename search-dir
+                                                       current-filename)
+                          full-package-filename t)))
 
              ;; If we found it, we're done.
              (if (and full-package-filename
                       (file-exists-p full-package-filename))
                  (throw 'done nil))
              ;; Didn't find it.  Try the next possible filename.
-             (setq search-filenames (cdr search-filenames))
-             )
-           ;; Try looking in the next possible directory ...
-           (setq search-dirs (cdr search-dirs))
-           )
-         ))
+             (setq search-filenames (cdr search-filenames))))))
 
       (if (or (not full-package-filename)
              (not (file-exists-p full-package-filename)))
          (if package-get-remote
-             (error "Unable to find file %s" base-filename)
-           (error
-            "No download sites or local package locations specified.")))
+             (error 'search-failed
+                    (format "Unable to find file %s" base-filename))
+           (error 'syntax-error
+                  "No download sites or local package locations specified.")))
       ;; Validate the md5 checksum
       ;; Doing it with XEmacs removes the need for an external md5 program
       (message "Validating checksum for `%s'..." package) (sit-for 0)
@@ -861,7 +1117,11 @@ successfully installed but errors occurred during initialization, or
        (if (not (string= (md5 (current-buffer))
                          (package-get-info-prop this-package
                                                 'md5sum)))
-           (error "Package %s does not match md5 checksum" base-filename)))
+           (progn
+             (delete-file full-package-filename)
+             (error 'process-error
+                    (format "Package %s does not match md5 checksum %s has been deleted"
+                            base-filename full-package-filename)))))
 
       (package-admin-delete-binary-package package install-dir)
 
@@ -879,30 +1139,25 @@ successfully installed but errors occurred during initialization, or
                  (progn
                    (run-hook-with-args 'package-install-hook package install-dir)
                    (message "Added package `%s'" package)
-                   (sit-for 0)
-                   )
+                   (sit-for 0))
                (progn
                  ;; display message only if there isn't already one.
                  (if (not (current-message))
                      (progn
                        (message "Added package `%s' (errors occurred)"
                                 package)
-                       (sit-for 0)
-                       ))
+                       (sit-for 0)))
                  (if package-status
-                     (setq package-status 'errors))
-                 ))
-             )
+                     (setq package-status 'errors)))))
          (message "Installation of package %s failed." base-filename)
          (sit-for 0)
          (switch-to-buffer package-admin-temp-buffer)
-         (setq package-status nil)
-         ))
+         (delete-file full-package-filename)
+         (setq package-status nil)))
       (setq found t))
     (if (and found package-get-remove-copy)
        (delete-file full-package-filename))
-    package-status
-    )))
+    package-status)))
 
 (defun package-get-info-find-package (which name)
   "Look in WHICH for the package called NAME and return all the info
@@ -953,13 +1208,6 @@ md5sum            - computed md5 checksum"
    (package-get-info-version
     (package-get-info-find-package package-list package) version) property))
 
-(defun package-get-set-version-prop (package-list package version
-                                                 property value)
-  "A utility to make it easier to add a VALUE for a specific PROPERTY
-  in this VERSION of a specific PACKAGE kept in the PACKAGE-LIST.
-Returns the modified PACKAGE-LIST.  Any missing fields are created."
-  )
-
 (defun package-get-staging-dir (filename)
   "Return a good place to stash FILENAME when it is retrieved.
 Use `package-get-dir' for directory to store stuff.
@@ -997,7 +1245,6 @@ If (car search) is nil, (cadr search is interpreted as  a local directory).
                (concat dir "/"))
              filename))))
 
-
 (defun package-get-installedp (package version)
   "Determine if PACKAGE with VERSION has already been installed.
 I'm not sure if I want to do this by searching directories or checking
@@ -1006,7 +1253,9 @@ some built in variables.  For now, use packages-package-list."
   (equal (plist-get
          (package-get-info-find-package packages-package-list
                                         package) ':version)
-        (if (floatp version) version (string-to-number version))))
+        (if (floatp version)
+            version
+          (string-to-number version))))
 
 ;;;###autoload
 (defun package-get-package-provider (sym &optional force-current)
@@ -1044,26 +1293,6 @@ lead to Emacs accessing remote sites."
         (message "No appropriate package found")))
     found))
 
-;;
-;; customize interfaces.
-;; The group is in this file so that custom loads includes this file.
-;;
-(defgroup packages nil
-  "Configure XEmacs packages."
-  :group 'emacs)
-
-;;;###autoload
-(defun package-get-custom ()
-  "Fetch and install the latest versions of all customized packages."
-  (interactive)
-  (package-get-require-base t)
-  (mapcar (lambda (pkg)
-           (if (eval (intern (concat (symbol-name (car pkg)) "-package")))
-               (package-get (car pkg) nil))
-           t)
-         package-get-base)
-  (package-net-update-installed-db))
-
 (defun package-get-ever-installed-p (pkg &optional notused)
   (string-match "-package$" (symbol-name pkg))
   (custom-initialize-set
@@ -1073,26 +1302,5 @@ lead to Emacs accessing remote sites."
        (intern (substring (symbol-name pkg) 0 (match-beginning 0))))
        t)))
 
-(defvar package-get-custom-groups nil
-  "List of package-get-custom groups")
-
-(defun package-get-custom-add-entry (package props)
-  (let* ((category (plist-get props 'category))
-         (group (intern (concat category "-packages")))
-         (custom-var (intern (concat (symbol-name package) "-package")))
-         (description (plist-get props 'description)))
-    (when (not (memq group package-get-custom-groups))
-      (setq package-get-custom-groups (cons group
-                                            package-get-custom-groups))
-      (eval `(defgroup ,group nil
-               ,(concat category " package group")
-               :group 'packages)))
-    (eval `(defcustom ,custom-var nil
-             ,description
-             :group ',group
-             :initialize 'package-get-ever-installed-p
-             :type 'boolean))))
-
-
 (provide 'package-get)
 ;;; package-get.el ends here
index 6226664..7428f49 100644 (file)
@@ -94,7 +94,8 @@ author-version -- The original Author's version #.
 maintainer -- The package maintainer.
 category -- The build category."
   (unless noninteractive
-    (error "`batch-update-package-info' is to be used only with -batch"))
+    (error 'invalid-operation
+          "`batch-update-package-info' is to be used only with -batch"))
   (let ((version (nth 0 command-line-args-left))
        (filename (nth 1 command-line-args-left))
        (requires (nth 2 command-line-args-left))
index c0b93ad..60b31d0 100644 (file)
@@ -80,11 +80,10 @@ Set this to `nil' to use the `default' face."
    :group 'pui
    :type 'face)
    
-
-
-
-(defvar pui-info-buffer "*Packages*"
-  "Buffer to use for displaying package information.")
+(defcustom pui-info-buffer "*Packages*"
+  "*Buffer to use for displaying package information."
+  :group 'pui
+  :type 'string)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; End of user-changeable variables.
@@ -105,6 +104,7 @@ Set this to `nil' to use the `default' face."
     (define-key m "q" 'pui-quit)
     (define-key m "g" 'pui-list-packages)
     (define-key m "i" 'pui-display-info)
+    (define-key m "m" 'pui-display-maintainer)
     (define-key m "?" 'describe-mode)
     (define-key m "v" 'pui-toggle-verbosity-redisplay)
     (define-key m "d" 'pui-toggle-package-delete-key)
@@ -137,46 +137,11 @@ Set this to `nil' to use the `default' face."
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Configuration routines
 
-(defun pui-directory-exists (dir)
-  "Check to see if DIR exists in `package-get-remote'."
-  (let (found)
-    (mapcar #'(lambda (item)
-               (if (and (null (car item))
-                        (string-equal (file-name-as-directory (car (cdr item)))
-                                      (file-name-as-directory dir)))
-                   (setq found t)))
-           package-get-remote)
-    found
-    ))
-
-(defun pui-package-dir-list (buffer)
-  "In BUFFER, format the list of package binary paths."
-  (let ( (count 1) paths sys dir)
-    (set-buffer buffer)
-    (buffer-disable-undo buffer)
-    (erase-buffer buffer)
-    (insert "Existing package binary paths:\n\n")
-    (setq paths package-get-remote)
-    (while paths
-      (setq sys (car (car paths))
-           dir (car (cdr (car paths))))
-      (insert (format "%2s. " count))
-      (if (null sys)
-         (insert dir)
-       (insert sys ":" dir))
-      (insert "\n")
-      (setq count (1+ count))
-      (setq paths (cdr paths))
-      )
-    (insert "\nThese are the places that will be searched for package binaries.\n")
-    (goto-char (point-min))
-    ))
-
 ;;;###autoload
 (defun package-ui-add-site (site)
   "Add site to package-get-remote and possibly offer to update package list."
   (let ((had-none (null package-get-remote)))
-    (push site package-get-remote)    
+    (setq package-get-remote site)    
     (when (and had-none package-get-was-current
               (y-or-n-p "Update Package list?"))
       (setq package-get-was-current nil)
@@ -185,39 +150,64 @@ Set this to `nil' to use the `default' face."
          (save-window-excursion
            (pui-list-packages))))
     (set-menubar-dirty-flag)))
-    
 
 ;;;###autoload
-(defun pui-add-install-directory (dir)
-  "Add a new package binary directory to the head of `package-get-remote'.
+(defun package-ui-download-menu ()
+  "Build the `Add Download Site' menu."
+  (mapcar (lambda (site)
+           (vector (car site)
+                   `(if (equal package-get-remote (quote ,(cdr site)))
+                     (setq package-get-remote nil)
+                     (package-ui-add-site (quote ,(cdr site))))
+                   ;; I've used radio buttons so that only a single
+                   ;; site can be selected, but they are in fact
+                   ;; toggles.  SY.
+                   :style 'radio
+                   :selected `(equal package-get-remote (quote ,(cdr site)))))
+         package-get-download-sites))
+
+;;;###autoload
+(defun package-ui-pre-release-download-menu ()
+  "Build the 'Pre-Release Download Sites' menu."
+  (mapcar (lambda (site)
+           (vector (car site)
+                   `(if (equal package-get-remote (quote ,(cdr site)))
+                     (setq package-get-remote nil)
+                     (package-ui-add-site (quote ,(cdr site))))
+                   ;; I've used radio buttons so that only a single
+                   ;; site can be selected, but they are in fact
+                   ;; toggles.  SY.
+                   :style 'radio
+                   :selected `(equal package-get-remote (quote ,(cdr site)))))
+         package-get-pre-release-download-sites))
+
+;;;###autoload
+(defun package-ui-site-release-download-menu ()
+  "Build the 'Site Release Download Sites' menu."
+  (mapcar (lambda (site)
+           (vector (car site)
+                   `(if (equal package-get-remote (quote ,(cdr site)))
+                     (setq package-get-remote nil)
+                     (package-ui-add-site (quote ,(cdr site))))
+                   ;; I've used radio buttons so that only a single
+                   ;; site can be selected, but they are in fact
+                   ;; toggles.  SY.
+                   :style 'radio
+                   :selected `(equal package-get-remote (quote ,(cdr site)))))
+         package-get-site-release-download-sites))
+
+;;;###autoload
+(defun pui-set-local-package-get-directory ()
+  "Set a new package binary directory in `package-get-remote'.
 Note that no provision is made for saving any changes made by this function.
 It exists mainly as a convenience for one-time package installations from
 disk."
-  (interactive (let ( (tmpbuf (get-buffer-create
-                              "*Existing Package Binary Paths*"))
-                     dir)
-                (save-window-excursion
-                  (save-excursion
-                    (unwind-protect
-                        (progn
-                          (pui-package-dir-list tmpbuf)
-                          (display-buffer tmpbuf)
-                          (setq dir (read-directory-name
-                                     "New package binary directory to add? "
-                                     nil nil t))
-                          )
-                      (kill-buffer tmpbuf)
-                      )))
-                (list dir)
-                ))
-  (progn
-    (if (not (pui-directory-exists dir))
-       (progn
-         (setq package-get-remote (cons (list nil dir) package-get-remote))
-         (message "Package directory \"%s\" added." dir)
-         )
-      (message "Directory \"%s\" already exists in `package-get-remote'." dir))
-    ))
+  (interactive) 
+  (let ((dir (read-directory-name
+             "New package binary directory to add? "
+             nil nil t)))
+    (setq package-get-remote (list nil dir))
+    (message "Package directory \"%s\" added." dir)))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Package list/installer routines
@@ -238,8 +228,7 @@ disk."
                     version))
               (list " " pui-up-to-date-package-face)
             (list "*" pui-outdated-package-face)))
-      (list "-" pui-uninstalled-package-face))
-    ))
+      (list "-" pui-uninstalled-package-face))))
 
 (defun pui-update-package-display (extent &optional pkg-sym version)
   "Update the package status for EXTENT.
@@ -272,9 +261,7 @@ and whether or not it is up-to-date."
       (goto-char (extent-start-position extent))
       (delete-char 1)
       (insert sym-char)
-      (set-buffer-modified-p nil)
-      )
-    ))
+      (set-buffer-modified-p nil))))
 
 (defun pui-toggle-package (extent)
   (let (pkg-sym)
@@ -286,8 +273,7 @@ and whether or not it is up-to-date."
            (cons pkg-sym pui-selected-packages))
       (setq pui-deleted-packages
            (delete pkg-sym pui-deleted-packages)))
-    (pui-update-package-display extent pkg-sym)
-    ))
+    (pui-update-package-display extent pkg-sym)))
 
 (defun pui-toggle-package-key ()
   "Select/unselect package for installation, using the keyboard."
@@ -296,10 +282,9 @@ and whether or not it is up-to-date."
     (if (setq extent (extent-at (point) (current-buffer) 'pui))
        (progn
          (pui-toggle-package extent)
-         (forward-line 1)
-         )
-      (error "No package under cursor!"))
-    ))
+         (forward-line 1))
+      (error 'invalid-operation
+            "No package under cursor!"))))
 
 (defun pui-toggle-package-delete (extent)
   (let (pkg-sym)
@@ -311,8 +296,7 @@ and whether or not it is up-to-date."
            (cons pkg-sym pui-deleted-packages))
       (setq pui-selected-packages
            (delete pkg-sym pui-selected-packages)))
-    (pui-update-package-display extent pkg-sym)
-    ))
+    (pui-update-package-display extent pkg-sym)))
   
 
 (defun pui-toggle-package-delete-key ()
@@ -322,10 +306,9 @@ and whether or not it is up-to-date."
     (if (setq extent (extent-at (point) (current-buffer) 'pui))
        (progn
          (pui-toggle-package-delete extent)
-         (forward-line 1)
-         )
-      (error "No package under cursor!"))
-    ))
+         (forward-line 1))
+      (error 'invalid-operation
+            "No package under cursor!"))))
 
 (defun pui-current-package ()
   (let ((extent (extent-at (point) (current-buffer) 'pui)))
@@ -335,25 +318,23 @@ and whether or not it is up-to-date."
 (defun pui-toggle-package-event (event)
   "Select/unselect package for installation, using the mouse."
   (interactive "e")
-  (let* ( (ep (event-point event))
-          (buffer (window-buffer (event-window event)))
-          (extent (extent-at ep buffer 'pui-package))
-          )
-    (pui-toggle-package extent)
-    ))
+  (let* ((ep (event-point event))
+        (buffer (window-buffer (event-window event)))
+        (extent (extent-at ep buffer 'pui-package)))
+    (pui-toggle-package extent)))
 
 (defun pui-toggle-verbosity-redisplay ()
   "Toggle verbose package info."
   (interactive)
   (progn
     (setq pui-list-verbose (not pui-list-verbose))
-    (pui-list-packages)
-    ))
+    (pui-list-packages)))
 
 (defun pui-install-selected-packages ()
   "Install selected packages."
   (interactive)
-  (let ( (tmpbuf "*Packages-To-Remove*") do-delete)
+  (let ((tmpbuf "*Packages-To-Remove*") 
+       do-delete)
     (when pui-deleted-packages
       (save-window-excursion
        (with-output-to-temp-buffer tmpbuf
@@ -362,8 +343,7 @@ and whether or not it is up-to-date."
                                    #'string<)
                                   :activate-callback nil
                                   :help-string "Packages selected for removal:\n"
-                                  :completion-string t
-                                  ))
+                                  :completion-string t))
        (setq tmpbuf (get-buffer-create tmpbuf))
        (display-buffer tmpbuf)
        (setq do-delete (yes-or-no-p "Remove these packages? "))
@@ -372,11 +352,12 @@ and whether or not it is up-to-date."
        (message "Deleting selected packages ...") (sit-for 0)
        (mapcar (lambda (pkg)
                  (package-admin-delete-binary-package
-                  pkg (package-admin-get-install-dir pkg nil)))
+                  pkg (package-admin-get-install-dir pkg)))
                (nreverse pui-deleted-packages))
        (message "Packages deleted"))))
         
-  (let ( (tmpbuf "*Packages-To-Install*") do-install)
+  (let ((tmpbuf "*Packages-To-Install*") 
+       do-install)
     (if pui-selected-packages
        (progn
          ;; Don't change window config when asking the user if he really
@@ -390,21 +371,18 @@ and whether or not it is up-to-date."
               (sort (mapcar #'symbol-name pui-selected-packages) #'string<)
               :activate-callback nil
               :help-string "Packages selected for installation:\n"
-              :completion-string t
-              ))
+              :completion-string t))
            (setq tmpbuf (get-buffer-create tmpbuf))
            (display-buffer tmpbuf)
            (setq do-install (y-or-n-p "Install these packages? "))
-           (kill-buffer tmpbuf)
-           )
+           (kill-buffer tmpbuf))
          (if do-install
              (progn
                (save-excursion
                  ;; Clear old temp buffer history
                  (set-buffer (get-buffer-create package-admin-temp-buffer))
                  (buffer-disable-undo package-admin-temp-buffer)
-                 (erase-buffer package-admin-temp-buffer)
-                 )
+                 (erase-buffer package-admin-temp-buffer))
                (message "Installing selected packages ...") (sit-for 0)
                (if (catch 'done
                      (mapcar (lambda (pkg)
@@ -415,18 +393,14 @@ and whether or not it is up-to-date."
                      t)
                    (progn
                      (pui-list-packages)
-                     (message "Packages installed")
-                     ))
-               )
-           (clear-message)
-           )
-         )
+                     (message "Packages installed"))))
+           (clear-message)))
       (if pui-deleted-packages
          (pui-list-packages)
-       (error "No packages have been selected!")))
+       (error 'invalid-operation
+              "No packages have been selected!")))
     ;; sync with windows type systems
-    (package-net-update-installed-db)
-    ))
+    (package-net-update-installed-db)))
 
 (defun pui-add-required-packages ()
   "Select packages required by those already selected for installation."
@@ -482,20 +456,21 @@ and whether or not it is up-to-date."
                              nil nil nil nil nil 'pui)
                 (message "added dependencies"))
              (clear-message)))
-      (error "No packages have been selected!"))))
+      (error 'invalid-operation
+            "No packages have been selected!"))))
 
 (defun pui-help-echo (extent &optional force-update)
   "Display additional package info in the modeline.
 EXTENT determines the package to display (the package information is
 attached to the extent as properties)."
-  (let (pkg-sym info inst-ver auth-ver date maintainer balloon req)
+  (let (pkg-sym info inst-ver inst-auth-ver auth-ver date maintainer balloon req)
     (if (or force-update (not (current-message))
-           (string-match ".*: .*: " (current-message))
-           )
+           (string-match ".*: .*: " (current-message)))
        (progn
          (setq pkg-sym (extent-property extent 'pui-package)
                info (extent-property extent 'pui-info)
                inst-ver (package-get-key pkg-sym :version)
+               inst-auth-ver (package-get-key pkg-sym :author-version)
                auth-ver (package-get-info-prop info 'author-version)
                date (package-get-info-prop info 'date)
                maintainer (package-get-info-prop info 'maintainer)
@@ -507,22 +482,16 @@ attached to the extent as properties)."
                (setq balloon (format "
 Package Information:  [For package: \"%s\"]
 ================
-Installed Version : %.2f
-Author Version : %s
-Maintainer: %s
-Released: %s
+Installed Upstream Ver: %s  Available Upstream Ver: %s
+Maintainer : %s
+Released : %s
 Required Packages : %s\n\n"
-                                     pkg-sym inst-ver auth-ver maintainer 
+                                     pkg-sym inst-auth-ver auth-ver maintainer 
                                      date req))
                (set-extent-property extent 'balloon-help balloon)))
-         (if pui-list-verbose
-             (format 
-              "Inst V: %.2f Auth V: %s Maint: %s" 
-              inst-ver auth-ver maintainer)
-           (format "%.2f : %s : %s"
-                   inst-ver auth-ver maintainer))
-         ))
-    ))
+         (format 
+          "Installed upstream ver: %s  Available upstream ver: %s" 
+          inst-auth-ver auth-ver)))))
 
 (defun pui-display-info (&optional no-error event)
   "Display additional package info in the modeline.
@@ -535,8 +504,25 @@ Designed to be called interactively (from a keypress)."
          (message (pui-help-echo extent t))
        (if no-error
            (clear-message nil)
-         (error "No package under cursor!")))
-      )))
+         (error 'invalid-operation
+                "No package under cursor!"))))))
+
+(defun pui-display-maintainer (&optional no-error event)
+  "Display a package's maintainer in the minibuffer."
+  (interactive)
+  (let (extent pkg-sym info maintainer)
+    (save-excursion
+      (beginning-of-line)
+      (if (setq extent         (extent-at (point) (current-buffer) 'pui))
+         (progn
+           (setq pkg-sym (extent-property extent 'pui-package)
+                 info (extent-property extent 'pui-info)
+                 maintainer (package-get-info-prop info 'maintainer))
+           (message (format "Maintainer: %s" maintainer)))
+       (if no-error
+           (clear-message nil)
+         (error 'invalid-operation
+                "No package under cursor!"))))))
 
 (defvar pui-menu
   '("Packages"
@@ -580,11 +566,13 @@ Useful keys:
   `\\[pui-add-required-packages]' to add any packages required by those selected.
   `\\[pui-install-selected-packages]' to install/delete selected packages.
   `\\[pui-display-info]' to display additional information about the package in the modeline.
+  `\\[pui-display-maintainer]' to display the package's maintainer in the minibuffer
   `\\[pui-list-packages]' to refresh the package list.
   `\\[pui-toggle-verbosity-redisplay]' to toggle between a verbose and non-verbose display.
   `\\[pui-quit]' to kill this buffer.
 "
-  (error "You cannot enter this mode directly. Use `pui-list-packages'"))
+  (error 'invalid-operation
+        "You cannot enter this mode directly. Use `pui-list-packages'"))
 
 (put 'list-packages-mode 'mode-class 'special)
 
@@ -597,9 +585,9 @@ which are out-of-date (a newer version is available).  The user can then
 select packages for installation via the keyboard or mouse."
   (interactive)
   (package-get-require-base t)
-  (let ( (outbuf (get-buffer-create pui-info-buffer))
-        (sep-string "===============================================================================\n")
-        start )
+  (let ((outbuf (get-buffer-create pui-info-buffer))
+       (sep-string "===============================================================================\n")
+       start)
     (message "Creating package list ...") (sit-for 0)
     (set-buffer outbuf)
     (setq buffer-read-only nil)
@@ -643,27 +631,21 @@ Warning: No download sites specified.  Package index may be out of date.
               (progn
                 (setq current-vers (package-get-key pkg-sym :version))
                 (cond
-                 ( (not current-vers)
-                   (setq current-vers "-----") )
-                 ( (stringp current-vers)
-                   (setq current-vers
-                         (format "%.2f"
-                                 (string-to-number current-vers))) )
-                 ( (numberp current-vers)
-                   (setq current-vers (format "%.2f" current-vers)) )
-                 )
+                 ((not current-vers)
+                  (setq current-vers "-----"))
+                 ((stringp current-vers)
+                  (setq current-vers
+                        (format "%.2f"
+                                (string-to-number current-vers))))
+                 ((numberp current-vers)
+                  (setq current-vers (format "%.2f" current-vers))))
                 (insert
                  (format "%s %-15s %-5.2f  %-5s  %s\n"
                          (car disp) pkg-sym 
                          (if (stringp version)
                              (string-to-number version)
                            version)
-                         current-vers desc))
-                ;; (insert
-                ;;  (format "\t\t  %-12s  %s\n"
-                ;;    (package-get-info-prop info 'author-version)
-                ;;    (package-get-info-prop info 'date)))
-                )
+                         current-vers desc)))
             (insert (format "%s %-15s %-5s %s\n"
                             (car disp)
                             pkg-sym version desc)))
@@ -681,8 +663,7 @@ Warning: No download sites specified.  Package index may be out of date.
           (set-extent-property extent 'pui-package pkg-sym)
           (set-extent-property extent 'pui-info info)
           (set-extent-property extent 'help-echo 'pui-help-echo)
-          (set-extent-property extent 'keymap pui-package-keymap)
-          ))
+          (set-extent-property extent 'keymap pui-package-keymap)))
      (sort (copy-sequence package-get-base)
           #'(lambda (a b)
               (string< (symbol-name (car a))
@@ -700,9 +681,7 @@ Warning: No download sites specified.  Package index may be out of date.
       (set-buffer-menubar current-menubar)
       (add-submenu '() pui-menu)
       (setq mode-popup-menu pui-menu))
-    (clear-message)
-    ;;    (message (substitute-command-keys "Press `\\[pui-help]' for help."))
-    ))
+    (clear-message)))
 
 ;;;###autoload
 (defalias 'list-packages 'pui-list-packages)
index e0b8fdb..86f1782 100644 (file)
@@ -1,6 +1,7 @@
 ;;; packages.el --- Low level support for XEmacs packages
 
 ;; Copyright (C) 1997 Free Software Foundation, Inc.
+;; Copyright (C) 2002, 2003 Ben Wing.
 
 ;; Author: Steven L Baur <steve@xemacs.org>
 ;; Maintainer: Steven L Baur <steve@xemacs.org>
@@ -96,6 +97,10 @@ show up in.
 The third component is a thunk which, if it returns NIL, causes
 the directory to be ignored."
   (list
+   (list (paths-construct-path (list user-init-directory "site-packages"))
+        'early #'(lambda () t))
+   (list (paths-construct-path (list user-init-directory "infodock-packages"))
+        'early #'(lambda () (featurep 'infodock)))
    (list (paths-construct-path (list user-init-directory "mule-packages"))
         'early #'(lambda () (featurep 'mule)))
    (list (paths-construct-path (list user-init-directory "xemacs-packages"))
@@ -129,11 +134,13 @@ the directory to be ignored."
 (defun package-require (name version)
   (let ((pkg (assq name packages-package-list)))
     (cond ((null pkg)
-          (error "Package %s has not been loaded into this XEmacsen"
-                 name))
+          (error 'invalid-state
+                 (format "Package %s has not been loaded into this XEmacsen"
+                         name)))
          ((< (package-get-key name :version) version)
-          (error "Need version %g of package %s, got version %g"
-                 version name (cdr pkg)))
+          (error 'search-failed
+                 (format "Need version %g of package %s, got version %g"
+                         version name (cdr pkg))))
          (t t))))
 
 (defun package-delete-name (name)
@@ -144,40 +151,14 @@ the directory to be ignored."
     ;; one.
     (while (setq pkg (assq name packages-package-list))
       (setq packages-package-list (delete pkg (copy-alist
-                                              packages-package-list)))
-      )
-    ))
+                                              packages-package-list))))))
 
 ;;; Build time stuff
 
 (defvar autoload-file-name "auto-autoloads.el"
   "Filename that autoloads are expected to be found in.")
 
-(defvar packages-hardcoded-lisp
-  '(
-    ;; Nothing at this time
-    )
-  "Lisp packages that are always dumped with XEmacs.
-This includes every package that is loaded directly by a package listed
-in dumped-lisp.el and is not itself listed.")
-
-(defvar packages-useful-lisp
-  '("bytecomp"
-    "byte-optimize"
-    "shadow"
-    "cl-macs")
-  "Lisp packages that need early byte compilation.")
-
-(defvar packages-unbytecompiled-lisp
-  '("paths.el"
-    "dumped-lisp.el"
-    "dumped-pkg-lisp.el"
-    "version.el"
-    "very-early-lisp.el")
-  "Lisp packages that should not be byte compiled.")
-
-
-;; Copied from help.el, could possibly move it to here permanently.
+;; Moved from help.el.
 ;; Unlike the FSF version, our `locate-library' uses the `locate-file'
 ;; primitive, which should make it lightning-fast.
 
@@ -352,7 +333,7 @@ This function is basically a wrapper over `locate-file'."
   ;; make sure paths-find-version-directory and paths-find-site-directory
   ;; don't both pick up version-independent directories ...
   (let ((version-directory (paths-find-version-directory roots base nil nil t))
-       (site-directory (paths-find-site-directory roots base nil nil t)))
+       (site-directory (paths-find-site-directory roots base)))
     (paths-uniq-append
      (and version-directory (list version-directory))
      (and site-directory (list site-directory)))))
index fb26c2e..55801b1 100644 (file)
@@ -1,7 +1,7 @@
 ;;; specifier.el --- Lisp interface to specifiers
 
-;; Copyright (C) 1997 Free Software Foundation, Inc.
-;; Copyright (C) 1995, 1996, 2000 Ben Wing.
+;; Copyright (C) 1997, 2004 Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1996, 2000, 2002 Ben Wing.
 
 ;; Author: Ben Wing <ben@xemacs.org>
 ;; Keywords: internal, dumped
 ;;; Code:
 
 (defun make-specifier-and-init (type spec-list &optional dont-canonicalize)
-  "Create and initialize a new specifier.
-
-This is a front-end onto `make-specifier' that allows you to create a
-specifier and add specs to it at the same time.  TYPE specifies the
-specifier type.  SPEC-LIST supplies the specification(s) to be added
-to the specifier. Normally, almost any reasonable abbreviation of the
-full spec-list form is accepted, and is converted to the full form;
-however, if optional argument DONT-CANONICALIZE is non-nil, this
-conversion is not performed, and the SPEC-LIST must already be in full
-form.  See `canonicalize-spec-list'."
+  "Create and initialize a specifier of type TYPE with spec(s) SPEC-LIST.
+
+A convenience API combining `make-specifier' and `set-specifier', allowing you
+to create a specifier and add specs to it at the same time.
+TYPE specifies the specifier type.  See `make-specifier' for known types.
+SPEC-LIST supplies the specification(s) to be added to the specifier, in any
+  form acceptable to `canonicalize-spec-list'.
+Optional DONT-CANONICALIZE, if non-nil, inhibits the conversion, and the
+  SPEC-LIST must already be in full form."
   (let ((sp (make-specifier type)))
     (if (not dont-canonicalize)
        (setq spec-list (canonicalize-spec-list spec-list type)))
@@ -53,10 +52,12 @@ form.  See `canonicalize-spec-list'."
 (defun map-specifier (ms-specifier ms-func &optional ms-locale ms-maparg)
   "Apply MS-FUNC to the specification(s) for MS-LOCALE in MS-SPECIFIER.
 
-If MS-LOCALE is a locale, MS-FUNC will be called for that locale.
-If MS-LOCALE is a locale type, MS-FUNC will be mapped over all locales
-of that type.  If MS-LOCALE is 'all or nil, MS-FUNC will be mapped
-over all locales in MS-SPECIFIER.
+If optional MS-LOCALE is a locale, MS-FUNC will be called for that locale.
+If MS-LOCALE is a locale type, MS-FUNC will be mapped over all locales of that
+type.  If MS-LOCALE is 'all or nil, MS-FUNC will be mapped over all locales in
+MS-SPECIFIER.
+
+Optional MS-MAPARG will be passed to MS-FUNC.
 
 MS-FUNC is called with four arguments: the MS-SPECIFIER, the locale
 being mapped over, the inst-list for that locale, and the
@@ -76,7 +77,7 @@ returns nil."
 (defun canonicalize-inst-pair (inst-pair specifier-type &optional noerror)
   "Canonicalize the given INST-PAIR.
 
-SPECIFIER-TYPE specifies the type of specifier that this SPEC-LIST
+SPECIFIER-TYPE specifies the type of specifier that this INST-PAIR
 will be used for.
 
 Canonicalizing means converting to the full form for an inst-pair, i.e.
@@ -169,8 +170,7 @@ otherwise return t."
 (defun canonicalize-spec (spec specifier-type &optional noerror)
   "Canonicalize the given SPEC (a specification).
 
-SPECIFIER-TYPE specifies the type of specifier that this SPEC-LIST
-will be used for.
+SPECIFIER-TYPE is the type of specifier that this SPEC will be used for.
 
 Canonicalizing means converting to the full form for a spec, i.e.
 `(LOCALE (TAG-SET . INSTANTIATOR) ...)'.  This function accepts a
@@ -222,9 +222,42 @@ a possibly abbreviated specification or a list of such things. (See
 accepted by `set-specifier' and such into a form suitable for
 `add-spec-list-to-specifier'.
 
-This function tries extremely hard to resolve any ambiguities,
-and the built-in specifier types (font, image, toolbar, etc.) are
-designed so that there won't be any ambiguities.
+The canonicalization algorithm is as follows:
+
+1. Attempt to parse SPEC-LIST as a single, possibly abbreviated, specification.
+2. If (1) fails, attempt to parse SPEC-LIST as a list of (abbreviated)
+   specifications.
+3. If (2) fails, SPEC-LIST is invalid.
+
+A possibly abbreviated specification SPEC is parsed by
+
+1. Attempt to parse SPEC as a possibly abbreviated inst-list.
+2. If (1) fails, attempt to parse SPEC as a cons of a locale and an
+   (abbreviated) inst-list.
+3. If (2) fails, SPEC is invalid.
+
+A possibly abbreviated inst-list INST-LIST is parsed by
+
+1. Attempt to parse INST-LIST as a possibly abbreviated inst-pair.
+2. If (1) fails, attempt to parse INST-LIST as a list of (abbreviated)
+   inst-pairs.
+3. If (2) fails, INST-LIST is invalid.
+
+A possibly abbreviated inst-pair INST-PAIR is parsed by
+
+1. Check if INST-PAIR is `valid-instantiator-p'.
+2. If not, check if INST-PAIR is a cons of something that is a tag, ie,
+   `valid-specifier-tag-p', and something that is `valid-instantiator-p'.
+3. If not, check if INST-PAIR is a cons of a list of tags and something that
+   is `valid-instantiator-p'.
+
+In summary, this function generally prefers more abbreviated forms.
+
+This function tries extremely hard to resolve any ambiguities, and the
+built-in specifier types (font, image, toolbar, etc.) are designed so that
+there won't be any ambiguities.  (#### Unfortunately there are bugs in the
+treatment of toolbar spec-lists and generic spec-lists; avoid depending on
+canonicalization for these types.)
 
 If NOERROR is nil, signal an error if the spec-list is invalid;
 otherwise return t."
@@ -265,51 +298,47 @@ otherwise return t."
            (nreverse result)))))))
 
 (defun set-specifier (specifier value &optional locale tag-set how-to-add)
-  "Add a specification or specifications to SPECIFIER.
+  "Add the specification(s) given by VALUE to SPECIFIER in LOCALE.
+
+VALUE may be any of the values accepted by `canonicalize-spec-list', including
+
+-- an instantiator (either a Lisp object which will be returned when the
+   specifier is instanced, or a Lisp object that can be instantiated to
+   produce an opaque value: eg, a font name (string) can be used for a font
+   specifier, but an instance will be a font object)
+-- a list of instantiators
+-- a cons of a locale and an instantiator, or of a locale and a list of
+   instantiators
+-- a cons of a tag or tag-set and an instantiator (or list of instantiators)
+-- a cons of a locale and the previous type of item
+-- a list of one or more of any of the previous types of items
+-- a canonical spec-list.
+
+See `canonicalize-spec-list' for details.  If you need to know the details,
+though, strongly consider using the unambiguous APIs `add-spec-to-specifier'
+and `add-spec-list-to-specifier' instead.
+
+Finally, VALUE can itself be a specifier (of the same type as
+SPECIFIER), if you want to copy specifications from one specifier
+to another; this is equivalent to calling `copy-specifier', and
+LOCALE, TAG-SET, and HOW-TO-ADD have the same semantics as with
+that function.
+
+Note that a VALUE of `nil' is either illegal or will be treated as a value of
+`nil'; it does not remove existing specifications.  Use `remove-specifier' for
+that.  N.B. `remove-specifier' defaults to removing all specifications, not
+just the 'global one!
+
+Warning: this function is inherently heuristic, and should not be relied on to
+properly resolve ambiguities, when specifier instantiators can be lists
+\(currently, for toolbar specifiers and generic specifiers).  In those cases
+use either `add-spec-to-specifier' or `add-spec-list-to-specifier'.
 
-This function adds a specification of VALUE in locale LOCALE.
 LOCALE indicates where this specification is active, and should be
 a buffer, a window, a frame, a device, or the symbol `global' to
-indicate that it applies everywhere.  LOCALE usually defaults to
-`global' if omitted.
-
-VALUE is usually what is called an \"instantiator\" (which, roughly
-speaking, corresponds to the \"value\" of the property governed by
-SPECIFIER).  The valid instantiators for SPECIFIER depend on the type
-of SPECIFIER (which you can determine using `specifier-type').  The
-specifier `scrollbar-width', for example, is of type `integer',
-meaning its valid instantiators are integers.  The specifier governing
-the background color of the `default' face (you can retrieve this
-specifier using `(face-background 'default)') is of type `color',
-meaning its valid instantiators are strings naming colors and
-color-instance objects.  For some types of specifiers, such as `image'
-and `toolbar', the instantiators can be very complex.  Generally this
-is documented in the appropriate creation function --
-e.g. `make-color-specifier', `make-font-specifier',
-`make-image-specifier' -- or in the global variable holding the most
-common specifier for that type (`default-toolbar', `default-gutter',
-`current-display-table').
-
-NOTE: It does *not* work to give a VALUE of nil as a way of
-removing the specifications for a locale.  Use `remove-specifier'
-instead. (And keep in mind that, if you omit the LOCALE argument
-to `remove-specifier', it removes *all* specifications!  If you
-want to remove just the `global' specification, make sure to
-specify a LOCALE of `global'.)
-
-VALUE can also be a list of instantiators.  This means basically,
-\"try each one in turn until you get one that works\".  This allows
-you to give funky instantiators that may only work in some cases,
-and provide more normal backups for the other cases. (For example,
-you might like the color \"darkseagreen2\", but some X servers
-don't recognize this color, so you could provide a backup
-\"forest green\".  Color TTY devices probably won't recognize this
-either, so you could provide a second backup \"green\".  You'd
-do this by specifying this list of instantiators:
-
-'(\"darkseagreen2\" \"forest green\" \"green\")
-
-VALUE can also be various more complicated forms; see below.
+indicate that it applies everywhere.  LOCALE defaults to
+`global' if omitted, and is overridden by locales provided by VALUE (in the
+cases where value is a full specification or a spec-list).
 
 Optional argument TAG-SET is a tag or a list of tags, to be associated
 with the VALUE.  Tags are symbols (usually naming device types, such
@@ -329,25 +358,6 @@ the default behavior of `remove-tag-set-prepend' is usually fine.
 See `copy-specifier' and `add-spec-to-specifier' for a full
 description of what each of these means.
 
-VALUE can actually be anything acceptable to `canonicalize-spec-list';
-this includes, among other things:
-
--- a cons of a locale and an instantiator (or list of instantiators)
--- a cons of a tag or tag-set and an instantiator (or list of
-   instantiators)
--- a cons of a locale and the previous type of item
--- a list of one or more of any of the previous types of items
-
-However, in these cases, you cannot give a LOCALE or TAG-SET,
-because they do not make sense. (You will probably get an error if
-you try this.)
-
-Finally, VALUE can itself be a specifier (of the same type as
-SPECIFIER), if you want to copy specifications from one specifier
-to another; this is equivalent to calling `copy-specifier', and
-LOCALE, TAG-SET, and HOW-TO-ADD have the same semantics as with
-that function.
-
 Note that `set-specifier' is exactly complementary to `specifier-specs'
 except in the case where SPECIFIER has no specs at all in it but nil
 is a valid instantiator (in that case, `specifier-specs' will return
@@ -355,14 +365,7 @@ nil (meaning no specs) and `set-specifier' will interpret the `nil'
 as meaning \"I'm adding a global instantiator and its value is `nil'\"),
 or in strange cases where there is an ambiguity between a spec-list
 and an inst-list, etc. (The built-in specifier types are designed
-in such a way as to avoid any such ambiguities.)
-
-NOTE: If you want to work with spec-lists, you should probably not
-use either `set-specifier' or `specifier-specs', but should use the
-lower-level functions `add-spec-list-to-specifier' and `specifier-spec-list'.
-These functions always work with fully-qualified spec-lists; thus, there
-is no possibility for ambiguity and no need to go through the function
-`canonicalize-spec-list', which is potentially time-consuming."
+in such a way as to avoid any such ambiguities.)"
 
   ;; backward compatibility: the old function had HOW-TO-ADD as the
   ;; third argument and no arguments after that.
@@ -406,7 +409,7 @@ is no possibility for ambiguity and no need to go through the function
   value)
 
 (defun modify-specifier-instances (specifier func &optional args force default
-                                            locale tag-set)
+                                  locale tag-set)
   "Modify all specifications that match LOCALE and TAG-SET by FUNC.
 
 For each specification that exists for SPECIFIER, in locale LOCALE
index 4950427..502c6dc 100644 (file)
@@ -385,7 +385,7 @@ Returns the window displaying BUFFER."
         ;; and does `returns' all over the place and there's no sense
         ;; in trying to rewrite it to be more Lispy.
         (catch 'done
-          (let (window old-frame target-frame explicit-frame)
+          (let (window old-frame target-frame explicit-frame shrink-it)
             (setq old-frame (or (last-nonminibuf-frame) (selected-frame)))
             (setq buffer (get-buffer buffer))
             (check-argument-type 'bufferp buffer)
@@ -573,9 +573,7 @@ Returns the window displaying BUFFER."
                                (and (window-leftmost-p window)
                                     (window-rightmost-p window))))
                       (setq window (split-window window))
-                    (let (upper
-;;                        lower
-                          other)
+                    (let (upper other)
                       (setq window (get-lru-window target-frame))
                       ;; If the LRU window is selected, and big enough,
                       ;; and can be split, split it.
@@ -605,11 +603,9 @@ Returns the window displaying BUFFER."
                       ;; even out their heights.
                       (if (window-previous-child window)
                           (setq other (window-previous-child window)
-;;                              lower window
                                 upper other))
                       (if (window-next-child window)
                           (setq other (window-next-child window)
-;;                              lower other
                                 upper window))
                       ;; Check that OTHER and WINDOW are vertically arrayed.
                       (if (and other
@@ -622,8 +618,11 @@ Returns the window displaying BUFFER."
                                                 2)
                                              (window-height upper))
                                           nil upper))
-                      (if shrink-to-fit
-                          (shrink-window-if-larger-than-buffer window)))))
+                       ;; Klaus Berndl <klaus.berndl@sdm.de>: Only in
+                       ;; this situation we shrink-to-fit but we can do
+                       ;; this first after we have displayed buffer in
+                       ;; window (s.b. (set-window-buffer window buffer))
+                       (setq shrink-it shrink-to-fit))))
 
               (setq window (get-lru-window target-frame)))
 
@@ -636,6 +635,12 @@ Returns the window displaying BUFFER."
 
             (set-window-buffer window buffer)
 
+             ;; Now window's previous buffer has been brought to the top
+             ;; of the MRU chain and window displays buffer - now we can
+             ;; shrink-to-fit if necessary
+             (if shrink-it
+                 (shrink-window-if-larger-than-buffer window))
+
             (display-buffer-1 window)))))
     (or (equal wconfig (current-window-configuration))
        (push-window-configuration wconfig))
index 24b7bc7..52502ed 100644 (file)
@@ -1,3 +1,7 @@
+2004-02-02  Vin Shelton <acs@xemacs.org>
+
+       * XEmacs 21.4.15 is released
+
 2003-09-03  Vin Shelton <acs@xemacs.org>
 
        * XEmacs 21.4.14 is released
index d332342..21e5cd0 100644 (file)
@@ -1,3 +1,144 @@
+2004-02-02  Vin Shelton <acs@xemacs.org>
+
+       * XEmacs 21.4.15 is released
+
+2004-01-27  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * lispref/lispref.texi (Top): Pluralize node name Specifier Examples.
+       * lispref/specifiers.texi: Synch to 21.5 where appropriate.
+
+2003-11-04  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * xemacs-faq.texi: Fix Tony Rossini's address.
+
+2004-01-25  Steve Youngs  <youngs@xemacs.org>
+
+       * xemacs-faq.texi (Q2.0.2): Rewrite, mentioning the correct way to
+       remove a package.
+       (Q3.8.2): big-menubar is in the edit-utils package.
+       (Q4.3.2): Add a comment about not needing TM for things like Gnus,
+       MH-E and VM.
+       (Q5.3.3): State correct location of ps-print.el.
+
+       * xemacs/packages.texi (Packages): Remove "Creating Packages" menu
+       entry.
+       (Package Terminology): Whitespace clean up.
+       (Installing Packages): Whitespace clean up and add some @code
+       formatters. 
+       Re-organise the menu so that installation via PUI is first and
+       Sumo is last.
+       (Automatically): mule-base is no longer a requirement for using
+       PUI.
+       Mention optionally requiring mailcrypt.
+       (Note): Removed.
+       (Manually): Move to below the PUI installation method.
+       (Sumo): Move to below the manual installation method.
+       (Which Packages): Add mailcrypt.
+       (Building Packages): Remove duplicated stuff that is in
+       lispref/packaging.texi, xref to it instead.
+       (Local.rules File): xref to the appropriate node in
+       lispref/packaging.texi. 
+       (Available Packages): Update to current reality.
+       (all): Removed.
+       (srckit): Removed.
+       (binkit): Removed.
+       
+       * xemacs/reading.texi (Reading Mail): Mention Gnus and MEW.
+
+       * new-users-guide/custom2.texi (Init File): big-menubar.el is in
+       the edit-utils package.
+
+       * lispref/packaging.texi (Packaging):
+       (The User View):
+       (The Library Maintainer View):
+       (Infrastructure):
+       (Control Files):
+       (Obtaining):
+       (The Package Release Engineer View):
+       (Package Terminology):
+       (Building Packages):
+       (Makefile Targets):
+       (packages): New.
+       (Local.rules File):
+       (XEMACS_PACKAGES): Removed.
+       (XEMACS_INSTALLED_PACKAGES_ROOT): New.
+       (NONMULE_PACKAGES): New.
+       (EXCLUDES): New.
+       (Creating Packages):
+       (BATCH): New.
+       (VERSION): Removed.
+       (AUTHOR_VERSION): Removed.
+       (MAINTAINER): Removed.
+       (PACKAGE): Removed.
+       (PKG_TYPE): Removed.
+       (REQUIRES): Removed.
+       (CATEGORY): Removed.
+       (ELS): Removed.
+       (ELCS): Removed.
+       (all): Removed.
+       (srckit): Removed.
+       (binkit): Removed.
+       (are): New.
+       (STANDARD_DOCS): New.
+       (ELCS_1_DEST): New.
+       (example): New.
+       (PACKAGE_SUPPRESS): New.
+       (EXPLICIT_DOCS): New.
+       (DATA_DEST): New.
+       (Documenting Packages):
+
+       Not quite a total rewrite, but a fairly thorough audit
+       nonetheless.
+
+2003-08-15  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * internals/internals.texi: Update copyright notice.
+       (GCPROing): Add missing period.
+       (Adding Global Lisp Variables): general.c -> general-slots.h.
+       (A Reader's Guide to XEmacs Coding Conventions): New node.
+
+2003-10-22  Ilya N. Golubev  <gin@mo.msk.ru>
+
+       * custom.texi (The Init File):
+       * xemacs-faq.texi (Q2.1.3):
+       (Q2.1.5):
+       * internals/internals.texi (Modules for Internationalization):
+       * lispref/display.texi (Beeping):
+       * lispref/ldap.texi (Encoder/Decoder Functions):
+       * lispref/markers.texi (The Mark):
+       (The Region):
+       * lispref/menus.texi (Menu Accelerator Functions):
+       * lispref/numbers.texi (Math Functions):
+       * lispref/packaging.texi (package-compile.el):
+       (Makefile Targets):
+       (Local.rules File):
+       * lispref/postgresql.texi (libpq Lisp Symbols and DataTypes):
+       (libpq Lisp Variables):
+       (Synchronous Interface Functions):
+       (Other libpq Functions):
+       * new-users-guide/custom2.texi (Init File):
+       (Setting Variables):
+       * new-users-guide/files.texi (File Names):
+       (Saving Files):
+       * new-users-guide/search.texi (Search and Replace):
+       * xemacs/custom.texi (X Resources):
+       Fix up erroneous uses of @var instead of @code for the names of
+       particular variables in programming languages.
+
+2003-10-20  Ilya N. Golubev  <gin@mo.msk.ru>
+
+       * lispref/tips.texi (Style Tips): Note disabling undo in temporary
+       buffers.
+
+2003-10-16  Ilya N. Golubev  <gin@mo.msk.ru>
+
+       * lispref/tips.texi (Comment Tips): Typo fix.
+
+2003-09-22  Adrian Aichner  <adrian@xemacs.org>
+
+       * lispref/backups.texi (Reverting): Fix the PRINTED-MANUAL-TITLE
+       argument for a cross reference to  "The XEmacs User's Manual".
+
 2003-09-03  Vin Shelton <acs@xemacs.org>
 
        * XEmacs 21.4.14 is released
index 66acee1..a3960a8 100644 (file)
@@ -291,7 +291,7 @@ and older XEmacs) and is @file{custom.el} in the same directory as
 @file{init.el} (in XEmacs 21.4 and later).  If you use another file, you
 must explicitly load it yourself.
 
-As of XEmacs 21.4.7, when @var{custom-file} is present, it is loaded
+As of XEmacs 21.4.7, when @code{custom-file} is present, it is loaded
 @emph{after} @file{init.el}.  This is likely to change in the future,
 because (1) actions in @file{init.el} often would like to depend on
 customizations for consistent appearance and (2) Custom is quite brutal
index 548a62f..322f7ef 100644 (file)
@@ -12,7 +12,7 @@
 
 Copyright @copyright{} 1992 - 1996 Ben Wing.
 Copyright @copyright{} 1996, 1997 Sun Microsystems.
-Copyright @copyright{} 1994 - 1998 Free Software Foundation.
+Copyright @copyright{} 1994 - 1998, 2002, 2003 Free Software Foundation.
 Copyright @copyright{} 1994, 1995 Board of Trustees, University of Illinois.
 
 
@@ -1938,6 +1938,7 @@ get something that appears to work, but which will crash in odd
 situations, often in code far away from where the actual breakage is.
 
 @menu
+* A Reader's Guide to XEmacs Coding Conventions::
 * General Coding Rules::
 * Writing Lisp Primitives::
 * Writing Good Comments::
@@ -1947,6 +1948,99 @@ situations, often in code far away from where the actual breakage is.
 * Techniques for XEmacs Developers::
 @end menu
 
+@node A Reader's Guide to XEmacs Coding Conventions
+@section A Reader's Guide to XEmacs Coding Conventions
+@cindex coding conventions
+@cindex reader's guide
+@cindex coding rules, naming
+
+Of course the low-level implementation language of XEmacs is C, but much
+of that uses the Lisp engine to do its work.  However, because the code
+is ``inside'' of the protective containment shell around the ``reactor
+core,'' you'll see lots of complex ``plumbing'' needed to do the work
+and ``safety mechanisms,'' whose failure results in a meltdown.  This
+section provides a quick overview (or review) of the various components
+of the implementation of Lisp objects.
+
+  Two typographic conventions help to identify C objects that implement
+Lisp objects.  The first is that capitalized identifiers, especially
+beginning with the letters @samp{Q}, @samp{V}, @samp{F}, and @samp{S},
+for C variables and functions, and C macros with beginning with the
+letter @samp{X}, are used to implement Lisp.  The second is that where
+Lisp uses the hyphen @samp{-} in symbol names, the corresponding C
+identifiers use the underscore @samp{_}.  Of course, since XEmacs Lisp
+contains interfaces to many external libraries, those external names
+will follow the coding conventions their authors chose, and may overlap
+the ``XEmacs name space.''  However these cases are usually pretty
+obvious.
+
+  All Lisp objects are handled indirectly.  The @code{Lisp_Object}
+type is usually a pointer to a structure, except for a very small number
+of types with immediate representations (currently characters and
+integers).  However, these types cannot be directly operated on in C
+code, either, so they can also be considered indirect.  Types that do
+not have an immediate representation always have a C typedef
+@code{Lisp_@var{type}} for a corresponding structure.
+@c #### mention l(c)records here?
+
+  In older code, it was common practice to pass around pointers to
+@code{Lisp_@var{type}}, but this is now deprecated in favor of using
+@code{Lisp_Object} for all function arguments and return values that are
+Lisp objects.  The @code{X@var{type}} macro is used to extract the
+pointer and cast it to @code{(Lisp_@var{type} *)} for the desired type.
+
+  @strong{Convention}: macros whose names begin with @samp{X} operate on
+@code{Lisp_Object}s and do no type-checking.  Many such macros are type
+extractors, but others implement Lisp operations in C (@emph{e.g.},
+@code{XCAR} implements the Lisp @code{car} function).  These are unsafe,
+and must only be used where types of all data have already been checked.
+Such macros are only applied to @code{Lisp_Object}s.  In internal
+implementations where the pointer has already been converted, the
+structure is operated on directly using the C @code{->} member access
+operator.
+
+  The @code{@var{type}P}, @code{CHECK_@var{type}}, and
+@code{CONCHECK_@var{type}} macros are used to test types.  The first
+returns a Boolean value, and the latter signal errors.  (The
+@samp{CONCHECK} variety allows execution to be CONtinued under some
+circumstances, thus the name.)  Functions which expect to be passed user
+data invariably call @samp{CHECK} macros on arguments.
+
+  There are many types of specialized Lisp objects implemented in C, but
+the most pervasive type is the @dfn{symbol}.  Symbols are used as
+identifiers, variables, and functions.
+
+  @strong{Convention}: Global variables whose names begin with @samp{Q}
+are constants whose value is a symbol.  The name of the variable should
+be derived from the name of the symbol using the same rules as for Lisp
+primitives.  Such variables allow the C code to check whether a
+particular @code{Lisp_Object} is equal to a given symbol.  Symbols are
+Lisp objects, so these variables may be passed to Lisp primitives.  (An
+alternative to the use of @samp{Q...} variables is to call the
+@code{intern} function at initialization in the
+@code{vars_of_@var{module}} function, which is hardly less efficient.)
+
+  @strong{Convention}: Global variables whose names begin with @samp{V}
+are variables that contain Lisp objects.  The convention here is that
+all global variables of type @code{Lisp_Object} begin with @samp{V}, and
+no others do (not even integer and boolean variables that have Lisp
+equivalents). Most of the time, these variables have equivalents in
+Lisp, which are defined via the @samp{DEFVAR} family of macros, but some
+don't.  Since the variable's value is a @code{Lisp_Object}, it can be
+passed to Lisp primitives.
+
+  The implementation of Lisp primitives is more complex.
+@strong{Convention}: Global variables with names beginning with @samp{S}
+contain a structure that allows the Lisp engine to identify and call a C
+function.  In modern versions of XEmacs, these identifiers are almost
+always completely hidden in the @code{DEFUN} and @code{SUBR} macros, but
+you will encounter them if you look at very old versions of XEmacs or at
+GNU Emacs.  @strong{Convention}: Functions with names beginning with
+@samp{F} implement Lisp primitives.  Of course all their arguments and
+their return values must be Lisp_Objects.  (This is hidden in the
+@code{DEFUN} macro.)
+
+
 @node General Coding Rules
 @section General Coding Rules
 @cindex coding rules, general
@@ -2406,10 +2500,15 @@ XEmacs crash!].)
 @code{defsymbol()} are no problem, but some linkers will complain about
 multiply-defined symbols.  The most insidious aspect of this is that
 often the link will succeed anyway, but then the resulting executable
-will sometimes crash in obscure ways during certain operations!  To
-avoid this problem, declare any symbols with common names (such as
+will sometimes crash in obscure ways during certain operations!
+
+To avoid this problem, declare any symbols with common names (such as
 @code{text}) that are not obviously associated with this particular
-module in the module @file{general.c}.
+module in the file @file{general-slots.h}.  The ``-slots'' suffix
+indicates that this is a file that is included multiple times in
+@file{general.c}.  Redefinition of preprocessor macros allows the
+effects to be different in each context, so this is actually more
+convenient and less error-prone than doing it in your module.
 
   Global variables whose names begin with @samp{V} are variables that
 contain Lisp objects.  The convention here is that all global variables
@@ -4986,7 +5085,7 @@ respectively.  This is currently in beta.
 
 @file{mule-mcpath.c} provides some functions to allow for pathnames
 containing extended characters.  This code is fragmentary, obsolete, and
-completely non-working.  Instead, @var{pathname-coding-system} is used
+completely non-working.  Instead, @code{pathname-coding-system} is used
 to specify conversions of names of files and directories.  The standard
 C I/O functions like @samp{open()} are wrapped so that conversion occurs
 automatically.
@@ -5315,7 +5414,7 @@ different section of code.
 
 If you don't understand whether to @code{GCPRO} in a particular
 instance, ask on the mailing lists.  A general hint is that @code{prog1}
-is the canonical example
+is the canonical example.
 
 @cindex garbage collection, conservative
 @cindex conservative garbage collection
index 7ea6cc4..cac8e56 100644 (file)
@@ -579,7 +579,7 @@ name.
   If you have made extensive changes to a file and then change your mind
 about them, you can get rid of them by reading in the previous version
 of the file with the @code{revert-buffer} command.  @xref{Reverting, ,
-Reverting a Buffer, xemacs, The XEmacs Lisp Reference Manual}.
+Reverting a Buffer, xemacs, The XEmacs User's Manual}.
 
 @deffn Command revert-buffer &optional check-auto-save noconfirm preserve-modes
 This command replaces the buffer text with the text of the visited
index 3263dbe..e34d3ff 100644 (file)
@@ -1244,7 +1244,7 @@ This function reads in an audio file and adds it to @code{sound-alist}.
 The sound file must be in the Sun/NeXT U-LAW format.  @var{sound-name}
 should be a symbol, specifying the name of the sound.  If @var{volume}
 is specified, the sound will be played at that volume; otherwise, the
-value of @var{bell-volume} will be used.
+value of @code{bell-volume} will be used.
 @end deffn
 
 @defun play-sound sound &optional volume device
index 827fca0..5099e92 100644 (file)
@@ -431,21 +431,21 @@ A function that decodes a LDAP boolean string representation
 @end defun
 
 @defun ldap-decode-string str
-Decode a string @var{str} according to @var{ldap-coding-system}.
+Decode a string @var{str} according to @code{ldap-coding-system}.
 @end defun
 
 @defun ldap-encode-string str
-Encode a string @var{str} according to @var{ldap-coding-system}.
+Encode a string @var{str} according to @code{ldap-coding-system}.
 @end defun
 
 @defun ldap-decode-address str
-Decode an address @var{str} according to @var{ldap-coding-system} and
+Decode an address @var{str} according to @code{ldap-coding-system} and
 replacing $ signs with newlines as specified by LDAP encoding rules for
 addresses.
 @end defun
 
 @defun ldap-encode-address str
-Encode an address @var{str} according to @var{ldap-coding-system} and
+Encode an address @var{str} according to @code{ldap-coding-system} and
 replacing newlines with $ signs as specified by LDAP encoding rules for
 addresses.
 @end defun
index 538ac59..6cbad13 100644 (file)
@@ -263,9 +263,9 @@ Packaging
 
 Package Overview
 
-* The User's View::
-* The Library Maintainer's View::
-* The Package Release Engineer's View::
+* The User View::
+* The Library Maintainer View::
+* The Package Release Engineer View::
 
 The Library Maintainer's View
 
@@ -275,9 +275,8 @@ The Library Maintainer's View
 
 Creating Packages
 
-* package-compile.el::
-* package-info.in Fields::
-* Makefile Variables::
+* package-info.in::             package-info.in
+* Makefile::                    @file{Makefile}
 * Makefile Targets::
 
 Lisp Data Types
@@ -947,7 +946,7 @@ Specifiers
 * Retrieving Specifications::  Querying a specifier's specifications.
 * Specifier Instancing Functions::
                                Functions to instance a specifier.
-* Specifier Example::          Making all this stuff clearer.
+* Specifier Examples::         Making all this stuff clearer.
 * Creating Specifiers::                Creating specifiers for your own use.
 * Specifier Validation Functions::
                                Validating the components of a specifier.
index b22c287..18212de 100644 (file)
@@ -508,7 +508,7 @@ However, if @var{force} is non-@code{nil}, then @code{mark} returns the
 mark position anyway---or @code{nil}, if the mark is not yet set for
 the buffer.
 
-(Remember that if @var{zmacs-regions} is @code{nil}, the mark is
+(Remember that if @code{zmacs-regions} is @code{nil}, the mark is
 always active as long as it exists, and the @var{force} argument
 will have no effect.)
 
@@ -687,8 +687,8 @@ these functions, however.  A command designed to operate on a region
 should normally use @code{interactive} with the @samp{r} specification
 to find the beginning and end of the region.  This lets other Lisp
 programs specify the bounds explicitly as arguments and automatically
-respects the user's setting for @var{zmacs-regions}.  (@xref{Interactive
-Codes}.)
+respects the user's setting for @code{zmacs-regions}.
+(@xref{Interactive Codes}.)
 
 @defun region-beginning &optional buffer
 This function returns the position of the beginning of @var{buffer}'s
@@ -730,7 +730,7 @@ region or on something else (e.g. the word or paragraph at point).
 @defvar zmacs-region-stays
 If a command sets this variable to true, the currently active region
 will remain activated when the command finishes. (Normally the region is
-deactivated when each command terminates.) If @var{zmacs-regions} is
+deactivated when each command terminates.) If @code{zmacs-regions} is
 false, however, this has no effect.  Under normal circumstances, you do
 not need to set this; use the interactive specification @samp{_}
 instead, if you want the region to remain active.
@@ -740,15 +740,15 @@ instead, if you want the region to remain active.
 This function activates the region in the current buffer (this is
 equivalent to activating the current buffer's mark).  This will normally
 also highlight the text in the active region and set
-@var{zmacs-region-stays} to @code{t}. (If @var{zmacs-regions} is false,
-however, this function has no effect.)
+@code{zmacs-region-stays} to @code{t}. (If @code{zmacs-regions} is
+false, however, this function has no effect.)
 @end defun
 
 @defun zmacs-deactivate-region
 This function deactivates the region in the current buffer (this is
 equivalent to deactivating the current buffer's mark).  This will
 normally also unhighlight the text in the active region and set
-@var{zmacs-region-stays} to @code{nil}. (If @var{zmacs-regions} is
+@code{zmacs-region-stays} to @code{nil}. (If @code{zmacs-regions} is
 false, however, this function has no effect.)
 @end defun
 
@@ -768,21 +768,21 @@ happens as a result of a command that activates the region, such as
 @code{set-mark-command}, @code{activate-region}, or
 @code{exchange-point-and-mark}.) Note that calling
 @file{zmacs-activate-region} will call this hook, even if the region is
-already active.  If @var{zmacs-regions} is false, however, this hook
+already active.  If @code{zmacs-regions} is false, however, this hook
 will never get called under any circumstances.
 @end defvar
 
 @defvar zmacs-deactivate-region-hook
 This normal hook is called when an active region becomes inactive.
 (Calling @file{zmacs-deactivate-region} when the region is inactive will
-@emph{not} cause this hook to be called.)  If @var{zmacs-regions} is
+@emph{not} cause this hook to be called.)  If @code{zmacs-regions} is
 false, this hook will never get called.
 @end defvar
 
 @defvar zmacs-update-region-hook
 This normal hook is called when an active region is "updated" by
 @code{zmacs-update-region}.  This normally gets called at the end
-of each command that sets @var{zmacs-region-stays} to @code{t},
+of each command that sets @code{zmacs-region-stays} to @code{t},
 indicating that the region should remain activated.  The motion
 commands do this.
 @end defvar
index 53d1ef7..4a00115 100644 (file)
@@ -677,14 +677,14 @@ accelerator keys can be used regardless of the value of this variable.
 precedence over bindings in the current keymap(s).  @code{menu-fallback} means
 that bindings in the current keymap take precedence over menu accelerator keys.
 Thus a top level menu with an accelerator of "T" would be activated on a
-keypress of Meta-t if @var{menu-accelerator-enabled} is @code{menu-force}.
-However, if @var{menu-accelerator-enabled} is @code{menu-fallback}, then
+keypress of Meta-t if @code{menu-accelerator-enabled} is @code{menu-force}.
+However, if @code{menu-accelerator-enabled} is @code{menu-fallback}, then
 Meta-t will not activate the menubar and will instead run the function
 transpose-words, to which it is normally bound.
 
 The default value is @code{nil}.
 
-See also @var{menu-accelerator-modifiers} and @var{menu-accelerator-prefix}.
+See also @code{menu-accelerator-modifiers} and @code{menu-accelerator-prefix}.
 @end defvar
 
 @defvar menu-accelerator-map
@@ -698,12 +698,12 @@ accelerator in order for the top level menu to be activated in response to
 a keystroke.  The default value of @code{(meta)} mirrors the usage of the alt key
 as a menu accelerator in popular PC operating systems.
 
-The modifier keys in @var{menu-accelerator-modifiers} must match exactly the
+The modifier keys in @code{menu-accelerator-modifiers} must match exactly the
 modifiers present in the keypress.  The only exception is that the shift
-modifier is accepted in conjunction with alphabetic keys even if it is not
-a menu accelerator modifier.
+modifier is accepted in conjunction with alphabetic keys even if it is not a
+menu accelerator modifier.
 
-See also @var{menu-accelerator-enabled} and @var{menu-accelerator-prefix}.
+See also @code{menu-accelerator-enabled} and @code{menu-accelerator-prefix}.
 @end defvar
 
 @defvar menu-accelerator-prefix
index 6258217..afbd666 100644 (file)
@@ -1028,7 +1028,7 @@ base of natural logarithms.
 
 @defun log number &optional base
 This function returns the logarithm of @var{number}, with base @var{base}.
-If you don't specify @var{base}, the base @var{e} is used.  If @var{number}
+If you don't specify @var{base}, the base @code{e} is used.  If @var{number}
 is negative, the result is a NaN.
 @end defun
 
index adb36ff..dfdc88a 100644 (file)
@@ -1,6 +1,7 @@
 @c -*-texinfo-*-
 @c This is part of the XEmacs Lisp Reference Manual.
 @c Copyright (C) 1995, 1996 Ben Wing.
+@c Copyright (C) 2002, 2004 Free Software Foundation, Inc.
 @c See the file lispref.texi for copying conditions.
 @setfilename ../../info/specifiers.info
 @node Specifiers, Faces and Window-System Objects, Extents, top
@@ -8,14 +9,13 @@
 @cindex specifier
 
 A specifier is an object used to keep track of a property whose value
-may vary depending on the particular situation (e.g. particular buffer
-displayed in a particular window) that it is used in.  The value of many
-built-in properties, such as the font, foreground, background, and such
-properties of a face and variables such as
-@code{modeline-shadow-thickness} and @code{top-toolbar-height}, is
-actually a specifier object.  The specifier object, in turn, is
-``instanced'' in a particular situation to yield the real value
-of the property in that situation.
+should vary according to @emph{display context}, a window, a frame, or
+device.  The value of many built-in properties, such as the font,
+foreground, background, and such properties of a face and variables
+such as @code{modeline-shadow-thickness} and
+@code{top-toolbar-height}, is actually a specifier object.  The
+specifier object, in turn, is ``instanced'' in a particular situation
+to yield the real value of the property in the current context.
 
 @defun specifierp object
 This function returns non-@code{nil} if @var{object} is a specifier.
@@ -26,6 +26,7 @@ This function returns non-@code{nil} if @var{object} is a specifier.
                                 display and other properties to vary
                                 (under user control) in a wide variety
                                 of contexts.
+* Simple Specifier Usage::      Getting started with specifiers.
 * Specifiers In-Depth::         Gory details about specifier innards.
 * Specifier Instancing::        Instancing means obtaining the ``value'' of
                                 a specifier in a particular context.
@@ -37,7 +38,7 @@ This function returns non-@code{nil} if @var{object} is a specifier.
 * Specifier Tag Functions::     Working with specifier tags.
 * Specifier Instancing Functions::
                                 Functions to instance a specifier.
-* Specifier Example::           Making all this stuff clearer.
+* Specifier Examples::          Making all this stuff clearer.
 * Creating Specifiers::         Creating specifiers for your own use.
 * Specifier Validation Functions::
                                 Validating the components of a specifier.
@@ -48,14 +49,16 @@ This function returns non-@code{nil} if @var{object} is a specifier.
 @node Introduction to Specifiers
 @section Introduction to Specifiers
 
-Sometimes you may want the value of a property to vary depending on
-the context the property is used in.  A simple example of this in XEmacs
-is buffer-local variables.  For example, the variable
+Perhaps the most useful way to explain specifiers is via an analogy.
+Emacs Lisp programmers are used to @emph{buffer-local variables}
+@ref{Buffer-Local Variables}. For example, the variable
 @code{modeline-format}, which controls the format of the modeline, can
 have different values depending on the particular buffer being edited.
 The variable has a default value which most modes will use, but a
-specialized package such as Calendar might change the variable so
-as to tailor the modeline to its own purposes.
+specialized package such as Calendar might change the variable so as to
+tailor the modeline to its own purposes. Other variables are perhaps
+best thought of as ``mode local,'' such as font-lock keywords, but they
+are implemented as buffer locals.
 
 Other properties (such as those that can be changed by the
 @code{modify-frame-parameters} function, for example the color of the
@@ -70,11 +73,41 @@ displayed on a particular frame, another value in all other buffers
 displayed in all other frames on any mono (two-color, e.g. black and
 white only) displays, and a default value in all other circumstances.
 
-A @dfn{specifier} is a generalization of this, allowing a great deal
-of flexibility in controlling exactly what value a property has in which
-circumstances.  It is most commonly used for display properties, such as
-an image or the foreground color of a face.  As a simple example, you can
-specify that the foreground of the default face be
+Specifiers generalize both buffer- and frame-local properties.
+Specifiers vary according to the @emph{display} context.  Font-lock
+keywords in a buffer will be the same no matter which window the
+buffer is displayed in, but windows on TTY devices will simply not be
+capable of the flexibility that windows on modern GUI devices are.
+Specifiers provide a way for the programmer to @emph{declare} that an
+emphasized text should be italic on GUI devices and inverse video on
+TTYs.  They also provide a way for the programmer to declare
+fallbacks, so that a color specified as ``chartreuse'' where possible
+can fall back to ``yellow'' on devices where only ANSI (4-bit) color
+is available.  The complex calculations and device querying are
+transparent to both user and programmer.  You ask for what you want;
+it's up to XEmacs to provide it, or a reasonable approximation.
+
+We call such a declaration a @dfn{specification}.  A @dfn{specification}
+applies in a particular @dfn{locale}, which is a window, buffer, frame,
+device, or the global locale.  The value part of the specification is
+called an @dfn{instantiator}.  The process of determining the value in a
+particular context, or @dfn{domain}, is called @dfn{instantiation} or
+@dfn{instancing}.  A domain is a window, frame, or device.
+
+The difference between @dfn{locale} and @dfn{domain} is somewhat subtle.
+You may think of a locale as a class of domains, which may span
+different devices.  Since the specification is abstract (a Lisp form),
+you can state it without reference to a device.  On the other hand, when
+you instantiate a specification, you must know the type of the device.
+It is useless to specify that ``blue means emphasis'' on a monochrome
+device.  Thus instantiation requires specification of the device on
+which it will be rendered.
+
+Thus a @dfn{specifier} allows a great deal of flexibility in
+controlling exactly what value a property has in which circumstances.
+Specifiers are most commonly used for display properties, such as an image or
+the foreground color of a face.  As a simple example, you can specify
+that the foreground of the default face be
 
 @itemize @bullet
 @item
@@ -98,6 +131,150 @@ red for all other buffers displayed on a color device
 white for all other buffers
 @end itemize
 
+@node Simple Specifier Usage
+@section Simple Specifier Usage
+@cindex specifier examples
+@cindex examples, specifier
+@cindex adding a button to a toolbar
+@cindex toolbar button, adding
+
+A useful specifier application is adding a button to a toolbar.  XEmacs
+provides several toolbars, one along each edge of the frame.  Normally
+only one is used at a time, the default.  The default toolbar is
+actually a specifier object which is the value of
+@code{default-toolbar}.  @xref{Toolbar Intro}.
+
+The specification of a toolbar is simple:  it is a list of buttons.
+Each button is a vector with four elements:  an icon, a command, the
+enabled flag, and a help string.  Let's retrieve the instance of the
+toolbar you see in the selected frame.
+
+@example
+(specifier-instance default-toolbar)
+@end example
+
+The value returned is, as promised, a list of vectors.  Now let's build
+up a button, and add it to the toolbar.  Our button will invoke the last
+defined keyboard macro.  This is an alternative to
+@code{name-last-kbd-macro} for creating a persistent macro, rather than
+an alias for @kbd{C-x e}.
+
+A toolbar button icon can be quite sophisticated, with different images
+for button up, button down, and disabled states, and a similar set with
+captions.  We'll use a very simple icon, but we have to jump through a
+few non-obvious hoops designed to support the sophisticated applications.
+The rest of the button descriptor is straightforward.
+
+@example
+(setq toolbar-my-kbd-macro-button
+  `[ (list (make-glyph "MyKbdMac"))
+     (lambda () (interactive) (execute-kbd-macro ,last-kbd-macro))
+     t
+     "Execute a previously defined keyboard macro." ])
+
+(set-specifier default-toolbar
+               (cons toolbar-my-kbd-macro-button
+                     (specifier-specs default-toolbar 'global))
+               'global)
+@end example
+
+To remove the button, just substitute the function @code{delete} for the
+@code{cons} above.
+
+What is the difference between @code{specifier-instance}, which we used
+in the example of retrieving the toolbar descriptor, and
+@code{specifier-specs}, which was used in the toolbar manipulating code?
+@code{specifier-specs} retrieves a copy of the instantiator, which is
+abstract and does not depend on context.  @code{specifier-instance}, on
+the other hand, actually instantiates the specification, and returns the
+result for the given context.  Another way to express this is:
+@code{specifier-specs} takes a @emph{locale} as an argument, while
+@code{specifier-instance} takes a @emph{domain}.  The reason for
+providing @code{specifier-instance} is that sometimes you wish to see
+the object that XEmacs will actually use.  @code{specifier-specs}, on
+the other hand, shows you what the programmer (or user) requested.  When
+a program manipulates specifications, clearly it's the latter that is
+desirable.
+
+In the case of the toolbar descriptor, it turns out that these are the
+same:  the instancing process is trivial.  However, many specifications
+have non-trivial instancing.  Compare the results of the following forms
+on my system.  (The @samp{(cdr (first ...))} form is due to my use of
+Mule.  On non-Mule XEmacsen, just use @code{specifier-specs}.)
+
+@example
+(cdr (first (specifier-specs (face-font 'default) 'global)))
+=> "-*--14-*jisx0208*-0"
+
+(specifier-instance (face-font 'default))
+#<font-instance "-*--14-*jisx0208*-0" on #<x-device on ":0.0" 0x970> 0xe0028b 0x176b>
+@end example
+
+In this case, @code{specifier-instance} returns an opaque object;
+programs can't work on it, they can only pass it around.  Worse, in some
+environments the instantiation will fail, resulting in a different value
+(when another instantiation succeeds), or worse yet, an error, if all
+attempts to instance the specifier fail.  @code{specifier-instance} is
+context-dependent, even for the exact same specification.
+@code{specifier-specs} is deterministic, and only depends on the
+specifications.
+
+Note that in the toolbar-changing code we operate in the global locale.
+This means that narrower locales, if they have specifications, will
+shadow our changes.  (Specifier instancing does not merge
+specifications.  It selects the "highest-priority successful
+specification" and instances that.)
+
+In fact, in our example, it seems pretty likely that different buffers
+@emph{should} have different buttons.  (The icon can be the same, but
+the keyboard macro you create in a Dired buffer is highly unlikely to be
+useful in a LaTeX buffer!)  Here's one way to implement this:
+
+@example
+(setq toolbar-my-kbd-macro-button
+  `[ (list (make-glyph "MyKbdMac"))
+     (lambda () (interactive) (execute-kbd-macro ,last-kbd-macro))
+     t
+     "Execute a previously defined keyboard macro." ])
+
+(set-specifier default-toolbar
+               (cons toolbar-my-kbd-macro-button
+                     (cond ((specifier-specs default-toolbar
+                                             (current-buffer)))
+                           ((specifier-specs default-toolbar
+                                             'global)))
+               (current-buffer))
+@end example
+
+Finally, a cautionary note: the use of @code{specifier-specs} in the
+code above is for expository purposes.  Don't use it in production code.
+In fact, the @code{set-specifier} form above is likely to fail
+occasionally, because you can add many specifications for the same
+locale.
+
+In these cases, @code{specifier-specs} will return a list.  A further
+refinement is that a specification may be associated with a set of
+@dfn{specifier tags}.  If the list of specifier tags is non-nil, then
+@code{specifier-specs} will return a cons of the tag set and the
+instantiator.  Evidently @code{specifier-specs} is a bit unreliable.
+(For toolbars, the code above should work 99% of the time, because
+toolbars are rarely changed.  Since instantiation is trivial, multiple
+specs are not useful---the first one always succeeds.)
+
+In fact, @code{specifier-specs} is intended to be used to display specs
+to humans with a minimum of clutter. The robust way to access
+specifications is via @code{specifier-spec-list}. @xref{Adding
+Specifications}, for the definition of @dfn{spec-list}. @xref{Retrieving
+Specifications}, for documentation of @code{specifier-specs} and
+@code{specifier-spec-list}. To get the desired effect, replace the form
+@code{(specifier-spec default-toolbar 'global)} with
+
+@example
+(cdr (second (first (specifier-spec-list default-toolbar 'global))))
+@end example
+
+(It should be obvious why the example uses the lazy unreliable method!)
+
 @node Specifiers In-Depth
 @section In-Depth Overview of a Specifier
 @cindex specification (in a specifier)
@@ -121,12 +298,36 @@ white for all other buffers
 @cindex specifier, tag
 @cindex specifier, tag set
 
-A specifier object encapsulates a set of @dfn{specifications}, each of
-which says what its value should be if a particular condition applies.
+Having variables vary according the editing context is very useful, and
+the buffer is the natural ``atomic'' unit of editing context.  In a GUI
+environment, it can be similarly useful to have variables whose values
+vary according to display context.  The atomic unit of display context
+is the Emacs window.  Buffers are cleanly grouped by modes, but windows
+are not so easily pigeonholed.  On the one hand, a window displays a
+buffer, and thus one possible hierarchy is window, buffer, mode.  On the
+other, a window is a component of a frame.  This generates the window,
+frame, device hierarchy.  Finally, there are objects such as toolbars
+whose properties are described by specifiers.  These do not fit
+naturally into either hierarchy.  This problem is as yet not cleanly
+solved.
+
+Another potential source of conceptual confusion is the instantiation
+process.  Instantiating a buffer-local variable is simple: at any given
+point in time there is a current buffer, and its local values are used
+and set whenever the variable is accessed, unless the programmer goes to
+some special effort (uses @code{default-value} and @code{set-default}.
+However, a specifier object encapsulates a set of @dfn{specifications},
+each of which says what its value should be if a particular condition
+applies.  Several such conditions might apply simultaneously in a given
+window.
+
 For example, one specification might be ``The value should be
 darkseagreen2 on X devices'' another might be ``The value should be blue
-in the *Help* buffer''.  In specifier terminology, these conditions are
-called @dfn{locales} and the values are called @dfn{instantiators}.
+in the *Help* buffer''.  So what do we do for "the *Help* buffer on an X
+device"?  The answer is simple: give each type of locale a priority and
+check them in priority order, returning the first instantiator that
+successfully instantiates a value.
+
 Given a specifier, a logical question is ``What is its value in a
 particular situation?'' This involves looking through the specifications
 to see which ones apply to this particular situation, and perhaps
@@ -140,6 +341,13 @@ of the default face and @dfn{instances} it in the domain given by that
 window; in other words, it asks the specifier, ``What is your value in
 this window?''.
 
+Note that the redisplay example is in a sense canonical.  That is,
+specifiers are designed to present a uniform and @emph{efficient} API
+to redisplay.  It is the efficiency constraint that motivates the
+introduction of specifier tags, and many restrictions on access (for
+example, a buffer is not a domain, and you cannot instantiate a
+specifier over a buffer).
+
 More specifically, a specifier contains a set of @dfn{specifications},
 each of which associates a @dfn{locale} (a window object, a buffer
 object, a frame object, a device object, or the symbol @code{global})
@@ -160,8 +368,9 @@ same specifier and not interfere with each other.  Each tag can have a
 device. (If a tag does not have a predicate, it matches all devices.)
 All tags in a tag set must match a device for the associated inst-pair
 to be instantiable over that device.  (A null tag set is perfectly
-valid.)
+valid, and trivially matches all devices.)
 
+@c #### don't we have more device types now, gtk, ms-windows, mac-carbon?
 The valid device types (normally @code{x}, @code{tty}, and
 @code{stream}) and device classes (normally @code{color},
 @code{grayscale}, and @code{mono}) can always be used as tags, and match
@@ -474,8 +683,13 @@ specifications.
 the existing ones, and has the same semantics as for
 @code{add-spec-to-specifier}.
 
-In many circumstances, the higher-level function @code{set-specifier} is
-more convenient and should be used instead.
+The higher-level function @code{set-specifier} is often
+more convenient because it allows abbreviations of spec-lists to be used
+instead of the heavily nested canonical syntax.  However, one should
+take great care in using them with specifiers types which can have lists
+as instantiators, such as toolbar specifiers and generic specifiers.  In
+those cases it's probably best to use @code{add-spec-to-specifier} or
+@code{add-spec-list-to-specifier}.
 @end defun
 
 @defspec let-specifier specifier-list &rest body
@@ -525,7 +739,7 @@ specification), a list of tagged and/or untagged instantiators (added as
 a global specification), a cons of a locale and instantiator or locale
 and instantiator list, a list of such conses, or nearly any other
 reasonable form.  More specifically, @var{value} can be anything
-accepted by @code{canonicalize-spec-list}.
+accepted by @code{canonicalize-spec-list} (described below).
 
 @var{locale}, @var{tag-set}, and @var{how-to-add} are the same as in
 @code{add-spec-to-specifier}.
@@ -538,7 +752,10 @@ specs at all in it but @code{nil} is a valid instantiator (in that case,
 adding a global instantiator and its value is @code{nil}''), or in
 strange cases where there is an ambiguity between a spec-list and an
 inst-list, etc. (The built-in specifier types are designed in such a way
-as to avoid any such ambiguities.)
+as to avoid any such ambiguities.)  For robust code,
+@code{set-specifier} should probably be avoided for specifier types
+which accept lists as instantiators (currently toolbar specifiers and
+generic specifiers).
 
 If you want to work with spec-lists, you should probably not use these
 functions, but should use the lower-level functions
@@ -601,6 +818,10 @@ specifications).
 @var{specifier-type} specifies the type of specifier that this
 @var{spec-list} will be used for.
 
+If @var{noerror} is @code{nil}, signal an error if the spec-list is
+invalid; otherwise return @code{t} for an invalid spec-list.  (Note that
+this cannot be confused with a canonical spec-list.)
+
 Canonicalizing means converting to the full form for a spec-list, i.e.
 @code{((@var{locale} (@var{tag-set} . @var{instantiator}) ...) ...)}.
 This function accepts a possibly abbreviated specification or a list of
@@ -612,8 +833,59 @@ This function tries extremely hard to resolve any ambiguities,
 and the built-in specifier types (font, image, toolbar, etc.) are
 designed so that there won't be any ambiguities.
 
-If @var{noerror} is @code{nil}, signal an error if the spec-list is
-invalid; otherwise return @code{t}.
+The canonicalization algorithm is as follows:
+
+@enumerate
+@item
+Attempt to parse @var{spec-list} as a single, possibly abbreviated,
+specification.
+@item
+If that fails, attempt to parse @var{spec-list} as a list of (abbreviated)
+specifications.
+@item
+If that fails, @var{spec-list} is invalid.
+@end enumerate
+
+A possibly abbreviated specification @var{spec} is parsed by
+
+@enumerate
+@item
+Attempt to parse @var{spec} as a possibly abbreviated inst-list.
+@item
+If that fails, attempt to parse @var{spec} as a cons of a locale and an
+(abbreviated) inst-list.
+@item
+If that fails, @var{spec} is invalid.
+@end enumerate
+
+A possibly abbreviated inst-list @var{inst-list} is parsed by
+
+@enumerate
+@item
+Attempt to parse @var{inst-list} as a possibly abbreviated inst-pair.
+@item
+If that fails, attempt to parse @var{inst-list} as a list of (abbreviated)
+inst-pairs.
+@item
+If that fails, @var{inst-list} is invalid.
+@end enumerate
+
+A possibly abbreviated inst-pair @var{inst-pair} is parsed by
+
+@enumerate
+@item
+Check if @var{inst-pair} is @code{valid-instantiator-p}.
+@item
+If not, check if @var{inst-pair} is a cons of something that is a tag, ie,
+@code{valid-specifier-tag-p}, and something that is @code{valid-instantiator-p}.
+@item
+If not, check if @var{inst-pair} is a cons of a list of tags and something that
+is @code{valid-instantiator-p}.
+@item
+Otherwise, @var{inst-pair} is invalid.
+@end enumerate
+
+In summary, this function generally prefers more abbreviated forms.
 @end defun
 
 @node Retrieving Specifications
@@ -775,7 +1047,7 @@ This function returns the predicate for the given specifier tag.
 @section Functions for Instancing a Specifier
 
 @defun specifier-instance specifier &optional domain default no-fallback
-This function instantiates @var{specifier} (return its value) in
+This function instantiates @var{specifier} (returns its value) in
 @var{domain}.  If no instance can be generated for this domain, return
 @var{default}.
 
@@ -829,6 +1101,34 @@ returned value will be a font-instance object.  For images, the returned
 value will be a string, pixmap, or subwindow.
 @end defun
 
+@defun specifier-matching-instance specifier matchspec &optional domain default no-fallback
+This function returns an instance for @var{specifier} in @var{domain}
+that matches @var{matchspec}.  If no instance can be generated for
+@var{domain}, return @var{default}.
+
+This function is identical to @code{specifier-instance} except that a
+specification will only be considered if it matches @var{matchspec}.
+The definition of ``match,'' and allowed values for @var{matchspec}, are
+dependent on the particular type of specifier.  Here are some examples:
+
+@itemize
+@item
+For chartable (e.g. display table) specifiers, @var{matchspec} should be a
+character, and the specification (a chartable) must give a value for
+that character in order to be considered.  This allows you to specify,
+@emph{e.g.}, a buffer-local display table that only gives values for particular
+characters.  All other characters are handled as if the buffer-local
+display table is not there. (Chartable specifiers are not yet
+implemented.)
+@item
+For font specifiers, @var{matchspec} should be a charset,
+and the specification (a font string) must have
+a registry that matches the charset's registry.  (This only makes sense
+with Mule support.)  This makes it easy to choose a font that can
+display a particular character.  (This is what redisplay does, in fact.)
+@end itemize
+@end defun
+
 @defun specifier-instance-from-inst-list specifier domain inst-list &optional default
 This function attempts to convert a particular inst-list into an
 instance.  This attempts to instantiate @var{inst-list} in the given
@@ -838,8 +1138,8 @@ In most circumstances, you should not use this function; use
 @code{specifier-instance} instead.
 @end defun
 
-@node Specifier Example
-@section Example of Specifier Usage
+@node Specifier Examples
+@section Examples of Specifier Usage
 
 Now let us present an example to clarify the theoretical discussions we
 have been through.  In this example, we will use the general specifier
@@ -912,6 +1212,143 @@ our window is on recognizes the color @samp{moccasin}, and so the
 instantiation method succeeds and returns a color instance.
 @end enumerate
 
+Here's another example, which implements something like GNU Emacs's
+``frame-local'' variables.
+
+@example
+;; Implementation
+
+;; There are probably better ways to write this macro
+;; Heaven help you if VAR is a buffer-local; you will become very
+;; confused.  Probably should error on that.
+(defmacro define-frame-local-variable (var)
+  "Make the unbound symbol VAR become a frame-local variable."
+  (let ((val (if (boundp var) (symbol-value var) nil)))
+    `(progn
+      (setq ,var (make-specifier 'generic))
+      (add-spec-to-specifier ,var ',val 'global))))
+
+;; I'm not real happy about this terminology, how can `setq' be a defun?
+;; But `frame-set' would have people writing "(frame-set 'foo value)".
+(defun frame-setq (var value &optional frame)
+  "Set the local value of VAR to VALUE in FRAME.
+
+FRAME defaults to the selected frame."
+  (and frame (not (framep frame))
+       (error 'invalid-argument "FRAME must be a frame", frame))
+  (add-spec-to-specifier var value (or frame (selected-frame))))
+
+(defun frame-value (var &optional frame)
+  "Get the local value of VAR in FRAME.
+
+FRAME defaults to the selected frame."
+  (and frame (not (framep frame))
+       (error 'invalid-argument "FRAME must be a frame", frame))
+  ;; this is not just a map from frames to values; it also falls back
+  ;; to the global value
+  (specifier-instance var (or frame (selected-frame))))
+
+;; for completeness
+(defun frame-set-default (var value)
+  "Set the default value of frame-local variable VAR to VALUE."
+  (add-spec-to-specifier var value 'global))
+
+(defun frame-get-default (var)
+  "Get the default value of frame-local variable VAR."
+  (car (specifier-specs var 'global)))
+@end example
+
+Now you can execute the above definitions (eg, with @code{eval-last-sexp})
+and switch to @file{*scratch*} to play.  Things will work differently if
+you already have a variable named @code{foo}.
+
+@example
+;; Usage
+
+foo
+@error{} Symbol's value as variable is void: foo
+
+(define-frame-local-variable foo)
+@result{} nil
+
+;; the value of foo is a specifier, which is an opaque object;
+;; you must use accessor functions to get values
+
+foo
+@result{} #<generic-specifier global=(nil) 0x4f5cb>
+
+;; since no frame-local value is set, the global value (which is the
+;; constant `nil') is returned
+(frame-value foo)
+@result{} nil
+
+;; get the default explicitly
+(frame-get-default foo)
+@result{} nil
+
+;; get the whole specification list
+(specifier-specs foo 'global)
+@result{} (nil)
+
+;; give foo a frame-local value
+
+(frame-setq foo 'bar)
+@result{} nil
+
+;; access foo in several ways
+
+;; Note that the print function for this kind of specifier only
+;; gives you the global setting.  To get the full list of specs for
+;; debugging or study purposes, you must use specifier-specs or
+;; specifier-spec-list.
+foo
+@result{} #<generic-specifier global=(nil) 0x4f5cb>
+
+;; get the whole specification list
+(specifier-specs foo)
+@result{} ((#<x-frame "Message" 0x1bd66> (nil . bar)) (global (nil)))
+
+;; get the frame-local value
+(frame-value foo)
+@result{} bar
+
+;; get the default explicitly
+(frame-get-default foo)
+@result{} nil
+
+;; Switch to another frame and evaluate:
+;; C-x 5 o M-: (frame-setq foo 'baz) RET M-: (frame-value foo) RET
+@result{} baz
+
+;; Switch back.
+;; C-x 5 o
+(specifier-specs foo)
+@result{} ((#<x-frame "emacs" 0x28ec> (nil . baz))
+    (#<x-frame "Message" 0x1bd66> (nil . bar))
+    (global (nil)))
+
+(frame-value foo)
+@result{} bar
+
+(frame-get-default foo)
+@result{} nil
+@end example
+
+Note that since specifiers generalize both frame-local and buffer-local
+variables in a sensible way, XEmacs is not likely to put a high priority
+on implementing frame-local variables.
+@c Thanks to Jerry James for the following explanation.  He is not
+@c responsible for its use here, Stephen Turnbull is.
+In fact, some developers think that frame-local variables are evil for
+the same reason that buffer-local variables are evil: the declaration is
+both global and invisible.  That is, you cannot tell whether a variable
+is ``normal,'' buffer-local, or frame-local just by looking at it.  So
+if you have namespace management problems, and some other Lisp package
+happens to use a variable name that you already declared frame- or
+buffer-local, weird stuff happens, and it is extremely hard to track
+down.
+
+
 @node Creating Specifiers
 @section Creating New Specifier Objects
 
@@ -943,16 +1380,20 @@ functions @code{make-generic-specifier}, @code{make-integer-specifier},
 @end defun
 
 @defun make-specifier-and-init type spec-list &optional dont-canonicalize
-This function creates and initialize a new specifier.
+This function creates and initializes a new specifier.
 
-This is a front-end onto @code{make-specifier} that allows you to create
+This is a convenience API combining @code{make-specifier} and
+@code{set-specifier} that allows you to create
 a specifier and add specs to it at the same time.  @var{type} specifies
-the specifier type.  @var{spec-list} supplies the specification(s) to be
-added to the specifier. Normally, almost any reasonable abbreviation of
-the full spec-list form is accepted, and is converted to the full form;
-however, if optional argument @var{dont-canonicalize} is non-@code{nil},
-this conversion is not performed, and the @var{spec-list} must already
-be in full form.  See @code{canonicalize-spec-list}.
+the specifier type.  Allowed types are as for @code{make-specifier}.
+
+@var{spec-list} supplies the specification(s) to be
+added to the specifier.  Any abbreviation of
+the full spec-list form accepted by @code{canonicalize-spec-list} may
+be used.
+However, if the optional argument @var{dont-canonicalize} is non-@code{nil},
+canonicalization is not performed, and the @var{spec-list} must already
+be in full form.
 @end defun
 
 @defun make-integer-specifier spec-list
@@ -1137,12 +1578,15 @@ instantiator's tag set for the instantiator to be removed.
 This function applies @var{func} to the specification(s) for
 @var{locale} in @var{specifier}.
 
-If @var{locale} is a locale, @var{func} will be called for that locale.
+If optional @var{locale} is a locale, @var{func} will be called for that
+locale.
 If @var{locale} is a locale type, @var{func} will be mapped over all
 locales of that type.  If @var{locale} is @code{nil} or the symbol
 @code{all}, @var{func} will be mapped over all locales in
 @var{specifier}.
 
+Optional @var{ms-maparg} will be passed to @var{ms-func}.
+
 @var{func} is called with four arguments: the @var{specifier}, the
 locale being mapped over, the inst-list for that locale, and the
 optional @var{maparg}.  If any invocation of @var{func} returns
@@ -1154,4 +1598,3 @@ value returned from @code{map-specifier}.  Otherwise,
 @defun specifier-locale-type-from-locale locale
 Given a specifier @var{locale}, this function returns its type.
 @end defun
-
index a8ce727..0af08d0 100644 (file)
@@ -239,6 +239,13 @@ only for program-generated buffers.)  The users will find Emacs more
 coherent if all libraries use the same conventions.
 
 @item
+Use names starting with a space for temporary buffers (@pxref{Buffer
+Names}), or at least call @code{buffer-disable-undo} on them.  Otherwise
+they may stay referenced by internal undo variable(s) after getting
+killed.  If this happens before dumping (@pxref{Building XEmacs}), this
+may cause fatal error when portable dumper is used.
+
+@item
 Indent each function with @kbd{C-M-q} (@code{indent-sexp}) using the
 default indentation parameters.
 
@@ -488,7 +495,7 @@ at that point.  For example:
 @end group
 @end smallexample
 
-Every function that has no documentation string (because it is use only
+Every function that has no documentation string (because it is used only
 internally within the package it belongs to), should have instead a
 two-semicolon comment right before the function, explaining what the
 function does and how to call it properly.  Explain precisely what each
index e7ab517..a801ba7 100644 (file)
@@ -93,7 +93,7 @@ M-x describe variable
 
 After you type any of the above commands, you will be prompted for a
 variable name in the @dfn{echo area}. Type in the name of the variable,
-for example, type  @var{case-fold-search} @key{RET}
+for example, type  @code{case-fold-search} @key{RET}
 Your window will split into two and you will see the following message
 in that window:
 
@@ -219,9 +219,9 @@ the left margin or in the line's indentation:
 @end example
 
 @noindent
-The value of the variable @var{c-tab-always-indent} is usually @samp{t}
+The value of the variable @code{c-tab-always-indent} is usually @samp{t}
 for @samp{true}. When this variable is true, then hitting the @key{TAB}
-key always indents the current line. 
+key always indents the current line.
 
 @item
 This expression will turn on the @var{auto-fill-mode} when you are in
@@ -233,7 +233,7 @@ text mode:
 
 This mode will automatically break lines when you type a space so that
 the lines don't become too long. The length of the lines is controlled
-by the variable @var{fill-column}. You can set this variable to a value
+by the variable @code{fill-column}. You can set this variable to a value
 you wish. Look at the documentation for this variable to see its default
 value. To change the value to 75 for example, use:
 
@@ -383,7 +383,7 @@ will not be highlighted.
 
 @item 
 To control the number of buffers listed when you select the @b{Buffers}
-menu, you need to set the variable @var{buffers-menu-max-size} to
+menu, you need to set the variable @code{buffers-menu-max-size} to
 whatever value you wish. For example, if you want 20 buffers to be listed
 when you select @b{Buffers} use:
 
@@ -419,7 +419,7 @@ If you want an extensive menu-bar use the following expression in your
 @noindent
 If you want to write your own menus, you can look at some of the
 examples in
-@file{/usr/local/lib/xemacs-VERSION/lisp/packages/big-menubar.el} file.
+@file{/usr/local/lib/xemacs/xemacs-packages/lisp/edit-utils/big-menubar.el} file.
 
 @end itemize
 
index 1cfd3bf..9b68029 100644 (file)
@@ -49,7 +49,7 @@ prompts you for a file, it uses the default-directory unless you specify
 a directory. You can see what the default directory of the current
 buffer is by using the @b{Describe Variable} option from the @b{Help}
 menu. When Emacs prompts you for the variable name to describe, type
-@var{default-directory}. If you wish to open a file in some other
+@code{default-directory}. If you wish to open a file in some other
 directory, use @key{DEL} or the @key{BackSpace} key to go back and type
 the path name of the new directory.
 
@@ -201,7 +201,7 @@ saved by reading the text from the file again (called
 
 @vindex make-backup-files
    When you save a file in Emacs, it destroys its old contents. However,
-if you set the variable @var{make-backup-files} to non-@code{nil}
+if you set the variable @code{make-backup-files} to non-@code{nil}
 i.e. @samp{t}, Emacs will create a @dfn{backup} file. Select the
 @b{Describe variable} option from the @b{Help} menu and look at the
 documentation for this variable. Its default value should be
index d4cc7f6..70b321a 100644 (file)
@@ -11,7 +11,7 @@ complete typing the whole string. All searches in Emacs ignore the case
 of the text they are searching, i.e. if you are searching for "String",
 then "string" will also be one of the selections. If you want a case
 sensitive search select the @b{Case Sensitive Search} from the
-@b{Option} menu. You can also set the variable @var{case-fold-search} to
+@b{Option} menu. You can also set the variable @code{case-fold-search} to
 @code{nil} for making searches case-sensitive. For information on setting
 variables, @xref{Setting Variables}. The two commands for searching for
 strings in XEmacs are:
index a56aca7..8f8b3eb 100644 (file)
@@ -7,9 +7,9 @@
 @finalout
 @titlepage
 @title XEmacs FAQ
-@subtitle Frequently asked questions about XEmacs @* Last Modified: $Date: 2003/05/02 06:00:43 $
+@subtitle Frequently asked questions about XEmacs @* Last Modified: $Date: 2003/10/09 19:16:02 $
 @sp 1
-@author Tony Rossini <rossini@@biostat.washington.edu>
+@author Tony Rossini <rossini@@u.washington.edu>
 @author Ben Wing <ben@@xemacs.org>
 @author Chuck Thompson <cthomp@@xemacs.org>
 @author Steve Baur <steve@@xemacs.org>
@@ -1430,24 +1430,18 @@ you don't use.  @emph{Nothing bad will happen if you delete a package
 that you do not use}.  You must be sure you do not use it though, so be
 conservative at first.
 
-Possible candidates for deletion include w3, games, hyperbole, mh-e,
-hm-html-menus, vm, viper, oobr, gnus, etc.  Ask yourself, @emph{Do I
-ever want to use this package?}  If the answer is no, then it is a
-candidate for removal.
+Any package with the possible exceptions of xemacs-base, and EFS are
+candidates for removal.  Ask yourself, @emph{Do I ever want to use this
+package?}  If the answer is no, then it is a candidate for removal.
 
 First, gzip all the .el files.  Then go about package by package and
 start gzipping the .elc files.  Then run XEmacs and do whatever it is
-you normally do.  If nothing bad happens, then delete the directory.  Be
-conservative about deleting directories, and it would be handy to have a
-backup around in case you get too zealous.
+you normally do.  If nothing bad happens, then remove the package.  You
+can remove a package via the PUI interface 
+(@code{M-x pui-list-packages}, then press @kbd{d} to mark the packages
+you wish to delete, and then @kbd{x} to delete them.
 
-@file{prim}, @file{modes}, @file{packages}, and @file{utils} are four
-directories you definitely do @strong{not} want to delete, although
-certain packages can be removed from them if you do not use them.
-
-Online texinfo sources in the @file{info} can either be compressed them
-or remove them.  In either case, @kbd{C-h i} (info mode) will no longer
-work.
+Another method is to do @code{M-x package-get-delete-package}.
 
 @node Q2.0.3, Q2.0.4, Q2.0.2, Installation
 @unnumberedsubsec Q2.0.3: Compiling XEmacs with Netaudio.
@@ -1944,7 +1938,7 @@ file @file{XKeysymDB}.
 The binary cannot find the @file{XKeysymDB} file.  The location is
 hardcoded at compile time so if the system the binary was built on puts
 it a different place than your system does, you have problems.  To fix,
-set the environment variable @var{XKEYSYMDB} to the location of the
+set the environment variable @code{XKEYSYMDB} to the location of the
 @file{XKeysymDB} file on your system or to the location of the one
 included with XEmacs which should be at
 @iftex
@@ -1957,7 +1951,7 @@ The binary is finding the XKeysymDB but it is out-of-date on your system
 and does not contain the necessary lines.  Either ask your system
 administrator to replace it with the one which comes with XEmacs (which
 is the stock R6 version and is backwards compatible) or set your
-@var{XKEYSYMDB} variable to the location of XEmacs's described above.
+@code{XKEYSYMDB} variable to the location of XEmacs's described above.
 @end itemize
 
 @node Q2.1.4, Q2.1.5, Q2.1.3, Installation
@@ -1993,7 +1987,7 @@ The buffer still exists; it just isn't in your face.
 
 Help!  I can not get XEmacs to display on my Envizex X-terminal!
 
-Try setting the @var{DISPLAY} variable using the numeric IP address of
+Try setting the @code{DISPLAY} variable using the numeric IP address of
 the host you are running XEmacs from.
 
 @node Q2.1.6, Q2.1.7, Q2.1.5, Installation
@@ -3762,9 +3756,8 @@ For an extensive menubar, add this line to your @file{init.el}/@file{.emacs}:
 @end lisp
 
 If you'd like to write your own, this file provides as good a set of
-examples as any to start from.  The file is located in
-@file{lisp/packages/big-menubar.el} in the XEmacs installation
-directory.
+examples as any to start from.  The file is located in edit-utils
+package. 
 
 @node Q3.8.3, Q3.8.4, Q3.8.2, Customization
 @unnumberedsubsec Q3.8.3: How do I control how many buffers are listed in the menu @code{Buffers List}?
@@ -4546,6 +4539,14 @@ Don't let the installation procedure & instructions stop you from trying
 this package out---it's much simpler than it looks, and once installed,
 trivial to use.
 
+@email{youngs@@xemacs.org, Steve Youngs} writes:
+
+@quotation
+All the major Emacs Lisp based MUAs (Gnus, MH-E, and VM) all do their
+own thing when it comes to MIME so you won't need TM to get MIME support
+in these packages.
+@end quotation
+
 @node Q4.3.3, Q4.3.4, Q4.3.2, Subsystems
 @unnumberedsubsec Q4.3.3: Why isn't this @code{movemail} program working?
 
@@ -5903,7 +5904,9 @@ document?
 
 The package @code{ps-print}, which is now included with XEmacs, provides
 the ability to do this.  The source code contains complete instructions
-on its use, in @file{<xemacs_src_root>/lisp/packages/ps-print.el}.
+on its use, in
+@file{$prefix/lib/xemacs/xemacs-packages/lisp/ps-print/ps-print.el},
+being the default location of an installed ps-print package.
 
 @node Q5.3.4, Q5.3.5, Q5.3.3, Miscellaneous
 @unnumberedsubsec Q5.3.4: Getting @kbd{M-x lpr} to work with postscript printer.
index 183abd7..5aeef5d 100644 (file)
@@ -2106,7 +2106,7 @@ run both variants.
 Starting with XEmacs 21, XEmacs uses the class @samp{XEmacs} if it finds
 any XEmacs resources in the resource database when the X connection is
 initialized.  Otherwise, it will use the class @samp{Emacs} for
-backwards compatibility.  The variable @var{x-emacs-application-class}
+backwards compatibility.  The variable @code{x-emacs-application-class}
 may be consulted to determine the application class being used.
 
 The examples in this section assume the application class is @samp{Emacs}.
index 32adac7..5696ebe 100644 (file)
@@ -20,7 +20,6 @@ local needs with safe removal of unnecessary code.
 * Installing Packages:: How to install packages.
 * Building Packages::   Building packages from CVS sources.
 * Local.rules File::    This is an important file that you must create.
-* Creating Packages::   The basics.
 * Available Packages::  A brief directory of packaged LISP.
 @end menu
 
@@ -32,13 +31,13 @@ local needs with safe removal of unnecessary code.
 There are two main flavors of packages.
 
 @itemize @bullet
-@item
+@item 
 Regular Packages
 @cindex regular packages
 A regular package is one in which multiple files are involved and one
 may not in general safely remove any of them.
 
-@item
+@item 
 Single-File Packages
 @cindex single-file packages
 A single-file package is an aggregate collection of thematically
@@ -70,6 +69,7 @@ savings).
 
 Currently, source packages are only available via CVS.  See
 @url{http://cvs.xemacs.org/} for details.
+
 @node Installing Packages, Building Packages, Package Terminology, Packages
 @comment  node-name,  next,  previous,  up
 @cindex installing packages
@@ -95,7 +95,7 @@ where you grabbed the core distribution from, and are located in the
 subdirectory @file{packages}.  Package file names follow
 the naming convention @file{<package-name>-<version>-pkg.tar.gz}.
 
-If you have @ref{(EFS)}, packages can be installed over the network.
+If you have EFS @ref{(EFS)}, packages can be installed over the network.
 Alternatively, if you have copies of the packages locally, you can
 install packages from a local disk or CDROM.
 
@@ -107,13 +107,13 @@ are installed, using the visual package browser and installer.  You can
 access it via the menus:
 
 @example
-        Tools -> Packages -> List and Install
+Tools -> Packages -> List and Install
 @end example
 
 Or, you can get to it via the keyboard:
 
 @example
-M-x pui-list-packages
+@code{M-x pui-list-packages}
 @end example
 
 Hint to system administrators of multi-user systems: it might be a good
@@ -125,10 +125,10 @@ using the @code{package-get-package-provider} function. Eg., if you know
 that you need @code{thingatpt}, type:
 
 @example
-M-x package-get-package-provider RET thingatpt
+@code{M-x package-get-package-provider RET thingatpt}
 @end example
 
-which will return something like (fsf-compat "1.08"). You can the use
+which will return something like @samp{(fsf-compat "1.08")}. You can the use
 one of the methods above for installing the package you want.
 
 @subsection XEmacs and Installing Packages
@@ -136,80 +136,18 @@ one of the methods above for installing the package you want.
 There are three main ways to install packages:
 
 @menu
-* Sumo::              All at once, using the 'Sumo Tarball'.
-* Manually::          Using individual package tarballs.
 * Automatically::     Using the package tools from XEmacs.
+* Manually::          Using individual package tarballs.
+* Sumo::              All at once, using the 'Sumo Tarball'.
 * Which Packages::    Which packages to install.
 * Removing Packages:: Removing packages.
 @end menu
 
 But regardless of the method you use to install packages, they can only
-be used by XEmacs after a restart.
-
-@node Sumo, Manually, ,Installing Packages
-@comment  node-name,  next,  previous,  up
-@cindex sumo package install
-@heading Installing the Sumo Packages:
-Those with little time, cheap connections and plenty of disk space can
-install all the packages at once using the sumo tarballs.
-Download the file: @file{xemacs-sumo.tar.gz}
-
-For an XEmacs compiled with Mule you also need: @file{xemacs-mule-sumo.tar.gz}
-
-N.B. They are called 'Sumo Tarballs' for good reason. They are
-currently about 19MB and 4.5MB (gzipped) respectively.
-
-Install them by:
-
-@code{cd $prefix/lib/xemacs ; gunzip -c <tarballname> | tar xvf - RET}
-
-Or, if you have GNU tar:
-
-@code{cd $prefix/lib/xemacs ; tar zxvf /path/to/<tarballname> RET}
+be used by XEmacs after a restart unless the package in question has not
+been previously installed.
 
-As the Sumo tarballs are not regenerated as often as the individual
-packages, it is recommended that you use the automatic package tools
-afterwards to pick up any recent updates.
-
-@node Manually, Automatically, Sumo, Installing Packages
-@comment  node-name,  next,  previous,  up
-@cindex manual package install
-@heading Manual Package Installation:
-Fetch the packages from the FTP site, CD-ROM whatever. The filenames
-have the form @file{name-<version>-pkg.tar.gz} and are gzipped tar files. For
-a fresh install it is sufficient to untar the file at the top of the
-package hierarchy. 
-
-Note: If you are upgrading packages already installed, it's best to
-remove the old package first @ref{Removing Packages}.
-
-For example if we are installing the @file{xemacs-base}
-package (version 1.48):
-
-@example
-   mkdir $prefix/lib/xemacs/xemacs-packages RET # if it does not exist yet
-   cd $prefix/lib/xemacs/xemacs-packages RET
-   gunzip -c /path/to/xemacs-base-1.48-pkg.tar.gz | tar xvf - RET
-
-Or if you have GNU tar, the last step can be:
-
-   tar zxvf /path/to/xemacs-base-1.48-pkg.tar.gz RET
-@end example
-
-For MULE related packages, it is best to untar into the mule-packages
-hierarchy, i.e. for the @file{mule-base} package, version 1.37:
-
-@example
-   mkdir $prefix/lib/xemacs/mule-packages RET # if it does not exist yet
-   cd $prefix/lib/xemacs/mule-packages RET
-   gunzip -c /path/to/mule-base-1.37-pkg.tar.gz | tar xvf - RET
-
-Or if you have GNU tar, the last step can be:
-
-   tar zxvf /path/to/mule-base-1.37-pkg.tar.gz RET
-@end example
-
-@node Automatically, Which Packages ,Manually, Installing Packages
+@node Automatically, Manually, ,Installing Packages
 @comment  node-name,  next,  previous,  up
 @cindex automatic package install
 @cindex package tools
@@ -229,33 +167,31 @@ you need are:
 
 and optionally:
 
-   mule-base    - Needed if you want to use XEmacs with MULE.
+   mailcrypt    - To do PGP verification of the @file{package-index}
+                  file. 
 @end example
 
 After installing these by hand, fire up XEmacs and follow these
 steps.
 
 @enumerate 1
-@item
+@item 
 Choose a download site.
-via menu: Tools -> Packages -> Add Download Site 
+via menu: Tools -> Packages -> Set Download Site 
 via keyb: @code{M-x customize-variable RET package-get-remote RET}
 (put in the details of remote host and directory)
 
 If the package tarballs _AND_ the package-index file are in a
-local directory, you can: @code{M-x pui-add-install-directory RET}
+local directory, you can: @code{M-x pui-set-local-package-get-directory RET}
 
-@item
+@item 
 Obtain a list of packages and display the list in a buffer named
 @file{*Packages*}.
 menu: Tools -> Packages -> List & Install
 keyb: @code{M-x pui-list-packages RET}
 
 XEmacs will now connect to the remote site and download the
-latest package-index file.  If you see an error about the
-package-index entries not being PGP signed, you can safely
-ignore this because PGP has not been integrated into the XEmacs
-package tools yet.
+latest package-index file.
 
 The visual package browser will then display a list of all packages.
 Help information will be displayed at the very bottom of the buffer; you
@@ -278,7 +214,7 @@ installed and is up to date.
 
 From here, you can select or unselect packages for installation using
 the @key{RET} key, the @kbd{Mouse-2} button or selecting "Select" from
-the (Popup) Menu.
+the Popup @kbd{Mouse-3} Menu.
 Once you've finished selecting the packages, you can
 press the @kbd{x} key (or use the menu) to actually install the
 packages. Note that you will have to restart XEmacs for XEmacs to
@@ -307,15 +243,17 @@ Kill the package buffer.
 @end table
 
 Moving the mouse over a package will also cause additional information
-about the package to be displayed in the minibuffer.
+about the package to be displayed in the minibuffer.  If you have
+balloon-help enabled a balloon-help frame will pop up and display
+additional package information also.
 
 
-@item
+@item 
 Choose the packages you wish to install.
 mouse: Click button 2 on the package name.
  keyb: @kbd{RET} on the package name
 
-@item
+@item 
 Make sure you have everything you need.
 menu: Packages -> Add Required
 keyb: @kbd{r}
@@ -327,7 +265,7 @@ those packages also.
 For novices and gurus alike, this step can save your bacon.
 It's easy to forget to install a critical package.
 
-@item
+@item 
 Download and install the packages.
 menu: Packages -> Install/Remove Selected
 keyb: @kbd{x}
@@ -343,7 +281,81 @@ Enter the name of the package (e.g., @code{prog-modes}), and XEmacs
 will search for the latest version and install it and any packages that
 it depends upon.
 
-@node Which Packages, Removing Packages, Automatically, Installing Packages
+@heading Keeping Packages Up To Date:
+Once you have the packages you want installed (using any of the above
+methods) you'll want to keep them up to date.  You can do this easily
+from the menubar:
+
+@example
+Tools -> Packages -> Set Download Site
+Tools -> Packages -> Update Installed Packages
+@end example
+
+
+@node Manually, Sumo, Automatically, Installing Packages
+@comment  node-name,  next,  previous,  up
+@cindex manual package install
+@heading Manual Package Installation:
+Fetch the packages from the FTP site, CD-ROM whatever. The filenames
+have the form @file{name-<version>-pkg.tar.gz} and are gzipped tar files. For
+a fresh install it is sufficient to untar the file at the top of the
+package hierarchy. 
+
+Note: If you are upgrading packages already installed, it's best to
+remove the old package first @ref{Removing Packages}.
+
+For example if we are installing the @file{xemacs-base}
+package (version 1.48):
+
+@example
+   mkdir $prefix/lib/xemacs/xemacs-packages RET # if it does not exist yet
+   cd $prefix/lib/xemacs/xemacs-packages RET
+   gunzip -c /path/to/xemacs-base-1.48-pkg.tar.gz | tar xvf - RET
+
+Or if you have GNU tar, the last step can be:
+
+   tar zxvf /path/to/xemacs-base-1.48-pkg.tar.gz RET
+@end example
+
+For MULE related packages, it is best to untar into the mule-packages
+hierarchy, i.e. for the @file{mule-base} package, version 1.37:
+
+@example
+   mkdir $prefix/lib/xemacs/mule-packages RET # if it does not exist yet
+   cd $prefix/lib/xemacs/mule-packages RET
+   gunzip -c /path/to/mule-base-1.37-pkg.tar.gz | tar xvf - RET
+
+Or if you have GNU tar, the last step can be:
+
+   tar zxvf /path/to/mule-base-1.37-pkg.tar.gz RET
+@end example
+
+@node Sumo, Which Packages, Manually, Installing Packages
+@comment  node-name,  next,  previous,  up
+@cindex sumo package install
+@heading Installing the Sumo Packages:
+Those with little time, cheap connections and plenty of disk space can
+install all the packages at once using the sumo tarballs.
+Download the file: @file{xemacs-sumo.tar.gz}
+
+For an XEmacs compiled with Mule you also need: @file{xemacs-mule-sumo.tar.gz}
+
+N.B. They are called 'Sumo Tarballs' for good reason. They are
+currently about 19MB and 4.5MB (gzipped) respectively.
+
+Install them by:
+
+@code{cd $prefix/lib/xemacs ; gunzip -c <tarballname> | tar xvf - RET}
+
+Or, if you have GNU tar:
+
+@code{cd $prefix/lib/xemacs ; tar zxvf /path/to/<tarballname> RET}
+
+As the Sumo tarballs are not regenerated as often as the individual
+packages, it is recommended that you use the automatic package tools
+afterwards to pick up any recent updates.
+
+@node Which Packages, Removing Packages, Sumo, Installing Packages
 @comment  node-name,  next,  previous,  up
 @cindex which packages
 @cindex choosing packages
@@ -354,7 +366,7 @@ everything. A good minimal set of packages for XEmacs-latin1 would be
 
 xemacs-base, xemacs-devel, c-support, cc-mode, debug, dired, efs,
 edit-utils, fsf-compat, mail-lib, net-utils, os-utils, prog-modes,
-text-modes, time
+text-modes, time, mailcrypt
 
 If you are using the XEmacs package tools, don't forget to do:
 
@@ -402,7 +414,7 @@ Currently, source packages are only available via anonymous CVS.  See
 @item GNU make 
 (3.75 or later preferred).
 @item makeinfo 
-(1.68 from texinfo-3.11 or later required).
+(4.2 from GNU texinfo 4.2 or later required).
 @item GNU tar
 (or equivalent).
 @item GNU gzip
@@ -418,52 +430,10 @@ The packages CVS sources are most useful for creating XEmacs package
 tarballs for installation into your own XEmacs installations or for
 distributing to others.
 
-Supported operations from @file{make} are:
-
-@table @code
-@item all
-Bytecompile all files, build and bytecompile byproduct files like
-@file{auto-autoloads.el} and @file{custom-load.el}.  Create info version
-of TeXinfo documentation if present.
-
-@item bindist
-Does a @code{make all} as well as create a binary package tarball in the
-staging directory.
-
-@item install
-Bytecompile all files, build and bytecompile byproduct files like
-@file{auto-autoloads.el} and @file{custom-load.el}.  Create info version
-of TeXinfo documentation if present.  And install everything into the
-staging directory.
-
-@item srckit
-Usually aliased to @code{srckit-std}.  This does a @code{make
-distclean} and creates a package source tarball in the staging
-directory.  This is generally only of use for package maintainers.
-
-@item binkit
-May be aliased to @code{binkit-sourceonly}, @code{binkit-sourceinfo},
-@code{binkit-sourcedata}, or
-@code{binkit-sourcedatainfo}. @code{sourceonly} indicates there is
-nothing to install in a data directory or info directory.
-@code{sourceinfo} indicates that source and info files are to be
-installed.  @code{sourcedata} indicates that source and etc (data) files
-are to be installed.  @code{sourcedatainfo} indicates source, etc
-(data), and info files are to be installed.  A few packages have needs
-beyond the basic templates so this is not yet complete.
-
-@item dist
-Runs the rules @code{srckit} followed by @code{binkit}.  This is
-primarily of use by XEmacs maintainers producing files for distribution.
-
-@item clean
-Remove all built files except @file{auto-autoloads.el} and @file{custom-load.el}.
-
-@item distclean
-Remove all created files.
-@end table
+For a list and description of the different @file{Makefile} targets,
+@xref{Makefile Targets,,,lispref}.
 
-@node Local.rules File, Creating Packages, Building Packages, Packages
+@node Local.rules File, Available Packages, Building Packages, Packages
 @comment  node-name,  next,  previous,  up
 @cindex local.rules
 @heading The Local.rules File:
@@ -472,201 +442,10 @@ the top level of the CVS module, @file{packages}, contains the
 file, @file{Local.rules.template}.  Simply copy that to
 @file{Local.rules} and edit it to suit your needs.
 
-These are the variables in 'Local.rules' that you will need to
-address. Items that have default settings have those defaults shown. 
-
-@table @var
-@item XEMACS = xemacs
-If your XEmacs isn't in your path, change this.  Native MS Windows users
-should double quote this if the path has embedded spaces.
-
-@item BUILD_WITHOUT_MULE =
-Building from CVS defaults to building the Mule
-packages.  Set this to 't' if you don't want/have Mule
-
-@item XEMACS_NATIVE_NT =
-Set this to 't' if you are building on WinNT.  NT users should note that
-you still need the Cygwin environment to build the packages.
-
-@item XEMACS_INSTALLED_PACKAGES_ROOT = /usr/local/lib/xemacs
-This is the directory tree under which the installed packages go.  Under
-this directory there would normally be @file{xemacs-packages/} for
-standard (non-Mule) packages, @file{mule-packages/} for Mule packages
-(if you built XEmacs with Mule), and possibly @file{site-packages/} for
-3rd party packages that aren't distributed by XEmacs.org.
-
-@item symlink = 
-Set this to 't' if you want to do a "run in place".
-Setting this doesn't work well with 'make bindist'
-
-@item NONMULE_INSTALLED_PACKAGES_ROOT = $@{XEMACS_INSTALLED_PACKAGES_ROOT@}/xemacs-packages
-This is where the non-Mule packages are installed to.  You probably
-don't want to change this.
-
-@item MULE_INSTALLED_PACKAGES_ROOT = $@{XEMACS_INSTALLED_PACKAGES_ROOT@}/mule-packages
-This is where the Mule packages are installed to.  You probably don't
-want to change this.  Please note that @code{make bindist} does
-@emph{not} use this variable.  When doing a @code{make bindist}
-@emph{everything} goes into @var{NONMULE_INSTALLED_PACKAGES_ROOT}.
-
-@item NONMULE_PACKAGES = xemacs-packages
-This is where you set the non-Mule packages that you want to install. eg:
-@example
-      XEMACS_PACKAGES = xemacs-packages/xemacs-base xemacs-packages/bbdb
-@end example
-
-@item MULE_PACKAGES = mule-packages
-Same as for 'XEMACS_PACKAGES' except you list the Mule
-packages you want to install here. eg:
-@example
-      MULE_PACKAGES = mule-packages/mule-base mule-packages/skk
-@end example
-
-@item PACKAGE_INDEX = package-index
-If you want the package-index file to have a different
-name, change this.
+For a complete discussion of the @file{Local.rules} file,
+@xref{Local.rules File,,,lispref}.
 
-@item INSTALL = install -c
-The path to your BSD compatible install program.
-
-@item TAR = tar
-The path to your tar program
-
-@item BZIP2 =
-If you want bzip2 tarballs, set this.
-
-@item MAKEINFO = makeinfo
-The path to your makeinfo program
-@end table
-
-
-@node Creating Packages, Available Packages, Local.rules File, Packages
-@comment  node-name,  next,  previous,  up
-@cindex creating packages
-@heading Creating Packages:
-Creating a package from an existing Lisp library is not very difficult.
-
-In addition to the Lisp libraries themselves, you need a
-@file{package-info.in} file and a simple @file{Makefile}.  The rest is
-done by @file{XEmacs.rules}, part of the packaging system
-infrastructure.
-
-@file{package-info.in} contains a single Lisp form like this:
-
-@example
-(name                               ; your package's name
-  (standards-version 1.1
-   version VERSION
-   author-version AUTHOR_VERSION
-   date DATE
-   build-date BUILD_DATE
-   maintainer MAINTAINER
-   distribution xemacs              ; change to "mule" if MULE is needed
-   priority high
-   category CATEGORY
-   dump nil
-   description "DESCRIPTION"        ; one-line period-terminated string
-   filename FILENAME
-   md5sum MD5SUM
-   size SIZE
-   provides (feature1 feature2)     ; one for every `provides' form
-   requires (REQUIRES)
-   type regular
-))
-@end example
-
-You must fill in the four commented lines.  The value of @code{name} is
-the name of your package as an unquoted symbol.  Normally it is the name
-of the main Lisp file or principal feature provided.  The allowed values
-for distribution are @code{xemacs} and @code{mule}.  Write them as
-unquoted symbols.  The @code{description} is a quoted Lisp string; use
-the usual conventions.  The first letter should be capitalized, and the
-string should end in a period.  It need not be a complete sentence
-grammatically.  The value for @code{provides} is a list of feature
-symbols (written unquoted).  All of the features provided by libraries
-in your package should be elements of this list.  Implementing an
-automatic method for generating the @file{provides} line is desirable,
-but as yet undone.
-
-The variables in upper-case are references to variables set in the
-@file{Makefile} or automatically generated.  Do not change them; they
-are automatically filled in by the build process.
-
-The remaining lines refer to implementation constants
-(@code{standards-version}), or features that are unimplemented or have
-been removed (@code{priority} and @code{dump}).  The @code{type} line is
-not normally relevant to external maintainers; the alternate value is
-@code{single-file}, which refers to packages consed up out of a number
-of single-file libraries that are more or less thematically related.  An
-example is @code{prog-modes}.  Single-file packages are basically for
-administrative convenience, and new packages should generally be created
-as regular packages.
-
-The @file{Makefile} is quite stylized.  The idea is similar to an
-@file{Imakefile} or an @code{automake} file: the complexity is hidden in
-generic rules files, in this case the @file{XEmacs.rules} include file
-in the top directory of the packages hierarchy.  Although a number of
-facilities are available for complex libraries, most simple packages'
-@file{Makefile}s contain a copyright notice, a few variable definitions,
-an include for @file{XEmacs.rules}, and a couple of standard targets.
-
-The first few @code{make} variables defined are @code{VERSION},
-@code{AUTHOR_VERSION}, @code{MAINTAINER}, @code{PACKAGE},
-@code{PKG_TYPE}, @code{REQUIRES}, and @code{CATEGORY}.  All but one were
-described in the description of @file{package-info.in}.  The last is an
-administrative grouping.  Current categories include @code{standard},
-and @code{mule}.
-
-Next, define the variable @code{ELCS}.  This contains the list of the
-byte-compiled Lisp files used by the package.  These files and their
-@file{.el} versions will be included in the binary package.  If there
-are other files (such as extra Lisp sources or an upstream
-@file{Makefile}) that are normally placed in the installed Lisp
-directory, but not byte-compiled, they can be listed as the value of
-@code{EXTRA_SOURCES}.
-
-The include is simply
-@example
-include ../../XEmacs.rules
-@end example
-
-The standard targets follow.  These are
-
-@example
-all:: $(ELCS) auto-autoloads.elc
-
-srckit: srckit-alias
-
-binkit: binkit-alias
-@end example
-
-Other targets (such as Texinfo sources) may need to be added as
-dependencies for the @code{all} target.  Dependencies for @code{srckit}
-and @code{binkit} (that is, values for @var{srckit-alias} and
-@var{binkit-alias}) are defined in @file{XEmacs.rules}.  The most useful
-of these values are given in the following table.
-
-@table @var
-@item srckit-alias
-Usually set to @code{srckit-std}.
-
-@item binkit-alias
-May be set to @code{binkit-sourceonly}, @code{binkit-sourceinfo},
-@code{binkit-sourcedata}, or
-@code{binkit-sourcedatainfo}.  @code{sourceonly} indicates there is
-nothing to install in a data directory or info directory.
-@code{sourceinfo} indicates that source and info files are to be
-installed.  @code{sourcedata} indicates that source and etc (data) files
-are to be installed.  @code{sourcedatainfo} indicates source, etc
-(data), and info files are to be installed.
-@end table
-
-Data files include things like pixmaps for a package-specific toolbar,
-and are normally installed in @file{etc/@var{PACKAGE_NAME}}.  A few
-packages have needs beyond the basic templates.  See @file{XEmacs.rules}
-or a future revision of this manual for details.
-
-@node Available Packages,  , Creating Packages, Packages
+@node Available Packages,  , Local.rules File, Packages
 @comment  node-name,  next,  previous,  up
 @cindex available packages
 @cindex packages
@@ -676,7 +455,7 @@ xemacs.org and it's mirrors.  If a particular package that you are
 looking for isn't here, please send a message to the
 @email{xemacs-beta@@xemacs.org, XEmacs Beta list}.
 
-This data is up to date as of September 22, 2002.
+This data is up to date as of June 27, 2003.
 
 @subsection Normal Packages
 A very broad selection of elisp packages.
@@ -793,6 +572,9 @@ GNU Emacs compatibility files.
 @item games
 Tetris, Sokoban, and Snake.
 
+@item general-docs
+General documentation.  Presently, empty.
+
 @item gnats
 XEmacs bug reports.
 
@@ -851,13 +633,13 @@ Support for Multiple Major Modes within a single buffer.
 Miscellaneous Networking Utilities.  This is a single-file package and 
 files may be deleted at will.
 
+@item ocaml
+Objective Caml editing support.
+
 @item os-utils
 Miscellaneous single-file O/S utilities, for printing, archiving,
 compression, remote shells, etc.
 
-@item ocaml
-Objective Caml language support.
-
 @item pc
 PC style interface emulation.
 
@@ -870,6 +652,9 @@ Provides programmatic completion.
 @item perl-modes
 Perl language support.
 
+@item pgg
+Emacs interface to various PGP implementations.
+
 @item prog-modes
 Miscellaneous single-file lisp files for various programming languages.
 
@@ -982,6 +767,9 @@ An Emacs mailer.
 @item w3
 A Web browser.
 
+@item x-symbol
+Semi WYSIWYG for LaTeX, HTML, etc, using additional fonts.
+
 @item xemacs-base
 Fundamental XEmacs support.  Install this unless you wish a totally
 naked XEmacs.
index 57e965c..ca1e156 100644 (file)
@@ -4,29 +4,35 @@
 @cindex mail
 @cindex message
 
-XEmacs provides three separate mail-reading packages.  Each one comes with
-its own manual, which is included standard with the XEmacs distribution.
+XEmacs provides several mail-reading packages.  Each one comes with
+its own manual, which is included in each package.
 
 The recommended mail-reading package for new users is VM.  VM works
 with standard Unix-mail-format folders and was designed as a replacement
 for the older Rmail.
 
 XEmacs also provides a sophisticated and comfortable front-end to the
-MH mail-processing system, called @samp{mh-e}.  Unlike in other
+MH mail-processing system, called @samp{MH-E}.  Unlike in other
 mail programs, folders in MH are stored as file-system directories,
 with each message occupying one (numbered) file.  This facilitates
 working with mail using shell commands, and many other features of
 MH are also designed to integrate well with the shell and with
-shell scripts.  Keep in mind, however, that in order to use mh-e
+shell scripts.  Keep in mind, however, that in order to use MH-E
 you must have the MH mail-processing system installed on your
 computer.
 
-Finally, XEmacs provides the Rmail package.  Rmail is (currently) the
-only mail reading package distributed with FSF GNU Emacs, and is
-powerful in its own right.  However, it stores mail folders in a special
-format called @samp{Babyl}, that is incompatible with all other
-frequently-used mail programs.  A utility program is provided for
-converting Babyl folders to standard Unix-mail format; however, unless
-you already have mail in Babyl-format folders, you should consider
-using VM or mh-e instead. (If at times you have to use FSF Emacs, it
-is not hard to obtain and install VM for that editor.)
+The @dfn{Everything including the kitchen sink} package @samp{Gnus} is
+also available as an XEmacs package.  Gnus also handles Usenet articles
+as well as mail.
+
+@samp{MEW} (Messaging in the Emacs World) is another mail-reading
+package available for XEmacs.
+
+Finally, XEmacs provides the Rmail package.  Rmail is (currently)
+the only mail reading package distributed with FSF GNU Emacs, and is
+powerful in its own right.  However, it stores mail folders in a
+special format called @samp{Babyl}, that is incompatible with all
+other frequently-used mail programs.  A utility program is provided
+for converting Babyl folders to standard Unix-mail format; however,
+unless you already have mail in Babyl-format folders, you should
+consider using Gnus, VM, or MH-E instead.
index d5d83b6..89fd4b3 100644 (file)
@@ -241,7 +241,6 @@ Packages
 * Installing Packages:: How to install packages.
 * Building Packages::   Building packages from sources.
 * Local.rules File::    An important part of building packages.
-* Creating Packages::   The basics.
 * Available Packages::  A brief directory of packaged LISP.
 
 Basic Editing Commands
index d568d0b..1fa8429 100644 (file)
@@ -1,3 +1,21 @@
+2004-02-02  Vin Shelton <acs@xemacs.org>
+
+       * XEmacs 21.4.15 is released
+
+2003-12-10  Adrian Aichner  <adrian@xemacs.org>
+
+       * xemacs.mak (COPYCMD): New.
+       * xemacs.mak (COPY): New.
+       * xemacs.mak (COPYDIR): New.
+       * xemacs.mak (XEMACS_INCLUDES):
+       * xemacs.mak (install): Allow xemacs.mak to overwrite existing
+       installation.
+
+2003-11-06  Adrian Aichner  <adrian@xemacs.org>
+
+       * minitar.c: Sync with Xemacs 21.5 version to fix package
+       installation in native Windows XEmacs.
+
 2003-09-03  Vin Shelton <acs@xemacs.org>
 
        * XEmacs 21.4.14 is released
index a704d5f..d5e3d40 100644 (file)
 
 #include <zlib.h>
 
-static int
-Usage(char *name)
+static void
+Usage (char *name)
 {
-  fprintf(stderr,"Usage: %s file.tar.gz [base-dir]\n",name);
-  fprintf(stderr,"\tExtracts the contents compressed tar file to base-dir\n");
-  exit(-1);
+  fprintf (stderr, "Usage: %s file.tar.gz [base-dir]\n", name);
+  fprintf (stderr, "\tExtracts the contents compressed tar file to base-dir\n");
+  exit (-1);
 }
 
 
@@ -36,10 +36,10 @@ Usage(char *name)
 #define MAXNAMELEN 1024
 
 static int
-octal(char *str)
+octal (char *str)
 {
   int ret = -1;
-  sscanf(str,"%o",&ret);
+  sscanf (str, "%o", &ret);
   return ret;
 }
 
@@ -48,39 +48,40 @@ octal(char *str)
    path component, so it is not created as a directory */
 
 static int
-makepath(char *path)
+makepath (char *path)
 {
   char tmp[MAXNAMELEN];
   char *cp;
 
-  for (cp=path; cp; cp = (char*)strchr(cp+1,'/')){
-    if (!*cp)
-      break;
-    if (*cp != '/')
-      continue;
-    strncpy(tmp, path, cp-path);
-    tmp[cp-path] = '\0';
-    if (strlen(tmp) == 0)
-      continue;
+  for (cp=path; cp; cp = (char*)strchr (cp+1, '/'))
+    {
+      if (!*cp)
+       break;
+      if (*cp != '/')
+       continue;
+      strncpy (tmp, path, cp-path);
+      tmp[cp-path] = '\0';
+      if (strlen (tmp) == 0)
+       continue;
 #ifdef WIN32_NATIVE
-    if (mkdir(tmp)){
+      if (mkdir (tmp))
 #else
-    if (mkdir(tmp,0777)){
+       if (mkdir (tmp, 0777))
 #endif
-      if (errno == EEXIST)
-       continue;
-      else
-       return -1;
+         {
+           if (errno == EEXIST)
+             continue;
+           else
+             return -1;
+         }
     }
-  }
   return 0;
 }
 
-  
-                    
+
 
 int
-main(int argc, char **argv)
+main (int argc, char **argv)
 {
   char fullname[MAXNAMELEN];
   char *basedir = ".";
@@ -101,124 +102,145 @@ main(int argc, char **argv)
   int directory = 0;
 
   if (argc < 2 || argc > 3)
-    Usage(argv[0]);
+    Usage (argv[0]);
 
   tarfile = argv[1];
   if (argc==3)
     basedir = argv[2];
 
-  if (! (infile = gzopen(tarfile,"rb"))){
-    fprintf(stderr,"Cannot open %s\n", tarfile);
-    exit(-2);
-  }
-  
-  while (1){
-  
-
-    nread = gzread(infile,block,512);
-
-    if (!in_block && nread == 0)
-      break;
-
-    if (nread != BLOCKSIZE){
-      fprintf(stderr,"Error: incomplete block read. Exiting.\n");
-      exit(-2);
+  if (! (infile = gzopen (tarfile, "rb")))
+    {
+      fprintf (stderr, "Cannot open %s\n", tarfile);
+      exit (-2);
     }
+  
+  while (1)
+    {
+      nread = gzread (infile, block, 512);
 
-    if (!in_block){
-      if (block[0]=='\0')  /* We're done */
+      if (!in_block && nread == 0)
        break;
 
-      strncpy(magic,block+257,6);
-      magic[6] = '\0';
-      if (strcmp(magic,"ustar ")){
-       fprintf(stderr,
-               "Error: incorrect magic number in tar header. Exiting\n");
-      }
-
-      strncpy(name,block,100);
-      name[100] = '\0';
-      sprintf(fullname,"%s/%s",basedir,name);
-      printf("%s\n",fullname);
-      type = block[156];
+      if (nread != BLOCKSIZE)
+       {
+         fprintf (stderr, "Error: incomplete block read. Exiting.\n");
+         exit (-2);
+       }
+
+      if (!in_block)
+       {
+         if (block[0]=='\0')  /* We're done */
+           break;
+
+         strncpy (magic, block+257, 6);
+         magic[6] = '\0';
+         if (strcmp (magic, "ustar "))
+           {
+             fprintf (stderr,
+                      "Error: incorrect magic number in tar header. Exiting\n");
+             exit (-2);
+           }
+
+         strncpy (name, block, 100);
+         name[100] = '\0';
+         sprintf (fullname, "%s/%s", basedir, name);
+         printf ("%s\n", fullname);
+         type = block[156];
       
-      switch(type){
-      case '0':
-      case '\0':
-       directory = 0;
-       break;
-      case '5':
-       directory = 1;
-       break;
-      default:
-       fprintf(stderr,"Error: unknown type flag %c. Exiting.\n",type);
-       break;
-      }
+         switch (type)
+           {
+           case '0':
+           case '\0':
+             directory = 0;
+             break;
+           case '5':
+             directory = 1;
+             break;
+           default:
+             fprintf (stderr, "Error: unknown type flag %c. Exiting.\n", type);
+             exit (-2);
+             break;
+           }
       
-      if (directory){
-       in_block = 0;
+         if (directory)
+           {
+             in_block = 0;
        
-       /* makepath will ignore the final path component, so make sure 
-          dirnames have a trailing slash */
-
-       if (fullname[strlen(fullname)-1] != '/')
-         strcat(fullname,"/");
-       if (makepath(fullname)){
-         fprintf(stderr, "Error: cannot create directory %s. Exiting.\n",
-                 fullname);
-         exit(-2);
+             /* makepath will ignore the final path component, so make sure 
+                dirnames have a trailing slash */
+
+             if (fullname[strlen (fullname)-1] != '/')
+               strcat (fullname, "/");
+             if (makepath (fullname))
+               {
+                 fprintf (stderr, "Error: cannot create directory %s. Exiting.\n",
+                          fullname);
+                 exit (-2);
+               }
+             continue;
+           }
+         else
+           { /*file */
+             in_block = 1;
+             if (outfile)
+               {
+                 if (fclose (outfile))
+                   {
+                     fprintf (stderr, "Error: cannot close file %s. Exiting.\n",
+                              fullname);
+                     exit (-2);
+                   }
+                 outfile = (FILE*)0;
+               }
+
+             if (!(outfile = fopen (fullname, "wb")))
+               {
+                 /*try creating the directory, maybe it's not there */
+                 if (makepath (fullname))
+                   {
+                     fprintf (stderr, "Error: cannot create file %s. Exiting.\n",
+                              fullname);
+                     exit (-2);
+                   }
+                 /* now try again to open the file */
+                 if (!(outfile = fopen (fullname, "wb")))
+                   {
+                     fprintf (stderr, "Error: cannot create file %s. Exiting.\n",
+                              fullname);
+                     exit (-2);
+                   }
+               }
+
+             strncpy (osize, block+124, 12);
+             osize[12] = '\0';
+             size = octal (osize);
+             if (size<0)
+               {
+                 fprintf (stderr, "Error: invalid size in tar header. Exiting.\n");
+                 exit (-2);
+               }
+             if (size==0)      /* file of size 0 is done */
+               in_block = 0;
+           }
        }
-       continue;
-      } else { /*file */
-       in_block = 1;
-       if (outfile){
-         if (fclose(outfile)){
-           fprintf(stderr,"Error: cannot close file %s. Exiting.\n",
-                   fullname);
-           exit(-2);
-         }
-         outfile = (FILE*)0;
-       }
-
-       if ( !(outfile = fopen(fullname,"wb"))){
-         /*try creating the directory, maybe it's not there */
-         if (makepath(fullname)){
-           fprintf(stderr,"Error: cannot create file %s. Exiting.\n",
-                   fullname);
-           exit(-2);
-         }
-         /* now try again to open the file */
-         if (!(outfile = fopen(fullname,"wb"))){
-           fprintf(stderr,"Error: cannot create file %s. Exiting.\n",
-                   fullname);
-           exit(-2);
-         }
-       }
-
-       strncpy(osize,block+124,12);
-       osize[12] = '\0';
-       size = octal(osize);
-       if (size<0){
-         fprintf(stderr,"Error: invalid size in tar header. Exiting.\n");
-         exit(-2);
-       }
-      }
-    } else { /* write or continue writing file contents */
-      nbytes = size>512? 512:size;
+      else
+       { /* write or continue writing file contents */
+         nbytes = size>512? 512:size;
       
-      nwritten = fwrite(block, 1, nbytes, outfile);
-      if (nwritten != nbytes){
-       fprintf(stderr, "Error: only wrote %d bytes to file %s. Exiting.\n",
-               nwritten, fullname);
-      }
-      size -= nbytes;
-      if (size==0)
-       in_block = 0;
+         nwritten = fwrite (block, 1, nbytes, outfile);
+         if (nwritten != nbytes)
+           {
+             fprintf (stderr, "Error: only wrote %d bytes to file %s. Exiting.\n",
+                      nwritten, fullname);
+             exit (-2);
+           }
+         size -= nbytes;
+         if (size==0)
+           in_block = 0;
+       }
     }
-  }
-  exit (0);
-}      
-
+  return 0;
+}
 
 
   
index 235937b..35ddb91 100644 (file)
@@ -44,16 +44,25 @@ LWLIB_SRCDIR=$(XEMACS)\lwlib
 MAKEDIRSTRING=$(MAKEDIR:\=\\)
 XEMACSDIRSTRING=$(MAKEDIRSTRING:\\nt=)
 
-
-# Define a variable for the 'del' command to use
-# N.B. Windows Millenium Edition's ERASE can only handle one target (file or
-# wildcard) per invocation.  Make sure each use has only one target!
-DEL=-del
-
 # Program name and version
 
 !include "$(XEMACS)\version.sh"
 
+# Put these before including config.inc so they can be overridden there.
+# Note that some versions of some commands are deficient.
+
+# Define a variable for the 'del' command to use.
+# WinME's DEL command can only handle one argument and only has the /P flag.
+# So only delete one glob at a time.  Override flags in config.inc.
+DEL=-del
+
+# Tell COPY, MOVE, and XCOPY to suppress confirmation for overwriting
+# files.
+COPYCMD=/y
+# Define the 'copy' command to use.
+COPY=xcopy /q
+COPYDIR=xcopy /q /e
+
 !include "config.inc"
 
 !if !defined(INFODOCK)
@@ -490,12 +499,15 @@ XEMACS_INCLUDES=\
 
 # #### Copying is cheap, we should just force these
 $(SRC)\config.h:       config.h
+       set COPYCMD=$(COPYCMD)
        copy config.h $(SRC)
 
 $(SRC)\Emacs.ad.h:     Emacs.ad.h
+       set COPYCMD=$(COPYCMD)
        copy Emacs.ad.h $(SRC)
 
 $(SRC)\paths.h:        paths.h
+       set COPYCMD=$(COPYCMD)
        copy paths.h $(SRC)
 
 #------------------------------------------------------------------------------
@@ -1405,6 +1417,7 @@ temacs: $(LASTFILE) $(TEMACS)
 # use this rule to install the system
 install:       all
        cd $(NT)
+       set COPYCMD=$(COPYCMD)
        @echo Installing in $(INSTALL_DIR) ...
        @echo PlaceHolder > PlaceHolder
        @xcopy /q PROBLEMS "$(INSTALL_DIR)\"
index 4bfa4b0..6fc5ff9 100644 (file)
@@ -1057,10 +1057,14 @@ x_error_handler (Display *disp, XErrorEvent *event)
       }
 #endif /* EXTERNAL_WIDGET */
 
+#if 0
+      /* This ends up calling X, which isn't allowed in an X error handler
+       */
       stderr_out ("\n%s: ",
                  (STRINGP (Vinvocation_name)
                   ? (char *) XSTRING_DATA (Vinvocation_name)
                   : "xemacs"));
+#endif
       XmuPrintDefaultErrorMessage (disp, event, stderr);
     }
   return 0;
index b034860..0293331 100644 (file)
@@ -809,7 +809,7 @@ Use Common Lisp style keywords to specify hash table properties.
 Keyword :test can be `eq', `eql' (default) or `equal'.
 Comparison between keys is done using this function.
 If speed is important, consider using `eq'.
-When storing strings in the hash table, you will likely need to use `equal'.
+When hash table keys may be strings, you will likely need to use `equal'.
 
 Keyword :size specifies the number of keys likely to be inserted.
 This number of entries can be inserted without enlarging the hash table.
index bf87090..779f049 100644 (file)
@@ -3875,7 +3875,7 @@ FROB (WM_SETHOTKEY)
 FROB (WM_GETHOTKEY)
 FROB (WM_QUERYDRAGICON)
 FROB (WM_COMPAREITEM)
-#if(WINVER >= 0x0500)
+#if(WINVER >= 0x0500) && defined(WM_GETOBJECT)
 FROB (WM_GETOBJECT)
 #endif /* WINVER >= 0x0500 */
 FROB (WM_COMPACTING)
@@ -3957,10 +3957,18 @@ FROB (WM_MENUCHAR)
 FROB (WM_ENTERIDLE)
 #if(WINVER >= 0x0500)
 FROB (WM_MENURBUTTONUP)
+#ifdef WM_MENUDRAG
 FROB (WM_MENUDRAG)
+#endif
+#ifdef WM_MENUGETOBJECT
 FROB (WM_MENUGETOBJECT)
+#endif
+#ifdef WM_UNINITMENUPOPUP
 FROB (WM_UNINITMENUPOPUP)
+#endif
+#ifdef WM_MENUCOMMAND
 FROB (WM_MENUCOMMAND)
+#endif
 #endif /* WINVER >= 0x0500 */
 
 
@@ -4036,7 +4044,7 @@ FROB (WM_IME_COMPOSITIONFULL)
 FROB (WM_IME_SELECT)
 FROB (WM_IME_CHAR)
 #endif /* WINVER >= 0x0400 */
-#if(WINVER >= 0x0500)
+#if(WINVER >= 0x0500) && defined(WM_IME_REQUEST)
 FROB (WM_IME_REQUEST)
 #endif /* WINVER >= 0x0500 */
 #if(WINVER >= 0x0400) && !defined(CYGWIN)
index f174a06..f3aaef1 100644 (file)
@@ -1811,10 +1811,14 @@ x_layout_widgets (Widget w, XtPointer client_data, XtPointer call_data)
 #endif
 
   /* finally the text area */
-  XtConfigureWidget (text, text_x, text_y,
-                    width - 2*textbord,
-                    height - text_y - 2*textbord,
-                    textbord);
+  {
+    Dimension nw = width - 2*textbord;
+    Dimension nh = height - text_y - 2*textbord;
+
+    if (nh != f->pixheight || nw != f->pixwidth)
+      MARK_FRAME_SIZE_SLIPPED (f);
+    XtConfigureWidget (text, text_x, text_y, nw, nh, textbord);
+  }
 }
 
 static void
@@ -2744,9 +2748,11 @@ x_update_frame_external_traits (struct frame* frm, Lisp_Object name)
      Lisp_Object font = FACE_FONT (Vdefault_face, frame, Vcharset_ascii);
 
      if (!EQ (font, Vthe_null_font_instance))
-       XtSetArg (al[ac], XtNfont,
-                (void *) FONT_INSTANCE_X_FONT (XFONT_INSTANCE (font)));
-     ac++;
+       {
+        XtSetArg (al[ac], XtNfont,
+                  (void *) FONT_INSTANCE_X_FONT (XFONT_INSTANCE (font)));
+        ac++;
+       }
    }
   else
    abort ();
index 527ae6b..d308eb0 100644 (file)
@@ -47,10 +47,8 @@ DECLARE_LRECORD (opaque, Lisp_Opaque);
 
 #define OPAQUE_SIZE(op) ((op)->size)
 #define OPAQUE_DATA(op) ((void *) ((op)->data))
-#define OPAQUE_MARKFUN(op) ((op)->markfun)
 #define XOPAQUE_SIZE(op) OPAQUE_SIZE (XOPAQUE (op))
 #define XOPAQUE_DATA(op) OPAQUE_DATA (XOPAQUE (op))
-#define XOPAQUE_MARKFUN(op) OPAQUE_MARKFUN (XOPAQUE (op))
 
 Lisp_Object make_opaque (const void *data, size_t size);
 
index d780f91..be814d7 100644 (file)
@@ -11,7 +11,7 @@
 #endif
 
 /* Fix understandable GCC lossage on Solaris 2.6 */
-#if defined(__GNUC__) && OS_RELEASE >= 56 && !defined(NOT_C_CODE)
+#if defined(__GNUC__) && OS_RELEASE >= 506 && !defined(NOT_C_CODE)
 
 /* GCC va_list munging is a little messed up */
 #define __GNUC_VA_LIST
@@ -66,7 +66,7 @@ extern int     __xnet_getsockopt (int, int, int, void *, size_t *);
  */
 
 #undef UNEXEC
-#if OS_RELEASE < 56
+#if OS_RELEASE < 506
 #define UNEXEC "unexsol2.o"
 #else
 #define UNEXEC "unexsol2-6.o"
@@ -74,7 +74,7 @@ extern int     __xnet_getsockopt (int, int, int, void *, size_t *);
 
 #else /* C_CODE */
 
-#if OS_RELEASE <= 53
+#if OS_RELEASE <= 503
 /* Solaris 2.3 has a bug in XListFontsWithInfo.  */
 #define BROKEN_XLISTFONTSWITHINFO
 #endif
@@ -91,7 +91,7 @@ extern int     __xnet_getsockopt (int, int, int, void *, size_t *);
 #define BROKEN_SIGCHLD
 #endif
 
-#if OS_RELEASE < 55
+#if OS_RELEASE < 505
 
 #if __STDC__ == 1 && defined(__SUNPRO_C)
 #define _POSIX_C_SOURCE 1
@@ -103,7 +103,7 @@ extern int     __xnet_getsockopt (int, int, int, void *, size_t *);
 extern void *__builtin_alloca (size_t);
 #endif /* before SunOS 5.5 */
 
-#if OS_RELEASE == 55
+#if OS_RELEASE == 505
 /* The following functions were added in Solaris 2.5,
    but they forgot to add prototypes to the system header files. */
 int getpagesize (void);
@@ -113,13 +113,13 @@ int usleep (unsigned int useconds);
 #endif /* SunOS 5.5 */
 
 /* 2.5 now has `random' back in libc but we don't want to use it. */
-#if OS_RELEASE >= 55
+#if OS_RELEASE >= 505
 #undef HAVE_RANDOM
 /* Apparently not necessary here, and it causes 10% CPU chewage. */
 #undef BROKEN_SIGCHLD
 #endif /* >= SunOS 5.5 */
 
-#if OS_RELEASE < 56
+#if OS_RELEASE < 506
 /* Missing prototypes, added in Solaris 2.6 */
 struct timeval;
 int utimes (char *file, struct timeval *tvp);
index bdf7764..680c7b8 100644 (file)
@@ -2109,9 +2109,13 @@ will automatically call `save-buffers-kill-emacs'.)
   else if (!NILP (w->vchild))
     delete_all_subwindows (XWINDOW (w->vchild));
 
+  /* Warning: mark_window_as_deleted calls window_unmap_subwindows and
+     therefore redisplay, so it requires the mirror structure to be
+     correct.  We must dirty the mirror before it is called.  */
+  f->mirror_dirty = 1;
+
   mark_window_as_deleted (w);
 
-  f->mirror_dirty = 1;
   return Qnil;
 }
 
index 0fc8e1c..fcf1415 100644 (file)
@@ -1,3 +1,27 @@
+2004-02-02  Vin Shelton <acs@xemacs.org>
+
+       * XEmacs 21.4.15 is released
+
+2003-10-22  Vin Shelton  <acs@xemacs.org>
+
+       * automated/hash-table-tests.el: Remove debugging print
+       statements.
+
+2003-10-22  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * automated/test-harness.el: Synch to 21.5.
+
+2003-09-25  Stephen J. Turnbull  <stephen@xemacs.org>
+
+       * automated/regexp-tests.el (multiple-match): Test \{m,n\}.
+
+2003-09-09  Adrian Aichner  <adrian@xemacs.org>
+
+       * automated/test-harness.el (test-harness-from-buffer): Log
+       results when running noninteractive.
+       * automated/test-harness.el (batch-test-emacs): Remove misplaced
+       debugging code.
+
 2003-09-03  Vin Shelton <acs@xemacs.org>
 
        * XEmacs 21.4.14 is released
index 1c8af88..f3465c2 100644 (file)
 
   (let ((k-sum 0) (v-sum 0))
     (maphash #'(lambda (k v) (incf k-sum k) (incf v-sum v)) ht)
-    (print k-sum)
-    (print v-sum)
     (Assert (= k-sum (/ (* size (- size 1)) 2)))
     (Assert (= v-sum (- k-sum))))
 
index 89852fc..6e8d632 100644 (file)
@@ -1,8 +1,10 @@
 ;; test-harness.el --- Run Emacs Lisp test suites.
 
-;;; Copyright (C) 1998 Free Software Foundation, Inc.
+;;; Copyright (C) 1998, 2002, 2003 Free Software Foundation, Inc.
+;;; Copyright (C) 2002 Ben Wing.
 
 ;; Author: Martin Buchholz
+;; Maintainer: Stephen J. Turnbull <stephen@xemacs.org>
 ;; Keywords: testing
 
 ;; This file is part of XEmacs.
 ;;; A test suite harness for testing XEmacs.
 ;;; The actual tests are in other files in this directory.
 ;;; Basically you just create files of emacs-lisp, and use the
-;;; Assert, Check-Error, and Check-Message functions to create tests.
+;;; Assert, Check-Error, Check-Message, and Check-Error-Message functions
+;;; to create tests.  See `test-harness-from-buffer' below.
+;;; Don't suppress tests just because they're due to known bugs not yet
+;;; fixed -- use the Known-Bug-Expect-Failure and
+;;; Implementation-Incomplete-Expect-Failure wrapper macros to mark them.
+;;; A lot of the tests we run push limits; suppress Ebola message with the
+;;; Ignore-Ebola wrapper macro.
+;;; 
 ;;; You run the tests using M-x test-emacs-test-file,
 ;;; or $(EMACS) -batch -l .../test-harness.el -f batch-test-emacs file ...
 ;;; which is run for you by the `make check' target in the top-level Makefile.
 
 (require 'bytecomp)
 
+(defvar test-harness-test-compiled nil
+  "Non-nil means the test code was compiled before execution.")
+
 (defvar test-harness-verbose
   (and (not noninteractive) (> (device-baud-rate) search-slow-speed))
   "*Non-nil means print messages describing progress of emacs-tester.")
 
+(defvar test-harness-file-results-alist nil
+  "Each element is a list (FILE SUCCESSES TESTS).
+The order is the reverse of the order in which tests are run.
+
+FILE is a string naming the test file.
+SUCCESSES is a non-negative integer, the number of successes.
+TESTS is a non-negative integer, the number of tests run.")
+
+(defvar test-harness-risk-infloops nil
+  "*Non-nil to run tests that may loop infinitely in buggy implementations.")
+
 (defvar test-harness-current-file nil)
 
 (defvar emacs-lisp-file-regexp (purecopy "\\.el\\'")
   "*Regexp which matches Emacs Lisp source files.")
 
+(defconst test-harness-file-summary-template
+  (format "%%-%ds %%%dd of %%%dd tests successful (%%3d%%%%)."
+         (length "byte-compiler-tests.el:") ; use the longest file name
+         5
+         5)
+  "Format for summary lines printed after each file is run.")
+
+(defconst test-harness-null-summary-template
+  (format "%%-%ds             No tests run."
+         (length "byte-compiler-tests.el:")) ; use the longest file name
+  "Format for \"No tests\" lines printed after a file is run.")
+
 ;;;###autoload
 (defun test-emacs-test-file (filename)
   "Test a file of Lisp code named FILENAME.
@@ -99,7 +134,8 @@ The output file's name is made by appending `c' to the end of FILENAME."
          (setq body (cons (read buffer) body)))
       (end-of-file nil)
       (error
-       (princ (format "Unexpected error %S reading forms from buffer\n" error-info))))
+       (princ (format "Unexpected error %S reading forms from buffer\n"
+                     error-info))))
     `(lambda ()
        (defvar passes)
        (defvar assertion-failures)
@@ -130,20 +166,60 @@ The output file's name is made by appending `c' to the end of FILENAME."
 
        (trick-optimizer nil)
        (unexpected-test-suite-failure nil)
-       (debug-on-error t))
+       (debug-on-error t)
+       (pass-stream nil))
     (with-output-to-temp-buffer "*Test-Log*"
+      (princ (format "Testing %s...\n\n" filename))
+
+      (defconst test-harness-failure-tag "FAIL")
+      (defconst test-harness-success-tag "PASS")
+
+      (defmacro Known-Bug-Expect-Failure (&rest body)
+       `(let ((test-harness-failure-tag "KNOWN BUG")
+              (test-harness-success-tag "PASS (FAILURE EXPECTED)"))
+         ,@body))
+    
+      (defmacro Implementation-Incomplete-Expect-Failure (&rest body)
+       `(let ((test-harness-failure-tag "IMPLEMENTATION INCOMPLETE")
+              (test-harness-success-tag "PASS (FAILURE EXPECTED)"))
+         ,@body))
+    
+      (defun Print-Failure (fmt &rest args)
+       (setq fmt (format "%s: %s" test-harness-failure-tag fmt))
+       (if (noninteractive) (apply #'message fmt args))
+       (princ (concat (apply #'format fmt args) "\n")))
+
+      (defun Print-Pass (fmt &rest args)
+       (setq fmt (format "%s: %s" test-harness-success-tag fmt))
+       (and test-harness-verbose
+            (princ (concat (apply #'format fmt args) "\n"))))
+
+      (defun Print-Skip (test reason &optional fmt &rest args)
+       (setq fmt (concat "SKIP: %S BECAUSE %S" fmt))
+       (princ (concat (apply #'format fmt test reason args) "\n")))
+
+      (defmacro Skip-Test-Unless (condition reason description &rest body)
+       "Unless CONDITION is satisfied, skip test BODY.
+REASON is a description of the condition failure, and must be unique (it
+is used as a hash key).  DESCRIPTION describes the tests that were skipped.
+BODY is a sequence of expressions and may contain several tests."
+       `(if (not ,condition)
+            (let ((count (gethash ,reason skipped-test-reasons)))
+              (puthash ,reason (if (null count) 1 (1+ count))
+                       skipped-test-reasons)
+              (Print-Skip ,description ,reason))
+          ,@body))
 
       (defmacro Assert (assertion)
        `(condition-case error-info
             (progn
               (assert ,assertion)
-              (princ (format "PASS: %S" (quote ,assertion)))
-              (terpri)
+              (Print-Pass "%S" (quote ,assertion))
               (incf passes))
           (cl-assertion-failed
-           (princ (format "FAIL: Assertion failed: %S\n" (quote ,assertion)))
+           (Print-Failure "Assertion failed: %S" (quote ,assertion))
            (incf assertion-failures))
-          (t (princ (format "FAIL: %S ==> error: %S\n" (quote ,assertion) error-info))
+          (t (Print-Failure "%S ==> error: %S" (quote ,assertion) error-info)
              (incf other-failures)
              )))
 
@@ -153,60 +229,52 @@ The output file's name is made by appending `c' to the end of FILENAME."
          `(condition-case error-info
               (progn
                 (setq trick-optimizer (progn ,@body))
-                (princ (format "FAIL: %S executed successfully, but expected error %S\n"
+                (Print-Failure "%S executed successfully, but expected error %S"
                                ,quoted-body
-                               ',expected-error))
+                               ',expected-error)
                 (incf no-error-failures))
             (,expected-error
-             (princ (format "PASS: %S ==> error %S, as expected\n"
-                            ,quoted-body ',expected-error))
+             (Print-Pass "%S ==> error %S, as expected"
+                         ,quoted-body ',expected-error)
              (incf passes))
             (error
-             (princ (format "FAIL: %S ==> expected error %S, got error %S instead\n"
-                            ,quoted-body ',expected-error error-info))
+             (Print-Failure "%S ==> expected error %S, got error %S instead"
+                            ,quoted-body ',expected-error error-info)
              (incf wrong-error-failures)))))
 
-      (defmacro Check-Error-Message (expected-error expected-error-regexp &rest body)
+      (defmacro Check-Error-Message (expected-error expected-error-regexp
+                                                   &rest body)
        (let ((quoted-body (if (= 1 (length body))
                               `(quote ,(car body)) `(quote (progn ,@body)))))
          `(condition-case error-info
               (progn
                 (setq trick-optimizer (progn ,@body))
-                (princ (format "FAIL: %S executed successfully, but expected error %S\n"
-                               ,quoted-body
-                               ',expected-error))
+                (Print-Failure "%S executed successfully, but expected error %S"
+                               ,quoted-body ',expected-error)
                 (incf no-error-failures))
             (,expected-error
              (let ((error-message (second error-info)))
                (if (string-match ,expected-error-regexp error-message)
                    (progn
-                     (princ (format "PASS: %S ==> error %S %S, as expected\n"
-                                    ,quoted-body error-message ',expected-error))
+                     (Print-Pass "%S ==> error %S %S, as expected"
+                                 ,quoted-body error-message ',expected-error)
                      (incf passes))
-                 (princ (format "FAIL: %S ==> got error %S as expected, but error message %S did not match regexp %S\n"
-                                ,quoted-body ',expected-error error-message ,expected-error-regexp))
+                 (Print-Failure "%S ==> got error %S as expected, but error message %S did not match regexp %S"
+                                ,quoted-body ',expected-error error-message ,expected-error-regexp)
                  (incf wrong-error-failures))))
             (error
-             (princ (format "FAIL: %S ==> expected error %S, got error %S instead\n"
-                            ,quoted-body ',expected-error error-info))
+             (Print-Failure "%S ==> expected error %S, got error %S instead"
+                            ,quoted-body ',expected-error error-info)
              (incf wrong-error-failures)))))
 
-      (defun Print-Skip (test reason &optional fmt &rest args)
-       (setq fmt (concat "SKIP: %S.  REASON: %S" fmt))
-       (princ (concat (apply #'format fmt test reason args) "\n")))
-
 
       (defmacro Check-Message (expected-message-regexp &rest body)
-       (if (not (fboundp 'defadvice))
-           ;; #### This whole thing should go inside a macro Skip-Test
-           (let* ((reason "advice unavailable")
-                  (count (gethash reason skipped-test-reasons)))
-             ;(message "%S: %S" reason count)
-             (puthash reason (if (null count) 1 (1+ count))
-                      skipped-test-reasons)
-             `(Print-Skip ,expected-message-regexp ,reason))
+       (Skip-Test-Unless (fboundp 'defadvice)
+                         "can't defadvice"
+                         expected-message-regexp
          (let ((quoted-body (if (= 1 (length body))
-                                `(quote ,(car body)) `(quote (progn ,@body)))))
+                                `(quote ,(car body))
+                              `(quote (progn ,@body)))))
            `(let ((messages ""))
               (defadvice message (around collect activate)
                 (defvar messages)
@@ -218,15 +286,16 @@ The output file's name is made by appending `c' to the end of FILENAME."
                     (setq trick-optimizer (progn ,@body))
                     (if (string-match ,expected-message-regexp messages)
                         (progn
-                          (princ (format "PASS: %S ==> value %S, message %S, matching %S, as expected\n"
-                                         ,quoted-body trick-optimizer messages ',expected-message-regexp))
+                          (Print-Pass "%S ==> value %S, message %S, matching %S, as expected"
+                                      ,quoted-body trick-optimizer messages ',expected-message-regexp)
                           (incf passes))
-                      (princ (format "FAIL: %S ==> value %S, message %S, NOT matching expected %S\n"
-                                     ,quoted-body  trick-optimizer messages ',expected-message-regexp))
+                      (Print-Failure "%S ==> value %S, message %S, NOT matching expected %S"
+                                     ,quoted-body  trick-optimizer messages
+                                     ',expected-message-regexp)
                       (incf missing-message-failures)))
                 (error
-                 (princ (format "FAIL: %S ==> unexpected error %S\n"
-                                ,quoted-body error-info))
+                 (Print-Failure "%S ==> unexpected error %S"
+                                ,quoted-body error-info)
                  (incf other-failures)))
               (ad-unadvise 'message)))))
 
@@ -251,7 +320,8 @@ The output file's name is made by appending `c' to the end of FILENAME."
         (message "Test suite execution aborted." error-info)
         ))
       (princ "\nTesting Compiled Lisp\n\n")
-      (let (code)
+      (let (code
+           (test-harness-test-compiled t))
        (condition-case error-info
            (setq code
                  ;; our lisp code is often intentionally dubious,
@@ -269,7 +339,7 @@ The output file's name is made by appending `c' to the end of FILENAME."
           (message "Unexpected error %S while executing byte-compiled code." error-info)
           (message "Test suite execution aborted." error-info)
           )))
-      (princ "\nSUMMARY:\n")
+      (princ (format "\nSUMMARY for %s:\n" filename))
       (princ (format "\t%5d passes\n" passes))
       (princ (format "\t%5d assertion failures\n" assertion-failures))
       (princ (format "\t%5d errors that should have been generated, but weren't\n" no-error-failures))
@@ -285,14 +355,16 @@ The output file's name is made by appending `c' to the end of FILENAME."
             (basename (file-name-nondirectory filename))
             (summary-msg
              (if (> total 0)
-                 (format "%s: %d of %d (%d%%) tests successful."
-                         basename passes total (/ (* 100 passes) total))
-               (format "%s: No tests run" basename)))
+                 (format test-harness-file-summary-template
+                         (concat basename ":")
+                         passes total (/ (* 100 passes) total))
+               (format test-harness-null-summary-template
+                       (concat basename ":"))))
             (reasons ""))
        (maphash (lambda (key value)
                   (setq reasons
                         (concat reasons
-                                (format "\n    %d tests skipped because %s"
+                                (format "\n    %d tests skipped because %s."
                                         value key))))
                 skipped-test-reasons)
        (when (> (length reasons) 1)
@@ -300,6 +372,9 @@ The output file's name is made by appending `c' to the end of FILENAME."
     Probably XEmacs cannot find your installed packages.  Set EMACSPACKAGEPATH
     to the package hierarchy root or configure with --package-path to enable
     the skipped tests.")))
+       (setq test-harness-file-results-alist
+             (cons (list filename passes total)
+                   test-harness-file-results-alist))
        (message "%s" summary-msg))
       (when unexpected-test-suite-failure
        (message "Test suite execution failed unexpectedly."))
@@ -309,6 +384,9 @@ The output file's name is made by appending `c' to the end of FILENAME."
       (fmakunbound 'Check-Error-Message)
       (fmakunbound 'Ignore-Ebola)
       (fmakunbound 'Int-to-Marker)
+      (and noninteractive
+          (message "%s" (buffer-substring-no-properties
+                         nil nil "*Test-Log*")))
       )))
 
 (defvar test-harness-results-point-max nil)
@@ -388,8 +466,45 @@ For example, invoke \"xemacs -batch -f batch-test-emacs tests/*.el\""
                  (setq error t))))
        (or (batch-test-emacs-1 file)
            (setq error t))))
-    ;;(message "%s" (buffer-string nil nil "*Test-Log*"))
-    (message "Done")
+    (let ((namelen 0)
+         (succlen 0)
+         (testlen 0)
+         (results test-harness-file-results-alist))
+      ;; compute maximum lengths of variable components of report
+      ;; probably should just use (length "byte-compiler-tests.el")
+      ;; and 5-place sizes -- this will also work for the file-by-file
+      ;; printing when Adrian's kludge gets reverted
+      (flet ((print-width (i)
+              (let ((x 10) (y 1))
+                (while (>= i x)
+                  (setq x (* 10 x) y (1+ y)))
+                y)))
+       (while results
+         (let* ((head (car results))
+                (nn (length (file-name-nondirectory (first head))))
+                (ss (print-width (second head)))
+                (tt (print-width (third head))))
+           (when (> nn namelen) (setq namelen nn))
+           (when (> ss succlen) (setq succlen ss))
+           (when (> tt testlen) (setq testlen tt)))
+         (setq results (cdr results))))
+      ;; create format and print
+      (let ((results (reverse test-harness-file-results-alist)))
+       (while results
+         (let* ((head (car results))
+                (basename (file-name-nondirectory (first head)))
+                (nsucc (second head))
+                (ntest (third head)))
+           (if (> ntest 0)
+               (message test-harness-file-summary-template
+                        (concat basename ":")
+                        nsucc
+                        ntest
+                        (/ (* 100 nsucc) ntest))
+             (message test-harness-null-summary-template
+                      (concat basename ":")))
+           (setq results (cdr results))))))
+    (message "\nDone")
     (kill-emacs (if error 1 0))))
 
 (provide 'test-harness)
index 7faed11..03a4ee2 100644 (file)
@@ -2,8 +2,8 @@
 emacs_is_beta=
 emacs_major_version=21
 emacs_minor_version=4
-emacs_beta_version=14
-xemacs_codename="Reasonable Discussion"
+emacs_beta_version=15
+xemacs_codename="Security Through Obscurity"
 emacs_kit_version=
 infodock_major_version=4
 infodock_minor_version=0