www-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

www/prep/gnumaint mkspotlight gm-util.pl gm mas...


From: Ineiev
Subject: www/prep/gnumaint mkspotlight gm-util.pl gm mas...
Date: Sat, 11 May 2019 06:44:56 -0400 (EDT)

CVSROOT:        /web/www
Module name:    www
Changes by:     Ineiev <ineiev> 19/05/11 06:44:54

Added files:
        prep/gnumaint  : mkspotlight gm-util.pl gm 
                         massmail-1303-cveauto.txt gnumaint.README 
                         gm-read.pl recentrel.txt Makefile 
                         temail-4post.txt spotlight.mk temail-2dub.txt 
                         testgood1.msg testaddrcomment.msg 
                         temail-0query.txt gm-generate.pl 
                         howto-spotlight.txt .cvsignore nonpackages.txt 
                         testaddrangle.msg testjunk1.msg 
                         howto-decommission.txt maintfileupgrade 
                         massmail-1201-copyright.txt testaddr+real.msg 
                         sendmaintmail massmail-0705-active.txt 
                         gm-check.pl gnumaint contact-activity.txt 
                         massmail-1405-stale.txt mailtoname gm-email.pl 
                         gm-list.pl spotlight.tmpl 
                         massmail-1305-stale.txt oldpackages.txt 
                         tpost-need.html doc-categories.txt 
                         massmail-1503-stale.txt howto-commission.txt 
                         gnufsd testaddrcase.msg README 
        prep/gnumaint/fsd: Makefile .cvsignore gnufsd-psql 
                           fsd-schema.texi 
        prep/gnumaint/rec: pkgblurbs.rec nonpackages.rec oldpackages.rec 
                           gnupackages2txt.awk pkgblurbs2txt.awk 
                           gnupackages.rec package-descriptor.rec 
        prep/gnumaint/spotlight: spotlight.m4 gnubytime.pl 
        prep/gnumaint/msg.0802: Makefile .cvsignore send.0802 
                                msg0802.txt 

Log message:
        Copy from womb/gnumaint.

CVSWeb URLs:
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/mkspotlight?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/gm-util.pl?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/gm?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/massmail-1303-cveauto.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/gnumaint.README?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/gm-read.pl?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/recentrel.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/Makefile?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/temail-4post.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/spotlight.mk?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/temail-2dub.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/testgood1.msg?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/testaddrcomment.msg?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/temail-0query.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/gm-generate.pl?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/howto-spotlight.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/.cvsignore?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/nonpackages.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/testaddrangle.msg?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/testjunk1.msg?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/howto-decommission.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/maintfileupgrade?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/massmail-1201-copyright.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/testaddr%43real.msg?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/sendmaintmail?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/massmail-0705-active.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/gm-check.pl?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/gnumaint?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/contact-activity.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/massmail-1405-stale.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/mailtoname?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/gm-email.pl?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/gm-list.pl?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/spotlight.tmpl?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/massmail-1305-stale.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/oldpackages.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/tpost-need.html?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/doc-categories.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/massmail-1503-stale.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/howto-commission.txt?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/gnufsd?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/testaddrcase.msg?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/README?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/fsd/Makefile?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/fsd/.cvsignore?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/fsd/gnufsd-psql?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/fsd/fsd-schema.texi?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/rec/pkgblurbs.rec?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/rec/nonpackages.rec?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/rec/oldpackages.rec?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/rec/gnupackages2txt.awk?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/rec/pkgblurbs2txt.awk?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/rec/gnupackages.rec?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/rec/package-descriptor.rec?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/spotlight/spotlight.m4?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/spotlight/gnubytime.pl?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/msg.0802/Makefile?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/msg.0802/.cvsignore?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/msg.0802/send.0802?cvsroot=www&rev=1.1
http://web.cvs.savannah.gnu.org/viewcvs/www/prep/gnumaint/msg.0802/msg0802.txt?cvsroot=www&rev=1.1

Patches:
Index: mkspotlight
===================================================================
RCS file: mkspotlight
diff -N mkspotlight
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ mkspotlight 11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,168 @@
+#!/bin/bash
+# $Id: mkspotlight,v 1.1 2019/05/11 10:44:52 ineiev Exp $
+# Spotlight generation script
+#
+#  Copyright (C) 2018 Mike Gerwitz
+#
+#  This program is free software: you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# This script just automates parts of what Brandon Invergo conveyed to me
+# (Mike Gerwitz) via e-mail.  It is glue code around the existing
+# process.  It may or may not evolve over time.
+##
+
+set -euo pipefail
+
+declare -r makefile=spotlight.mk
+declare -r tmp=spotlight-tmp
+declare -r releases_out="$tmp/releases-this-month.gnu"
+
+declare -r editor="${EDITOR:-editor}"
+
+cd "$(dirname $0)"
+
+
+fail()
+{
+  local -r msg="${1?Missing failure message}"
+
+  echo "error: $msg" >&2
+  exit 1
+}
+
+
+cleanup()
+{
+  read -p 'Remove old spotlight (y/n)? '
+  test "$REPLY" == y || return 0
+
+  echo "cleaning old $tmp..."
+  rm -fv "$tmp"/*
+}
+
+
+package-exists()
+{
+  local -r pkg=${1?Missing package name}
+
+  test "$( recsel -ce "package = '$pkg'" rec/gnupackages.rec )" -gt 0
+}
+
+
+validate-pkgs()
+{
+  local line pkg
+
+  while read line; do
+    pkg=${line%%-[0-9-]*}
+
+    if ! package-exists "$pkg"; then
+      echo "# $line ($pkg not found in gnupackages.rec)"
+      continue
+    fi
+
+    echo "$line"
+  done
+}
+
+
+make-release-out()
+{
+  local -r last_date="${1?Missing last spotlight date}"
+
+  make -f "$makefile" END_DATE="$last_date"
+  test -f "$releases_out" || fail "didn't generate $releases_out!"
+
+  # comment out alpha and beta releases (which shouldn't be on ftp.gnu.org,
+  # but sometimes they are) so that they can be manually verified
+  sed -i 's/^.*\(-alpha\|-beta\)$/#&/' "$releases_out"
+
+  # prepend some useful text (from Brandon's original email); hopefully a
+  # lot of this will be automated as time goes on
+  cat - <( validate-pkgs < "$releases_out" ) > "$releases_out.tmp" <<EOF
+# From Brandon:
+# > Edit releases-this-month.gnu.  Normally this entails removing
+# > multiple releases of the same package (just keep the latest one),
+# > removing language packs (Icecat), dictionaries (aspell), patchsets
+# > (gnuhealth), and adding releases that weren't uploaded to the FTP
+# > server.  For that latter case, I don't methodically search for all
+# > packages; I just cross-check with the info-gnu release announcements
+# > and I double-check for the big ones: gnupg (normally announced on
+# > info-gnu) & gnutls (check the website).
+#
+# (All comments and empty lines will be removed.)
+
+EOF
+
+  # manually edit file
+  "$editor" "$releases_out.tmp"
+
+  # move into place without comments and remove temporary
+  # (*-ready is the ultimate destination)
+  sed '/^#/d;/^$/d' "$releases_out.tmp" > "$releases_out-ready"
+  rm "$releases_out.tmp" "$releases_out"
+}
+
+
+make-markdown()
+{
+  make -f "$makefile" markdown
+
+  # locate the markdown file
+  local -r md=spotlight/spotlight-"$( date +%Y-%m-%d )".md
+
+  test -f "$md" || fail 'error: missing spotlight/*.md output'
+
+  # some common replacements, to be added to over time (maybe extract into
+  # its own file for maintenance)
+  sed -i 's#software/tack#software/ncurses#;
+          s#software/gnuhealth-client#software/health#' \
+      "$md"
+
+  # manually edit final file
+  "$editor" "$md"
+
+  echo "send to address@hidden: $md"
+}
+
+
+usage()
+{
+  cat <<EOF
+Usage: $0 LAST_SPOTLIGHT_DATE
+
+Guide generation of GNU Spotlight since last date.
+LAST_SPOTLIGHT_DATE must be of the format YYYYMMDD.
+EOF
+
+  exit 64  # EX_USAGE
+}
+
+
+main()
+{
+  local -r last_date="${1?Missing end date}"
+
+  # sanity check, mostly, since we're about to issue `rm'
+  test -f "$makefile" || fail "missing $makefile"
+
+  cleanup
+  make-release-out "$last_date"
+  make-markdown
+}
+
+
+test $# -gt 0 || usage
+
+main "$@"

Index: gm-util.pl
===================================================================
RCS file: gm-util.pl
diff -N gm-util.pl
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gm-util.pl  11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,143 @@
+# $Id: gm-util.pl,v 1.1 2019/05/11 10:44:52 ineiev Exp $
+# Utilities for the gm script.
+# 
+# Copyright 2007, 2008, 2009, 2010, 2011, 2012, 2013
+# Free Software Foundation Inc.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# Originally written by Karl Berry.
+
+
+# Return the email addresses for the maintainers of package PKGREF (a
+# reference to a list of maintainer hashes).  Two strings are returned:
+# the named maintainers and any generic maintainer.  Either may be
+# empty/undef.
+# 
+sub maintainer_email_addrs {
+  my ($pkgref) = @_;
+  
+  my @entries = ();
+  my $generic_entry = "";
+  my @uploaders = ();
+
+  for my $m (@{$pkgref}) {
+    my $name = $m->{"name"};
+    my $entry = $name;
+    
+    $entry .= " " if $entry;
+    
+    if ($m->{"best_email"}) {
+      $entry .= "<$m->{best_email}>";
+    } else {
+      warn "no email for $name?!";
+    }
+
+    if ($m->{"is_generic"} && $name ne "unmaintained") {
+      # Assume that if a name starts with a lowercase letter, it is
+      # generic.  If we ever have a maintainer whose real name starts
+      # with a lowercase letter, we can invent a field to distinguish.
+      warn "two generic maintainers?! -- $entry and $generic_entry"
+        if $generic_entry;
+      $generic_entry = $entry;
+    } elsif ($m->{"is_uploader"}){
+       push (@uploaders, $entry);
+    } else {
+      push (@entries, $entry);
+    }
+  }
+  
+  # Make the individuals into a comma-separated list.
+  my $entries = join (", ", @entries);
+  my $uploaders = join (", ", @uploaders);
+  
+  return ($entries,$generic_entry,$uploaders);
+}
+
+
+
+# Since we need this in more than one place.  These are listed in the
+# maintainers file, but shouldn't be included in the "allpackages"
+# lists, etc., since their status is murky.
+#
+sub skip_pkg_p {
+  my ($pkgname) = @_;
+  return $pkgname =~ / /            # gimp www pages, flex manual
+         || $pkgname =~ /^gg-/      # groups
+         || $pkgname =~ /^(cfengine)$/  # not really ours
+         || $pkgname =~ /\.nongnu/; # specialness, see maintainers
+}
+
+
+# avoid repeating the field widths.
+# 
+sub gnupkgs_msg {
+  my ($msg,%p) = @_;
+  warn "gnupkgs_msg: oops, no lineno/package elements in %p hash"
+    unless $p{"lineno"} && $p{"package"};
+  return sprintf ("$GNUPACKAGES_FILE:%4d:%-16s $msg",
+                  $p{"lineno"}, $p{"package"});
+}
+
+
+# our package names don't always suit XHTML in its wisdom.
+# 
+sub xhtml_id {
+  my ($pkgname) = @_;
+  (my $xhtml_id = $pkgname) =~ s/[^-_0-9a-z]//g;        # identifier chars
+  $xhtml_id = "pkg_$xhtml_id"
+    if $xhtml_id !~ /^[a-z]/; # start w/letter
+  return $xhtml_id;
+}
+
+
+# return auto-generation notice to include in output files.
+# 
+sub generated_by_us {
+  chomp (my $date = `date`);
+  (my $us = $0) =~ s,^\./,,;
+  return "generated by womb/gnumaint/$us $date";
+}
+
+
+# print arg on stderr.
+sub debug { warn "$_[0]\n" if $DEBUG; }
+
+
+# Log LABEL followed by hash elements, all on one line.
+# 
+sub debug_hash {
+  return unless $DEBUG;
+  &warn_hash (@_);
+}
+
+sub warn_hash {
+  my ($label) = shift;
+  my (%hash) = (ref $_[0] && $_[0] =~ /.*HASH.*/) ? %{$_[0]} : @_;
+
+  my $str = "$label: {";
+  my @items = ();
+  for my $key (sort keys %hash) {
+    my $val = $hash{$key};
+    $key =~ s/\n/\\n/g;
+    $val =~ s/\n/\\n/g;
+    push (@items, "$key:$val");
+  }
+  $str .= join (",", @items);
+  $str .= "}";
+
+  warn "$str\n";
+}
+
+1;

Index: gm
===================================================================
RCS file: gm
diff -N gm
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gm  11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,142 @@
+#!/usr/bin/env perl
+# $Id: gm,v 1.1 2019/05/11 10:44:52 ineiev Exp $
+# GNU maintainer-related operations.
+# 
+# Copyright 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software
+# Foundation Inc.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# Originally written by Karl Berry.
+
+$DEBUG = 0;
+my $ver = '$Id: gm,v 1.1 2019/05/11 10:44:52 ineiev Exp $';
+
+# In this particular case, using require seemed better than setting up
+# modules.  It's certainly simpler.
+require "gm-check.pl";
+require "gm-email.pl";
+require "gm-generate.pl";
+require "gm-list.pl";
+require "gm-read.pl";
+require "gm-util.pl";
+
+# Recommended way to deal with the foreign data files: have a cron job
+# that copies them locally and nightly; put symlinks in this directory
+# to the cron-updated files.
+
+  # fp:~karl/src/gnumaint/activity-report.txt
+$ACTIVITY_FILE = "activity-report.txt";
+  # fp:/gd/gnuorg/copyright.list
+$COPYRIGHT_LIST_FILE = "copyright.list";
+  # maintained here:
+$DOC_CATEGORIES_FILE = "doc-categories.txt";
+  # maintained here:
+$GNUPACKAGES_FILE = "rec/gnupackages.rec";
+  # http://ftp.gnu.org/gnu/texinfo/htmlxref.cnf
+$HTMLXREF_FILE = "htmlxref.cnf";
+  # fp:/gd/gnuorg/maintainers
+$MAINTAINERS_FILE = "maintainers";
+  # maintained here:
+$OLDPACKAGES_FILE = "oldpackages.txt";
+  # maintained here:
+$PKGBLURBS_FILE = "pkgblurbs.txt";  
+
+# The routines using these additional files are not yet fully implemented.
+  # rsync://ftp.gnu.org/gnu/
+$FTPLISTING_FILE = "ftplisting.txt";
+  # fp:/srv/data/ftp-upload/maintainers_emails.txt
+$FTPUPLOAD_EMAIL_FILE = "ftp-upload-email.txt";
+  # (undone) list received from address@hidden:
+$COPYRIGHT_PAPERS_FILE = "copyright-papers.txt";
+  # (undone) http://savannah.gnu.org/cooperation/groups.tsv
+$SAVANNAH_FILE = "groups.tsv";
+  # maintained here (stale):
+$RECENTREL_FILE = "recentrel.txt";
+
+# (Not all of the above are fully implemented yet.)
+
+exit (&main ());
+
+sub main {
+  my $cmd = $ARGV[0];
+  my $arg1 = $ARGV[1];
+  my $arg2 = $ARGV[2];
+  
+  if ($cmd =~ /^-?-?help *$/) {
+    print <<END_USAGE;
+Usage: $0 CMD ARG...
+
+Perform various GNU maintainer/package operations.
+Here are the possibilities:
+
+check fsfcopyright              verify consistency: gnupackages/copyright.list
+check ftpupload                 verify consistency: maintainers/ftp-upload
+check maintainers               verify consistency: gnupackages/maintainers
+
+generate email bypackage        make messages to send out; add -h for details.
+generate maintainers bypackage  make /gd/gnuorg/maintainers.bypkg file
+                                                (run from address@hidden cron)
+generate blurbs html            make www.gnu.org/server/home-pkgblurbs.html 
+generate logos html             make www.gnu.org/graphics/allgnupkgs.html 
+generate manual html            make www.gnu.org/manual/allgnupkgs.html 
+generate packages html          make www.gnu.org/software/allgnupkgs.html
+
+list copyrightfsf               FSF-copyrighted packages
+list copyrightfsfnot            non-FSF-copyrighted packages
+
+list maintainers nophysical     maintainers without phone/address info
+
+list packages activity          packages sorted by activity-status
+list packages gplv3             packages with GPLv3 update pending
+list packages unanswered        packages we've had no contact about
+
+The idea is that "check" actions do consistency checking,
+"generate" actions write output that's intended to be used directly, and
+"list" actions are for information and further consumption.
+
+$ver
+Correspondence to address@hidden
+END_USAGE
+    return 0;
+  }
+
+  elsif ($cmd =~ /^-?-?version *$/) {
+    print "$ver\n";
+    return 0;
+  }
+
+# Features started but not finished:
+#check activityfile              verify activity-report.txt
+#list copyrightpapers            copyright.list vs. paperwork
+#check ftplisting                verify consistency: ftplisting.txt
+#check savannah                  verify consistency: gnupackages/savannah
+
+  # construct the function name from the arguments, and eval it.
+  my $fn = "${cmd}_${arg1}_${arg2}";
+  my @lines = eval "&$fn ()";
+
+  # This gives an ugly message if the eval failed, but this program is
+  # not for public consumption, so that's ok.
+  die "$0 failed: address@hidden" if $@;
+
+  # Print the resulting lines.  The idea is that none of the subroutines
+  # print normal output, but only return a list of the lines to print.
+  # (The subroutines do print warnings/errors, though.)
+  print map { "$_\n" } @lines if @lines;
+
+  return 0;
+}
+
+# All the code is in the gm-*.pl files.

Index: massmail-1303-cveauto.txt
===================================================================
RCS file: massmail-1303-cveauto.txt
diff -N massmail-1303-cveauto.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ massmail-1303-cveauto.txt   11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,39 @@
+From: address@hidden (GNU Project)
+To: %PACKAGE_MAINTAINERS
+Subject: %PACKAGE_NAME and Automake-related vulnerabilities
+Precedence: bulk
+
+Greetings,
+
+I'm sending you this message on behalf of GNU because as far as we know,
+you are the maintainer(s) of %PACKAGE_NAME.  (If you're not maintaining
+it, please reply to let me know.)
+
+Two vulnerabilities related to Automake-generated Makefiles and the dist
+and distcheck target were discovered some time ago.  It seemed to me
+that the latest release of %PACKAGE_NAME on ftp.gnu.org was still
+vulnerable to one or both.  They are:
+  http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-4029
+  http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-3386
+
+(If you did make a later release that fixes these issues, don't worry
+about this email, and sorry for the noise.  I could not determine
+the status with absolute certainty.)
+
+The issues were fixed in automake releases 1.12.2 and 1.11.6.  So the
+simplest way to mitigate them is to regenerate the Makefiles using an
+automake that is at least that new and re-release.  If you don't want to
+do that, you can also hack the Makefiles to fix the problem by hand:
+  http://lists.gnu.org/archive/html/savannah-hackers/2012-12/msg00049.html
+
+Although these vulnerabilities do not have a high probability of being
+exploited, of course we want GNU software to be safe.  So it would be
+good to make a new release, even if it's just to fix these bugs.  Of
+course other fixes or features are all to the good.
+
+As usual, aside from this issue, if you have any news or questions
+regarding the package, please let me know at address@hidden
+Thanks for contributing to GNU, and happy hacking.
+
+Karl Berry
+Assistant Chief GNUisance

Index: gnumaint.README
===================================================================
RCS file: gnumaint.README
diff -N gnumaint.README
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gnumaint.README     11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,42 @@
+Copyright 2007 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+
+gnumaint is a manager for the /gd/gnuorg/maintainers file, the
+official list of GNU packages and maintainers.
+It was written by Jose Marchesi in 2006-07.
+
+You can get listings (see ./gnumaint help list),
+send email to maintainers (./gnumaint help sendemail),
+and receive answers from the maintainers (./gnumaint help recemail).
+The ./Makefile shows sample invocations testing the various features.
+
+The file ./template-active.txt defines the mail message sent.  The first
+line is the Subject: header, the rest is the body.  The receive function
+looks for the specific string in the Subject:, so don't change it in one
+place without the other.
+
+Lines in the template starting with fmt: are piped through fmt before
+sending.
+
+If any questions/suggestions about the software, please email
address@hidden
+
+todo:
+- check for inconsistent case in maintainers package names.
+- send different msg to people in recentrel.txt.
+
+bugs from last send:
+fsd-by-license did not find gplv3 tar?!
+and what about slib publicdomain? should not have been mailed.
+ditto speex, which was xiph -- shouldn't have been mailed.
+then review mixed msgs to go out -- not tar, not gcc.
+unknown, unconfirmed maintainers
+sort both maintainers and gnupackages by block
+no non-email maintainers in .bypkg
+multiple email fields -> error
+on receipt, have to match any altemail not just primary
+must ignore maintainers without email, not send to empty

Index: gm-read.pl
===================================================================
RCS file: gm-read.pl
diff -N gm-read.pl
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gm-read.pl  11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,826 @@
+# $Id: gm-read.pl,v 1.1 2019/05/11 10:44:52 ineiev Exp $
+# Subroutines for gm script that read various external data file.
+# 
+# Copyright 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014
+# Free Software Foundation Inc.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# Originally written by Karl Berry.
+
+
+
+# Read $COPYRIGHT_LIST_FILE.  If HOW is "by-line", return hash with the
+# keys being package names and the values their line numbers in the
+# file.  If "by-year", return hash with keys as the assignment years and
+# the values another hash mapping packages to names.
+# 
+sub read_copyright_list {
+  my ($how) = @_;
+  my %ret;
+  
+  if ($how !~ /^by-(year|line)$/) {
+    die "unknown argument $how to read_copyright_list";
+  }
+
+  open (COPYRIGHT_LIST_FILE) || die "open($COPYRIGHT_LIST_FILE) failed: $!";
+  while (<COPYRIGHT_LIST_FILE>) {
+    # Look at lines following a blank line.
+    next unless /^\s*$/;
+    $_ = <COPYRIGHT_LIST_FILE>;
+    chomp;
+    
+#new    # Split at tabs.
+#new    my (@parts) = split (/\t+/);
+#new    
+#new    # If there is only one part, or more than five, something is totally 
awry.
+#new    if (@parts == 1 || @parts > 5) {
+#new      warn "$COPYRIGHT_LIST_FILE:$.: strange line tabs: $_\n";
+#new      next;
+#new
+#new    # If there are only two or three parts, we hope it is a company
+#new    # assignment, like
+#new    # Telmark       2010-4-29
+#new    # Just skip those for now.
+#new    } elsif (@parts == 2) { # xx complain if a pkgname is first?
+#new      warn "2 parts: @parts\n";
+#new      next;
+#new    
+#new    # If there are three parts, we hope it is also a company assignment
+#new    # with package name, like
+#new    # ANY   CNOC vof        2010-5-26
+#new    # Just skip these, too.
+#new    } elsif (@parts == 3) { # xx complain if a pkgname is first?
+#new      warn "3 parts: @parts\n";
+#new      next;
+#new    
+#new    # If there are four parts, it is a mystery.
+#new    } elsif (@parts == 4) { # xx complain if a pkgname is first?
+#new      warn "4 parts?: @parts\n";
+#new      next;
+#new    }
+#new    
+#new    # Five parts is the normal case of a personal assignment, like
+#new    # EMACS Richard Stallman        USA     1953    1986-09-29
+#new    my ($pkgs,$name,$birthplace,$birthyear,$date) = @parts;
+#new    warn "$pkgs by $name on $date\n";
+#new
+    
+    # Drop everything after the first tab, we don't want to see all-caps
+    # company names.
+    s/\t.*//;
+    
+    # Sometimes commas are used to separate package names.  Just replace
+    # them with spaces as a small simplification.
+    s/,/ /g;
+    
+    # Split remainder into words at whitespace.
+    my @words = split (" ");
+    
+    my $year = -1;
+    my @line_pkgs = (); # if by-year
+    for my $w (@words) {
+      # the word has to start with an uppercase letter or number,
+      # and be followed only by possible constituent characters,
+      # or we're done with this line.
+      last unless $w =~ /^[A-Z0-9][A-Z0-9._-]+$/;
+      
+      # and if it is only digits, never mind (1559643 Ontario Limited).
+      next if $w =~ /^\d+$/;
+      
+      # and if it is only digits and -, that's a date.
+      # remember the year if we need it, and we're done with this line.
+      if ($w =~ /^\d+-[-\d]+$/) {
+        if ($how eq "by-year") {
+          $year = substr ($w, 0, 4);
+          if ($year < 1980 || $year > 2222) {
+            warn "$COPYRIGHT_LIST_FILE:$.: strange year: $year\n";
+            next;
+          }
+        }
+        last;
+      }
+      
+      # keyword ANY in copyright.list is not a package name for us, etc.
+      next if $w =~ /^(ANY|MISC|TRANSLATIONS|UNUSED)$/;
+      
+      # Special case assignment, not a GNU package.
+      next if $w =~ /^(READINGRECORD)$/;
+      
+      $w = lc ($w);
+      $canonical_pkg_name = &canonicalize_pkg_name ($w);
+      
+      # Some packages have legitimate entries in copyright.list, but are
+      # nevertheless known not to be copyright FSF.  Probably would be
+      # better to maintain this information in gnupackages.txt and get it
+      # from there.  Maybe someday.
+      next if $canonical_pkg_name =~ /^(# not really ours:
+                            3dldf       #finstol
+                           |a2ps       #demaille, hatta, et al.
+                           |aspell     #atkinson
+                           |autogen    #korb
+                           |bayonne    #dyfet
+                           |ccrtp      #dyfet
+                           |djgpp      #delorie
+                           |ed         #moore "licenses"
+                           |epsilon    #french university
+                           |gcal        #esken
+                           |ghostscript #aladdin
+                           |gnome       #gnome
+                           |gnu-arch    #atai
+                           |gnuucp      #abandoned = unrelated to current uucp
+                           |gnutrition  #original author
+                           |gnuzilla    #mozilla
+                           |gsasl      #josefsson
+                           |gsl                #gough
+                           |gsrc       #sampson
+                           |icecat      #mozilla
+                           |indent      #bsd et al.
+                           |inetutils   #bsd
+                           |less        #nudelman
+                           |libgcrypt   #koch
+                           |libidn     #josefsson
+                           |octave      #many
+                           |osip       #josefsson
+                           |patch       #lwall
+                           |rcs                #tichy et al.
+                           |screen     #weigert et al.
+                           |shishi     #josefsson
+                           |social      #new social is not the old package
+                           |uucp        #airs
+                           |vera        #not an assignment
+                          )$/x;
+
+      # if by line, we can just save this package in the return hash.
+      # if by year, have to accumulate all the info on this line.
+      if ($how eq "by-year") {
+        push (@line_pkgs, $canonical_pkg_name);
+      } elsif ($how eq "by-line") {
+        $ret{$canonical_pkg_name} = $.;
+      }
+    }
+  }
+  close (COPYRIGHT_LIST_FILE) || warn "close($COPYRIGHT_LIST_FILE) failed: $!";
+  
+  $ret{"gnustandards"} = 1; # no papers, but is copyright FSF
+  $ret{"libtasn1"} = 1;     # split off from gnutls, so no separate papers
+  $ret{"lispintro"} = 1;    # no papers, but is copyright FSF
+  $ret{"mig"} = 1;          # part of hurd
+  $ret{"trans-coord"} = 1;  # container
+  
+  return %ret;
+
+  
+  # lots of names in copyright.list don't match current package
+  # identifiers, for whatever reason.
+  #
+  sub canonicalize_pkg_name {
+    my ($w) = @_;
+    
+    $w =~ s/_manual//;  # manuals are not separate packages for us.
+
+    %map = (
+#      "dotgnu"          => "dotgnu-pnet",#decommissioned
+      "enterprise"      => "gnue",     # remain?
+      "glibc"           => "libc",     # will remain
+#      "gnu-c"           => "gcc",
+#      "gnuchess"        => "chess",
+#      "gnugsl"          => "gsl",
+#      "gnupascal"       => "pascal",
+#      "gnus"            => "emacs",
+#      "gpc"             => "pascal",
+#      "graphics"        => "plotutils",
+#      "hashcash.el"     => "emacs",
+#      "info"            => "texinfo",
+#      "libavl"          => "avl",
+#      "libgcj"          => "gcc",
+#      "libgen.a"        => "libc",
+#      "libgsasl"        => "gsasl",
+#      "libutf8"         => "libunistring",
+#      "mach"            => "gnumach",
+#      "makeinfo"        => "texinfo",
+#      "malloc"          => "libc",
+#      "memcmp"          => "libc",
+#      "memcpy"          => "libc",
+#      "memset"          => "libc",
+#      "midnight"        => "mc",
+#      "midnight_commander" => "mc",
+#      "mp"              => "gmp",
+#      "muse"            => "emacs-muse",
+#      "objc"            => "gcc",
+#      "obstack"         => "libc",
+#      "pfe"             => "gforth",
+#      "pnet"            => "dotgnu-pnet",
+#      "portable.net"    => "dotgnu-pnet",
+#      "ps"              => "sysutils",
+#      "ptx"             => "coreutils",
+#      "queue"           => "gnu-queue",
+#      "radio"           => "gnuradio",
+#      "readlink"        => "coreutils",
+#      "regcmp"          => "libc",
+#      "regex"           => "libc",
+#      "regexp"          => "regex",
+#      "sasl"            => "gsasl",
+#      "shogi"           => "gnushogi",
+#      "shred"           => "coreutils",
+#      "snprintfv"       => "libc",
+#      "sql.el"          => "emacs",
+#      "strchr"          => "libc",
+#      "strftime"        => "libc",
+#      "strtod"          => "libc",
+#      "superoptimizer"  => "superopt",
+#      "texi2html"       => "texinfo",
+#      "verilog-mode.el" => "emacs",
+# fixed into /subentries:
+#      "gas"            => "binutils",
+#      "getopt"          => "libc",
+#      "gprof"          => "binutils",
+#      "glob"            => "libc",
+#      "gnu.regexp"      => "libc",
+#      "ld"             => "binutils",
+#      "robotussin"     => "binutils",
+#      "winboard"       => "xboard",
+    );
+    return $map{$w} || $w;
+  }
+}
+
+
+
+# Read $COPYRIGHT_PAPERS_FILE, generated with
+#   cd /srv/data/copyright-mirror && find -type f | sort
+#
+# Return hash with the keys being years and the values another hash
+# (reference): this one with keys being the package names and the values
+# yet a third hash (reference): this one just last names for keys, to
+# easily avoid muliple entries.  This is the information given in the
+# filenames.
+# 
+# Implementation not finished.  This is trying to check consistency
+# between the papers the FSF actually has and the records of them.
+# 
+sub read_copyright_papers {
+  my %ret;
+  
+  open (COPYRIGHT_PAPERS_FILE) ||die "open($COPYRIGHT_PAPERS_FILE) failed: $!";
+  while (<COPYRIGHT_PAPERS_FILE>) {
+    # Examples: ./1985/Curry.grep.pdf  ./1985/Robinson.emacs.1.pdf
+    chomp;
+    my (undef,$year,$file) = split ("/");
+    next if $file eq "";   # ignore top-level files
+    next if $file =~ /#/;  # ignore autosave files.
+    next if $file =~ /~$/; # ignore backup files.
+    
+    if ($year < 1980 || $year > 2222) {
+      warn "$COPYRIGHT_PAPERS_FILE:$.: strange year: $year\n";
+      next;
+    }
+    
+    $file =~ s/\.pdf$//;  # remove trailing .pdf
+    
+    my ($name,$package) = split (/\./, $file);
+    if ($name eq "") {
+      warn ("$COPYRIGHT_PAPERS_FILE:$.: empty name in $_\n");
+      next;
+    }
+
+    # many filenames lack package names; try to match up last names.
+    $package = ".nameonly" if $package eq "";
+    $ret{$year}->{$package}->{$name}++;
+  }
+    
+  close (COPYRIGHT_PAPERS_FILE)
+  || warn "close($COPYRIGHT_PAPERS_FILE) failed: $!";
+  return %ret;
+}
+
+
+
+# Read doc-categories.txt file for info about SHORT_CAT, and return a
+# reference to a two-element array.  The first element in the array is
+# the long category name; the second element is a url to the category in
+# the Free Software Directory.
+# 
+# If we ever need a third piece of information, should probably switch
+# to a hash for the values.
+# 
+sub read_doc_categories {
+  my ($short_cat) = @_;
+  
+  if (keys %doc_category == 0) {
+    open (DOC_CATEGORIES_FILE) || die "open($DOC_CATEGORIES_FILE) failed: $!";
+  
+    while (<DOC_CATEGORIES_FILE>) {
+      next if /^\s*#/;  # ignore comments
+      next if /^\s*$/;  # ignore blank lines.
+      chomp;
+    
+      my ($short,$fsd,$full) = split (" ", $_, 3);
+      my $ret_full = $full || $short;
+      my $ret_url = $fsd eq "-"
+                    ? "" : "http://directory.fsf.org/category/$fsd/";;
+      $doc_category{$short} = [ $ret_full, $ret_url ];
+           
+    }
+
+    close (DOC_CATEGORIES_FILE)
+    || warn "close($DOC_CATEGORIES_FILE) failed: $!";
+  }
+  
+  # now we have the hash, so look up SHORT_CAT.
+  my $ret;
+  if (exists ($doc_category{$short_cat})) {
+    $ret = $doc_category{$short_cat};
+  } else {
+    warn "$DOC_CATEGORIES_FILE: no short category name $short_cat\n";
+    $ret = ["no long name for $short_cat", "no url for $short_cat"];
+  }
+  
+  return $ret;
+}
+
+
+
+# Read an rsync listing of ftp.gnu.org, with entries like this:
+# 
+# drwxr-xr-x        4096 2004/01/16 12:20:08 gnu/3dldf
+# lrwxrwxrwx           5 2010/12/29 13:30:03 gnu/libc -> glibc
+# 
+# Return list of directories and symlinks under gnu/.
+#
+sub read_ftplisting {
+  my @ret;
+
+  open (FTPLISTING_FILE) || die "open($FTPLISTING_FILE) failed: $!";
+  my %keys;
+  while (<FTPLISTING_FILE>) {
+    chomp;
+    next unless /^[dl].*[0-9] gnu[^+]/;  # the 0-9 is the seconds
+    my $orig = $_;
+    s,^.* gnu/,,; # rm through the gnu/
+    s,[ /].*$,,;  # rm all following components or symlink target
+    push (@ret, $_) unless exists $keys{$_};
+    $keys{$_} = 1;
+    warn "keeping $_ from $orig\n" if /^drw/;
+  }
+  close (FTPLISTING_FILE) || warn "close($FTPLISTING_FILE) failed: $!";
+  
+  return @ret;
+}
+
+
+
+# Read the ftp-upload-email file, generated by the sysadmins.
+# Return per-package hash of info, with keys being the package names and
+# values the list of email addresses.
+#
+sub read_ftpupload_email {
+  my %ret;
+
+  open (FTPUPLOAD_EMAIL_FILE) || die "open($FTPUPLOAD_EMAIL_FILE) failed: $!";
+  while (<FTPUPLOAD_EMAIL_FILE>) {
+    chomp;
+    my ($pkg,$emails) = split (" ");
+
+    $pkg = "libc" if $pkg eq "glibc"; # name on ftp.gnu.org differs
+    
+    $ret{$pkg} = $emails;
+  }
+  close (FTPUPLOAD_EMAIL_FILE) || warn "close($FTPUPLOAD_EMAIL_FILE) failed: 
$!";
+  
+  return %ret;
+}
+
+
+
+# Read the gnupackages.txt file, return a hash of information, where
+# the keys are package names and the values are hash references with the
+# information.  If a key is given more than once (e.g., note), the
+# values are separated by |.
+# 
+# A key "lineno" is synthesized with the line number of the blank line
+# following the package.
+# 
+# Another key "human_label" is synthesized as a human-oriented package
+# name: the mundane_name: field if it's present, else a prettified
+# version of the package identifier.
+# 
+sub read_gnupackages {
+  my %ret;
+ 
+  open (GNUPACKAGES_FILE) || die "open($GNUPACKAGES_FILE) failed: $!";
+  
+  my %pkg;
+  while (<GNUPACKAGES_FILE>) {
+    next if /^#/;  # ignore comments
+    next if /^%/;  # ignore Recutils annotation
+    s/ +$//; # remove trailing spaces
+    chomp;
+    
+    # at a blank line, save the info we've accumulated, if any.
+    if (/^$/) {
+      next unless keys %pkg;
+      
+      if (exists $pkg{"package"}) {
+        my %copy = %pkg;  # do not save a pointer to what will be overwritten
+        $copy{"lineno"} = $. - 1;  # save line number
+
+        my $human_label = $pkg{"mundane_name"};
+        if (! $human_label) {
+          ($human_label = $pkg{"package"}) =~ s/^gnu/GNU/; # gnufoo -> GNUfoo
+          $human_label = ucfirst ($human_label);    # bar -> Bar
+        }
+        $copy{"human_label"} = $human_label;
+
+        # save the constructed hash.
+        $ret{$pkg{"package"}} = \%copy;
+
+      } else {
+        warn "$GNUPACKAGES_FILE:$.: no package name for block ending here\n";
+      }
+      undef %pkg;  # clear out for next
+      next;
+    }
+
+    # check for a line continuation
+    if (/^\+ /){
+       my $contval = substr $_, 2;
+       $key{$val} = $key{$val} . $contval;
+       next;
+    }
+
+    # key is everything before the first colon.
+    # value is everything after the first colon and whitespace.
+    my ($key,$val) = split (/:\s*/, $_, 2);
+    if ($key eq $_) {
+      warn "$GNUPACKAGES_FILE:$.: no colon in line\n";
+    }
+    
+    if ($key eq "package" && $val =~ /[A-Z]/) {
+      # as a convention for simplicitly, we want to eschew uppercase in
+      # package identifiers.
+      warn "$GNUPACKAGES_FILE:$.: forcing package name to lowercase\n";
+      $val = lc ($val);
+    }
+    
+    # if key already exists, use | to separate values.
+    $val = "$pkg{$key}|$val" if exists $pkg{$key};
+    
+    $pkg{$key} = $val;
+  }
+  
+  close (GNUPACKAGES_FILE) || warn "close($GNUPACKAGES_FILE) failed: $!";
+  
+  return %ret;
+}
+
+
+# Read the pkgblurbs.txt file, return a hash of information, where the
+# keys are package names and the values are hash references with the
+# information.  If a key is given more than once, an error is given.
+# A key "lineno" is synthesized with the line number of the blank line
+# following the package.
+# 
+sub read_pkgblurbs {
+  my %ret;
+
+  open (PKGBLURBS_FILE) || die "open($PKGBLURBS_FILE) failed: $!";
+
+  my %pkg;
+  while (<PKGBLURBS_FILE>) {
+    next if /^#/;  # Ignore comments
+    s/ +$//; # remove trailing spaces
+    chomp;
+
+    # at a blank line, save the info we've accumulated, if any.
+    if (/^$/) {
+      next unless keys %pkg;
+      
+      if (exists $pkg{"package"}) {
+        my %copy = %pkg;  # do not save a pointer to what will be overwritten
+        $copy{"lineno"} = $. - 1;  # save line number
+        $ret{$pkg{"package"}} = \%copy;
+      } else {
+        warn "$PKGBLURBS_FILE:$.: no package name for block ending here\n";
+      }
+      undef %pkg;  # clear out for next
+      next;
+    }
+    #
+    # the idea is that we have
+    #   blurb: text text text
+    #   + continued text continued text ...
+    #
+    # Let's look for the continuation lines first.
+    if (/^\+\s+/) {
+      if (exists $pkg{"blurb"}) {
+        # continued line, drop "+ " continuation and append.
+        s,^\+\s+,,;
+        $pkg{blurb} = "$pkg{blurb} $_";
+      } else {
+        warn "$PKGBLURBS_FILE:$.: +continuation without previous blurb:\n";
+      }
+
+    } elsif (/:/) {
+      # not a continuation line, so it should be a normal
+      # key: value line.
+      my ($key,$val) = split (/:\s*/, $_, 2);
+      # if key already exists, complain.
+      warn "found second value $val for key $key (already have $pkg{$key})\n"
+        if exists $pkg{$key};
+    
+      $pkg{$key} = $val;
+
+    } else {
+      warn "$PKGBLURBS_FILE:$.: no colon or plus in line\n";
+    }
+  }
+  close (PKGBLURBS_FILE) || warn "close($PKGBLURBS_FILE) failed: $!";
+  
+  return %ret;
+}
+
+
+
+# Read htmlxref.cnf file for entries relating to PKGNAME.
+# Return a hash where the keys are the manual identifiers and the values
+# are the urls.
+# 
+# See the HTML Xref Configuration node in the Texinfo manual.
+# The file is maintained in the util subdirectory of the Texinfo sources.
+# 
+sub read_htmlxref {
+  my ($pkgname) = @_;
+  my %ret;
+    
+  open (HTMLXREF_FILE) || die "open($HTMLXREF_FILE) failed: $!";
+
+  my %variables;
+  my %ret_type;  # record preferred xref type so far, for each manual
+  while (<HTMLXREF_FILE>) {
+    next if /^\s*#/;  # ignore comments
+    next if /^\s*$/;  # ignore blank lines.
+    chomp;
+    
+    # handle variable definitions:
+    if (/^\s*(\w+)\s*=\s*(.*)\s*$/) {
+      my ($var,$val) = ($1,$2);
+      $variables{$var} = &expand_variables ($val);
+
+    # look for manual entries relating to PKGNAME:
+    } elsif (/^\s*(\S+)\s+(\w+)\s+(.*)\s*$/) {
+      my ($manual,$type,$url) = ($1,$2,$3);
+
+      # The manual name may be exactly the package name, but it may not
+      # be, yet still part of the package.  To detect this, we see if
+      # the entry uses the package name as a variable in the url.  (This
+      # seemed the only other way we could extract the relevant manuals,
+      # barring adding another field, which seemed redundant.)  Such a
+      # variable name is always in all-uppercase, with - changed to _.
+      # 
+      (my $pkgname_as_var = $pkgname) =~ tr/a-z-/A-Z_/;
+      if ($manual eq $pkgname || $url =~ /\$\{$pkgname_as_var\}/) {
+        if (! exists $ret_type{$manual}
+            || &prefer_xref_type ($type, $ret_type{$manual})) {
+          $ret{$manual} = &expand_variables ($url);
+          $ret_type{$manual} = $type;
+        }
+      }
+      
+    } else {
+      warn "$HTMLXREF_FILE:$.: unexpected line: $_\n";
+    }
+  }
+  
+  close (HTMLXREF_FILE) || warn "close($HTMLXREF_FILE) failed: $!";
+
+  return %ret;
+
+  # using the %variables hash, expand ${varname} constructs until none
+  # remain.  If a variable isn't defined, just replace it with the empty
+  # string.  Would be better to give a warning, but let's not bother.
+  sub expand_variables {
+    my ($val) = @_;
+    $val =~ s/\$\{(\w+)\}/$variables{$1}/eg  # expand variables
+      until $val !~ /\$\{(\w+)\}/;           # until no more
+    return $val;
+  }
+
+  # If TYPE1 is preferred to TYPE2, return 1, else 0.
+  # When a given manual is available in multiple formats, we prefer the
+  # "smallest" one (mono < chapter < section < node), since packages with
+  # multiple manuals tend to be large, and in any event, we usually have a
+  # generic url (/software/pkgname/manual/) linking to all available forms.
+  sub prefer_xref_type {
+    my ($type1,$type2) = @_;
+    my %xref_types = (
+      "node"    => 10,
+      "section" => 20,
+      "chapter" => 30,
+      "mono"    => 40,
+    );
+    
+    if (! exists $xref_types{$type1}) {
+      warn "$HTMLXREF_FILE:$.: unexpected xref type: $type1\n";
+    }
+    if (! exists $xref_types{$type2}) {
+      warn "$HTMLXREF_FILE:$.: unexpected xref type: $type2\n";
+    }
+    
+    return $xref_types{$type1} < $xref_types{$type2};
+  }
+}
+
+
+
+# Read $MAINTAINERS_FILE according to $HOW, either "by-package" or
+# "by-maintainer".  We return a hash.  With "by-package", the keys are
+# package names and the values are a list of maintainer hash references.
+# With "by-maintainer", the keys are maintainer (real) names and the
+# values are hash references with their information.
+# If a field occurs more than once in a given maintainer's entry,
+# the values are separated by a |.
+# 
+# Special maintainer keys we synthesize, i.e., that are not in the
+# actual maintainers file:
+# is_generic - whether it is an actual person or a generic address;
+# best_email - uses privateemail where present, in preference to email;
+# lineno - location in the file.
+# 
+sub read_maintainers {
+  my ($how) = @_;
+  my %ret;
+  
+  open (MAINTAINERS_FILE) || die "open($MAINTAINERS_FILE) failed: $!";
+
+  # read the real information.
+  my %maint;  # info we are accumulating for one maintainer
+  while (<MAINTAINERS_FILE>) {
+    next if /^#/;  # ignore comments
+    next if /^%/;  # ignore Recutils annotation
+    chomp;
+    
+    # at a blank line, save the maintainer info we've accumulated, if any.
+    if (/^\s*$/) {
+      &debug_hash ($., %maint);
+      next unless keys %maint;
+      
+      # record whether this is a generic maintainer (starts with lowercase):
+      $maint{"is_generic"} = $maint{"name"} =~ m/^[a-z]/;
+      
+      # record best email to use for the maintainer.
+      $maint{"best_email"} = $maint{"privateemail"} || $maint{"email"};
+      
+      # record where we found it, more or less.  We are past the blank
+      # line, and we can assume every entry has at least two lines.
+      $maint{"lineno"} = $. - 4;
+      
+      if ($how eq "by-package") {
+        # split apart the package value we've accumulated..
+        if (exists $maint{"package"} || exists $maint{"uploader"}) {
+          my @pkgs = split (/\|/, $maint{"package"});
+         my @uplds = split (/\|/, $maint{"uploader"});
+
+          # append this maintainer to the list for each of his/her packages.
+          my %copy = %maint;
+         $copy{"is_uploader"} = 0;
+          for my $p (@pkgs) {
+            my @x = exists $ret{$p} ? @{$ret{$p}} : ();
+            push (@x, \%copy);
+            $ret{$p} = address@hidden;
+          }
+         my %copy2 = %maint;
+         $copy2{"is_uploader"} = 1;
+          for my $p (@uplds) {
+            my @x = exists $ret{$p} ? @{$ret{$p}} : ();
+            push (@x, \%copy2);
+            $ret{$p} = address@hidden;
+          }
+        } else {
+          warn "no packages for $maint{name}";
+        }
+
+      } elsif ($how eq "by-maintainer") {
+        if (! exists $maint{"name"}) {
+          warn "no name for maintainer";
+          next;
+        }
+        my $name = $maint{"name"};
+        if (exists $ret{$name}) {
+          warn "ignoring second entry for maintainer $name";
+          next;
+        }
+        my %copy = %maint;
+        $ret{$name} = \%copy;
+
+      } else {
+        die "can't read_maintainers($how)";
+      }
+
+      undef %maint;  # clear out for next maintainer.
+
+      last if /^\f$/;  # form feed marks end of info.
+      next;
+    }
+
+    # key is everything before the first colon.
+    # value is everything after the first colon and whitespace.
+    my ($key,$val) = split (/:\s*/, $_, 2);
+    
+    # check that an email value doesn't have two @'s.
+    if ($key =~ /email/ && $val =~ /@@/) {
+      warn "value for key $key has double \@: $val";
+      next;
+    }
+    
+    # if key already exists, use | to separate values.
+    $val = "$maint{$key}|$val" if exists $maint{$key};
+    
+    # todo: parse key of address+ and append.
+    $maint{$key} = $val;
+  }
+  
+  # skip the rest.
+  close (MAINTAINERS_FILE) || warn "close($MAINTAINERS_FILE) failed: $!";
+  
+  return %ret;
+}
+
+
+
+# Return list of entries in $OLDPACKAGES_FILE -- one per line, ignoring
+# comments starting with # and blank lines.
+# 
+sub read_oldpackages {
+  local $GNUPACKAGES_FILE = $OLDPACKAGES_FILE;
+  my %ret = &read_gnupackages ();    # reuse routine via dynamic scoping
+  return %ret;
+}  
+
+
+
+# Return list of entries in $RECENTREL_FILE -- one per line, ignoring
+# comments starting with # and blank lines.
+# 
+sub read_recentrel {
+  my @ret = ();
+  
+  open (RECENTREL_FILE) || die "open($RECENTREL_FILE) failed: $!";
+  while (<RECENTREL_FILE>) {
+    next if /^\s*#/;  # ignore comments
+    next if /^\s*$/;  # ignore blank lines.
+    chomp;
+    push (@ret, $_);
+  }
+  close (RECENTREL_FILE) || warn "close($RECENTREL_FILE) failed: $!";
+ 
+  return @ret;
+}
+
+
+
+# read the savannah groups.tsv file, return a hash of information, where
+# the keys are project identifiers and the values are references to
+# hashes with the information.  A key "lineno" is included in each value.
+# 
+sub read_savannah {
+  my %ret;
+  
+  open (SAVANNAH_FILE) || die "open($SAVANNAH_FILE) failed: $!";
+  <SAVANNAH_FILE>;  # ignore first line (with field names).
+  
+  # We want only the offical GNU packages, which, happily, come first (type=1).
+  while (<SAVANNAH_FILE>) {
+    last if /^2/;  # quit at first non-gnu
+    chomp;
+    my ($type_id,$name,$unix_group_name,$group_name) = split (/\t/);
+
+    my %pkg;
+    $pkg{"name"} = $group_name;
+    $pkg{"lineno"} = $.;
+    
+    if (exists $ret{$unix_group_name}) {
+      warn "$SAVANNAH_FILE:$.: already saw $unix_group_name?\n";
+    } else {
+      $ret{$unix_group_name} = \%pkg;
+    }
+  }
+  
+  close (SAVANNAH_FILE) || warn "close($SAVANNAH_FILE) failed: $!";
+  
+  return %ret;
+}
+
+
+1;

Index: recentrel.txt
===================================================================
RCS file: recentrel.txt
diff -N recentrel.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ recentrel.txt       11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,75 @@
+# released only, no announcement
+gnuradio
+commoncpp
+gcc
+solfege
+smalltalk
+nano
+global
+kawa
+bayonne
+ccscript
+tramp
+gprolog
+libextractor
+gnunet
+ccrtp
+aspell
+gdb
+bpel2owfn
+libcdio
+gettext
+ccaudio
+gettext
+radius
+autoconf
+units
+gnujump
+osip
+mailutils
+inetutils
+cpio
+groff
+jel
+electric
+glibc
+erc
+parted
+ed
+reftex
+bash
+readline
+findutils
+libmatheval
+gsl
+glpk
+autogen
+coreutils
+src-highlite
+m4
+songanizer
+reftex
+gzip
+osip
+gnutls
+gsasl
+classpath
+libidn
+xnee
+libgcrypt
+autogen
+libopts
+glpk
+ghostscript
+gperf
+gnupg
+tramp
+nano
+global
+fdisk
+parted
+solfege
+bpel2owfn
+libc
+gnuschool
+shtool

Index: Makefile
===================================================================
RCS file: Makefile
diff -N Makefile
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ Makefile    11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,183 @@
+# $Id: Makefile,v 1.1 2019/05/11 10:44:52 ineiev Exp $
+# Copyright 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015
+# Free Software Foundation, Inc.
+#
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved.
+
+default:
+
+# when we want to remake all the .html on the web site,
+# $(gw) being the www cvs checkout.
+html-update html: pkgblurbs.txt
+       gm generate logos html    >$(gw)/graphics/allgnupkgs.html
+       gm generate manual html   >$(gw)/manual/allgnupkgs.html
+       gm generate packages html >$(gw)/software/allgnupkgs.html
+       gm generate blurbs html   >$(gw)/server/home-pkgblurbs.html
+
+html-diff:
+       -cd $(gw) && cvs diff -u0 */allgnupkgs.html server/home-pkgblurbs.html
+
+pkg-blurbs-html bhtml: pkgblurbs.txt
+       gm generate blurbs html | tee ~/tmp/x.html
+
+test-genlhtml ghtml:  # result included from www.gnu.org/graphics/manual.html
+       gm generate logos html | tee ~/tmp/x.html
+
+test-genmhtml mhtml:  # result included from www.gnu.org/manual/manual.html
+       gm generate manual html | tee ~/tmp/x.html
+
+test-genphtml phtml shtml:  # result included from 
www.gnu.org/software/software.html
+       gm generate packages html | tee ~/tmp/x.html
+
+test-genmaint maint:  # this function updates gnuorg/maintainers.bypkg
+       gm generate maintainers bypackage
+
+test-genemail email:
+       gm generate email bypackage -o msg.1303 -p pkglist-cveauto.txt -t 
massmail-1303-cveauto.txt
+       ls msg.1303/
+
+email-stale-%:
+       gm generate email bypackage -o msg.$* -p pkglist-stale-$*.txt -t 
massmail-$*-stale.txt
+       ls msg.$*/
+
+email-1201:
+       gm generate email bypackage -o msg.1201 -p pkglist-fsfpackages.txt -t 
massmail-1201-copyright.txt
+       ls msg.1201/
+
+test-genemail-err:
+       gm generate email bypackage  # should give error, missing args
+test-genemail-help:
+       gm generate email bypackage -h
+fsfpackages.txt: copyright.list gm gm-read.pl gm-util.pl pkgblurbs.txt
+       gm list copyrightfsf >$@
+
+test-listfsf fsf:
+       gm list copyrightfsf
+       
+test-listfsfnot fsfnot:
+       gm list copyrightfsfnot
+
+test-listpapers pap:
+       gm list copyrightpapers
+       
+test-nophysical:
+       gm list maintainers nophysical
+
+test-listactivity stale:
+       gm list packages activity
+
+test-gplv3 gplv3:
+       gm list packages gplv3
+       
+test-unanswered:
+       gm list packages unanswered
+       
+test-checkactivity cact:
+       gm check activityfile
+       
+test-checkfsf cfsf: gnupackages.txt
+       gm check fsfcopyright
+
+test-checkmaint cmaint: gnupackages.txt
+       gm check maintainers
+
+test-checkftp-upload cfu:
+       gm check ftpupload
+
+test-checkftp ftp:
+       gm check ftplisting
+       
+test-checksv sv:
+       gm check savannah
+
+# 
+creport: gnupackages.txt
+       @printf "total "; gm generate maintainers bypackage \
+                         | grep ' - ' | grep -v ' (generic)' | wc -l
+       @printf "fsf   "; gm list copyrightfsf 2>/dev/null | wc -l
address@hidden "notfsf"; gm list copyrightfsfnot | wc -l
+# the totals don't exactly match because of gm-utils.pl:skip_pkg_p,
+# so don't bother showing.
+       @$(MAKE) --no-print-directory cfsf
+# just a dirty count of the various categories.
+       @sed -n 's/^copyright-holder: fsf//p' gnupackages.txt \
+       | sed 's/^-//' \
+       | sort | uniq -c
+
+#      | sed 's/-.*//' \
+
+maint-field-check:
+       sed 1,/`printf '\f'`/d maintainers \
+       | sed s/#.*// | 
+       | sed -n 's/^\([^ ]*\):.*/\1/p' \
+       | sort | uniq -c | sort -n
+
+test-listmaint:
+       gnumaint list maintainers $(sep)
+       gnumaint list maintainers package karl1test  $(sep)
+       gnumaint list maintainers karl $(sep)
+       
+test-list-packages:
+#      gnumaint list packages $(sep)
+#      gnumaint list packages maintained $(sep)
+#      gnumaint list packages unmaintained $(sep)
+#      gnumaint list packages maintainer karl $(sep)
+       gnumaint list packages maintainer arenn $(sep)
+
+# 
+# gnumaint (mail) and conversion.
+# 
+test-help:
+       gnumaint help sendemail $(sep)
+       gnumaint help list $(sep)
+       gnumaint help $(sep)
+
+test-rece:
+#      gnumaint recemail </etc/issue
+#      gnumaint recemail <testjunk1.msg
+       gnumaint recemail <testgood1.msg
+#      gnumaint recemail <testaddr+real.msg
+#      gnumaint recemail <testaddrangle.msg
+#      gnumaint recemail <testaddrcase.msg
+#      gnumaint recemail <testaddrcomment.msg
+
+sep = 2>&1 | dos2unix; true ------------------------------
+
+test-send:
+       gnumaint sendemail active $(sep)
+       
+test-activity-convert:
+       mailtoname
+
+test-maint-convert:
+#      maintfileupgrade $(gorg)/maintainers | dos2unix
+       maintfileupgrade m.src | dos2unix | tee m.new
+
+# 
+# Old txt files, now maintained as recfiles
+pkgblurbs.txt: rec/pkgblurbs.rec
+       gawk -f rec/pkgblurbs2txt.awk < $< > $@
+gnupackages.txt: rec/gnupackages.rec
+       gawk -f rec/gnupackages2txt.awk < $< > $@
+
+# 
+# From the good old days when the Directory was in CVS.
+# 
+#gnuorg = $(go)
+#dircvs = $(HOME)/gnu/src/directory/CVS
+#
+## compare GNU package names in maintainers file and Free Software Directory.
+#check-pkgnames: pkgnames.frommaint pkgnames.fromdir
+#      comm -3 $^
+#
+## list of all packages derived from the maintainers file.
+## (easier to parse from maintainers.bypkg, generated from maintainers).
+#pkgnames.frommaint: $(gnuorg)/maintainers.bypkg
+#      sed -e 's/#.*$$//' -e 's/ - .*$$//' $< | grep -v '(generic)' \
+#      | sed '/^$$/d' | sort >$@
+#
+## list of all packages derived from the Free Software Directory.
+#pkgnames.fromdir: gnufsd $(dircvs)/Entries
+#      $< byname >$@

Index: temail-4post.txt
===================================================================
RCS file: temail-4post.txt
diff -N temail-4post.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ temail-4post.txt    11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,34 @@
+Sample blurbs for sending to new maintainers, to be edited as appropriate.
+
+------------------------------------------------------------------
+[check savannah; if they aren't there, get them to create an account.]
+[a first msg, right after they are appointed]
+
+I added you to the gnu-prog lists.  You should have received the welcome
+msgs just before this.
+
+Also, can you please send us a phone number / mailing address /
+alternative email, just to have as backup?  We try to collect these for
+all GNU maintainers.  Of course we won't publicize the information
+anywhere on the web.  If you would prefer to send this info encrypted,
+please let me know.
+
+[for new packages only]
+Also, can you please write a couple of sentences describing your
+package, for use on http://www.gnu.org/manual/blurbs.html?
+
+-------------------------------------------------------------------
+[a second msg, after they reply]
+Thanks for the contact info.
+
+[for replacement maintainers only]
+Please go ahead and update any of the information at the savannah
+project and on the web pages (e.g., remove the looking-for-a-maintainer
+notice :) as needed.
+http://www.gnu.org/prep/maintain/html_node/Web-Pages.html talks about
+handling web pages, including a template you can use if you like.
+
+If any questions or problems with the GNU infrastructure, please feel
+free to email us (or address@hidden, as mentioned in the welcome email).
+
+Happy hacking,

Index: spotlight.mk
===================================================================
RCS file: spotlight.mk
diff -N spotlight.mk
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ spotlight.mk        11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,77 @@
+FP = fencepost.gnu.org
+FP_GNU_EXCLUDES = --exclude=*.sig --exclude=video/TIME --exclude=find.txt.gz \
+       --exclude=ls-l*.txt.gz --exclude=gnu-keyring.gpg
+
+SL_DIR = spotlight
+GNUBYTIME = perl $(SL_DIR)/gnubytime.pl
+SL_M4 = $(SL_DIR)/spotlight.m4
+
+SL_TMP = spotlight-tmp
+REL = $(SL_TMP)/releases.gnu
+REL_BY_TIME = $(SL_TMP)/releases-by-time.gnu
+REL_THIS_MONTH = $(SL_TMP)/releases-this-month.gnu
+REL_READY = $(SL_TMP)/releases-ready.gnu
+REL_MD = $(SL_TMP)/releases.md
+SL_MD = $(SL_DIR)/spotlight-$(shell date +%Y-%m-%d).md
+ACTIVITY_REPORT = $(SL_TMP)/activity-report.txt
+
+define HELP
+Procedure:
+       1. make release-list
+       2. [manually edit $(REL_THIS_MONTH), rename to $(REL_THIS_MONTH)-ready]
+       3. make markdown
+endef
+
+release-list: $(REL_THIS_MONTH)
+
+markdown: $(SL_MD)
+
+help:
+       $(info $(HELP))
+
+.PHONY: release-list markdown help
+
+$(REL):
+       mkdir -p $(SL_TMP)
+       rsync --no-h -r $(REL_EXCLUDES) $(FP):/srv/data/ftp-mirror/ftp/ \
+               | egrep -v '^[dl]' >"$@"
+
+$(ACTIVITY_REPORT):
+       scp $(FP):~brandon/src/womb/gnumaint/activity-report.txt $@
+
+$(REL_BY_TIME): $(REL)
+       $(GNUBYTIME) "$<" >"$@"
+
+ifdef END_DATE
+$(REL_THIS_MONTH): $(REL_BY_TIME)
+       if grep -q "$(END_DATE)" $<; then \
+               sed '/$(END_DATE)/,$$d;s|^.*/||' "$<" | sort -u >"$@"; \
+               printf "\nNow manually edit $@, rename to address@hidden"; \
+               printf "Run '$(MAKE) markdown' to continue.\n"; \
+       else \
+               printf "Invalid end date (no packages released on that 
date)\n"; \
+               exit; \
+       fi
+else
+$(REL_THIS_MONTH):
+       $(error No end date (end of previous Spotlight) specified (e.g. 
END_DATE=20150222))
+endif
+
+$(REL_THIS_MONTH)-ready:
+       $(error You must create $@ by manually editing $(REL_THIS_MONTH))
+
+$(REL_READY): $(REL_THIS_MONTH)-ready
+       sort "$<" >"$@"
+
+$(REL_MD): $(REL_READY)
+       sed \
+               -e 's,\(.*\)-\([^-]*\),* 
[\1-\2](https://www.gnu.org/software/\1/),' \
+         "$<" >"$@"
+
+$(SL_MD): $(REL_MD)
+       m4 \
+               -DNN="`wc -l <$(REL_MD)`" \
+               -DDATE="`date '+%B %d, %Y'`" \
+               -DRELEASES="`cat $(REL_MD)`" \
+               -DNEWMAINT="TODO new maintainers" \
+               $(SL_M4) >"$@"

Index: temail-2dub.txt
===================================================================
RCS file: temail-2dub.txt
diff -N temail-2dub.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ temail-2dub.txt     11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,152 @@
+From: address@hidden (Brandon Invergo)
+To: 
+Cc: address@hidden, address@hidden
+Subject: maintaining 
+ 
+I hereby appoint you as the new maintainer of 
+Thanks for volunteering.
+
+Being a package maintainer is a relationship between you personally
+and the GNU Project.  The maintainer or maintainers are the ones who
+take the overall responsibility for the work done on the package, on
+behalf of the GNU Project.
+
+If you recruit others to contribute to the package (and some packages
+have hundreds of contributors), they work under your supervision.  You
+can delegate some of your authority to them, but you can also take it
+back.  Please make sure they don't come to think that you have ceded
+your authority to them and that they no longer have to follow your
+directions.
+
+The GNU Project will sometimes need to talk with you, sometimes
+privately, so please make sure we know a personal email address which
+you read frequently.  We normally publish these email addresses in the
+Free Software Directory.  We would also like to know other ways to get
+in touch with you if email fails; we do not give them out.
+
+If you ever want to step down as maintainer, or would like someone
+else to replace you, please talk with address@hidden about it.
+When a package has no maintainer, we need to know about the problem so
+we can look for a new one.  The program remains a GNU package
+unless/until the GNU project decides to drop ties with it.
+
+Likewise, if you think someone else should join you as co-maintainer
+or take over from you as maintainer, please suggest that to us, since
+we will need to establish a relationship with that person.  A person
+cannot become a GNU package maintainer except by being appointed by
+the GNU Project.
+
+Your appointment as maintainer is provisional at first.  We'll make
+your appointment full and permanent when we see that you're doing the
+job.  Usually that means we see that you've made a release properly,
+with the changes that the next release ought to have.  However, if
+making a proper release involves a lot of work, and will therefore
+take a long time, we could appoint you full maintainer when we see you
+have made a good start on the job.
+
+Please tell us the first time you're about to make a release, so we
+can guide you on doing it properly following our conventions.
+
+The GNU maintainer information in https://www.gnu.org/prep/maintain/
+describes a lot of procedures for GNU maintainers.  It also
+describes who you can ask for various kinds of support or advice.  If
+you encounter a situation where it isn't clear what to do, you can
+also ask address@hidden, which is a list of a few other GNU
+maintainers who have offered to answer questions for new maintainers.
+
+We will add you to the gnu-prog mailing list, a moderated list for
+announcements to GNU maintainers.  We will also add you to the
+gnu-prog-discuss list, which can be used for discussion among GNU
+maintainers, but whether to stay on the list is up to you.
+
+We strongly recommend using ftp.gnu.org to make distributions
+available.  Please see the GNU maintainers guide for the procedure,
+https://www.gnu.org/prep/maintain/html_node/Automated-FTP-Uploads.html.
+When that is set up, you'll be able to do uploads yourself.  If you
+want to also distribute the package from a site of your own, that is
+fine.  To use some other site instead of ftp.gnu.org is acceptable,
+provided it allows connections from anyone anywhere.
+
+Please write or update the web pages about the program, to put in
+https://www.gnu.org/software/PROGNAME.  These pages should be the
+main web site for the program, and they should really have the
+information for users, not just a link to another site; please use
+https://www.gnu.org/software/PROGNAME whenever you give out the URL
+for the home page of the program.  Please don't set up a "site for the
+program" anywhere else--if you want to do work on additional web pages
+about the program, please put them on www.gnu.org.
+
+(It is ok to put pages that address developers-only topics on another
+site, and likewise for pages that access databases.)
+
+In writing the web pages, please follow the style guidelines in
+https://www.gnu.org/server/fsf-html-style-sheet.html.  See also
+https://www.gnu.org/prep/maintain/html_node/Web-Pages.html.
+
+We ask that you register your package on Savannah, at least to maintain
+your package's web pages.  This is independent of where the actual
+program sources are hosted (although we encourage you to use Savannah
+for that too).  This makes it easy to update the web pages, since you
+will have access to a CVS repository for the web pages and can update it
+as you like.  Using Savannah will help the GNU Project in other ways,
+too.  To set this up, visit https://savannah.gnu.org/.
+
+Please also write an entry or a change for the page
+https://www.gnu.org/people/people.html, and mail that to
address@hidden  Note that we don't want to talk about
+proprietary software, so if you have worked on any, please don't
+mention it here.  Your entry can include a link to your home page
+provided it fits our usual criteria for what we link to.
+
+Please update the program's entry in our Free Software Directory.  See
+https://www.gnu.org/help/directory.html#adding-entries for help.
+
+Mailing lists: Your package should already have a mailing list
address@hidden for reporting bugs.  If not, please create it--see
+https://www.gnu.org/prep/maintain/html_node/Mail.html for the details of
+creating mailing lists.
+
+Some GNU programs with many users have another mailing list,
address@hidden, for people to ask other users for help.  If
+your program has many users, you should create such a list for it.
+For a fairly new program, which doesn't have a large user base yet, it
+is better not to bother with this.
+
+Please post announcements of new releases of the program to
address@hidden  Include a brief description of the program so people
+can tell whether they are interested in using it.  The announcement
+should mention the web pages on www.gnu.org, and say where to get
+releases, normally ftp.gnu.org.
+
+You can also send announcements to a special list address@hidden
+for your program if you think that is warranted.  (This list should be
+moderated.)
+
+Please also mention release announcements in the news feed of the
+savannah project site, <https://savannah.gnu.org/projects/PROGNAME>.
+The news feeds from the GNU project are aggregated at
+<https://planet.gnu.org/>.
+
+For more details about writing and publicizing announcements, please see
+https://www.gnu.org/prep/maintain/html_node/Announcements.html.
+
+For details on all policies and recommendations for GNU packages,
+please see the GNU maintainers information, at
+https://www.gnu.org/prep/maintain/, and GNU coding standards, at
+https://www.gnu.org/prep/standards/.
+
+For the basic ideas of GNU and free software, please read these essays:
+http://www.gnu.org/gnu/the-gnu-project.html
+http://www.gnu.org/philosophy/free-sw.html
+http://www.gnu.org/philosophy/categories.html
+http://www.gnu.org/philosophy/compromise.html
+http://www.gnu.org/philosophy/words-to-avoid.html
+http://www.gnu.org/gnu/linux-and-gnu.html
+http://www.gnu.org/gnu/gnu-linux-faq.html
+http://www.gnu.org/philosophy/open-source-misses-the-point.html
+
+new-gnu people, could you please enter XYZ in
+gnuorg/maintainers and add him to the gnu-prog lists?
+
+Savannah hackers, could you please ensure that XYZ is an administrator
+of the project on Savannah (if there is one)?

Index: testgood1.msg
===================================================================
RCS file: testgood1.msg
diff -N testgood1.msg
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ testgood1.msg       11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,14 @@
+From address@hidden Sun Feb 11 14:48:08 2007
+Return-path: <address@hidden>
+Envelope-to: address@hidden
+Delivery-date: Sun, 11 Feb 2007 14:48:08 -0500
+Received: from karl by fencepost.gnu.org with local (Exim 4.60)
+       (envelope-from <address@hidden>)
+       id 1HGKgC-0000P9-M8
+       for address@hidden; Sun, 11 Feb 2007 14:48:08 -0500
+To: address@hidden
+Message-Id: <address@hidden>
+From: address@hidden
+Date: Sun, 11 Feb 2007 14:48:08 -0500
+Subject: GNU package maintenance
+

Index: testaddrcomment.msg
===================================================================
RCS file: testaddrcomment.msg
diff -N testaddrcomment.msg
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ testaddrcomment.msg 11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,14 @@
+From address@hidden Sun Feb 11 14:48:08 2007
+Return-path: <address@hidden>
+Envelope-to: address@hidden
+Delivery-date: Sun, 11 Feb 2007 14:48:08 -0500
+Received: from karl by fencepost.gnu.org with local (Exim 4.60)
+       (envelope-from <address@hidden>)
+       id 1HGKgC-0000P9-M8
+       for address@hidden; Sun, 11 Feb 2007 14:48:08 -0500
+To: address@hidden
+Message-Id: <address@hidden>
+From: address@hidden (Karl Berry)
+Date: Sun, 11 Feb 2007 14:48:08 -0500
+Subject: GNU package maintenance
+

Index: temail-0query.txt
===================================================================
RCS file: temail-0query.txt
diff -N temail-0query.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ temail-0query.txt   11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,131 @@
+[This is generic text to send to prospective (co-)maintainers, that is,
+ before they are appointed.  Of course the intro text should be adjusted
+ to suit the case at hand.  The crucial thing is that all maintainers
+ must explicitly agree to follow GNU policies.]
+
+Below is our general info on policies and conventions for maintaining
+GNU programs.  Please take a look; assuming you're ok with them, we'll
+be glad to officially appoint you the new maintainer.
+
+========================================================================
+Here's the explanation of what it means for a program to be a GNU
+package, which also explains at a general level the responsibilities
+of a GNU package maintainer.
+
+GNU is not simply a collection of useful programs.  We started the GNU
+Project with a specific overall goal: to create a free software
+operating system, the GNU System.  To keep the GNU system technically
+coherent, we make sure that the parts fit well together.
+
+Thus, becoming a GNU maintainer is a somewhat formal process, since
+affiliating with the GNU project as a maintainer means you must agree to
+work (within the confines of the maintenance) with the GNU project's
+mission for software freedom.
+
+Here is the basic explanation.
+
+======================================================================
+Making a program GNU software means that its developers and the GNU
+project agree that "This program is part of the GNU project, released
+under the aegis of GNU"--and say so in the program.
+
+The GNU Project appoints package maintainers--initially the main
+developers, or those of them who wish to be appointed--to take
+responsibility for the package on the behalf of the GNU project.  We
+hope it won't happen, but if they step down, we look for other
+maintainers.  The program remains a GNU package unless/until the GNU
+project decides to drop ties with it.
+
+Being a GNU package means we normally put the program on ftp.gnu.org
+(although we can instead refer to your choice of ftp site, as long as
+it allows connections from anyone anywhere).
+
+The official site for the GNU package should be on www.gnu.org,
+specifically in /software/PROGRAMNAME.  Whenever you give out the URL
+for the package home page, you would give this address.  It is ok to
+use another site for secondary topics, such as pages meant for people
+helping develop the package, and for running data bases.  (We can make
+an exception, and put the web pages somewhere else, if there is a
+pressing reason.)
+
+It means that the developers agree to pay attention to making the
+program work well with the rest of the GNU system--and conversely that
+the GNU project will encourage other GNU maintainers to pay attention
+to making their programs fit in well with it.
+
+Just what it means to make programs work well together is mainly a
+practical matter that depends on what the program does.  But there are
+a few general principles.  Certain parts of the GNU coding standards
+directly affect the consistency of the whole system.  These include
+the standards for configuring and building a program, and the
+standards for command-line options.  It is important to make all GNU
+programs follow these standards, where they are applicable.
+
+Another important GNU standard is that GNU programs should come with
+documentation in Texinfo format.  That is the GNU standard
+documentation format, and it can be converted automatically into
+various other formats.  You can use DocBook format or another suitable
+format for the documentation sources, as long as converting it
+automatically into Texinfo gives good results.
+
+If a GNU program wants to be extensible, it should use Guile
+(https://www.gnu.org/software/guile/guile.html) as the programming
+language for extensibility, if possible.  For some programs there's a
+reason to do things differently, but please use Guile if that is
+feasible.
+
+A GNU program should use the latest version of the license that the
+GNU Project recommends--not just any free software license.  For most
+packages, this means releasing under the GNU GPL, "version 3 or later."
+
+A GNU program should not recommend use of any non-free program, and it
+should not refer the user to any non-free documentation for free
+software.  The campaign for free documentation to go with free
+software is a major focus of the GNU project (see
+https://www.gnu.org/philosophy/free-doc.html); to show that we are
+serious about it, we must not undermine our position by recommending
+documentation that isn't free.
+
+Occasionally there are issues of terminology which are important for
+the success of the GNU project as a whole.  So we expect maintainers
+of GNU programs to follow them.  For example, the documentation files
+and comments in the program should speak of GNU/Linux systems, rather
+than calling the whole system "Linux", and should use the term "free
+software" rather than "open source".  Since a GNU program is released
+under the auspices of GNU, it should not say anything that contradicts
+the GNU Project's views.
+
+For a program to be GNU software does not require transferring
+copyright to the FSF; that is a separate question.  If you transfer
+the copyright to the FSF, the FSF will enforce the GPL for the program
+if someone violates it; if you keep the copyright, enforcement will be
+up to you.
+
+As the GNU maintainer of the package, please make sure to stay in
+touch with the GNU Project.  If we come across a problem relating to
+the package, we need to tell you about it, and to discuss with you how
+to solve it.  Sometimes we will need to ask you to work with other
+maintainers to solve a problem that involves using multiple packages
+together.  This probably will happen less than once a year, but please
+make sure we can contact you in case it does happen.
+
+Finally, if you decide to step down as maintainer at any time, please
+inform us (see https://www.gnu.org/prep/maintain/html_node/Stepping-Down.html).
+
+More details are available in these documents:
+  Information For Maintainers of GNU Software:
+  https://www.gnu.org/prep/maintain/
+
+  GNU Coding Standards:
+  https://www.gnu.org/prep/standards/
+
+For the basic ideas of GNU and free software, please read these essays:
+  https://www.gnu.org/gnu/the-gnu-project.html
+  https://www.gnu.org/philosophy/free-sw.html
+  https://www.gnu.org/philosophy/categories.html
+  https://www.gnu.org/philosophy/compromise.html
+  https://www.gnu.org/philosophy/words-to-avoid.html
+  https://www.gnu.org/gnu/linux-and-gnu.html
+  https://www.gnu.org/gnu/gnu-linux-faq.html
+  https://www.gnu.org/philosophy/open-source-misses-the-point.html
+========================================================================

Index: gm-generate.pl
===================================================================
RCS file: gm-generate.pl
diff -N gm-generate.pl
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gm-generate.pl      11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,447 @@
+# $Id: gm-generate.pl,v 1.1 2019/05/11 10:44:52 ineiev Exp $
+# The generate actions for the gm script (see --help message).
+# 
+# Copyright 2007, 2008, 2009, 2010, 2012, 2013, 2014
+# Free Software Foundation Inc.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# Originally written by Karl Berry.
+
+
+
+# Return doc links for all packages.  The result is included in
+# http://www.gnu.org/manual/manual.html via SSI.
+# 
+sub generate_logos_html {
+  my $autostamp = &generated_by_us ();
+  my @ret = ("<!-- File $autostamp -->");
+  push (@ret, "<table>");
+  
+  my %pkgs = &read_gnupackages ();
+  for my $pkgname (sort keys %pkgs) {
+    next if &skip_pkg_p ($pkgname);
+    my $logo = $pkgs{$pkgname}->{"logo"};
+    next unless $logo;
+    
+    push (@ret, qq!<tr><td><a href="/software/$pkgname/">$pkgname</a></td>!);
+    push (@ret, qq!    <td><img alt="$pkgname" 
src="/graphics/pkg-logos-250x100/$pkgname.250x100.png" /></td></tr>\n!);
+  }
+
+  push (@ret, "</table>");
+  push (@ret, "<!-- End file $autostamp -->");
+
+  return @ret;
+}  
+
+
+
+# Return all packages with all their maintainers, one package per
+# line, like the original format of the maintainers file.  We run this
+# from cron.
+# 
+sub generate_maintainers_bypackage {
+  my @ret = ();
+  
+  my %pkgs = &read_maintainers ("by-package");
+  
+  for my $p (sort { lc($a) cmp lc($b) } keys %pkgs) {
+    my ($entries,$generic_entry,$uploaders) = &maintainer_email_addrs 
($pkgs{$p});
+    
+    # might not be anything in @entries if the only maintainer was generic.
+    push (@ret, "$p - $entries") if $entries;
+    
+    # if we had a generic maintainer for this package, add that as a
+    # separate entry, since that's the way rms wants it.
+    push (@ret, "$p (generic) - $generic_entry") if $generic_entry;
+
+    # if there are named uploaders (distinct from maintainers), add
+    # them under a separate entry
+    push (@ret, "$p (uploaders) - $uploaders") if $uploaders;
+  }
+  
+  return @ret;
+}
+
+
+
+# Return doc links for all packages.  The result is included in
+# www.gnu.org/manual/manual.html via SSI.
+# 
+sub generate_manual_html {
+  my $autostamp = &generated_by_us ();
+  my @ret = ("<!-- File $autostamp -->");
+  
+  # we want to output by category, so keep a hash with category names
+  # for keys, and lists of package references for values.
+  my %cat;
+
+  my %pkgs = &read_gnupackages ();
+  
+  # Sort packages into their categories.
+  for my $pkgname (sort keys %pkgs) {
+    next if &skip_pkg_p ($pkgname);
+    my %p = %{$pkgs{$pkgname}};
+
+    my $short_cat = $p{"doc_category"};
+    if (! $short_cat) {
+      warn (&gnupkgs_msg ("lacks doc_category\n", %p));
+      next;
+    }
+    
+    # Append to the list of packages for this category.
+    my @x = exists $cat{$short_cat} ? @{$cat{$short_cat}} : ();
+    push (@x, \%p);
+    $cat{$short_cat} = address@hidden;
+  }
+
+  # show list of all categories at top
+  push (@ret, &output_category_list (%cat));
+  
+  push (@ret, "<table>");
+  push (@ret, qq!<col width="24%" />!); # <td width=...> disallowed in XHTML.
+  push (@ret, qq!<col width="74%" />!); 
+  
+  # Sort first by full category name, since the abbreviations sometimes
+  # start with a completely different string (Libraries -> Software
+  # libraries).  Then, for each category, sort list of packages and output.
+  # 
+  for my $short_cat (sort by_full_cat keys %cat) {
+    my ($full_cat,$cat_url) = @{ &read_doc_categories ($short_cat) };
+
+    push (@ret, &output_cat ($short_cat, $full_cat, $cat_url));
+    
+    # For each package ...
+    for my $pkg_ref (sort by_pkgname @{$cat{$short_cat}}) {
+      my %p = %$pkg_ref;
+      my ($doc_url,$doc_summary) = ($p{"doc_url"}, $p{"doc_summary"});
+      if (! $doc_url || ! $doc_summary) {
+        warn (&gnupkgs_msg ("lacks doc_(url|summary)\n", %p));
+        next;
+      }
+      
+      # convert the doc-url value to a hash of manuals and urls.
+      my $pkgname = $p{"package"};
+      my $home_url = "/software/$pkgname/";
+      
+      my %doc_urls = &find_doc_urls ($pkgname, $p{"doc_url"});      
+      
+      # if there was no explicit url for the package, use the home page.
+      if (! exists ($doc_urls{$pkgname})) {
+        $doc_urls{$pkgname} = $home_url;
+      }
+      
+      # have to replace & with &amp; for XHTML.
+      for my $manual (keys %doc_urls) {
+        (my $doc_url_xhtml = $doc_urls{$manual}) =~ s,\&,\&amp;,g;
+        $doc_urls{$manual} = $doc_url_xhtml;
+      }
+      
+      # start building output string for this package.
+      # first column is the package name and additional manuals.
+      # Add an id for each package for easy linking;
+      # but XHTML, as usual, introduces gratuitious problems.
+      my $xhtml_id = &xhtml_id ($pkgname);
+      my $str = qq!\n<tr id="$xhtml_id"><td>* !;
+      
+      # the main package identifier and its doc url.  If we have a
+      # mundane name, use it.  Otherwise, prettify the pkg identifier.
+      my $human_label = $p{"human_label"};
+      $str .= qq!<a href="$doc_urls{$pkgname}">$human_label</a>!;
+      
+      # followed by other manual identifiers if present.
+      my @more_manuals = ();
+      for my $manual (keys %doc_urls) {
+        next if $manual eq $pkgname; # already took care of that
+        push (@more_manuals,
+              sprintf (qq!<a href="%s">$manual</a>!, $doc_urls{$manual}));
+      }
+      if (@more_manuals) {
+        $str .= "\n<small>(";
+        $str .= join ("\n  ", sort @more_manuals);
+        $str .= ")</small>\n";
+      }
+      $str .= "</td>\n";
+
+      # Second column is the package synopsis, any shop url's, and
+      # the package home page.
+      my $summary = "$doc_summary."; # yep, add period
+      my $shop = &find_shop_urls (%p);
+      my $home = qq!\n       [<a href="$home_url">$pkgname&nbsp;home</a>]!;
+
+      $str .= qq!    <td>$summary$shop$home!;
+      $str .= "</td></tr>";  
+      
+      push (@ret, $str);
+    }
+  }
+  push (@ret, "</table>");
+
+  # show list of categories again at the end:
+  push (@ret, &output_category_list (%cat));
+
+  push (@ret, "<!-- End file $autostamp -->");
+
+  return @ret;
+
+
+  # HTML output for the beginning of each doc category --
+  # the table row with the text, a header, a link.  The padding-top
+  # leaves a bit of extra space above the header, and padding-left moves
+  # the header right to straddle the columns.
+  # 
+  sub output_cat {
+    my ($short_cat,$full_cat,$cat_url) = @_;
+    my $css = qq!style="padding-top:.8em; padding-left:16%;"!;
+    my $ret = "\n\n<tr>\n";
+    $ret .= qq!<td id="$short_cat" colspan="2" $css>!;
+    $ret .= qq!<a href="$cat_url">! if $cat_url;
+    $ret .= "<big><b>$full_cat</b></big>";
+    $ret .= "</a>" if $cat_url;
+    $ret .= "</td></tr>";
+    return $ret;    
+  }
+
+  # given two package references, compare their names (for sorting).
+  sub by_pkgname { $a->{"package"} cmp $b->{"package"}; }
+
+  # given two short categories, compare their full names (for sorting).
+  sub by_full_cat { &full_category ($a) cmp &full_category ($b); }
+
+  # return just the full category name for SHORT_CAT.
+  sub full_category {
+    my ($short_cat) = @_;
+    my ($full,undef) = @{ &read_doc_categories ($short_cat) };
+    return $full;
+  }
+
+  # return string with all categories as links, as a sort of toc.
+  sub output_category_list {
+    my (%cat) = @_;
+    my $ret = "<p>\n";  
+ 
+    for my $short_cat (sort by_full_cat keys %cat) {
+      my ($full_cat,$cat_url) = &full_category ($short_cat);
+      $full_cat =~ s/ /\&nbsp;/g;  # no spaces in the category name here
+      $ret .= qq!<a href="#$short_cat">$full_cat</a> -\n!;
+    }
+    
+    $ret .= "</p>\n";
+    return $ret;
+  }
+  
+  # interpret the doc-url value, return hash where keys are manual
+  # identifiers and values are their urls.
+  #
+  sub find_doc_urls {
+    my ($pkgname,$doc_url_val) = @_;
+    my %ret;
+    
+    my @vals = split (/\|/, $doc_url_val); # result of parsing is | separators
+    for my $val (@vals) {
+      if ($val eq "none") {
+        ; # nothing to return, let caller handle it.
+        
+      } elsif ($val eq "htmlxref") {
+        my %htmlxref = &read_htmlxref ($pkgname);
+        for my $manual (keys %htmlxref) {
+          # do not overwrite a url from gnupackages for the main package
+          # name with one from the htmlxref.  Instead, add junk to make
+          # the htmlxref manual have a different key.  We don't want to
+          # lose it, since if we have a general entry for "Texinfo"
+          # (pointing to all its manuals), say, it's still useful to
+          # have the direct link to the "texinfo" manual specifically.
+          # Since we uppercase the main label, they're visually
+          # distinct, too.
+          # 
+          if ($manual eq $pkgname && exists $ret{$pkgname}) {
+            $ret{"$manual<!-- again -->"} = $htmlxref{$manual}
+          } else {
+            # otherwise, take what we are given.
+            $ret{$manual} = $htmlxref{$manual};
+          }
+        }
+
+      } else {
+        warn "$pkgname: overwriting first doc_url value ($ret{$pkgname}) "
+             . "with $val"  # source file should not do this.
+          if (exists $ret{$pkgname}); 
+        $ret{$pkgname} = $val;  # always prefer url given in gnupackages.
+      }
+    }
+    return %ret;
+  }
+  
+  # Handle FSF shop references.  We assume they come in pairs:
+  # description in one entry and url in the next.  We return the HTML to
+  # insert in the output, or the empty string.
+  #
+  sub find_shop_urls {
+    my (%pkg) = @_;
+    my $ret;
+    my @shop = split (/\|/, $pkg{"doc_shop"});
+    if (@shop) {
+      $ret =  "\n       <br/>Available in print:";
+      # keep same ordering as input.
+      my @books = ();
+      for (my $i = 0; $i < @shop; $i += 2) {
+        my $title = $shop[$i];
+        my $url = $shop[$i+1];
+        if ($url !~ /https?:/) {
+          warn (&gnupkgs_msg ("doc_shop url lacks http (misordered?)\n",%pkg));
+        }
+        push (@books, qq!\n       <cite><a href="$url">$title</a></cite>!);
+      }
+      $ret .= join (",", @books);
+      $ret .= ".";
+    } else {
+      $ret = "";
+    }
+    return $ret;
+  }
+}
+
+
+
+# Return all packages as relative HTML links to directories by the
+# package name.  We carefully maintain http://www.gnu.org/software/
+# so this works.  Use the simple pkgname/ directory, since nothing else
+# (neither /index.html nor /pkgname.html) always works.
+# 
+sub generate_packages_html {
+  my $autostamp = &generated_by_us ();
+  my @ret = ("<!-- File $autostamp -->");
+
+  my %pkgs = &read_gnupackages ();
+  for my $pkgname (sort keys %pkgs) {
+    next if &skip_pkg_p ($pkgname);
+    push (@ret, qq!<a href="$pkgname/">$pkgname</a>&nbsp;!);
+  }
+
+  push (@ret, "<!-- End file $autostamp -->");
+  return @ret;
+}
+
+
+# Return HTML-formatted blurbs about the packages for the featured
+# package on http://www.gnu.org.
+#
+sub generate_blurbs_html {
+  my $autostamp = &generated_by_us ();
+  my @ret = ("<!-- File $autostamp -->");
+  
+  # so we can cross-check blurbs against packages.
+  my %gnupkgs = &read_gnupackages ();
+
+  my %pkgs = &read_pkgblurbs ();
+  for my $pkgname (sort keys %pkgs) {
+    next if &skip_pkg_p ($pkgname);
+    
+    my %pkg = %{ $pkgs{$pkgname} };
+    my $msgprefix = "$PKGBLURBS_FILE:$pkg{lineno}";
+    warn "$msgprefix: $pkgname not in gnupackages\n"
+      if ! exists $gnupkgs{$pkgname};
+    #
+    # Retrieve info from packages file.
+    my $pkglabel = $gnupkgs{$pkgname}->{"human_label"};
+    my $pkgactivity = $gnupkgs{$pkgname}->{"activity_status"};
+    my $pkglogo = $gnupkgs{$pkgname}->{"logo"};
+    delete $gnupkgs{$pkgname}; # so we can see what's left over
+    
+    # we intentionally omit blurbs for some packages.
+    next if $pkg{"blurb"} =~ /^null/;
+    
+    # Need the anchor version of the package name for the links.
+    my $xhtml_id = &xhtml_id ($pkgname);
+    
+    # Need the regexp-safe version of the package name for the SSI (for gtk+).
+    my $rxsafe_id = quotemeta ($pkgname);
+    $rxsafe_id =~ s,\\-,-,g;  # \- troubles ineiev's request-blurbs
+
+    # This ssi stuff lets the homepage extract a single blurb to display.
+    push (@ret, qq,\n<!--,
+                  . qq,#if expr="\$pkg_selection = /:($rxsafe_id|ALL):/" -->,);
+
+    # Include the package logo (scaled) in the head, if there is one.
+    $logo_xhtml = $pkglogo
+      ?    qq!\n  <img src="/graphics/pkg-logos-250x100/$pkgname.250x100.png" 
style="height:1.3em"\n!
+         . qq!       alt="logo for $pkgname" />!
+      : "";
+    
+    # Note for translators if the package is stale.
+    my $stale_comment = "";
+    $stale_comment = "<!-- TRANSLATORS: stale -->" if $pkgactivity =~ /^stale/;
+
+    # Include it in both HTML elements so that, e.g., msggrep can be used.
+    push (@ret, qq,<h4 id="$xhtml_id">,
+                  . qq,$stale_comment,
+                  . qq,$logo_xhtml,
+                  . qq,\n  <a href="/software/$pkgname/">$pkglabel</a></h4>,
+                  . ($stale_comment ? "\n" : "")
+                  . qq,<p>$stale_comment,);
+
+    my $blurb = $pkg{"blurb"};
+    # a very short blurb should be a redirect, since we already skipped null.
+    if (length ($blurb) < 70) {
+      my @words = split (" ", $blurb);
+      if ($words[0] eq "redirect") {
+        my $target = &xhtml_id ($words[1]);
+        if (length ($target) <= 1) {
+          warn "$msgprefix: redirection target too short: $target\n";
+          next;
+        }
+        push (@ret, qq!See <a href="#$target">$target</a>.!);
+      } else {
+        warn "$msgprefix: unexpectedly short blurb: $words[0]\n";
+        next;      
+      }
+
+    } else {  # normal blurb
+      $blurb =~ s/\&/\&amp;/g;
+      $blurb =~ s/</\&lt;/g;
+      $blurb =~ s/>/\&gt;/g;
+
+      # "..." typically is best rendered in typewriter.
+      $blurb =~ s,"(.*?)",<tt>$1</tt>,g;
+      $blurb =~ s/"/\&quot;/g;  # quote any stray "
+
+      $blurb =~ s/'/\&#39;/g;  # be sure we can quote text for shell
+      chomp ($blurb = `echo '$blurb' | fmt`);
+      $blurb =~ s/\&#39;/'/g;  # convert apostrophe back for translators
+      push (@ret, $blurb);
+    }
+
+    # let's advertise if the package is looking for a maintainer.  maybe
+    # we'll find someone.
+    push (@ret, "This package is looking for a maintainer.")
+      if $pkgactivity =~ /^nomaint/;
+
+    my $doc_links = "/manual/manual.html#$xhtml_id";
+    push (@ret, qq!<small>(<a href="$doc_links">doc</a>)!
+              . qq!</small></p>!);
+
+    push (@ret, "<!--#endif -->");
+  }
+
+  # make sure we've covered every package.
+  for my $leftover (sort keys %gnupkgs) {
+    next if &skip_pkg_p ($leftover);
+    warn "$PKGBLURBS_FILE:1: $leftover missing\n";
+  }
+  
+  push (@ret, "\n<!-- End file $autostamp -->");
+  return @ret;
+}
+
+1;

Index: howto-spotlight.txt
===================================================================
RCS file: howto-spotlight.txt
diff -N howto-spotlight.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ howto-spotlight.txt 11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,117 @@
+$Id: howto-spotlight.txt,v 1.1 2019/05/11 10:44:52 ineiev Exp $
+    Copyright 2015 Free Software Foundation, Inc.
+
+    Copying and distribution of this file, with or without modification,
+    are permitted in any medium without royalty provided the copyright
+    notice and this notice are preserved.
+
+Notes on making the spotlight feature for the Free Software Supporter.
+The general idea is to make markdown text and send it to
address@hidden, around the 23rd of each month.
+
+This is all pretty randomly messy.  The process never seemed worth
+refining, in light of who runs it and how often and that the final
+result needs to be carefully read anyway.  Of course all aspects can be
+tinkered with ad infinitum.
+
+-------------------------------------------------------------------------
+Top level outline, with more about the prerequisites following:
+
+1. Run the hacky little script below, call it gnubytime for the sake of
+example, which reads a previously-saved rsync listing of
+ftp.gnu.org::gnu, call that fp.gnu for the sake of example.  As in:
+  gnubytime fp.gnu >/tmp/s0
+
+2. Throw away everything after the latest release from the previous
+month, which just needs to be tracked in a working file somewhere.  For
+example, in February 2015 the latest release was parallel-20150222, so
+March 2015 should include everything after that.
+
+3. Reduce the list to just unique package names, as in:
+sed 's,^.*/,,' /tmp/s0 | sort -u >/tmp/s1
+
+4. Remove things we don't want to list here, such as aspell
+dictionaries, test releases (wrongly) put on ftp.gnu.org,
+and plenty more.
+
+5. Look at the info-gnu mailing list archives from
+ftp://lists.gnu.org/info-gnu/ for the current month and the previous
+month for releases not on ftp.gnu.org.  Add those by hand to /tmp/s1
+(and resort).  gnupg and related are the most likely.  Looking at the
+Subject: lines suffices.
+
+6. Convert the result to markdown with the one-line gnu2mdwn script below:
+gnu2mdwn /tmp/s1 >/tmp/s2
+
+7. Check that the result is actually correct, e.g., does not have version
+numbers in the urls, has correct package names in the urls.  Especially
+when there are dashes in either the package name or release version.
+
+8. Look at ./spotlight.tmpl in this womb/gnumaint directory.  The markdown
+list from /tmp/s2 goes at the top.  Also replace the NN and DD and YY in
+the first line.
+
+9. The list of people to welcome as new maintainers or as maintaining
+new packages comes from fp:~karl/src/gnumaint/activity-report.txt.  That
+file needs to be maintained in place, by hand, whenever a maintainer or
+package is added or removed, as noted in /gd/gnuorg/README.
+
+10. Send to the FSF as above.
+
+11. Update the new "latest release" wherever that info is stored.
+And, although not strictly necessary, keeping an archive of all
+spotlights as sent can be useful for quickly looking at past entries.
+
+-------------------------------------------------------------------------
+In step 1, the rsync listing can be generated like this:
+
+outfile=fp.gnu # or whatever
+excludes="--exclude=*.sig \
+  --exclude=video/TIME --exclude=find.txt.gz --exclude=ls-l*.txt.gz \
+  --exclude=gnu-keyring.gpg"
+rsync --no-h -r $excludes fp:/srv/data/ftp-mirror/ftp/ \
+  | egrep -v '^[dl]' \
+  >$outfile.new
+...
+mv $outfile.new $outfile
+
+By the way, this same rsync listing is intended to be the source for the
+ftplisting check in gm-check.pl.
+
+Also, this same rsync listing can be the source for updating release
+information in gnupackages.txt, as they come through.  For that
+
+-------------------------------------------------------------------------
+Still in step 1, the "hacky little script" (gnubytime) is as follows.
+
+#!/usr/bin/env perl
+# ftp releases by time,via  rsync listing.
+# -rw-r--r--         918 2002/01/14 14:28:56 .message
+
+$ARGV[0] = "/u/karl/sys/ftp/fp.gnu" unless @ARGV;
+
+while (<>) {
+  next if / -> /;
+  next if /\.(diff|xdelta)\./;
+  next if /snapshot\.pkg/;
+  next if /\.darwin/;
+  next if /-latest/;
+  next if /\.sig/;
+  next unless /\.[tj]ar\./;
+  my (undef,undef,$date,undef,$pkg) = split (" "); # rsync
+  # my ($date,undef,$pkg) = split (" "); # ftp
+  $date =~ tr,-/,,d;
+  $pkg{$pkg} = $date;
+}
+
+for my $p (sort { $pkg{$b} <=> $pkg{$a} } keys %pkg) {
+  ($pfile = $p) =~ s/\.tar\..*$//;
+  print "$pkg{$p}\t$pfile\n";
+}
+-------------------------------------------------------------------------
+In step 6, the gnu2mdwn script is:
+
+#!/bin/sh
+sed \
+  -e 's,\(.*\)-\([^-]*\),* [\1-\2](http://www.gnu.org/software/\1/),' \
+  "$@"

Index: .cvsignore
===================================================================
RCS file: .cvsignore
diff -N .cvsignore
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ .cvsignore  11 May 2019 10:44:52 -0000      1.1
@@ -0,0 +1,13 @@
+ChangeLog
+activity-report.txt
+copyright-papers.txt
+pkgblurbs.txt
+gnupackages.txt
+m.test
+msg.*
+*.mbox*
+*.log*
+pkgnames.frommaint
+pkgnames.fromdir
+fsd
+pkglist-*.txt

Index: nonpackages.txt
===================================================================
RCS file: nonpackages.txt
diff -N nonpackages.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ nonpackages.txt     11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,16 @@
+# $Id: nonpackages.txt,v 1.1 2019/05/11 10:44:53 ineiev Exp $
+# Public domain.
+# 
+# This file records information about software that is not an official
+# GNU package on its own, but we want to automatically generate entries
+# about it anyway.  There is nothing private in this file. 
+
+package: gnus
+doc-category: Email
+doc-summary: Emacs-based mail and news reader.
+
+package: mh-e
+doc-category: Email
+doc-summary: Emacs interface to the MH mail system.
+
+# End. (Do not remove this line or the blank line before it.  Thanks.)

Index: testaddrangle.msg
===================================================================
RCS file: testaddrangle.msg
diff -N testaddrangle.msg
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ testaddrangle.msg   11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,14 @@
+From address@hidden Sun Feb 11 14:48:08 2007
+Return-path: <address@hidden>
+Envelope-to: address@hidden
+Delivery-date: Sun, 11 Feb 2007 14:48:08 -0500
+Received: from karl by fencepost.gnu.org with local (Exim 4.60)
+       (envelope-from <address@hidden>)
+       id 1HGKgC-0000P9-M8
+       for address@hidden; Sun, 11 Feb 2007 14:48:08 -0500
+To: address@hidden
+Message-Id: <address@hidden>
+From: <address@hidden>
+Date: Sun, 11 Feb 2007 14:48:08 -0500
+Subject: GNU package maintenance
+

Index: testjunk1.msg
===================================================================
RCS file: testjunk1.msg
diff -N testjunk1.msg
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ testjunk1.msg       11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,15 @@
+From address@hidden Sun Feb 11 14:48:08 2007
+Return-path: <address@hidden>
+Envelope-to: address@hidden
+Delivery-date: Sun, 11 Feb 2007 14:48:08 -0500
+Received: from karl by fencepost.gnu.org with local (Exim 4.60)
+       (envelope-from <address@hidden>)
+       id 1HGKgC-0000P9-M8
+       for address@hidden; Sun, 11 Feb 2007 14:48:08 -0500
+To: address@hidden
+Message-Id: <address@hidden>
+From: Karl Berry <address@hidden>
+Date: Sun, 11 Feb 2007 14:48:08 -0500
+
+karl fencepost Sun Feb 11 14:48:08 EST 2007
+

Index: howto-decommission.txt
===================================================================
RCS file: howto-decommission.txt
diff -N howto-decommission.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ howto-decommission.txt      11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,30 @@
+$Id: howto-decommission.txt,v 1.1 2019/05/11 10:44:53 ineiev Exp $
+    Copyright 2013, 2014, 2015 Free Software Foundation, Inc.
+
+    Copying and distribution of this file, with or without modification,
+    are permitted in any medium without royalty provided the copyright
+    notice and this notice are preserved.
+
+Notes on what to do when a package becomes unmaintained or
+decommissioned.
+
+unmaintained:
+  for the new maintainer to do: look at mailing list archives,
+    any todo files, good to make quick release.
+  try writing mlist if there is one.
+  update: package web page - takeaction.html - www.gnu.org home page
+  on savannah: status=orphaned; note in summary; post job.
+  (in more detail, see fp:/gd/gnuorg/README)
+
+decommissioned:
+  maintainers - activity-report.txt
+  - gnupackages.rec,pkgblurbs.rec -> oldpackages.txt;
+    then regenerate autopackage lists (see Makefile and howto-commission.txt)
+  - address@hidden ftp.gnu.org dir to old-gnu
+  - lists: advertised=no, mv domains/gnu.org ...
+  - project home page: Add a prominent notice stating that the package is 
decommissioned.
+  - add to list of old packages on software.html - webpages
+  - savannah: status=orphaned; note in summary.
+
+When a maintainer resigns, implicitly or explicitly, the story is
+similar; see /gd/gnuorg/README.

Index: maintfileupgrade
===================================================================
RCS file: maintfileupgrade
diff -N maintfileupgrade
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ maintfileupgrade    11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,221 @@
+#!/usr/bin/env tclsh
+#
+# maintfileupgrade - GNU maintainers file upgrade to new format
+#
+# Copyright 2007 Free Software Foundation Inc.
+# 
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved.
+
+
+###
+### Global variables
+###
+
+set first_page_contents {}
+
+set contact_regexp {(?x)
+    # A regexp to match contact information
+    ^([^<(]*)             # The name of the contact (optional)
+    (<address@hidden@[^>]+?>)?     # The email of the contact (optional)
+    ((?:.+))?$            # Notes about the contact (optional)
+  }
+
+set package_line_regexp {(?x)
+    # A regexp to match a package description line
+    ^
+    ([^(]+)               # The name of the package
+    ((?:.+))?             # Package comments (optional)
+    \ -                   # Separator: " -"
+    (.*)                  # Contacts information (see above)
+    $        
+  }
+
+set maintainers_file {}
+set maintainersdb {}
+
+
+###
+### Code
+###
+
+proc do_help_usage {} {
+    
+    puts {Usage: mfupgrade FILE}
+    puts "Read FILE and convert its contents to the new maintainers format"
+    puts "Dump the new contents on the standard output"
+}
+
+proc parse_contacts {text} {
+    
+    global contact_regexp
+    
+    set contact_list {}
+    
+    foreach scontact [split $text ,] {
+       
+       if {![regexp -- $contact_regexp $scontact fullmatch contact_name 
contact_email contact_comments]} {
+
+           puts "ERROR: not matching text $scontact"
+           exit 1
+       }
+       
+       lappend contact_list [list [string trim $contact_name] \
+                                 [string trim [string trim [string trim 
$contact_email "<"] ">"]] \
+                                 [string trim [string trim $contact_comments] 
{( )}]]
+
+    }
+
+    return $contact_list
+
+}
+
+proc parse_package_line {line} {
+
+    global package_line_regexp
+
+    if {![regexp -- $package_line_regexp $line]} then {
+       # Invalid package line
+       return {}
+    }
+
+    regexp -- $package_line_regexp $line entire_match pkg_name pkg_comments 
pkg_contacts
+    #puts "parse: $pkg_name | $pkg_comments | $pkg_contacts"
+    return [list [string trim $pkg_name] \
+               [string trim $pkg_comments] \
+               [parse_contacts [string trim $pkg_contacts]]]
+}
+
+
+proc build_maintainers_db {} {
+    
+    global first_page_contents
+    global maintainers_file
+    global maintainersdb
+
+    # Open the maintainers file
+    if {[catch {set finput [open $maintainers_file r]}]} {
+
+       puts "Cannot open the maintainers file $maintainers_file"
+       puts "Aborting"
+       exit 1
+    }
+
+    # Get the first line and collect the info
+    gets $finput line
+    append first_page_contents $line
+    append first_page_contents "\n"
+
+    # Skip until second page
+    while {(![eof $finput]) && ([string index $line 0] != "\f")} {
+       gets $finput line
+        append first_page_contents $line
+        append first_page_contents "\n"
+    }
+    # Consume the ^L
+    if {![eof $finput]} then {
+       gets $finput line
+    }
+
+    # Parse package lines
+    while {(![eof $finput]) && ([string index $line 0] != "\f")} {
+       
+       set pkginfo [parse_package_line $line]
+       lappend maintainersdb $pkginfo
+       #puts "lappe: [lindex $pkginfo 1]"
+       gets $finput line
+    }
+    
+    # Close the maintainers file
+    close $finput
+}
+
+proc do_convert {} {
+
+    global first_page_contents
+    global maintainersdb
+
+    puts $first_page_contents
+    puts {}
+
+    foreach pkg $maintainersdb {
+       if {[lindex $pkg 2] == ""} then {
+        #puts "regen: [lindex $pkg 0] -- [lindex $pkg 1] -- [lindex $pkg 2]"
+           
+           set maintainer_name "Unmaintained"
+           set maintainer_email($maintainer_name) {}
+           set maintainer_notes($maintainer_name) {}
+           lappend maintainer_packages($maintainer_name) [list [lindex $pkg 0] 
[lindex $pkg 1]]
+       }
+
+        foreach maintainer [lindex $pkg 2] {
+            set maintainer_name [lindex $maintainer 0]
+            set m_email [lindex $maintainer 1]
+            set m_notes [lindex $pkg 1]
+
+            set maintainer_email($maintainer_name) $m_email
+            set maintainer_notes($maintainer_name) $m_notes
+            lappend maintainer_packages($maintainer_name) [list [lindex $pkg 
0] [lindex $pkg 1]]
+        }
+
+
+    }
+    
+    set maintainers_name_list [lsort [array names maintainer_email]]
+    foreach maintainer $maintainers_name_list {
+
+        puts "name: $maintainer"
+        puts "email: $maintainer_email($maintainer)"
+
+        foreach pkg $maintainer_packages($maintainer) {
+            puts "package: [lindex $pkg 0]"
+            ;#if {[lindex $pkg 1] != {}} then {
+           ;#puts "note: [lindex $pkg 1]"
+           ;#}
+        }
+
+        if {$maintainer_notes($maintainer) != {}} then {
+            puts "note: $maintainer_notes($maintainer)"
+        }
+
+        puts {}
+    }
+}
+
+proc main {} {
+
+    global argc
+    global argv
+    global maintainers_file
+
+    # Get the maintainers file from arguments
+    if {$argc != 1} then {
+
+       do_help_usage
+       exit 1
+    }
+
+    set maintainers_file [lindex $argv 0]
+    if {![file readable $maintainers_file]} then {
+
+       puts stderr "error: could not open file $maintainers_file"
+       exit 1
+    }
+
+    # Build the maintainers database
+    build_maintainers_db
+
+    # Convert the file
+    do_convert
+}
+
+
+# Call the main routine
+main
+
+# Local Variables:
+# mode: tcl
+# End:
+
+### End of file

Index: massmail-1201-copyright.txt
===================================================================
RCS file: massmail-1201-copyright.txt
diff -N massmail-1201-copyright.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ massmail-1201-copyright.txt 11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,34 @@
+From: address@hidden (GNU Project)
+To: %PACKAGE_MAINTAINERS
+Subject: %PACKAGE_NAME and non-FSF-copyrighted code
+Precedence: bulk
+
+Greetings,
+
+I'm sending you this message on behalf of the GNU Project because
+according to the FSF's records, you are the maintainer(s) of
+%PACKAGE_NAME, which is supposed to be an FSF-copyrighted package.
+
+We would like to gather information on any code or other material in
+your package that is *not* copyrighted by the FSF.  Could you please
+reply to this message (which should go to address@hidden) and let
+us know?  That is, one of:
+
+1) There is no non-FSF-copyrighted material in %PACKAGE_NAME.
+
+2) There is non-FSF-copyrighted code included in %PACKAGE_NAME,
+   per the procedure described in the External Libraries node
+   of the maintainers' guide:
+   http://www.gnu.org/prep/maintain/html_node/External-Libraries.html
+
+3) Something else.
+
+Please include any and all relevant details.
+
+(Aside from this, if you have any news or questions regarding the
+package, please let us know at address@hidden)
+
+Thanks for contributing to GNU, and happy hacking.
+
+Karl Berry
+Assistant Chief GNUisance

Index: testaddr+real.msg
===================================================================
RCS file: testaddr+real.msg
diff -N testaddr+real.msg
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ testaddr+real.msg   11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,14 @@
+From address@hidden Sun Feb 11 14:48:08 2007
+Return-path: <address@hidden>
+Envelope-to: address@hidden
+Delivery-date: Sun, 11 Feb 2007 14:48:08 -0500
+Received: from karl by fencepost.gnu.org with local (Exim 4.60)
+       (envelope-from <address@hidden>)
+       id 1HGKgC-0000P9-M8
+       for address@hidden; Sun, 11 Feb 2007 14:48:08 -0500
+To: address@hidden
+Message-Id: <address@hidden>
+From: Karl Berry <address@hidden>
+Date: Sun, 11 Feb 2007 14:48:08 -0500
+Subject: GNU package maintenance
+

Index: sendmaintmail
===================================================================
RCS file: sendmaintmail
diff -N sendmaintmail
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ sendmaintmail       11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,123 @@
+#!/usr/bin/env perl
+# $Id: sendmaintmail,v 1.1 2019/05/11 10:44:53 ineiev Exp $
+# Send or refrain from sending a message to a maintainer.
+# 
+# Copyright 2007 Free Software Foundation Inc.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# Originally written by Karl Berry.
+#
+# If the email address is recent enough in activity-report.txt, omit.
+# If the package is recent enough in activity-report.txt, omit.
+# If the package is in recentrel.txt, omit.
+# Otherwise send.
+# 
+# When we omit, we write a short string to stdout describing why.
+# When we send, we write nothing to stdout.
+# (The TCL exec function works most naturally this way.)
+# 
+# Although we could of course do the filtering in gnumaint, it was
+# easier for me to implement it in this separate script.
+
+exit (&main ());
+
+sub main
+{
+  my ($maint_email, $pkgref, @msg) = &read_msg ();
+  my @maint_pkgs = @$pkgref;  
+  
+  # Check if any of these package names appear in the recently-released file.
+  # If so, we're done.
+  chomp (my @recent_rel = `cat recentrel.txt`);
+  #
+  for my $p (@maint_pkgs) {
+    if (grep { $_ eq $p } @recent_rel) {
+      print "recent release of $p\n";
+      return 0;
+    }
+  }
+  
+  # Check if either the maintainer email or any package occurs
+  # recently enough in activity-report.txt.
+  # 
+  my $now = time ();
+  my $cutoff = $now - 512 * 24 * 60 * 60;  # don't bother them for 512 days
+  #warn "cutoff seconds: $cutoff\n";
+  #
+  chomp (my @activity = `cat activity-report.txt`);
+  @activity = reverse @activity;  # newest first
+  #
+  for my $a (@activity) {
+    my ($name, $email,$pkg,$time) = split (/\|/, $a);
+    next unless $time;         # last_sendemail has two fields
+    $time =~ tr/./ /;          # date -d wants a space between date and time
+    substr ($time,13,2) = "";  # wipe out seconds, date -d can't handle
+    chomp (my $seconds = `date +%s -d "$time"`);
+    last if $seconds < $cutoff;
+    
+    #warn "checking $email|$pkg|$seconds\n";
+    if ($email eq $maint_email) {
+      print "recent activity for $email/$pkg\n";
+      return 0;
+    } elsif (grep { $_ eq $pkg } @maint_pkgs) {
+      print "recent activity for $pkg/$email\n";
+      return 0;
+    }
+  }
+  
+  #warn "would send mail";
+  local *SENDMAIL;
+#  $SENDMAIL = "|/usr/lib/sendmail -t";
+  $SENDMAIL = "|cat >>/tmp/xyz";
+  open (SENDMAIL) || die "open($SENDMAIL) failed: $!";
+  print SENDMAIL @msg;
+  close (SENDMAIL) || warn "close($SENDMAIL) failed: $!";
+
+  return 0;
+}
+
+
+# return maintainer email, package list reference, and original message
+# from msg on stdin.
+# 
+sub read_msg
+{
+  my @msg = ();
+  my ($to,$subject);
+  for my $line (<>) {
+    push (@msg, $line);
+    ($to = $line) =~ s/^To: // if $line =~ /^To: /;
+    ($subject = $line) =~ s/^Subject: // if $line =~ /^Subject: /;
+  }
+  
+  die "no To: in @msg\n" unless $to;
+  die "no Subject: in @msg\n" unless $subject;
+  chomp ($to);
+  chomp ($subject);
+  #warn "found $to, $subject\n";
+  
+  # extract package names from subject, which looks like this:
+  # Subject: GNU package maintenance: a and b
+  # or
+  # Subject: GNU package maintenance: a, b and c
+  $subject =~ s/^.*: *//;
+  $subject =~ s/ and /, /;
+  my @pkgs = split (/, /, $subject);
+  #warn "pkgs @pkgs from $subject";
+
+  # We can assume the maintainer email is just the value of the To:
+  # header, since we generated it ourselves in gnumaint.
+  return ($to, address@hidden, @msg);
+}

Index: massmail-0705-active.txt
===================================================================
RCS file: massmail-0705-active.txt
diff -N massmail-0705-active.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ massmail-0705-active.txt    11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,31 @@
+GNU package maintenance: %PACKAGE_LIST
+
+Have I reached %MAINTAINER_NAME?
+(My apologies if this message reaches you in error.)
+
+fmt:I'm sending you this message on behalf of the GNU Project because
+fmt:you're listed as the maintainer of the GNU %PLURAL_PACKAGE %PACKAGE_LIST.
+fmt:We would like to verify that you're still there, and still reachable at
+fmt:the address we have, %MAINTAINER_EMAIL.
+
+If all of that is correct, please just reply to this message.
+That will confirm that you got it, that you're still maintaining
+%PLURAL_THIS_PACKAGE, and that the address we used is still good.
+
+If you are no longer maintaining the %PLURAL_PACKAGE, or your preferred
+email address has changed, or there's anything else you think we should
+know, please send mail to address@hidden so we can update our
+records.
+
+We'd also like to collect package maintainers' postal addresses and
+phone numbers, so that if email addresses stop working, we have some
+backup.  Would you please mail that contact information to
address@hidden so we can note it down?
+
+If you have any news or questions regarding your GNU %PLURAL_PACKAGE,
+please let us know.  address@hidden is the address for that too.
+
+Thanks for contributing to GNU, and happy hacking.
+
+Karl Berry
+Assistant Chief GNUisance

Index: gm-check.pl
===================================================================
RCS file: gm-check.pl
diff -N gm-check.pl
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gm-check.pl 11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,239 @@
+# $Id: gm-check.pl,v 1.1 2019/05/11 10:44:53 ineiev Exp $
+# The check actions for the gm script (see --help message).
+# 
+# Copyright 2007, 2008, 2009, 2010, 2012, 2013
+# Free Software Foundation Inc.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# Originally written by Karl Berry.
+
+
+
+# Return list of packages in the activity report that are not in the
+# maintainers file.  (Implementation not finished.)
+# 
+sub check_activityfile_ {
+  my @ret = ();
+
+  my %pkgs = &read_maintainers ("by-package");
+  my %maints = &read_maintainers ("by-maintainer");
+  
+  my %activity = &read_activity ("by-package");
+  
+  for my $ap (sort by_lineno keys %activity) {
+    next if $ap eq "*";  # our last_sendemail placeholder
+    my ($email,$name,$time,$line) = split (/\|/, $activity{$ap});
+    
+    push (@ret, "$ACTIVITY_FILE:$line: active package $ap does not exist"
+                . " ($email|$name|$time)")
+      unless exists $pkgs{$ap}; #|| exists $missing_pkg_ok{$ap};
+  }
+  return @ret;
+
+  
+  sub by_lineno {
+    my (undef,undef,undef,$aline) = split (/\|/, $activity{$a});
+    my (undef,undef,undef,$bline) = split (/\|/, $activity{$b});
+    $aline <=> $bline;
+  }
+}
+
+
+
+# Return inconsistencies between copyright.list and the
+# copyright-holder: field in gnupackages.  There should not be any.
+# 
+sub check_fsfcopyright_ {
+  my @ret = ();
+
+  my %pkgs = &read_gnupackages ();
+  my @cl = &list_copyrightfsf_ (0, 1);
+  my %cl;
+  @address@hidden = (); # make hash from list
+  
+  for my $cl (keys %cl) {
+    if (! exists $pkgs{$cl}) {
+      # should be caught by daily checks.
+      push (@ret, "$0: FSF-copyrighted $cl missing from $GNUPACKAGES_FILE");
+      next;
+    }
+    my $p = $pkgs{$cl};
+    #&warn_hash ($cl, $p);
+    if ($p->{"copyright-holder"} !~ /^(fsf|see-)/) { # allow redirects too
+      push (@ret, &gnupkgs_msg
+                   ("copyright-holder: not fsf, but in copyright.list", %$p));
+    }
+    delete $pkgs{$cl};
+  }
+  
+  for my $pkgname (keys %pkgs) {
+    my $p = $pkgs{$pkgname};
+    if ($p->{"copyright-holder"} =~ /^fsf/) {
+      push (@ret, &gnupkgs_msg
+                    ("copyright-holder: fsf, but not in copyright.list", %$p));
+    }
+  }
+
+  return @ret;
+}
+
+
+
+# Return list of entries in the ftp listing that are not in the official
+# list of packages.  (Implementation not finished.)
+# 
+sub check_ftplisting_ {
+  my @ret = ();
+  
+  my %pkgs = &read_gnupackages ();
+  my @ftp = &read_ftplisting ();
+  
+  # known-unusual entries or aliases under ftp.gnu.org:gnu/.
+  my @special = qw(GNUinfo GNUsBulletins Licenses MailingListArchives
+                   MicrosPorts aspell- commonc\+\+ dotgnu flex git glibc
+                   non-gnu phantom queue savannah speedx windows);
+  
+  for my $f (sort @ftp) {
+    next if exists $pkgs{$f};
+    next if grep { $f =~ /^$_/ } @special;
+    # read oldpackages?  next if grep { $f =~ /^$_/ } @old;
+    push (@ret, $f);
+  }
+  
+  return @ret;
+}
+
+
+
+# Return list of email addresses or packages in the ftp-upload setup
+# that are not in maintainers.
+# 
+sub check_ftpupload_ {
+  my @ret = ();
+  
+  my %maint_file = &read_maintainers ("by-package");
+  my %ftpupload_file = &read_ftpupload_email ();
+  
+  for my $p (sort keys %ftpupload_file) {
+    # The ftp-upload package itself better be in the maintainers file.
+    # (Many packages do not release through ftp.gnu.org, unfortunately,
+    #  so there is no use in worrying about the reverse.)
+    if (! exists $maint_file{$p}) {
+      push (@ret, "$FTPUPLOAD_EMAIL_FILE: not in maintainers: $p");
+      next;
+    }
+
+    # see if we can find each ftp-upload email in maintainers.
+   FTP_EMAIL:
+    for my $ftp_email (split (" ", $ftpupload_file{$p})) {
+      
+      # for each maintainer of this package ...
+      my @maint_refs = @{$maint_file{$p}};
+      for my $m (@maint_refs) {
+
+        # for each of the keys that have email values ...
+        for my $mkey ("email", "privateemail", "altemail", "bademail") {
+          my @mval = split (/\|/, $m->{$mkey}); # split multiple vals
+
+          # for each value of this key ...
+          for my $mval (@mval) {
+            if ($mval eq $ftp_email) {
+              if ($mkey eq "bademail") {
+                warn "$p: ftp email $ftp_email known bad!\n\n";
+              } else {
+                warn "$p: good, found $mval in $mkey\n";
+              }
+              next FTP_EMAIL;
+            }
+          }  # each of multiple email values
+        }    # each possible email key
+      }      # each maintainer
+      warn "$p: did not find $ftp_email\n";
+      warn "\n";
+    }        # each ftp-upload email for this package
+  }          # each ftp-upload package
+  
+  return @ret;
+}
+
+
+# Return list of packages in the gnupackages file that are not in the
+# maintainers file, and vice versa.  Run hourly from karl cron on fp.
+# 
+sub check_maintainers_ {
+  my @ret = ();
+  
+  my %maint_file = &read_maintainers ("by-package");
+  my %pkg_file = &read_gnupackages ();
+  
+  for my $m (keys %maint_file) {
+    if (exists $pkg_file{$m}) {
+      delete $maint_file{$m};
+      delete $pkg_file{$m};
+    }
+  }
+  
+  for my $p (sort keys %pkg_file) {
+    push (@ret, "$GNUPACKAGES_FILE:$pkg_file{$p}->{lineno}: "
+                . "$p not in maintainers");
+  }
+  
+  for my $p (sort keys %maint_file) {
+    next if $p =~ /\.nongnu/;
+    push (@ret, "$MAINTAINERS_FILE:$maint_file{$p}[0]->{lineno}: "
+                . "$p not in gnupackages");
+  }
+  
+  return @ret;
+}
+
+
+
+# Return list of packages in the savannah GNU groups.tsv list that are
+# not in the gnupackages or oldpackages files.  We check against these
+# rather than maintainers because some are legitimately only on sv and
+# we want to have info for them.
+# 
+# On the other hand, there's no expectation that everything in
+# gnupackages (or maintainers) is on savannah, so don't check that
+# direction.
+# 
+# The sv file is at http://savannah.gnu.org/cooperation/groups.tsv
+# and is updated via cron on savannah.
+# 
+# (Implementation not finished.)
+#
+sub check_savannah_ {
+  my @ret = ();
+  
+  my %pkg_file = &read_gnupackages ();
+  my %sv_file = &read_savannah ();
+  
+  for my $m (keys %sv_file) {
+    if (exists $pkg_file{$m}) {
+      delete $sv_file{$m};
+    }
+  }
+  
+  for my $p (sort keys %sv_file) {
+    push (@ret, "$SAVANNAH_FILE:$sv_file{$p}->{lineno}: "
+                . "$p ($sv_file{$p}->{name}) not in gnupackages");
+  }
+  
+  return @ret;
+}
+
+
+1;

Index: gnumaint
===================================================================
RCS file: gnumaint
diff -N gnumaint
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gnumaint    11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,773 @@
+#!/usr/bin/env tclsh
+# gnumaint - GNU maintainers file maintenance (/gd/gnuorg/maintainers)
+# $Id: gnumaint,v 1.1 2019/05/11 10:44:53 ineiev Exp $
+#
+# Copyright 2007 Free Software Foundation Inc.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# Originally written by Jose Marchesi.
+
+# Global variables (configuration section)
+
+variable maintainers_file     "maintainers"
+variable mailtemplate_active  "template-active.txt"
+variable log_file             "email.log"
+variable report_file          "activity-report.txt"
+variable discarded_mbox       "discarded-email.mbox"
+variable processed_mbox       "processed-email.mbox"
+variable sent_mbox            "sent-email.mbox"
+variable formail              "/usr/bin/formail"
+variable sendmail             "sendmaintmail"
+variable email_originator     "address@hidden"
+variable email_reply          "address@hidden"
+
+proc do_help_usage {} {
+  global maintainers_file
+  global log_file
+
+  puts "Usage: gnumaint OPERATION \[ARG\]..."
+  puts ""
+  puts "Manage the GNU maintainer list (/gd/gnuorg/maintainers)."
+  puts ""
+  puts "Available OPERATIONs:"
+  puts "   list - retrieve information"
+  puts "   sendemail - send email to maintainers"
+  puts "   recemail - receive email from maintainers"
+  puts ""
+  puts "For more help, run:"
+  puts "   gnumaint help OPERATION"
+  puts ""
+  puts "The maintainer information is taken from the file"
+  puts "  $maintainers_file (GNUMAINT_MAINTAINERS_FILE envvar overrides)."
+  puts "Log messages are written to the file"
+  puts "  $log_file"
+  puts ""
+  puts "Please email address@hidden with any discussion."
+}
+
+proc do_help_list {} {
+  puts "Usage: gnumaint list TOPIC \[ARG\]..."
+  puts ""
+  puts "List information about GNU maintainers to stdout."
+  puts ""
+  puts "Allowed TOPICs:"
+  puts "  packages \[ARG\]"
+  puts "    all \[or no argument\] - list all packages"
+  puts "    maintained - list all maintained packages"
+  puts "    unmaintained - list all unmaintained packages"
+  puts "    maintainer MAINTAINER - list MAINTAINER's packages"
+  puts "      (search is done in both names and email addresses)"
+  puts ""
+  puts "  maintainers \[ARG\]"
+  puts "    all \[or no argument\] - list all maintainers"
+  puts "    package PACKAGE - list maintainers of PACKAGE"
+  puts "      search is done for \"*PACKAGE*\", case-insensitive"
+  puts "    GLOB"
+  puts "      search for GLOB in maintainers file"
+}
+
+proc do_help_sendemail {} {
+  variable mailtemplate_active
+
+  puts "Usage: gnumaint sendemail EMAIL-TYPE"
+  puts ""
+  puts "Send email to maintainers.  At present we have one EMAIL-TYPE:"
+  puts "  active - send email to all maintainers requesting a reply"
+  puts "           to confirm that they are active.  Template file:"
+  puts "           $mailtemplate_active"
+}
+
+proc do_help_recemail {} {
+  puts "Usage: gnumaint recemail"
+  puts ""
+  puts "Receive email.  This is invoked via /com/mailer/aliases."
+}
+
+proc do_help_operation {topic} {
+  switch $topic {
+    sendemail {
+      do_help_sendemail
+    }
+    recemail {
+      do_help_recemail
+    }
+    list {
+      do_help_list
+    }
+    default {
+      puts "Unknown operation `$topic'"
+      do_help_usage
+    }
+  }
+}
+
+proc add_to_log {text} {
+  global log_file
+  set flog [open $log_file a]
+  puts $flog "[timestamp]: $text"
+  close $flog
+}
+
+# 
+# Maintainers database structure:
+#
+#   { {MAINTAINER-NAME MAINTAINER-EMAIL MAINTAINER-NOTES {PACKAGE1 PACKAGE2 
...}} ...}
+#
+set maintainersdb {}
+
+proc get_entry_value {entry text} {
+  set label_regexp "${entry}:"
+  set entry_regexp "^${label_regexp}(.+)"
+
+  regexp $entry_regexp $text match entry_content
+
+  return [string trim $entry_content]
+}
+
+proc get_entry_label {text} {
+  set entry_regexp {^([^:]+):.+}
+
+  regexp $entry_regexp $text match entry_label
+
+  ;# Bad formed entry line
+  if {![info exist entry_label]} then {
+      return {}
+  }
+
+  return [string trim $entry_label]
+}
+
+proc parse_maintainers {finput lineno} {
+  global maintainers_file
+  global maintainersdb
+
+  if {![eof $finput]} then {
+      gets $finput line
+      incr lineno
+  }
+
+  while {(![eof $finput]) && ([string index $line 0] != "\f")} {
+      # Break if EOF or ^L
+      if {[eof $finput] || ([string index $line 0] == "\f")} then {
+          break;
+      }
+
+      ;# Skip blank lines or comments
+      while {$line == "" || ([string index $line 0] == "#")} {
+          gets $finput line
+      }
+
+      ;# Process this maintainer entry
+      set maintainer_name {}
+      set maintainer_email {}
+      set maintainer_notes {}
+      set maintainer_packages {}
+
+      if {[string match "name:*" $line]} then {
+          set maintainer_name [get_entry_value name $line]
+
+      } else {
+          puts "parse error: $maintainers_file \[line $lineno\]: `name:' 
expected" 
+          exit 1
+      }
+
+      gets $finput line
+      incr lineno
+
+      while {$line != ""} {
+          set entry_label [get_entry_label $line]
+          switch $entry_label {
+              "email" {
+                  set maintainer_email [get_entry_value email $line]
+              }
+              "note" {
+                  set note_contents [get_entry_value note $line]
+                  lappend maintainer_notes $note_contents
+              }
+              "package" {
+                  set pkgname [get_entry_value package $line]
+                  lappend maintainer_packages $pkgname
+              }
+          }
+
+          gets $finput line
+          incr lineno
+      }
+
+      ;# Add this maintainer entry into maintainersdb
+      lappend maintainersdb [list \
+                                 $maintainer_name \
+                                 $maintainer_email \
+                                 $maintainer_notes \
+                                 $maintainer_packages]
+      ;# Read the next line
+      gets $finput line
+      incr lineno
+  }
+}
+
+proc build_maintainers_db {} {
+  global maintainers_file
+  global maintainersdb
+
+  # Open the maintainers file
+  if {[catch {set finput [open $maintainers_file r]}]} {
+      puts "Cannot open the maintainers file $maintainers_file"
+      puts "Aborting"
+      exit 1
+  }
+
+  # Get the first line
+  set lineno 0
+  gets $finput line
+  incr lineno
+
+  # Skip until second page
+  while {(![eof $finput]) && ([string index $line 0] != "\f")} {
+      gets $finput line
+      incr lineno
+  }
+
+
+  # Parse maintainers
+  parse_maintainers $finput $lineno
+
+  # Close the maintainers file
+  close $finput
+}
+
+# 
+proc do_recemail_operation {opargs} {
+  variable maintainersdb
+  variable formail
+  variable discarded_mbox
+  variable processed_mbox
+
+  ;# Read the email from the standard input
+  set email_contents [read -nonewline stdin]
+
+  ;# Get data fields from the received email
+  set from [exec $formail -c -xFrom: << $email_contents]
+  set subject [exec $formail -c -xSubject << $email_contents]
+  set body [exec $formail -I \"\" << $email_contents]
+    
+  ;# Infer the nature of the email from the subject content
+  set subject [string trim $subject]
+
+  switch -glob $subject {
+      {*GNU package*} {
+          ;# Handle activity response email
+
+          ;# Get the maintainer email
+          set maintainer_email [string trim $from]
+
+          ;# We need to extract the email address from a From: line in
+          ;# any of several formats:
+          ;#   address@hidden
+          ;#   <address@hidden>
+          ;#   J User <address@hidden>
+          ;#   address@hidden (J User)
+          ;# We don't attempt to do this perfectly.
+          ;#
+          if { [regexp {<([^>]+)>} $from match maintainer_email] } then {
+            ;# take whatever is inside <...>
+          } elseif { [regexp {^[^ ]*$} $maintainer_email] } then {
+            ;# no spaces, take the whole thing
+          } elseif { [regsub {\(.*\)}  $from "" maintainer_email] } then {
+            ;# (Real Name) removed, now remove space.  regsub won't do it.
+            set maintainer_email [string trim $maintainer_email]
+          } else {
+            puts "could not find email in $from"
+          }
+          set maintainer_email [string tolower $maintainer_email]
+          #puts "got email $maintainer_email"
+          
+          ;# See if this maintainer is in the database
+          set maintainer_found false
+          foreach maintainer $maintainersdb {
+              if { [string tolower [lindex $maintainer 1]] 
+                   == $maintainer_email } then {
+                  set maintainer_found true
+              }
+          }
+          if {!$maintainer_found} then {
+              ;# Maintainer not found => discard email
+              add_to_log "discarded msg from unknown maintainer $from"
+              archive_email $discarded_mbox $email_contents
+              return
+          }
+
+          ;# Log the operation
+          add_to_log "received activity reply from $from"
+          archive_email $processed_mbox $email_contents
+
+          ;# Annotate this packages into the activity file
+          activity_annotate $maintainer_email
+      }
+      default {
+          ;# Unknown email type. Discard it.
+          add_to_log "discarded strange email from $from about $subject"
+          archive_email $discarded_mbox $email_contents
+      }
+  }
+}
+
+proc archive_email {mbox email_contents} {
+  set fout [open $mbox a]
+  puts $fout $email_contents
+  puts $fout "\n"
+  close $fout
+}
+
+
+proc sendemail_annotate {} {
+  variable report_file
+
+  set fout [open $report_file a]
+  set line "last_sendemail|[timestamp]"
+  puts $fout $line
+
+  close $fout
+}
+
+proc activity_annotate {maintainer_email} {
+  variable report_file
+  variable maintainersdb
+
+  set maintainer_name {}
+  set maintainer_packages {}
+
+  ;# Collect information for this maintainer
+  foreach maintainer $maintainersdb {
+      if {[lindex $maintainer 1] == $maintainer_email} then {
+          set maintainer_name [lindex $maintainer 0]
+          set maintainer_packages [lindex $maintainer 3]
+          break;
+      }
+  }
+
+  ;# Make an annotation on file
+  set fout [open $report_file a]
+
+  foreach pkg $maintainer_packages {
+      set pkgline "$maintainer_name|$maintainer_email|$pkg|[timestamp]"
+      puts $fout $pkgline
+  }
+
+  close $fout
+}
+
+proc timestamp {} {
+  return [exec date +%Y%m%d.%H%M%S.%Z]
+}
+
+# 
+proc do_sendemail_operation {opargs} {
+  if {[llength $opargs] == 1} then {
+    puts "Please specify sendemail type"
+    do_help_sendemail
+    exit 1
+  }
+
+  switch [lindex $opargs 1] {
+    active {
+      do_sendemail_operation_active
+    }
+    default {
+      puts "Unknown sendemail type `[lindex $opargs 1]'"
+      do_help_sendemail
+      exit 1
+    }
+  }
+}
+
+proc fill_template {translation_list email_template} {
+  foreach trn $translation_list {      
+    regsub -all -- [lindex $trn 0] $email_template [lindex $trn 1] 
email_template
+  }
+
+  return $email_template
+}
+
+proc do_sendemail_operation_active {} {
+  variable maintainersdb
+  variable formail
+  variable sendmail
+  variable mailtemplate_active
+  variable email_originator
+  variable email_reply
+  set maintainer_sent 0
+  set maintainer_omit 0
+
+  ;# Read the email template
+  set email_contents_file [open $mailtemplate_active r]
+  gets $email_contents_file subject_template
+  set email_template [read -nonewline $email_contents_file]
+  close $email_contents_file
+
+  foreach maintainer $maintainersdb {
+      set maintainer_name [lindex $maintainer 0]
+      set maintainer_email [lindex $maintainer 1]
+      set maintainer_notes [lindex $maintainer 2]
+      set maintainer_pkgs [lindex $maintainer 3]
+
+      ;# Skip unmaintained and generic addresses.
+      ;#puts "checking $maintainer_name"
+      if {[regexp {^[a-z]} $maintainer_name] == 1} then {
+          puts "skipping $maintainer_name"
+          continue
+      }
+
+      ;# Skip maintainers with no packages
+      if {[llength $maintainer_pkgs] == 0} then {
+          puts "*** no packages for $maintainer_name??"
+          continue
+      }
+
+      # 
+      if {$maintainer_notes == ""} {
+        set maintainer_notes "(none)";
+      }
+
+      ;# Build the list of package names.
+      set pkg_list_str "" 
+      set i 0
+      foreach pkg $maintainer_pkgs {
+          incr i
+          append pkg_list_str "${pkg}"
+          if {$i == [llength $maintainer_pkgs] - 1} then {
+            append pkg_list_str " and "
+          } elseif {$i < [llength $maintainer_pkgs]} then {
+            append pkg_list_str ", "
+          }
+      }
+
+      ;# rms doesn't like "package(s)".
+      if {[llength $maintainer_pkgs] == 1} then {
+        set plural_package "package"
+        set plural_this_package "this package"
+      } else {
+        set plural_package "packages"
+        set plural_this_package "these packages"
+      }
+
+      ;# Fill the template with this package/maintainer pair info
+      set translation_list \
+            [list \
+              [list %PLURAL_PACKAGE $plural_package] \
+              [list %PLURAL_THIS_PACKAGE $plural_this_package] \
+              [list %PACKAGE_LIST $pkg_list_str] \
+              [list %MAINTAINER_ADDRESS $maintainer_notes] \
+              [list %MAINTAINER_NAME $maintainer_name] \
+              [list %MAINTAINER_EMAIL $maintainer_email]]
+      set email_contents [fill_template $translation_list $email_template]
+
+      ;# Append the control line
+      set note_line \
+          "\n\n-- Please make sure to include the following line in the body 
on your reply --\n"
+
+      set control_line {}
+      append control_line "\$mntemail:$maintainer_email\$ "
+      foreach pkg $maintainer_pkgs {
+          append control_line "\$package:$pkg\$ "
+      }
+      append control_line "\n"
+
+;#        append email_contents $note_line
+;#        append email_contents $control_line
+
+      set subject_contents [fill_template $translation_list $subject_template]
+
+      ;# Build the email with formail
+      set out_email_contents \
+        [exec $formail -i "Reply-To: $email_reply" \
+              -i "From: $email_originator" \
+              -i "To: $maintainer_email" \
+              -i "Subject: $subject_contents" \
+              -i "Precedence: bulk" \
+              << $email_contents]
+      set out_email_contents \
+        [exec $formail -k -X Date -X Reply-to: -X From: -X Subject: -X To: \
+              << $out_email_contents]
+      append out_email_contents "\n";# be sure we end with blank line
+      
+      ;# redo the linebreaks where requested.
+      set out_email_contents \
+        [exec fmt --prefix=fmt: <<$out_email_contents | sed s/fmt:// \
+              << $out_email_contents]
+
+      ;# (Maybe) send the email.
+      puts -nonewline "--- Email to $maintainer_name <$maintainer_email>:"
+      set ret [exec $sendmail << $out_email_contents]
+      if {[string length $ret] == 0} {
+        set log_str "sent"
+        incr maintainer_sent
+        variable sent_mbox
+        archive_email $sent_mbox $out_email_contents
+      } else {
+        set log_str "omitted ($ret)";
+        incr maintainer_omit;
+      }
+      
+      puts " $log_str.";
+      add_to_log "$log_str activity check to $maintainer_email 
($maintainer_name) for $pkg_list_str"
+
+  }
+
+  ;# Annotate the sendemail operation
+  sendemail_annotate
+
+  puts "Sent email to $maintainer_sent maintainers, omitted $maintainer_omit."
+}
+
+proc do_list_operation {opargs} {
+  if {[llength $opargs] == 1} then {
+    do_help_list
+    exit 1
+  }
+
+  switch [lindex $opargs 1] {
+      packages {           
+          if {[llength $opargs] == 2} then {
+              do_list_packages all
+          } else {
+              switch [lindex $opargs 2] {
+                  all {
+                      do_list_packages all
+                  }
+                  maintained {
+                      do_list_packages maintained
+                  }
+                  unmaintained {
+                      do_list_packages unmaintained
+                  }
+                  maintainer {
+                      do_list_packages_maintainer [lindex $opargs 3]
+                  }
+                  default {
+                      puts "Unknown list packages operation: [lindex $opargs 
2]"
+                  }
+              }
+          }
+      }
+      maintainers {
+          if {[llength $opargs] == 2} then {
+              do_list_maintainers all
+          } else {
+              switch [lindex $opargs 2] {              
+                  all {
+                      do_list_maintainers all
+                  }
+                  package {
+                      do_list_package_maintainers [lindex $opargs 3]
+                  }
+                  default {
+                      do_list_maintainers [lindex $opargs 2]
+                  }
+              }
+          }
+      }
+
+      help {
+          do_help_list
+      }
+
+      default {
+          puts "Unknown list operation: [lindex $opargs 1]"
+          exit 1
+      }
+  }
+}
+
+proc do_list_maintainers {which} {
+  variable maintainersdb
+
+  foreach maintainer $maintainersdb {
+      set maintainer_name [lindex $maintainer 0]
+      set maintainer_email [lindex $maintainer 1]
+      set maintainer_notes [lindex $maintainer 2]
+
+      if {($which == "all") ||
+          [string match -nocase "*${which}*" $maintainer_name] ||
+          [string match -nocase "*${which}*" $maintainer_email]} {
+
+          ;# List this maintainer
+          puts -nonewline $maintainer_name
+          if {$maintainer_email != ""} then {
+              puts -nonewline " "
+              puts -nonewline "<$maintainer_email>"
+              }
+          foreach note $maintainer_notes {
+              puts -nonewline " "
+              puts -nonewline "($note)"
+          }
+          puts {}
+      }
+  }
+}
+
+proc do_list_package_maintainers {package_name} {
+  variable maintainersdb
+
+  foreach maintainer $maintainersdb {
+      set maintainer_name [lindex $maintainer 0]
+      set maintainer_email [lindex $maintainer 1]
+      set maintainer_notes [lindex $maintainer 2]
+      set maintainer_pkgs [lindex $maintainer 3]
+
+      set to_list false
+      foreach pkg $maintainer_pkgs {
+          if {[string match -nocase "*${package_name}*" $pkg]} then {
+              set to_list true
+              break
+          }
+      }
+
+      if {$to_list} then {
+          ;# List this maintainer
+          puts -nonewline $maintainer_name
+          if {$maintainer_email != ""} then {
+              puts -nonewline " "
+              puts -nonewline "<[lindex $maintainer 1]>"
+          }
+          foreach note $maintainer_notes {
+              puts -nonewline " "
+              puts -nonewline "($note)"
+          }
+          puts {}
+      }
+  }
+}
+
+proc do_list_packages_maintainer {maintainer_info} {
+  variable maintainersdb
+
+  foreach maintainer $maintainersdb {
+      set maintainer_name [lindex $maintainer 0]
+      set maintainer_email [lindex $maintainer 1]
+      set maintainer_pkgs [lindex $maintainer 3]
+
+      if {[string match -nocase "*${maintainer_info}*" $maintainer_name] ||
+          [string match -nocase "*${maintainer_info}*" $maintainer_email]} 
then {
+
+          foreach pkg $maintainer_pkgs {
+              puts $pkg
+          }
+      }
+  }
+}
+
+proc do_list_packages {which} {
+  variable maintainersdb
+
+  set pkg_list {}
+  foreach maintainer $maintainersdb {
+      set maintainer_name [lindex $maintainer 0]
+      set maintainer_pkgs [lindex $maintainer 3]
+
+      if {(($which == "maintained") && 
+           ($maintainer_name == "Unmaintained")) ||
+          (($which == "unmaintained") &&
+           ($maintainer_name != "Unmaintained"))} then {
+
+          continue
+      }
+
+      foreach pkg $maintainer_pkgs {
+          if {[lsearch -exact $pkg_list $pkg] == -1} then {
+              lappend pkg_list $pkg
+          }
+      }
+  }
+
+  foreach pkg $pkg_list {
+      puts $pkg
+  }
+}
+
+proc parse_command_line_arguments {} {
+  variable argc
+  variable argv
+
+  if {$argc == 0} then {
+      do_help_usage
+      exit 1
+  }
+
+  switch [lindex $argv 0] {
+      help {
+          if {($argc == 1) || ($argc > 2)} then {
+              do_help_usage
+              exit 0
+          }
+          do_help_operation [lindex $argv 1]
+          exit 0
+      }
+      list {
+          do_list_operation $argv
+      }
+      sendemail {
+          do_sendemail_operation $argv
+
+      }
+      recemail {
+          do_recemail_operation $argv
+      }
+      default {
+          do_help_usage
+          exit 1
+      }
+  }
+}
+
+# 
+proc get_environment {} {
+  global env
+  global maintainers_file
+  global mailtemplate_active
+
+  # GNUMAINT_MAINTAINERS_FILE variable
+  if {[info exists env(GNUMAINT_MAINTAINERS_FILE)]} then {
+    set maintainers_file $env(GNUMAINT_MAINTAINERS_FILE)
+  }
+
+  # GNUMAINT_MAILTEMPLATE_ACTIVE
+  if {[info exists env(GNUMAINT_MAILTEMPLATE_ACTIVE)]} then {
+    set mailtemplate_active $env(GNUMAINT_MAILTEMPLATE_ACTIVE)
+  }
+}
+
+proc main {} {
+  ; # cd to our directory so we can easily find our files.
+  global argv0
+  variable mydir
+  regsub {/[^/]*$} $argv0 "" mydir
+  cd $mydir
+
+  variable maintainersdb
+
+  # Override configuration variables from
+  # the environment
+  get_environment
+
+  # Build the maintainers database
+  build_maintainers_db
+
+  # Parse command line arguments
+  parse_command_line_arguments
+}
+
+# Call the main routine
+main

Index: contact-activity.txt
===================================================================
RCS file: contact-activity.txt
diff -N contact-activity.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ contact-activity.txt        11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,676 @@
+# $Id: contact-activity.txt,v 1.1 2019/05/11 10:44:53 ineiev Exp $
+# Public domain.
+# 
+# This file records information about contact activity with package
+# maintainers.  There is nothing private in this file. 
+#
+# Canonical order:
+# package
+# reply-from
+# query-to
+# next-release
+# next-contact
+# note
+#
+# The package name should always be all-lowercase (and match
+# gnupackages.txt and maintainers).
+#
+# Finally, this file as a whole is more or less sorted by package
+# identifier.  However, software reading this file should accept any
+# order of packages or fields.
+
+package: 3dldf
+reply-from: 04jun13/laurence, 23apr13, 3apr13, 28mar13
+query-to: 29mar13/brandon, 28mar13
+next-release: 04jun13/later this summer?, 23apr13/in preparation
+
+package: a2ps
+reply-from: 30sep12, 19feb12 replied to list, 20aug11
+query-to: 28jun14/karl, 5may14/karl, 18sep12/karl, 11jun12, 5may12
+
+package: acct
+query-to: 4dec12/karl
+next-release: 4dec12/no eta
+
+package: acm
+reply-from: 23mar15/sergio, 16nov10
+query-to: 22mar15/brandon
+next-release: 23mar15/stepping down, 16nov10/soon
+
+package: adns
+reply-from: 13may14/ian, 04jun13, 19feb13, 18feb13, 10mar11
+query-to: 12may13/brandon, 28may13, 7feb13/karl, 19jan12/rms
+next-release: 13may14/next 6 months, 04jun13/not certain, 19feb13/probably not 
soon maybe just gplv3, 10mar11/in a month
+
+package: anubis
+reply-from: 15may14/sergey
+query-to: 12may14/brandon
+next-release: 15may14/two weeks
+
+package: avl
+query-to:  12may14/brandon
+
+package: ballandpaddle
+reply-from: 04jun13, 11feb13
+query-to: 12may14/brandon
+next-release: 04jun13/fall 2013 or spring 2014, 11feb13/soon
+
+package: barcode
+reply-from: 12jun12, 22nov10 newmaint, 26jul09
+query-to: 11jun12/karl, 15nov10
+
+package: bc
+reply-from: 13may14/phil, 7may12/ken, 6may12/phil, 22may08/pizzini
+query-to: 12may14/brandon, 28may13
+next-release: 13may14/fall 2014
+
+package: bool
+reply-from: 28mar15/marc
+query-to: 23mar15/brandon, 12may14, 28may13, 5sep08/karl, 17dec09
+next-release: 28mar15/this year
+
+package: bpel2owfn
+reply-from: 15may15/Niels, 9apr10
+query-to: 14may15/brandon, 22mar15
+next-release: 15may15/never (stable)
+
+package: cfengine
+reply-from: feb10/gscrivano
+
+package: cim
+query-to: 12may14/brandon, 28may13, 22dec09/karl
+
+package: clisp
+reply-from: 23mar15/sam, 3jan11
+query-to: 22mar15/brandon, 4oct12/karl/rms
+next-release: 23mar15/never
+
+package: cobol
+reply-from: 26oct08
+note: dedicated maintainer, but will not be able to resume full-time work
+note: for 4-5 years (after 6 months full-time work).  But it's a Cobol
+note: compiler, hardly likely to find other implementors, and lots and lots
+note: of work has been done.  Mail from tej, 26 Oct 2008 12:42:10 +1100.
+
+package: combine
+reply-from: 14oct08
+query-to: 28may13/brandon, 18jun10/karl, 7nov10
+next-release: 14oct08/end of month
+
+package: commoncpp
+query-to: 8jun10/karl
+
+package: dap
+query-to: 19feb12/jmd, 22jan12
+
+package: ddd
+query-to: 17dec12/karl, 4may11
+reply-from: 29oct14
+next-release: 29oct14+soonh
+
+package: dejagnu
+reply-from: 10mar11
+
+package: denemo
+reply-from: 12may10
+
+package: dia
+reply-from: 9jun08
+
+package: dionysus
+reply-from: 23mar15/jean michel
+query-to: 22mar15/brandon
+next-release: 23mar15/never
+
+package: dismal
+reply-from: 29may13, 25jan11
+query-to: 28may13/brandon, 17nov10/karl, 29oct08
+next-release: 29may13/never, 25jan11/soon
+
+package: dmd
+reply-from: 30oct08
+query-to: 28may13/brandon, 20jun10/karl
+
+package: dominion
+query-to: 12may14/brandon, 28may13, 8jan10/karl
+
+package: emacs-muse
+query-to: 12may14/brandon
+
+package: enscript
+reply-from: 19sep12
+
+package: eprints
+reply-from: 23nov09
+
+package: epsilon
+reply-from: 14apr15/luca, 12dec12
+query-to: 23mar15/brandon, 11may14
+next-release: 23mar15/1.0 possible soon, 12dec12/alpha soon
+
+package: findutils
+reply-from: 24mar15/james, 1may12
+query-to: 23mar15/brandon, 12may14
+next-release: 24mar15/two months, 1may12/four blocking bugs
+
+package: flex manual
+query-to: 9nov08/karl
+note: 9nov08 source?
+
+package: fontutils
+reply-from: 12feb13
+query-to: 12may14/brandon
+next-release: 12feb13/not soon
+
+package: freeipmi
+reply-from: 14jan10
+next-release: 14jan10/next major release
+
+package: freetalk
+query-to: 12may14/brandon
+
+package: fribidi
+query-to: 12may14/brandon
+
+package: garpd
+reply-from: 21nov10
+next-release: 21nov10/soon
+
+package: gcl
+reply-from: 07jun13, 8nov10
+query-to: 28may13/brandon
+next-release: 07jun13/next week
+
+package: gdbm
+query-to: 10mar11/karl
+
+package: gengen
+reply-from: 23mar15/raman
+query-to: 22mar15/brandon
+next-release: 23mar15/2-3 weeks
+
+package: ggradebook
+reply-from: 22feb13/anto
+query-to: 21apr13/brandon, 18feb13
+
+package: gift
+reply-from: 18feb13
+query-to: 18feb13/brandon
+
+package: glue
+reply-from: 14may14/markus, 18jan10
+query-to: 12may14/brandon, 4apr13/karl
+next-release: 14may14/years from now, 18jan10/2011 release
+
+package: gmediaserver
+reply-from: 14apr15/dmitry, 14may14, 20nov10
+query-to:  23mar15/brandon, 12may14, 16may13
+next-release: 14apr15/suggest retirement, 14may14/this summer, 20nov10/this 
year
+
+package: gmorph
+reply-from: 24jan12
+query-to: 25apr13/rms/karl, 16feb13/brandon, 4jan11/karl
+next-release: 14jan12/replied to jmd but doing nothing
+
+package: gnats
+reply-from: 6apr13, 1jan13
+next-release: ?
+next-contact: 6nov13
+
+package: gnatsweb
+reply-from: 25jul11
+query-to: 22jan12/jmd
+next-release: 25jul11/little work done
+
+package: gnowsys
+reply-from: 24mar15/nagarjuna, 13may14, 28may13, 18mar10
+query-to: 22mar15/brandon, 12may14, 28may13
+next-release: 24mar15/april 2015, 13may14/august 2014, 28may13/august 2013
+
+package: gnu-arch
+reply-from: 28may13/andy, 10oct11, 2dec08
+query-to: 28may13/brandon, 1jul12/karl
+next-release: 28may13/probably none should retire
+
+package: gnubg
+query-to: 8may13/brandon, 25apr13/rms/karl, 20mar13/brandon
+
+package: gnucap
+query-to: 12may14/brandon, 28may13, 15aug08/karl
+note: 15aug08/asked about gplv3
+
+package: gnucash
+query-to: 24jan10/karl
+
+package: gnufm
+reply-from: 26mar13/matt
+query-to: 12may14/brandon, 26mar13
+next-release: 26mar13/almost ready
+
+package: gnugo
+query-to: 12may14/brandon
+
+package: gnuit
+query-to: 12may14/brandon
+
+package: gnujdoc
+reply-from: 15dec08
+query-to: 26jan10/karl
+
+package: gnukart
+reply-from: 04jun13, 21apr10
+query-to: 28may13/brandon
+next-release: 04jun13/never
+
+package: gnumed
+reply-from: 19jan10
+query-to: 18nov10/karl
+
+package: gnump3d
+query-to: 11feb10/karl
+
+package: gnupod
+reply-from: 13may14/adrian
+query-to: 12may14/brandon
+next-release: 13may14/none in sight
+note: the software is moribund due to being tied to moribund hardware
+
+package: gnurobots
+query-to: 12may14/brandon, 13feb11/karl
+
+package: gnuschool
+reply-from: 15jun13, 29may13, 7apr13, 1apr13
+query-to: 28may13/brandon, 26mar13/karl, 28mar12/karl
+next-release: 15jun13/emailed-to-karl-told-him-to-try-uploading
+next-contact: 1jul13
+
+package: gnushogi
+reply-from: 13mar12
+
+package: gnuskies
+reply-from: 8apr13/rahul
+query-to: 20mar13/brandon, 24jun09/karl
+next-release: never
+
+package: gnusound
+query-to: 12may14/brandon, 17sep11/karl, 30jan10
+note: 17sep11/#709362
+
+package: gnuspeech
+reply-from: 1apr15/david, 26mar13
+query-to: 23mar15/brandon, 12may14, 26mar13
+next-release: 1apr15/mid may?, 26mar13/unknown but possible
+
+package: goptical
+reply-from: 29nov10
+next-release: 29nov10/before christmas
+
+package: gpaint
+reply-from: 30may14/andy, 28may13, 10oct11, 12dec08
+query-to: 12may14/brandon, 28may13
+next-release: 31may14/two months, 28may13/one month
+
+package: gperf
+query-to: 28jun14/karl, 5may14/karl (and many in the past)
+also: libiconv, libsigsegv, libunistring
+
+package: gprolog
+query-to: 1feb10/karl
+
+package: grabcomics
+reply-from: 18nov10
+
+package: greg
+query-to: 12may14/brandon, 28may13, 14dec08/karl
+
+package: gretl
+query-to: 21nov10/karl
+
+package: gsegrafix
+query-to: 13feb11/karl
+
+package: gsl
+query-to: 25apr13/rms/karl, 19feb13/brandon
+
+package: gtick
+query-to: 12may14/brandon
+
+package: gtypist
+reply-from: 5dec10
+note: 5dec10/volunteer
+
+package: guile-rpc
+reply-from: 13may14/ludovic, 25mar13, 17dec08
+query-to: 12may14/brandon, 24mar13
+next-release: 13may14/next month, 25mar13/ready now, 17dec08/official eta 
unknown
+
+package: gurgle
+reply-from: 23mar15/tim
+query-to: 22mar15/brandon
+next-release: 23mar15/1 year but it's effectively stable
+
+package: halifax
+reply-from: 6jul12
+
+package: hp2xx
+reply-from: 13may14/martin, 11feb10
+query-to: 12may14/brandon, 11may13, 13nov12
+next-release: 13may14/maybe later this year, unlikely because it's stable
+
+package: httptunnel
+reply-from: 28apr09
+query-to: 12may14/brandon, 28may13, 9feb10/karl
+
+package: intlfonts
+query-to: 12may14/brandon, 28may13, 27jan09/karl
+
+package: jdresolve
+query-to: 25apr13/rms/karl, 24mar13/brandon, 24nov10/karl, 9feb10
+
+package: jel
+reply-from: 24jun09
+
+package: jwhois
+reply-from: 12dec12, 20jun09
+next-release: 20jun09/maybe soon
+
+package: kawa
+reply-from: 8jun09
+
+package: kopi
+query-to: 12may14/brandon, 28may13, 10mar12/benheni
+
+package: leg
+reply-from: 16feb13, 8nov10
+query-to: 16feb13/brandon
+next-release: 16feb13/end of summer
+
+package: liberty-eiffel
+query-to: 11may14/brandon
+
+package: libffcall
+reply-from: 28may13, 27nov10
+query-to: 28may13/brandon
+next-release: 28may13/orphaned, 27nov10/unknown
+
+package: libmatheval
+reply-from: 18jun11
+query-to: 18jun11/karl, 10nov10
+
+package: libredwg
+reply-from: 16feb10
+query-to: 27mar13/karl
+
+package: libxmi
+query-to: 12may14/brandon, 28may13, 16feb10/karl
+
+package: lightning
+query-to: 28may13/brandon, 27sep12/karl, 31dec08
+
+package: lrzsz
+reply-from: 11apr09
+query-to: 12may14/brandon, 28may13, 28nov10/karl
+next-release: 11apr09/next 3 months
+
+package: lsh
+reply-from: 29may13/niels, 9mar13
+query-to: 28may13/brandon
+next-release: 29may13/within a few months, 9mar13/sometime
+
+package: macchanger
+reply-from: 18jan09
+
+package: make
+reply-from: 21jan09
+
+package: maverik
+reply-from: 21feb13
+query-to: 18feb13/brandon
+
+package: mc
+query-to: 28may13/brandon, 19jun12/karl, 20jan09, 12nov08
+
+package: mcsim
+reply-from: 29jan11, 29nov10
+
+package: melting
+query-to: 22feb10/karl
+
+package: metaexchange
+reply-from: 27mar13/laurence
+query-to: 24mar13/brandon
+next-release: 27mar13/indefinitely no
+
+package: metahtml
+reply-from: 19jan11, 23feb10
+query-to: 27nov11/gerald
+
+package: miscfiles
+reply-from: 17nov10
+
+package: nana
+query-to: 3jul12/jmd, 10mar11/karl
+
+package: nano
+query-to: 11jun12/karl
+
+package: oleo
+reply-from: 21jan13, 5apr12
+query-to: 21jan13/brandon, 1apr12/jmd, 19feb12, 22jan12
+
+package: orgadoc
+reply-from: 1mar10
+
+package: panorama
+query-to: 12may14/brandon, 28may13, 11may09/karl
+
+package: pascal
+reply-from: 23feb09
+
+package: paxutils
+query-to: 12may14/brandon, 3apr13/karl
+reply-from: 9dec12, 4feb09, autumn09
+
+package: pcb
+query-to: 2jul12/karl, 2dec10, 4mar10, 24mar09
+
+package: pdf
+reply-from: 31mar13/jose
+query-to: 12may14/brandon, 24mar13
+
+package: pexec
+query-to: 13may14/brandon
+
+package: phantom_home
+query-to: 13may14/brandon, 28may13, 1jun09/karl
+
+package: phpgroupware
+reply-from: 28apr12/hamet
+query-to: 25apr13/rms/karl, 16feb13/brandon, 15apr12/karl, 8mar10
+
+package: pies
+reply-from: 24may14/sergey
+query-to: 13may14/brandon
+next-release: 24may14/within two months
+
+package: pipo
+query-to: 13may14/brandon, 28may13, 9mar10/karl
+
+package: plotutils
+reply-from: 14may14, 13jun11
+query-to: 30apr14/karl
+next-release: summer14
+
+package: powerguru
+next-release: 3dec10/never
+reply-from: 3dec10
+query-to: 26mar13/karl
+
+package: proxyknife
+query-to: 13may14/brandon
+
+package: pspp
+reply-from: 9dec12
+next-release: 9dec12/early next year
+
+package: pth
+reply-from: 3dec11, 4jan11, 1jun09
+query-to: 13may14/brandon, 28may13, 10mar11/karl, 12mar10
+note: 10mar11 rms gave up, 4jan11 to rms
+
+package: pythonwebkit
+reply-from: 17feb13
+query-to: 16feb13/brandon
+note: 17feb13 no release yet (urged doing so)
+
+package: quickthreads
+reply-from: 23jul09
+query-to: 12mar10/karl
+note: 23jul09 awaiting code
+
+package: radius
+query-to: 13may14/brandon
+
+package: rpge
+query-to: 25apr13/rms/karl, 16feb13/brandon, 19feb12/jmd, 22jan12, 14feb11/karl
+
+package: sather
+reply-from: 14apr13
+query-to: 19feb13/brandon, 14apr12/karl
+next-release: unknown
+next-contact: 14oct13
+
+package: screen
+reply-from: 27jan12
+query-to: 28may13/brandon
+next-release: 27jan12/early next week
+
+package: serveez
+reply-from: 29jan11, 25jun09
+query-to: 26jan11/karl, 8jun10
+
+package: shmm
+reply-from: 25mar15/jeannie
+query-to: 23mar15/brandon, 13may14
+next-release: 25mar15/probably never (stable) maybe update for MacOS
+support later this year
+
+package: shtool
+query-to: 13may14/brandon
+
+package: smarteiffel
+query-to: 28may13/brandon
+
+package: social
+reply-from: 13may14/brandon, 26mar13/matt
+query-to: 13may14/brandon, 26mar13
+next-release: 13may14/waiting on copyright assignment, 26mar13/almost ready
+
+package: spacechart
+query-to: 13may14/brandon, 28may13, 21mar10/karl, 14feb09
+
+package: speex
+reply-from: 13may14/jean-marc
+query-to: 13may14/brandon
+next-release: 13may14/new maintainer so hopefully sometime
+
+package: sqltutor
+reply-from: 13may14/ales, 9dec12
+query-to: 13may14/brandon
+next-release: 14may14/this summer, 9dec12/next year
+
+package: stalkerfs
+query-to: 13may14/brandon, 20feb09/karl
+
+package: stump
+reply-from: 13may14/igor, 16mar09
+query-to: 13may14/brandon, 28may13, 9dec10/karl, 24mar10
+next-release: 13may14/never
+
+package: superopt
+next-contact: jun14->ttn
+reply-from: 16jan14/ttn, 18mar09
+query-to: 28may13/brandon, 18jan11/karl, 25mar10
+
+package: sysutils
+query-to: 13may14/brandon, 28may13, 19jan11/karl, 26mar10
+
+package: talkfilters
+reply-from: 30may14/mark
+query-to: 13may14/brandon
+next-release: 30may14/never, stable
+
+package: termcap
+reply-from: 14may14/gary
+query-to: 13may14/brandon, 28may13
+next-release: 14may14/never
+
+package: termutils
+reply-from: 14may14/gary, 23feb09
+query-to: 13may14/brandon, 28may13, 8nov10/karl, 23feb09
+next-release: 14may14/never
+
+package: thales
+reply-from: 27feb13
+query-to: 26feb13/brandon
+
+package: time
+reply-from: 23mar15/david, 16feb13/bug-gnu-utils, 14oct11, 13jan11
+query-to: 22mar15/brandon, 13may14, 28may13
+next-release: 23mar15/recent release via git tag, 16feb13/no eta, 
13jan11/within a month
+
+package: trueprint
+reply-from: 15jan13
+note: 15jan13 "try to work more"
+
+package: userv
+reply-from: 04jun13, 19feb13
+query-to: 13may14/brandon, 28may13
+next-release: 04jun13/some time this year, 19feb13/maybe soon
+
+package: uucp
+reply-from: 29may13, 19may09
+query-to: 28may13/brandon, 9jan11/karl, 3apr10
+next-release: 29may13/never
+
+package: vcdimager
+reply-from: 26feb09
+
+package: vmslib
+reply-from: 18feb13, 12jun12
+query-to: 21mar13/brandon, 18feb13
+next-contact: 18mar13
+
+package: w3
+reply-from: 6apr10
+query-to: 16may13/brandon, 13may13, 25apr13/rms/karl, 27mar13/brandon, 
10jan11/karl, 8nov10
+
+package: webstump
+reply-from: 22mar15/igor
+query-to: 22mar15/brandon, 13may14, 28may13
+
+package: which
+reply-from: 15may14/carlo
+query-to: 13may14/brandon
+next-release: 15may14/none, stable
+
+package: xhippo
+reply-from: 13may14/adam
+query-to: 13may14/brandon
+next-release: 13may14/never
+
+package: xlogmaster
+reply-from: 23mar15/john
+query-to: 22mar15/brandon, 13may14, 19feb12/jmd
+note: 19feb12 asked about penguin
+next-release: 23mar15/couple months
+
+package: xmlat
+reply-from: 27feb13
+query-to: 26feb13/brandon
+
+package: xaos
+reply-from: 14may14/zoltan
+query-to: 13may14/brandon
+
+# End. (Do not remove this line or the blank line before it.  Thanks.)

Index: massmail-1405-stale.txt
===================================================================
RCS file: massmail-1405-stale.txt
diff -N massmail-1405-stale.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ massmail-1405-stale.txt     11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,39 @@
+From: address@hidden (GNU Project)
+To: %PACKAGE_MAINTAINERS
+Bcc: address@hidden
+Subject: release of GNU %PACKAGE_NAME
+
+Greetings,
+
+We're sending you this message on behalf of the GNU Project because as
+far as we know, you are the maintainer(s) of %PACKAGE_NAME.  (If you're
+not maintaining it, please just reply to let us know.)
+
+As far as we've been able to discern, %PACKAGE_NAME 
+has gone several years without a new (official) release.  If you have in
+fact made a recent release, please let us know, and sorry for the noise.
+We could not determine the status with absolute certainty.
+
+Otherwise ... it has always been a basic goal of GNU that its
+constituent packages be actively developed and have releases from time
+to time.  Without a release, we periodically ping the maintainer(s) to see
+how things are going.  So, could you please reply to this message with a
+response to the following questions?  Please include all and any
+relevant information, better too much than too little.
+
+1) Can you estimate, even roughly, when a new release will be made?
+
+2) Have you been able to make progress (fixing bugs, updating
+infrastructure, adding features, ...) since the last release, or since
+our last contact with you?
+
+3) Are there technical, legal, or other barriers to making a release?
+We'd like to help if we can.
+
+4) Other comments?
+
+In general, if you have any news or questions regarding the package,
+please let us know at address@hidden  Thanks for contributing to
+GNU, and happy hacking.
+
+Brandon & Karl (GNUisances)

Index: mailtoname
===================================================================
RCS file: mailtoname
diff -N mailtoname
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ mailtoname  11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,99 @@
+#!/usr/bin/env perl
+# We originally used email addresses in activity-report.txt; turns out
+# it's much better to include real names, since email addresses change and
+# vary.  This one-time script does a simplistic conversion, with hand
+# clean-up needed afterwards.
+
+exit (&main ());
+
+sub main
+{
+  my %names = &read_maintainers ("by-email");
+  my @activity = &read_activity ("activity-report.txt");
+  
+  for my $a (@activity) {
+    my ($email,$pkg,$date) = split (/\|/, $a);
+    print $names{lc ($email)};
+    print "|$email|$pkg|$date";
+  }
+  
+  return 0;
+}
+
+
+
+# just do very basic parsing for this one-time job.
+# return hash where keys are email addresses and values are names.
+# we record all emails we can find.
+# 
+sub read_maintainers
+{
+  my %ret;
+  
+  $MAINTAINERS_FILE = "m.link";
+  open (MAINTAINERS_FILE) || die "open($MAINTAINERS_FILE) failed: $!";
+
+  # ignore first part of maintainers, through the first form feed.
+  while (<MAINTAINERS_FILE>) {
+    chomp;
+    last if /^\f$/;
+  }
+  
+  # read the real information.
+  my (@email_list, $name);
+  while (<MAINTAINERS_FILE>) {
+    chomp;
+    next if /^#/;  # ignore comments
+    
+    # at a blank line, save the maintainer info we've accumulated, if any.
+    if (/^\s*$/) {
+      for my $e (@email_list) {
+        if (exists $ret{$e}) {
+          warn "already saw email $e for $ret{$e}, now have $name";
+        } else {
+          $ret{$e} = $name;
+        }
+      }
+      
+      @email_list = ();
+      $name = undef;
+
+      last if /^\f$/;  # form feed marks end of info.
+      next;
+    }
+
+    # key is everything before the first colon.
+    # value is everything after the first colon and whitespace.
+    my ($key,$val) = split (/:\s*/, $_, 2);
+    
+    # just want name and email addresses.
+    if ($key eq "name") {
+      $name = $val;
+    } elsif ($key =~ /email/) {
+      push (@email_list, lc ($val));
+    }
+  }
+  
+  # skip the rest.
+  close (MAINTAINERS_FILE) || warn "close($MAINTAINERS_FILE) failed: $!";
+  
+  return %ret;
+}
+
+
+
+sub read_activity
+{
+  my ($file) = @_;
+  my (@ret);
+  
+  local *FILE;
+  $FILE = $file;
+  open (FILE) || die "open($FILE) failed: $!";
+  while (<FILE>) {
+    push (@ret, $_);
+  }
+  close (FILE) || warn "close($FILE) failed: $!";
+
+  return @ret;
+}

Index: gm-email.pl
===================================================================
RCS file: gm-email.pl
diff -N gm-email.pl
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gm-email.pl 11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,156 @@
+# $Id: gm-email.pl,v 1.1 2019/05/11 10:44:53 ineiev Exp $
+# Generate a batch of email messages.  See the help string below.
+# In a separate file just because it gets kind of long.
+#
+# Copyright 2012 Free Software Foundation Inc.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# Originally written by Karl Berry.
+
+
+# Maybe someday we will need "bymaintainer", or something else.
+#
+sub generate_email_bypackage {
+  splice (@ARGV, 0, 3);  # lose the "generate email ..."
+  my ($output_dir, $pkg_list, $template_file);
+  while (my $arg = shift @ARGV) {
+    if ($arg eq "-h") {
+      print <<END_GENEMAIL_HELP;
+Usage: $0 generate email batch  -o OUTDIR  -p PKGLIST-FILE  -t TEMPLATE-FILE
+
+Generate a batch of email messages in OUTDIR,
+one for each package in PKGLIST-FILE (plain text, one package name per line),
+doing substitutions in TEMPLATE-FILE to make each actual message.
+All three of these options are required.
+
+Any previous contents of OUTDIR is removed, so the program can be run
+many times while tweaking the template and package list.
+
+No email is actually sent (do that by running, e.g., sendmail -t on each
+file in OUTDIR after you are satisfied with the contents).
+END_GENEMAIL_HELP
+      exit 0;
+
+    } elsif ($arg eq "-o") {
+      $output_dir = shift @ARGV;
+    } elsif ($arg eq "-p") {
+      $pkglist_file = shift @ARGV;
+    } elsif ($arg eq "-t") {
+      $template_file = shift @ARGV;
+    }
+  }
+  
+  # Check values.
+  die "$0: generate email group needs all of -o, -p, -t; try -h for help.\n"
+    if (! $output_dir || ! $pkglist_file || ! $template_file);
+  #
+  die "$0: package list file nonexistent or empty: $pkglist_file"
+    if ! -s $pkglist_file;
+  #
+  die "$0: template file nonexistent or empty: $template_file"
+    if ! -s $template_file;
+  # 
+  if (! -e $output_dir || -d $output_dir) {
+    system ("rm -rf $output_dir");
+    mkdir ($output_dir, 0777) || die "$0: mkdir($output_dir) failed: $!\n";
+  } else {
+    die "$0: output directory exists and is not a directory: $output_dir\n";
+  }
+  
+  my %maint_file = &read_maintainers ("by-package");
+  
+  my $count = 0;
+  open (PKGLIST, $pkglist_file) || die "open($pkglist_file) failed: $!";
+  while (<PKGLIST>) {
+    (my $pkg = $_) =~ s/\s.*$//;  # take first word of each line, ignore rest.
+    die "$0: Not a package in the maintainers file: $pkg\n"
+      if ! exists $maint_file{$pkg};
+
+    # for msg.1201, rms said to explicitly exclude Hurd from the query.
+    # And there's no point in checking on gnustandards or trans-coord.
+    next if $pkg =~ /^(mig|hurd|gnumach|gnustandards|trans-coord)$/;
+
+    my $msg = &make_msg ($template_file, $pkg, $maint_file{$pkg});
+    next if ! $msg;  # skipping this one since unmaintained, etc.
+    
+    local *MSG;
+    $MSG = ">$output_dir/$pkg";
+    open (MSG) || die "open($MSG) failed: $!";
+    print MSG $msg;
+    close (MSG) || die "close($MSG) failed: $!";
+    
+    $count++;
+  }
+  close (PKGLIST) || warn "close($pkglist_file) failed: $!";
+  
+  return "$count messages generated in $output_dir/.";
+}
+
+
+# PKGREF is a hash with the information for PKGNAME from the maintainers
+# file.  Expand TEMPLATE_FILE and return it as a string.  Except if the
+# package is unmaintained, then return undef.
+# 
+sub make_msg {
+  my ($template_file,$pkgname,$pkgref) = @_;
+  
+  # ignore generic entry if present, we want to write the individuals.
+  my ($maintainer_email_addrs,undef) = &maintainer_email_addrs ($pkgref);
+  return undef if $maintainer_email_addrs =~ /^unmaintained/;
+
+  # Ok, we're unnecessarily rereading the template file every time.
+  open (TEMPLATE, $template_file) || die "open($template_file) failed: $!";
+  my $msg = join ("", <TEMPLATE>);
+  close (TEMPLATE) || warn "close($template_file) failed: $!";
+  
+  my $pretty_email_addrs = &prettify_for_msg ($maintainer_email_addrs);
+  
+  # Template substitutions.
+  $msg =~ s/%PACKAGE_NAME/$pkgname/g;
+  $msg =~ s/%PACKAGE_MAINTAINERS/$pretty_email_addrs/g;
+  
+  return $msg;
+}
+
+# Given single string of email ADDRS, break into multiple lines at a
+# somewhat reasonable length, prepending tabs to second and subsequent
+# lines.  The idea being that the result can be used in the To: header.
+# 
+sub prettify_for_msg {
+  my ($addrs) = @_;
+  my $ret = "";
+  
+  my @addrs = split (/, /, $addrs);
+  return $addrs if @addrs == 1;  # only one, just return it.
+  
+  my $line_len = 0;
+  for (my $i = 0; $i < @addrs; $i++) {
+    $ret .= $addrs[$i];              # add addr
+    $ret .= "," if $i + 1 < @addrs;  # add comma if not the last one
+
+    $line_len += length ($addrs[$i]) + 1;  # what we just added
+    if ($line_len > 71) {
+      # long enough, end this line and start the next:
+      $ret .= "\n\t" if $i +1 < @addrs;  # unless it's the last one.
+      $line_len = 0;
+    } else {
+      $ret .= " ";  # add space, will continue on this line
+    }
+  }
+  
+  return $ret;
+}
+
+1;

Index: gm-list.pl
===================================================================
RCS file: gm-list.pl
diff -N gm-list.pl
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gm-list.pl  11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,267 @@
+# $Id: gm-list.pl,v 1.1 2019/05/11 10:44:53 ineiev Exp $
+# The list actions for the gm script (see --help message).
+# 
+# Copyright 2007, 2008, 2009, 2010, 2012, 2013, 2015
+# Free Software Foundation Inc.
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# Originally written by Karl Berry.
+
+
+
+# Return a list of strings: the (active) package names which the FSF is
+# the copyright holder.  Or, if the NOTFSF argument is set, for which it
+# is not the copyright holder.
+# 
+sub list_copyrightfsf_ {
+  my ($notfsf,$nowarn) = @_;
+  my @ret = ();
+
+  my %fsf_pkgs = &read_copyright_list ("by-line");
+  my %old_pkgs = &read_oldpackages ();
+  my %maint_pkgs = &read_maintainers ("by-package");
+
+  for my $fsf_pkg (sort keys %fsf_pkgs) {  # packages in copyright.list
+    if (! exists $maint_pkgs{$fsf_pkg}) {  # if not in maintainers ...
+      # warn about stray names unless known special case, or decommissioned.
+      if (! &skip_fsf ($fsf_pkg) && ! exists $old_pkgs{$fsf_pkg}) {
+        $fsf_line = $fsf_pkgs{$fsf_pkg};
+        warn "$COPYRIGHT_LIST_FILE:$fsf_line: $fsf_pkg not in maintainers\n"
+          unless $nowarn;
+      }
+      next;
+    }
+    
+    if ($notfsf) {
+      delete $maint_pkgs{$fsf_pkg};
+    } else {
+      push (@ret, $fsf_pkg) if ! &skip_pkg_p ($mp);
+    }
+  }
+  
+  
+  if ($notfsf) {
+    # if not fsf, then we want everything left in (not deleted from) maint.
+    # The same few problem and non-packages to delete in this case.
+    for my $mp (keys %maint_pkgs) {
+      delete $maint_pkgs{$mp} if &skip_pkg_p ($mp);
+    }
+    push (@ret, sort keys %maint_pkgs);
+  }
+  
+  return @ret;
+
+
+  # Return 1 if we shouldn't worry about the name of this FSF assignment
+  # not being a canonical package name.
+  # 
+  sub skip_fsf {
+    my ($fsf) = @_;
+
+    my @skip_fsf = qw(
+      alloca art artwork asa
+          at crontab atrm crond makeatfile
+       autolib
+          backupfile getversion
+      banner blksize bsearch c2tex catalog cdlndir
+          cgraph dfs
+      checkaliases checker chkmalloc command configure crypto ctutorial cvs
+       cvs-utils
+      dcl debian dvc
+      ebnf2ps ecc ecos edebug egcs elisp_manual elms emacstalk enc-dec
+          ep gnust
+       etags expect
+      fcrypt fiasco file flex flymake flyspell fpr freeodbc fsflogo
+      g77 g95 gamma garlic gc gcc-testsuite gconnectfour gellmu gfortran
+       gfsd gm2 gnatdist gnoetry gnu_ocr gnulist gnussl go32 gomp grx gsmb
+       gso guile-python guppi gyve
+      initialize interp io isaac ispell
+      je
+      kaffe
+      leif lesstif lib libiberty libstdc libwv linkcontroller lynx
+      m2f mh-e mingw32 minpath misc mkinstalldirs mmalloc mpuz msort mtime
+       mtrace mule mutt myme
+      newlib newsticker nvi
+      opcodes ox
+      p2c pc pipobbs pips planner polyorb pptp profile psi publish    
+      qsort quagga
+      rcl readelf regex review riacs
+          scandir srchdir
+      send sim spim spline stm suit
+          tcl tix tk expect
+      texi2roff thethe tkwww trix tsp_solve tzset
+      udi ul uncvt unexec
+      viper web webpages win32api xemacs zlib
+    );
+    
+    my %skip_fsf;
+    @address@hidden = ();  # hash slice to make hash from list
+    
+    return exists $skip_fsf{$fsf};
+  }
+}  
+
+
+# Return the packages for which the FSF is not the copyright holder.
+# 
+sub list_copyrightfsfnot_ {
+  return list_copyrightfsf_ (1);
+}
+
+
+
+# Return copyright.list entries that don't have matching paperwork,
+# and vice versa.
+# 
+sub list_copyrightpapers_ {
+  my @ret = ();
+  my %cl_pkgs = &read_copyright_list ("by-year");
+  my %cp_pkgs = &read_copyright_papers ();
+  
+  $DEBUG = 1;
+  
+  for my $year (sort keys %cp_pkgs) {
+    my $cp_year = $cp_pkgs{$year};
+    my $cl_year = $cl_pkgs{$year};
+  &debug_hash ("cp_year $year", $cp_year);
+  &debug_hash ("cl_year $year", $cl_year);
+    last;
+  }
+  
+  return @ret;
+}
+
+
+
+# Return list of maintainers for whom we have no phone or address.
+# 
+sub list_maintainers_nophysical {
+  my @maints = ();
+  my %maints = &read_maintainers ("by-maintainer");
+
+  for my $m (sort keys %maints) {
+    my $m_ref = $maints{$m};
+    my %m = %$m_ref;
+    next if $m{"is_generic"};  # no contact info needed
+    next if $m{"address"} || $m{"phone"};  # have contact info
+    (my $packages = $m{"package"}) =~ tr/|/ /;
+    push (@maints, "$m{best_email} ($m{name} - $packages)");
+  }
+  
+  return @maints;
+}
+
+
+
+# Return all packages sorted by activity status, one package per line.
+# 
+sub list_packages_activity {
+  my @ret = ();
+
+  # sort activity statuses in this order.  If other strings are used,
+  # they'll show up first so they can be easily fixed.
+  my %activity_order = ("stale" => 1,
+                        "moribund" => 2,
+                        "ok" => 3,
+                        "stable" => 4,
+                        "subpkg" => 5,
+                        "container" => 6,
+                       );
+
+  my %pkgs = &read_gnupackages ();
+  for my $pkgname (sort by_activity keys %pkgs) {
+    my %p = %{$pkgs{$pkgname}};
+    my $activity = $p{"activity-status"};
+    push (@ret, &gnupkgs_msg ($activity, %p));
+  }
+  
+  return @ret;
+  
+  sub by_activity {
+    (my $a_status = $pkgs{$a}->{"activity-status"}) =~ s/ .*//;
+    (my $b_status = $pkgs{$b}->{"activity-status"}) =~ s/ .*//;
+    $activity_order{$a_status} <=> $activity_order{$b_status}
+    || $pkgs{$a}->{"activity-status"} cmp $pkgs{$b}->{"activity-status"}
+    || $a cmp $b;
+  }
+}
+
+
+
+# Return all packages whose GPLv3 status is not final.
+# 
+sub list_packages_gplv3 {
+  my @ret = ();
+
+  my %pkgs = &read_gnupackages ();
+  for my $pkgname (sort by_gplv3 keys %pkgs) {
+    my %p = %{$pkgs{$pkgname}};
+    my $gplv3 = $p{"gplv3-status"};
+    my $contact = $p{"last-contact"};
+    next if $gplv3 =~ /^(done|doc|not-applicable|notgpl|ok|see)/;
+    push (@ret, &gnupkgs_msg ($gplv3 . ($contact ? " [$contact]" : ""), %p));
+  }
+  
+  return @ret;
+  
+  sub by_gplv3 {
+    (my $a_status = $pkgs{$a}->{"gplv3-status"});# =~ s/ .*//;
+    (my $b_status = $pkgs{$b}->{"gplv3-status"});# =~ s/ .*//;
+    $pkgs{$a}->{"gplv3-status"} cmp $pkgs{$b}->{"gplv3-status"}
+    || $a cmp $b;
+  }
+}
+
+
+
+# Return list of packages for whom no maintainer has answered.
+# 
+sub list_packages_unanswered {
+  my @recentrel = &read_recentrel ();
+  my %activity = &read_activity ("by-package");
+  my %pkgs = &read_maintainers ("by-package");
+  my @ret = ();
+
+  for my $p (sort { lc($a) cmp lc($b) } keys %pkgs) {
+    #&debug_hash ($p, $pkgs{$p});
+
+    if (grep { $p eq $_ } @recentrel) {
+      &debug ("$p recently released, skipping");
+
+    } elsif (exists $activity{$p}) {
+      # todo: check back to some cutoff
+      &debug ("$p got activity reply, skipping");
+
+    } else {
+      &debug ("$p no activity, returning");
+      my @entries = ();
+      for my $m (@{$pkgs{$p}}) {
+        next if $m->{"is_generic"};
+        my $entry = $m->{"name"};
+        $entry .= " " if $entry;
+        $entry .= "<$m->{best_email}>" if exists $m->{"best_email"};
+        push (@entries, $entry);
+      }
+    
+      # might not be anything in @entries.
+      push (@ret, "$p - " . join (", ", @entries)) if @entries;
+    }
+  }
+  
+  return @ret;
+}
+
+
+1;

Index: spotlight.tmpl
===================================================================
RCS file: spotlight.tmpl
diff -N spotlight.tmpl
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ spotlight.tmpl      11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,38 @@
+$Id: spotlight.tmpl,v 1.1 2019/05/11 10:44:53 ineiev Exp $
+    Copyright 2015 Free Software Foundation, Inc.
+
+    Copying and distribution of this file, with or without modification,
+    are permitted in any medium without royalty provided the copyright
+    notice and this notice are preserved.
+
+Template for GNU Spotlight feature of the Free Software Supporter.
+See ./howto-spotlight.txt.
+
+---------------------------------------------------------------------
+NN new GNU releases in the last month (as of Month DD, 20YY):
+
+[[[markdown list of releases goes here]]]
+
+For announcements of most new GNU releases, subscribe to the info-gnu
+mailing list: <http://lists.gnu.org/mailman/listinfo/info-gnu>.
+
+To download: nearly all GNU software is available from
+<http://ftp.gnu.org/gnu/>, or preferably one of its mirrors from
+<http://www.gnu.org/prep/ftp.html>.  You can use the url
+<http://ftpmirror.gnu.org/> to be automatically redirected to a
+(hopefully) nearby and up-to-date mirror.
+
+This month, we welcome [[[list from activity-report.txt]]].
+
+A number of GNU packages, as well as the GNU operating system as a
+whole, are looking for maintainers and other assistance: please see
+<http://www.gnu.org/server/takeaction.html#unmaint> if you'd like to
+help.  The general page on how to help GNU is at
+<http://www.gnu.org/help/help.html>.
+
+If you have a working or partly working program that you'd like
+to offer to the GNU project as a GNU package, see
+<http://www.gnu.org/help/evaluation.html>.
+
+As always, please feel free to write to us at <address@hidden>,
+with any GNUish questions or suggestions for future installments.

Index: massmail-1305-stale.txt
===================================================================
RCS file: massmail-1305-stale.txt
diff -N massmail-1305-stale.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ massmail-1305-stale.txt     11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,40 @@
+From: address@hidden (GNU Project)
+To: %PACKAGE_MAINTAINERS
+Bcc: address@hidden
+Subject: release of GNU %PACKAGE_NAME
+Reply-to: address@hidden
+
+Greetings,
+
+We're sending you this message on behalf of the GNU Project because as
+far as we know, you are the maintainer(s) of %PACKAGE_NAME.  (If you're
+not maintaining it, please just reply to let us know.)
+
+As far as we've been able to discern, %PACKAGE_NAME 
+has gone several years without a new (official) release.  If you have in
+fact made a recent release, please let us know, and sorry for the noise.
+We could not determine the status with absolute certainty.
+
+Otherwise ... it has always been a basic goal of GNU that its
+constituent packages be actively developed and have releases from time
+to time.  Without a release, we periodically ping the maintainer(s) to see
+how things are going.  So, could you please reply to this message with a
+response to the following questions?  Please include all and any
+relevant information, better too much than too little.
+
+1) Can you estimate, even roughly, when a new release will be made?
+
+2) Have you been able to make progress (fixing bugs, updating
+infrastructure, adding features, ...) since the last release, or since
+our last contact with you?
+
+3) Are there technical, legal, or other barriers to making a release?
+We'd like to help if we can.
+
+4) Other comments?
+
+In general, if you have any news or questions regarding the package,
+please let us know at address@hidden  Thanks for contributing to
+GNU, and happy hacking.
+
+Brandon & Karl (GNUisances)

Index: oldpackages.txt
===================================================================
RCS file: oldpackages.txt
diff -N oldpackages.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ oldpackages.txt     11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,482 @@
+# $Id: oldpackages.txt,v 1.1 2019/05/11 10:44:53 ineiev Exp $
+# Public domain.
+# 
+# This file is maintained in the CVS repository of GNU womb,
+# http://cvs.savannah.gnu.org/viewvc/gnumaint/?root=womb
+#
+# This file records information and the old gnupackages entries for
+# packages which we have decommissioned.
+# 
+# There is nothing private in this file.
+
+package: cobol
+copyright-holder: fsf-no-reply
+doc-category: Software
+doc-summary: COBOL for GCC
+doc-url: none
+download-url: http://sourceforge.net/project/showfiles.php?group_id=5709
+gplv3-status: next-release
+activity-status: moribund 20000812 (0.1.2)
+last-contact: 26oct08 replied
+note: dedicated maintainer, but will not be able to resume full-time work
+note: for 4-5 years (after 6 months full-time work).  But it's a Cobol
+note: compiler, hardly likely to find other implementors, and lots and lots
+note: of work has been done.  Mail from tej, 26 Oct 2008 12:42:10 +1100.
+
+package: libreboot
+copyright-holder: notfsf
+logo: https://libreboot.org/logo/logo.png
+language: shell,c
+doc-category: Sysadmin
+doc-summary: A free BIOS/UEFI replacement
+doc-url: none
+gplv3-status: ok
+activity-status: newpkg 20160514
+
+package: dmd
+copyright-holder: fsf-no-reply-individual-name-in-files
+doc-category: Sysadmin
+doc-summary: Daemon managing daemons
+doc-url: none
+gplv3-status: not-done-in-0.5
+download_url: http://www.wt-lorsch.de/dmd--0.5.tar.gz
+activity-status: newmaint/20130925 2003 (0.5)
+gone: 17jan16 per maintainer: renamed to shepherd
+
+package: sovix
+copyright-holder: notfsf
+doc-category: Web
+doc-summary: Emacs-like website revision system
+doc-url: none
+gplv3-status: done-in-0.0.1.5 (agplv3)
+activity-status: stale 20081215 (0.0.1.7)
+gone: 12mar15 per englund; maintainer long since took it from GNU
+
+package: myserver
+copyright-holder: fsf-ok-with-dependencies-libxml-libevent-#786724
+language: c++
+logo: /software/myserver/logo.png
+doc-category: Internet
+doc-summary: Multi-threaded web server
+doc-url: none
+gplv3-status: done-as-of-0.9.2
+activity-status: ok 20110716 (0.11)
+note: doc-url was htmlxref, but gone now, author working 11mar12
+gone: 14mar14 per maintainer
+
+package: fcrypt
+copyright-holder: fsf-ok-#786630
+doc-category: Sysadmin
+doc-summary: on-the-fly encrypted filesystems, including secret partitions
+doc-url: none
+gplv3-status: should-be-ok
+activity-status: newpkg/20121106
+gone: 5oct13 strange behavior by maintainer
+
+package: xhippo
+doc_category: Audio
+doc_summary: Generic playlist manager program
+doc_url: none
+blurb_id: xhippo_blurb
+gplv3_status: done-in-3.5
+last_release: 3.5
+last_release_date: 20070827
+activity_status: stable
+last_activity: 20070827
+gone: 20jan19 per request from rms
+
+package: w3
+copyright-holder: fsf-no-reply
+doc-category: Internet
+doc-summary: Web browser written entirely in Emacs Lisp
+doc-url: none
+gplv3-status: not-done-since-stale
+activity-status: stale no-release
+gone: now http://elpa.gnu.org/packages/w3.html
+
+package: dismal
+copyright-holder: fsf-no-reply
+doc-category: Spreadsheets
+doc-summary: Emacs spreadsheet mode
+doc-url: none
+download-url: http://acs.ist.psu.edu/dismal/
+gplv3-status: working (gnumaint-reply 22 Aug 2007 01:16:36)
+activity-status: nomaint/20130528 19971204 (1.4)
+note: copyright.list says fsf, but actual copyrights don't
+note: http://acs.ist.psu.edu/dismal/dismal-1.4.tar.gz
+last-contact: 25jan11 replied soon, 17nov10, 29oct08 asked
+gone: 9aug13, now http://elpa.gnu.org/packages/dismal.html (M-x list-packages)
+
+package: gnu-arch
+mundane-name: Arch
+copyright-holder: notfsf-#786554
+doc-category: Version
+doc-summary: Distributed version control system
+doc-url: htmlxref
+logo: /software/gnu-arch/graphics/octopus-a-small.png
+gplv3-status: decommissioning-since-no-changes (atai 17 Dec 2007 10:00:18 
-0800)
+activity-status: stale 20060720 (1.3.5)
+last-contact: 1jul12 asked, 10oct11,2dec08 replied
+gone: 29may13, inaction, have bazaar
+
+package: jdresolve
+language: perl
+doc-category: Internet
+doc-summary: Fast, recursive DNS name resolver for log files
+doc-url: none
+gplv3-status: not-done-since-stale
+activity-status: stale no-release
+gone: 22may13, vaporware
+
+package: phpgroupware
+mundane-name: phpGroupWare
+copyright-holder: fsf-no-reply
+logo: http://www.phpgroupware.org/templates/new/images/logo.png
+doc-category: Business
+doc-summary: Multi-user groupware suite
+doc-url: none
+download-url: http://sourceforge.net/projects/phpgroupware/files/phpgroupware/
+gplv3-status: in-dev-sources-maybe
+activity-status: newmaint/20091110 20100707 (0.9.16.017)
+gone: 22may13, inaction, hardly ever GNU
+
+package: gmorph
+doc-category: Graphics
+doc-summary: Image morphing program
+doc-url: none
+#download-url-of-xmorph: 
http://sourceforge.net/project/showfiles.php?group_id=11808
+gplv3-status: not-done-since-stale
+activity-status: newmaint/20100106 20060817 (20060817)
+last-contact: 16feb13 asked, 24jan12 replied to jmd but doing nothing, 4jan11 
asked
+note: renamed from xmorph, which continues to be non-GNU.
+gone: 22may13, inaction, still have xmorph
+
+package: gnuskies
+doc-category: Science
+doc-summary: Stargazing
+doc-url: none
+gplv3-status: not-done-since-no-release
+activity-status: nomaint/10apr13 no-release
+last-contact: 20mar13 brandon asked, 24jun09 asked, 2011 copyright finally done
+gone: 13apr13, never anything done, have celestia, per maintainer and rms
+
+package: vmslib
+doc-category: Software
+doc-summary: Help porting GNU software to VMS
+doc-url: none
+gplv3-status: not-done-since-nomaint
+activity-status: newmaint/20110707 (1996)
+gone: 28mar13, too stale and have GNV, per maintainer and rms
+
+package: packaging
+copyright-holder: fsf-no-reply
+doc-category: Software
+doc-summary: Packaging for GNU
+doc-url: none
+logo: /software/packaging/packaging.png
+gplv3-status: not-done-since-mia
+activity-status: stale no-release
+gone: 28mar13, too stale and have guix and gsrc, per maintainer and rms
+
+package: aetherspace
+doc-category: Games
+doc-summary: Massively multiplayer online (MMO) game
+doc-url: none
+gplv3-status: in-dev-sources (18jun08) # stated on web pages too
+activity-status: stale no-release
+last-contact: 20mar13 brandon asked, 12nov10 asked, 14dec09 replied, "spring 
2010"
+gone: 24mar13, nonexistent, per maintainer and rms
+
+package: sourceinstall
+copyright-holder: fsf-no-reply
+doc-category: Sysadmin
+doc-summary: Managing distribution sources as packages
+doc-url: /software/sourceinstall/manual/
+gplv3-status: done-in-2.5rc1 (11may08)
+activity-status: ok 20080719 (2.5)
+gone: 19mar13, gsrc + guix do the job, per maintainer and rms
+
+package: guile-gtk
+copyright-holder: fsf-no-reply
+doc-category: Libraries
+doc-summary: Guile bindings to GTK libraries
+doc-url: htmlxref
+gplv3-status: done-as-of-2.1
+activity-status: ok 20071230 (2.1)
+gone: 10mar13, replaced by guile-gnome, per maintainer and rms
+
+package: paperclips
+logo: /software/paperclips/Paperclips-GNU-small.jpg
+language: java
+doc-category: Internet
+doc-summary: Java Servlet engine with EEP! template language support
+doc-url: none
+gplv3-status: not-done-since-no-release
+activity-status: stale no-release
+last-contact: 11feb13 asked, 3mar10 asked
+gone: 13feb13, never any release, per maintainer and rms
+
+package: snakecharmer
+doc-category: Graphics
+doc-summary: Image finding with GNU GIFT
+doc-url: none
+gplv3-status: not-done-since-nomaint
+activity-status: nomaint
+last-contact: see gift
+gone: 9feb13, never any release, no volunteers, raw sources on web page
+
+package: vc-changelog
+doc-category: Version
+doc-summary: ChangeLog management especially with distributed version control
+doc-url: none
+gplv3-status: in-dev-sources
+activity-status: new 19aug10
+gone: 1feb13, no active developers, never any release, can be under vc-dwim
+
+package: dotgnu
+mundane-name: DotGNU
+doc-category: Software
+doc-summary: Web services and C#
+doc-url: none
+gplv3-status: ok-since-container
+activity-status: container for-dotgnu-pnet-etc.
+gone: 18dec12, no development
+
+package: dotgnu-forum
+doc-category: Internet
+doc-summary: Web site revision system for DotGNU
+doc-url: none
+gplv3-status: not-done-since-stale
+activity-status: nomaint
+note: copyright.list seems clear
+gone: 18dec12, no development
+
+package: dotgnu-pnet
+copyright-holder: notfsf
+doc-category: Software
+doc-summary: DotGNU Portable.NET support for .NET applications
+doc-url: http://dotgnu.org/pnetlib-doc/index.html
+download-url: ftp://ftp.gnu.org/gnu/dotgnu/
+gplv3-status: not-done-in-0.1.2
+activity-status: ok 20070308 (0.8, libjit-0.1.2/20081210)
+gone: 18dec12, no development
+
+package: gnu-queue
+mundane-name: Queue
+copyright-holder: address@hidden and other authors
+doc-category: Sysadmin
+doc-summary: Allocate jobs to nodes in a cluster
+doc-url: none
+gplv3-status: under-discussion partly at GPLv1, but should be updatable
+activity-status: nomaint 20001101 (1.30.1)
+gone: 11aug12, parallel does the job
+
+package: goldwater
+doc-category: Business
+doc-summary: Middleware server
+doc-url: none
+gplv3-status: not-done-since-dotgnu-nomaint
+activity-status: nomaint
+last-contact: 31jan10 replied
+note: cvs -d:pserver:address@hidden:/sources/dgee co goldwater
+note: download-url: ftp.gnu.org:gnu/dotgnu -- taken offline, though
+gone: 11aug12
+
+package: goodbye
+doc-category: Software
+doc-summary: Kiosk management
+doc-url: none
+gplv3-status: not-done-since-no-release
+activity-status: stale no-release
+gone: 25jul12, per rms on gnu-prog-discuss
+
+package: aeneas
+doc-category: Science
+doc-summary: Design and simulation of submicron semiconductor devices
+doc-url: /software/aeneas/#documentation
+gplv3-status: done-in-1.2 (14jul08)
+activity-status: ok 20080714
+gone: 13may12, subsumed into archimedes
+
+package: sxml
+download-url: http://medialab.di.unipi.it/Project/SXML/resources.html
+doc-category: Web
+doc-summary: Simple XML for defining and implementing markup languages
+doc-url: none
+gplv3-status: not-done-since-stale
+activity-status: nomaint 20010829 (0.96)
+last-contact: 14nov10 stepped down
+gone: 12may12, replaced by xmlat
+
+package: proto
+copyright-holder: confused
+note: copyright.list says fsf, sources don't
+doc-category: Software
+doc-summary: Find prototypes in header files
+doc-url: none
+download-url: http://www.oualline.com/sw/
+gplv3-status: done-since-public-domain
+activity-status: stale 1996
+last-contact: 3mar11 to rms, 14mar10 replied, no plans to work on it
+gone: 19mar11, maintainer not interested, rms ok with decommissioning it
+
+package: libiberty
+copyright-holder: fsf
+gplv3-status: under-discussion
+activity-status: ok released-in-combination
+gone: 2dec10, redundant with gcc
+
+package: gnotary
+mundane-name: GNotary
+doc-category: Business
+doc-summary: Digitally sign electronic health records
+doc-url: none
+gplv3-status: not-done-since-stale
+activity-status: stale 20050827 (0.1.rc1)
+last-contact: see gnumed
+gone: 28nov10 never got off the ground, maintainers have no time for it
+
+package: songanizer
+copyright-holder: fsf
+doc-category: Audio
+doc-summary: Organize collections of audio files
+doc-url: none
+gplv3-status: not-done-in-1.0
+activity-status: stale 20070326 (1.0)
+last-contact: 19nov10 wrote, 10feb09 wrote
+gone: 22nov10 maintainer resigned, never caught on
+
+package: dictionary
+download-url: ftp://ftp.gnu.org/gnu/gcide
+gplv3-status: not-done-since-moribund
+activity-status: moribund-will-merge-into-gcide 200201 (0.46)
+last-contact: 21jun10 replied
+note: renamed to/from gcide
+note: gray will make an interface and spruce it up as part of dico.
+gone: 17nov10 no need to be separate from dico
+
+package: beacon
+gplv3-status: not-done-since-no-release
+activity-status: stale nonesuch
+last-contact: see aroundme
+gone: 14nov10 like aroundme, but never existed
+
+package: aroundme
+mundane-name: AROUNDMe
+download-url: http://www.barnraiser.org/aroundme/
+doc-category: Web
+gplv3-status: done-in-aroundme_pi_20080116a
+activity-status: ok 20080327
+last-contact: 200808 wrote author, working
+gone: 14nov10, discovered resignation
+
+package: libopts
+gplv3-status: not-done-in-27.6
+activity-status: stale 20070127 (27.6)
+last-contact: 15feb10 wrote
+gone: 9nov10, effectively part of autogen, unused on its own.
+
+package: zebra
+download-url: ftp://ftp.zebra.org/pub/zebra/
+logo: http://www.zebra.org/zebralogo.jpg
+gplv3-status: not-done-since-stale
+activity-status: stale 20050908 (0.95a) # 10feb10 wrote
+note: 18dec09 quagga unlikely replacement, some developers anti-gplv3.
+note: see also http://www.zebra.org
+gone: 8nov10, maintainer disappeared for years, quagga fork is active.
+
+package: isofsmk
+gplv3-status: not-done-in-1.11.3
+activity-status: ok 20100108 (1.13)
+gone: 8jul10 per author, replaced by xorriso.
+
+package: toutdoux
+doc-url: http://www.gnu.org/software/toutdoux/en/documentation.html
+gone: 20apr09 per author.
+
+package: octal
+doc-url: http://www.gnu.org/software/octal/ox_api_main/
+gone: 9apr09 per author.
+
+package: abcsh
+gone: per author, #332187.
+
+package: gnufi
+gone: 13feb10
+
+package: cons
+gone: 3jan10
+
+package: radar
+gone: 13oct08
+
+package: recode
+gone: 13oct08
+
+package: balsa
+gone: 4mar08
+
+package: hydrant
+gone: 18feb08
+
+package: cfs-el
+gone: 31aug07 or so
+
+package: music
+gone: 28aug07
+
+package: mana
+gone: 17aug07
+
+package: leonardo
+gone: 12may07
+
+package: hegemonie
+gone: 29mar07
+
+package: gnusql
+gone: 16mar06
+
+package: free
+gone: 25oct02
+
+package: dld
+gone: 11jul01 or so
+
+package: rx
+gone: long ago
+
+package: doschk
+gone: always nongnu
+
+package: emacs-wiki
+gone: never dubbed
+
+package: adhoc
+gone: never dubbed
+
+package: fileutils
+gone: long ago merged into coreutils
+
+package: textutils
+gone: long ago merged into coreutils
+
+package: sh-utils
+gone: long ago merged into coreutils
+
+package: finger
+gone: long ago merged into inetutils
+
+package: gfe
+gone: long ago
+
+package: gts
+mundane-name: G Transaction Server (?)
+gone: long ago
+note: Todd Lewis
+note: http://archives.postgresql.org/pgsql-hackers/1999-03/msg00200.php
+
+package: winboard
+gone: part of xboard
+
+# End. (Do not remove this line or the blank line before it.  Thanks.)

Index: tpost-need.html
===================================================================
RCS file: tpost-need.html
diff -N tpost-need.html
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ tpost-need.html     11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,8 @@
+<!-- blurb to put on the web pages of packages that need maintainers. -->
+     
+<hr><p>GNU XXX is looking for a maintainer.
+If you're interested, please take a look at this <a
+href="/help/evaluation.html#whatmeans">general information about GNU
+packages and being a GNU maintainer</a>, and then email
address@hidden with a bit about your background and particular
+interest in this package.  Thanks.</p><hr>

Index: doc-categories.txt
===================================================================
RCS file: doc-categories.txt
diff -N doc-categories.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ doc-categories.txt  11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,41 @@
+# $Id: doc-categories.txt,v 1.1 2019/05/11 10:44:53 ineiev Exp $
+# Public domain.
+# Map doc-category identifiers in gnupackages.txt to the actual category
+# names used in the Free Software Directory (http://directory.fsf.org),
+# so we can use the latter in generated web pages, such as
+# http://www.gnu.org/manual.
+# Texinfo @dircategory names should also use the third column (full
+# name) when it's present.
+Archiving      -
+Audio          aud
+Business       prod    Business and productivity
+Database       db
+Dictionaries   dict
+Education      educ
+Email          email
+Editors                editors
+Fonts          fonts
+Games          games
+Graphics       graph
+Health         health
+Hobbies                hobbies
+Interface      iface
+Internet       net     Internet applications
+Libraries      libs    Software libraries
+Live           lc      Live communications
+Localization   local
+Mathematics    math
+Music          music
+Printing       print
+Science                science
+Security       sec
+Software       dev     Software development
+Spreadsheets   ssheet
+Sysadmin       admin   System administration
+Telephony      tel
+Text           text    Text creation and manipulation
+Translation    dtrans  Documentation translation
+Version                vc      Version control
+Video          video
+Web            web     Web authoring
+gnuorg         -       GNU organization

Index: massmail-1503-stale.txt
===================================================================
RCS file: massmail-1503-stale.txt
diff -N massmail-1503-stale.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ massmail-1503-stale.txt     11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,47 @@
+From: address@hidden (GNU Project)
+To: %PACKAGE_MAINTAINERS
+Bcc: address@hidden
+Subject: release of GNU %PACKAGE_NAME
+
+Greetings,
+
+We're sending you this message on behalf of the GNU Project because as
+far as we know, you are the maintainer(s) of %PACKAGE_NAME.  (If you're
+not maintaining it, please just reply to let us know.)
+
+As far as we've been able to discern, %PACKAGE_NAME 
+has gone several years without a new (official) release.  If you have in
+fact made a recent release, please let us know, and sorry for the noise.
+We could not determine the status with absolute certainty.  Please
+note that the best ways for us to be aware of your releases are making
+the release available on ftp.gnu.org and making release announcements
+via address@hidden and your Savannah project's "News" section (which
+shows up on the Planet GNU RSS feed).
+
+Otherwise ... it has always been a basic goal of GNU that its
+constituent packages be actively developed and have releases from time
+to time.  Without a release, we periodically ping the maintainer(s) to see
+how things are going.  So, could you please reply to this message with a
+response to the following questions?  Please include all and any
+relevant information, better too much than too little.
+
+1) Can you estimate, even roughly, when a new release will be made?
+
+2) Have you been able to make progress (fixing bugs, updating
+infrastructure, adding features, ...) since the last release, or since
+our last contact with you?
+
+3) Are there technical, legal, or other barriers to making a release?
+We'd like to help if we can.
+
+3b) Do you have any difficulties in making your package work with
+other GNU packages or are there any bugs in other GNU packages that
+affect your software?
+
+4) Other comments?
+
+In general, if you have any news or questions regarding the package,
+please let us know at address@hidden  Thanks for contributing to
+GNU, and happy hacking.
+
+Brandon & Karl (GNUisances)

Index: howto-commission.txt
===================================================================
RCS file: howto-commission.txt
diff -N howto-commission.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ howto-commission.txt        11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,76 @@
+$Id: howto-commission.txt,v 1.1 2019/05/11 10:44:53 ineiev Exp $
+    Copyright 2015 Free Software Foundation, Inc.
+
+    Copying and distribution of this file, with or without modification,
+    are permitted in any medium without royalty provided the copyright
+    notice and this notice are preserved.
+
+Notes on what an "assistant GNUisance" needs to do when a new package is
+officially dubbed.  Only rms can dub a new package; he sends mail to
address@hidden (which all and only such assistants should be on), and
+other recipients.
+
+When a replacement or co-maintainer for an existing package is dubbed,
+most of the below is unnecessary: just add the person to
+gnu-prog[-discuss] (item 1), and to the maintainers file (item 4), and
+send them the post-dubbing message (item 10).
+
+1. Add the new maintainer to gnu-prog, gnu-prog-discuss, and
+gnu-community-private right away, as stated at the end of the dubbing
+message.
+https://lists.gnu.org/mailman/admin/gnu-prog/members/add
+https://lists.gnu.org/mailman/admin/gnu-prog-discuss/members/add
+https://lists.gnu.org/mailman/admin/gnu-community-private/members/add
+
+2. Sometimes the package identifier is not completely clear from rms's
+message, especially if it has not gone through the normal evaluation
+process.  The identifier should be all lowercase (no exceptions!), no
+spaces, not start with "gnu" unless there is good reason for it, and be
+reasonably descriptive and unique in the universe of free software (at
+least).  The identifier is the common key linking the package in many
+disparate places, so it is worth a little time and discussion with the
+new maintainer if need be to make it good.  rms does not generally need
+to be involved in that detail.
+
+3. A package can have a "mundane name" that includes spaces, capitals,
+etc.  Sometimes that dispels fears the new maintainer might have.
+
+4. Once the package identifier is settled, things can proceed.  Add the
+new maintainer to /gd/gnuorg/maintainers, with the new package name.
+See /gd/gnuorg/README for editing specifics.  Update activity-report.txt
+at the same time, as described in that README.
+
+5. In womb/gnumaint, add the entry to rec/gnupackages.rec.  The only entries
+likely to require some thought are the doc-category and doc-summary.
+It can always be fixed later, but usually isn't, so it's worth thinking
+about.  Whatever else, do not commit a placeholder or other fake
+entries, since it will get propagated to www.gnu.org below.  The doc-url
+will typically be "none" for a new package.
+
+6. Also in womb/gnumaint, add an entry to rec/pkgblurbs.rec.  Here it can
+be a three-line placeholder:
+ id: newpkgid_blurb
+ package: newpkgid
+ blurb: null (newpkg/YYYYMMDD)
+We'll ask the new maintainer for a blurb in the post email, below.
+
+7. Items 5 and 6 should be done right away, as otherwise consistency
+checks will start to fail (as soon as /gd/gnuorg/maintainers is
+updated).  Commit these changes.
+
+8. Regenerate the allgnupkgs.html et al. web page includes here:
+  make gnupackages.txt
+  make html-update # writes into www checkout at ${gw}
+  make html-diff   # cvs diff of the generated files
+  cd $gw && cvs commit ...
+It's important to do the diff and actually look at the output, to ensure
+both that the files have not been hand-edited on the www side, and that
+the generation actually did what is expected.
+
+9. The savannah people should ensure that the new package is marked gnu,
+if it already exists on savannah, or accept it.  And for
+replacement/co-maintainers, they should ensure that the new person is
+made an admin of the package, if it exists.
+
+10. Send the post-appointment email from the template temail-4post.txt,
+suitably edited.

Index: gnufsd
===================================================================
RCS file: gnufsd
diff -N gnufsd
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gnufsd      11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,84 @@
+#!/usr/bin/env perl
+# $Id: gnufsd,v 1.1 2019/05/11 10:44:53 ineiev Exp $
+# Extract information about GNU packages from the Free Software Directory.
+
+$DIRDIR = "$ENV{HOME}/gnu/src/directory/";
+exit (&main ());
+
+sub main
+{
+  my %opt;
+  if ($ARGV[0] eq "byname") {
+    $opt{"packages_by_name"} = 1;
+  } elsif ($ARGV[0] eq "bylicense") {
+    $opt{"packages_by_license"} = 1;
+  }
+
+  # what we extract.  should read and return a hash, etc.  no need yet.
+  my %licenses;
+  my @packages;
+  
+  chdir ($DIRDIR) || die "chdir($DIRDIR) failed: $!";
+  opendir (DIR, ".") || die "opendir($DIRDIR) failed: $!";
+  while (my $dirent = readdir (DIR)) {
+    next if $dirent =~ /^(\.\.?|CVS|README)$/;  # ignore . .. CVS README
+
+    open (DIRENT, $dirent) || die "open($dirent) failed: $!";
+
+    my %fsd_entry;
+    
+    while (<DIRENT>) {
+      if (/^%%license:/) {
+        $fsd_entry{"license"} = $_;
+
+#      } elsif (/^%%name:/) {
+#        (undef,$xdirent) = split (" ", $_, 2);
+#      }
+      
+      } elsif (/^%%GNU:/) {
+        s/\s*\n$//;
+        my (undef,$val) = split;
+        $fsd_entry{"gnu"} = $val =~ /yes/i;
+      }
+    }
+    close (DIRENT) || warn "close($dirent) failed: $!";
+    
+    next unless $fsd_entry{"gnu"};  # if nongnu, forget it.
+    (my $pkg = $dirent) =~ s/\.txt$//;
+    
+    if ($opt{"packages_by_name"}) {
+      push (@packages, $pkg);
+    }
+
+    if ($opt{"packages_by_license"}) {
+      # save this package under all the licenses we've got.
+      $fsd_entry{"license"} =~ s/\s*\n$//;
+      my (undef,$license) = split (" ", $fsd_entry{"license"}, 2);
+      $license =~ s/ +and +/, /;
+      my @licenses = split (/ *[,;] */, $license);
+      # warn "$dirent: split $license into @licenses\n";
+
+      for my $l (@licenses) {
+        $licenses{$l} .= " $pkg";
+      }
+    }
+  }
+
+  closedir (DIR) || warn "closedir(dir) failed: $!";
+  
+  if ($opt{"packages_by_name"}) {
+    print map { "$_\n"} sort @packages;
+  }
+  
+  if ($opt{"packages_by_license"}) {
+    for my $k (sort keys %licenses) {
+      my $pkglist = $licenses{$k};
+      my @pkglist = split (" ", $pkglist);
+      print "$k: ";
+      print join (" ", sort @pkglist);
+      print "\n";
+    }
+  }
+  
+  return 0;
+}

Index: testaddrcase.msg
===================================================================
RCS file: testaddrcase.msg
diff -N testaddrcase.msg
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ testaddrcase.msg    11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,14 @@
+From address@hidden Sun Feb 11 14:48:08 2007
+Return-path: <address@hidden>
+Envelope-to: address@hidden
+Delivery-date: Sun, 11 Feb 2007 14:48:08 -0500
+Received: from karl by fencepost.gnu.org with local (Exim 4.60)
+       (envelope-from <address@hidden>)
+       id 1HGKgC-0000P9-M8
+       for address@hidden; Sun, 11 Feb 2007 14:48:08 -0500
+To: address@hidden
+Message-Id: <address@hidden>
+From: address@hidden
+Date: Sun, 11 Feb 2007 14:48:08 -0500
+Subject: GNU package maintenance
+

Index: README
===================================================================
RCS file: README
diff -N README
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ README      11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,36 @@
+Copyright 2013 Free Software Foundation, Inc.
+
+  Copying and distribution of this file, with or without modification,
+  are permitted in any medium without royalty provided the copyright
+  notice and this notice are preserved.
+
+The gm script is about performing various GNU maintainer/package
+operations.  Run gm --help for a list.  What's been done is what has
+been needed in practice, rather than any kind of theoretical list of
+what might be useful.
+
+gm combines information from several files.  The most important are
+./gnupackages.txt (maintained in the CVS here, can be updated whenever
+and by whomever) and the fp:/gd/gnuorg/maintainers (maintained on
+fencepost, in RCS, and should only be modified if you have explicit
+permission from rms to do so).
+
+For a list of all the files needed to do the various jobs, see the
+variables given at the top the gm file.  You yourself need to set up
+symlinks to them as needed, and arrange your own cron jobs (or whatever)
+to ensure your versions stay current.
+
+Perhaps the most frequent operation is updating the allgnupkgs.html on
+www.gnu.org.  If you set the envvar gw to the path of your www checkout,
+running make update-html will do this.  (It is just running three "gm
+generate" invocations, no magic involved, so go ahead and do it
+individually as needed.)
+
+The Makefile has a variety of other current and historical tasks, so
+it is good to peruse it, adapt it, update it.
+
+Happy maintaining.
+
+P.S. The gnumaint script was a first attempt at this job, dealing with
+the first mass email we did, ca.2007; see gnumaint.README.
+

Index: fsd/Makefile
===================================================================
RCS file: fsd/Makefile
diff -N fsd/Makefile
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ fsd/Makefile        11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,32 @@
+SHELL = /bin/sh
+TEXI2DVI = texi2dvi
+TEXI2PDF = texi2pdf
+MAKEINFO = makeinfo
+
+A4_FLAGS = -t @afourpaper
+LETTER_FLAGS =
+
+.PHONY: clean info all
+
+all: info
+
+info: fsd-schema.info
+
+fsd-schema.info: fsd-schema.texi
+       $(MAKEINFO) $<
+
+clean:
+       rm -f *.aux
+       rm -f *.cp
+       rm -f *.cps
+       rm -f *.dvi
+       rm -f *.fn
+       rm -f *.info
+       rm -f *.ky
+       rm -f *.log
+       rm -f *.pdf
+       rm -f *.pg
+       rm -f *.toc
+       rm -f *.tp
+       rm -f *.vr
+       rm -f fsd-schema.txt

Index: fsd/.cvsignore
===================================================================
RCS file: fsd/.cvsignore
diff -N fsd/.cvsignore
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ fsd/.cvsignore      11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,5 @@
+fsddb
+fsddb.tgz
+quaggasql
+sock
+README*

Index: fsd/gnufsd-psql
===================================================================
RCS file: fsd/gnufsd-psql
diff -N fsd/gnufsd-psql
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ fsd/gnufsd-psql     11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,561 @@
+#!/usr/bin/env perl
+# $Id: gnufsd-psql,v 1.1 2019/05/11 10:44:53 ineiev Exp $
+# Extract information about GNU packages from the Free Software
+# Directory's PostgreSQL database.
+#
+# Dependencies:
+#   perl (5.8.x), libdbd-pg-perl, libdate-calc-perl
+
+use warnings;
+use strict;
+use DBI;
+use Date::Calc qw ( check_date Delta_Days Add_Delta_YMD Today );
+use File::Temp qw ( tmpnam );
+
+# Configuration:
+# ==============================
+# Database connection settings:
+my $dbname = "quagga";
+my $username = "django";
+my $password = "";
+
+# `activity-status' calculation:
+my @activity_interval = (-1, 0, 0); # One year ago (Y, M, D)
+my @activity_reference = Today ();
+#===============================
+
+my @activity_threshold = Add_Delta_YMD (@activity_reference,
+                                       @activity_interval);
+
+# FIXME: What about handling UTF-8 from PostgreSQL?
+
+my ($dbh, $sth_homepage, $sth_download_url, $sth_activity_status,
+    $sth_computer_languages, $sth_subprograms, $sth_categories,
+    $sth_category, $sth_keywords, $sth_related, $sth_versions,
+    $sth_licenses, $sth_interfaces);
+
+my %user_level_enum = (
+  0 => "unknown",
+  1 => "beginner",
+  2 => "intermediate",
+  3 => "advanced");
+
+my %version_status_enum = (
+  2 => "alpha",
+  3 => "beta",
+  4 => "developmental",
+  5 => "testing",
+  6 => "unstable",
+  7 => "stable",
+  8 => "mature");
+
+exit (&main ());
+
+# Connect to the database and prepare all reusable statements in
+# advance.
+sub db_connect ()
+{
+  $dbh = DBI->connect ("dbi:Pg:dbname=$dbname",
+                      $username,
+                      $password,
+                      {AutoCommit => 0,
+                       PrintError => 1,
+                       RaiseError => 1});
+
+  $dbh->do ("SET datestyle TO ISO;"); # YYYY-MM-DD
+
+  $sth_homepage = $dbh->prepare (
+    "SELECT link FROM directory_projectwebresource
+     WHERE audience = 5 AND kind = 5 AND project_id = ?;");
+
+  $sth_download_url = $dbh->prepare (
+    "SELECT link FROM directory_projectwebresource
+     WHERE kind = 11 AND project_id = ? ORDER BY audience DESC;");
+
+  $sth_activity_status = $dbh->prepare (
+    "SELECT name, date FROM directory_version
+     WHERE project_id = ? ORDER BY date DESC;");
+
+  $sth_computer_languages = $dbh->prepare (
+    "SELECT l.name
+     FROM directory_computerlanguage l, directory_project_computer_languages p
+     WHERE l.id = p.computerlanguage_id AND p.project_id = ?
+     ORDER BY l.name ASC;");
+
+  $sth_subprograms = $dbh->prepare (
+    "SELECT name FROM directory_subprogram
+     WHERE project_id = ?
+     ORDER BY name;");
+
+  $sth_categories = $dbh->prepare (
+    "SELECT category_id FROM directory_project_categories
+     WHERE project_id = ?;");
+
+  $sth_category = $dbh->prepare (
+    "SELECT name, slug, parent_category_id  FROM directory_category
+     WHERE id = ?;");
+
+  $sth_keywords = $dbh->prepare (
+    "SELECT k.keyword
+     FROM directory_keyword k, directory_project_keywords p
+     WHERE p.keyword_id = k.id AND p.project_id = ?
+     ORDER BY k.keyword ASC;");
+
+  $sth_related = $dbh->prepare (
+    "SELECT p.slug
+     FROM directory_project p, directory_project_related r
+     WHERE r.to_project_id = p.id AND r.from_project_id = ?
+     ORDER BY p.slug ASC;");
+
+  $sth_versions = $dbh->prepare (
+    "SELECT v.id, v.name, v.date, v.status, v.notes,
+       u.first_name || ' ' || u.last_name || ' <' || u.email || '>'
+         AS license_verified_by,
+       v.license_verified_on, v.source_code
+     FROM directory_version AS v, auth_user AS u
+     WHERE v.license_verified_by_id = u.id AND v.project_id = ?
+     ORDER BY v.date DESC;");
+
+  $sth_licenses = $dbh->prepare (
+    "SELECT l.slug
+     FROM directory_license AS l, directory_version_licenses AS vl
+     WHERE l.id = vl.license_id AND vl.version_id = ?
+     ORDER BY slug;");
+
+  $sth_interfaces = $dbh->prepare (
+    "SELECT i.name
+     FROM directory_interface AS i, directory_version_interfaces AS vi
+     WHERE i.id = vi.interface_id AND vi.version_id = ?
+     ORDER BY name;");
+}
+
+# Disconnect from the database.
+sub db_disconnect ()
+{
+  $dbh->disconnect ();
+}
+
+# Trim the useless whitespace that sometimes surrounds the values in
+# the database.
+# FIXME: What about collapsing internal whitespace?
+sub trim_whitespace
+{
+  my ($input) = @_;
+  return $input if ! defined $input;
+
+  my $type = ref ($input);
+  if ($type eq "SCALAR") {
+    return $input if ! defined $$input;
+    $$input =~ s/^\s+//; # leading whitespace
+    $$input =~ s/\s+$//; # trailing whitespace
+    $$input =~ s/\r//g; # delete all carriage returns
+  }
+  elsif ($type eq "HASH") {
+    trim_whitespace (\$_) foreach (values %$input);
+  }
+  elsif ($type eq "ARRAY") {
+    for my $row (@$input) {
+      trim_whitespace (\$_) foreach (values %$row);
+    }
+  }
+  else {
+    die "Don't know how to trim input '$input' of type '$type'!";
+  }
+  return $input;
+}
+
+# Fetch all rows resulted from a SELECT statement.
+sub all ($)
+{
+  my ($sql) = @_;
+  return trim_whitespace ($dbh->selectall_arrayref ($sql, {Slice=>{}}));
+}
+
+# Fetch one row resulted from a SELECT statement.
+sub row ($)
+{
+  my ($sql) = @_;
+  return trim_whitespace ($dbh->selectrow_hashref ($sql));
+}
+
+# Fetch all values in one COLUMN resulted from a SELECT statement.
+sub all_col ($$)
+{
+  my ($sql, $col) = @_;
+  my @result;
+  my $rows = all ($sql);
+  for my $row (@$rows) {
+    push (@result, $row->{$col});
+  }
+  return @result;
+}
+
+# Fetch one COLUMN from the first row resulted from a SELECT
+# statement.
+sub col ($$)
+{
+  my ($sql, $col) = @_;
+  my $value = row ($sql);
+  return $value->{$col} if $value;
+}
+
+# Fetch all GNU projects.
+sub projects ()
+{
+  return all ("SELECT id, name, slug, user_level, short_description,
+                 full_description, entry_compiled_by, updated,
+                 checkout_command
+               FROM directory_project
+              WHERE gnu IS TRUE  ORDER BY slug;");
+}
+
+# Return mundane-name for a project.  Returns an empty string if the
+# `mundane-name' field should be ommited for this project.
+sub mundane_name (\%)
+{
+  my ($project) = @_;
+  my $slug = $project->{"slug"};
+  my $name = $project->{"name"};
+
+  # Omit mundane-name if it is trivial, e.g. match the package name.
+  return "" if ($name eq $slug) or ($name eq ucfirst $slug);
+
+  # The mundane-name is non-trivial, return it.
+  return $name;
+}
+
+# Fetch homepage (if any) for a project.  Returns an empty string if
+# the `homepage' field should be omitted for this project.
+sub homepage (\%)
+{
+  my ($project) = @_;
+  my $id = $project->{"id"};
+  my $slug = $project->{"slug"};
+  $sth_homepage->bind_param (1, $id);
+  my $url = col ($sth_homepage, "link");
+
+  # Mark explicitly the lack of homepage.
+  return "none" if ! $url;
+
+  # Do magic to suppress a homepage comforming to
+  # http://www.gnu.org/software/PACKAGE format.
+  return "" if $url =~ 
m#^http://www.gnu.org/software/$slug(/($slug.html)?)?$#i;
+
+  # This is non-trivial URL, return it as is.
+  return $url;
+}
+
+# Fetch download-url (if any) for a project.  Returns an empty string
+# if the `download-url' field should be omitted for this project.
+sub download_url (\%)
+{
+  my ($project) = @_;
+  my $id = $project->{"id"};
+  my $slug = $project->{"slug"};
+  $sth_download_url->bind_param (1, $id);
+  my $url = col ($sth_download_url, "link");
+
+  # Mark explicitly the lack of download-url.
+  return "none" if ! $url;
+
+  # Do magic to supress a download-url comforming to
+  # ftp://ftp.gnu.org/gnu/PACKAGE format.
+  return "" if $url =~ m#^ftp://ftp.gnu.org/gnu/$slug/?$#i;
+
+  return $url;
+}
+
+# Converts SQL ISO date format (YYYY-MM-DD) to Date::Calc YMD.
+sub iso_date_to_ymd ($)
+{
+  my ($iso_date) = @_;
+  my ($year, $month, $day) = split (/-/, $iso_date);
+  my @ymd = ($year, $month, $day);
+  return @ymd;
+}
+
+# Converts Date::Calc YMD to string.
+sub iso_date_to_str ($) {
+  my ($date) = @_;
+  $date =~ s/-//g;
+  return $date;
+}
+
+# Fetch activity-status for a project.
+sub activity_status (\%)
+{
+  my ($project) = @_;
+  my $id = $project->{"id"};
+  $sth_activity_status->bind_param (1, $id);
+  my $row = row ($sth_activity_status);
+
+  return "stale" if ! $row;
+
+  my $status = "stale";
+  my $comments = "";
+  if ($row->{"date"}) {        
+    my @release = iso_date_to_ymd ($row->{"date"});
+    if (check_date (@release)) {
+      $status = "ok" if Delta_Days (@activity_threshold, @release) >= 0;
+    }
+    else {
+      $comments .= " Invalid release date: $row->{date}.";
+    }
+  }
+
+  my $date = $row->{"date"};
+  $date =~ tr/-//d if $date;
+  $date = "" if ! $date;
+
+  my $number = $row->{"name"};
+  if ($number and not ($number eq "NO_VERSION_DATA")) {
+    $number = " ($number)";
+  }
+  else {
+    $number = "";
+  }
+
+  my $result = "$status $date$number";
+  $result .= " #" . $comments if $comments;
+  return $result;
+}
+
+# Formats a category_id to be suitable for dumping.
+sub format_category ($)
+{
+  my ($id) = @_;
+  my @name_chain;
+  my @slug_chain;
+  do {
+    $sth_category->bind_param (1, $id);
+    my $cat = row ($sth_category);
+    my $name = $cat->{"name"};
+    my $slug = $cat->{"slug"};
+    push (@name_chain, $name);
+    push (@slug_chain, $slug);
+    $id = $cat->{"parent_category_id"};
+  } until ($id == 1);
+  my $names = join ("/", reverse (@name_chain));
+  my $slugs = join ("/", reverse (@slug_chain));
+  return "/$names (/$slugs)"
+}
+
+# Fetch categories for a project.
+sub categories (\%)
+{
+  my ($project) = @_;
+  my $id = $project->{"id"};
+  $sth_categories->bind_param (1, $id);
+  my $categories = all ($sth_categories);
+
+  my @result;
+  foreach my $category (@{$categories}) {
+    my $category_id = $category->{"category_id"};
+    push (@result, format_category ($category_id));
+  }
+  return sort (@result);
+}
+
+# Fetch related projects for a project.
+sub keywords (\%)
+{
+  my ($project) = @_;
+  my $id = $project->{"id"};
+  $sth_keywords->bind_param (1, $id);
+  my @keywords = all_col ($sth_keywords, "keyword");
+
+  return @keywords;
+}
+
+# Fetch related projects for a project.
+sub related (\%)
+{
+  my ($project) = @_;
+  my $id = $project->{"id"};
+  $sth_related->bind_param (1, $id);
+  my @related = all_col ($sth_related, "slug");
+
+  return @related;
+}
+
+# Fetch computer languages for a project.
+sub computer_languages (\%)
+{
+  my ($project) = @_;
+  my $id = $project->{"id"};
+  $sth_computer_languages->bind_param (1, $id);
+  my @computer_languages = all_col ($sth_computer_languages, "name");
+
+  return @computer_languages;
+}
+
+# Fetch subprograms for a project.
+sub subprograms (\%)
+{
+  my ($project) = @_;
+  my $id = $project->{"id"};
+  $sth_subprograms->bind_param (1, $id);
+  my @subprograms = all_col ($sth_subprograms, "name");
+
+  return @subprograms;
+}
+
+# Reformat paragraph text using coreutils' fmt.
+sub fmt ($)
+{
+  my ($str) = @_;
+  # write input to temp file
+  my $filename;
+  $filename = tmpnam ();
+  open TMP, ">$filename" or die "Can't open file: $!";
+  print TMP $str;
+  close TMP or die "Can't close file: $!";
+
+  # invoke fmt
+  open(FMT, "fmt $filename |") or die "Can't fork: $!";
+
+  # read output
+  my (@lines) = <FMT>;
+  close FMT or die "Can't close file: $!";
+
+  # delete temp file
+  unlink $filename or die "Can't delete file: $!";
+  
+  return join ("", @lines);
+}
+
+# Formats long muliparagraph text to be suitable for dumping.
+sub format_full_descr ($)
+{
+  my ($descr) = @_;
+  my $out = fmt ($descr);
+  $out =~ s/\n/\n /g; # add space after every newline
+  $out =~ s/\s+$//; # trim trailing whitespace
+  return " " . $out;
+}
+
+# Fetch licenses for a project version.
+sub licenses (\%)
+{
+  my ($version) = @_;
+  my $id = $version->{"id"};
+  $sth_licenses->bind_param (1, $id);
+  return all_col ($sth_licenses, "slug");
+}
+
+# Fetch interfaces for a project version.
+sub interfaces (\%)
+{
+  my ($version) = @_;
+  my $id = $version->{"id"};
+  $sth_interfaces->bind_param (1, $id);
+  return all_col ($sth_interfaces, "name");
+}
+
+# Fetch versions for a project.
+sub versions (\%)
+{
+  my ($project) = @_;
+  my $id = $project->{"id"};
+  $sth_versions->bind_param (1, $id);
+  return all ($sth_versions);
+}
+
+# Dump a version.
+sub version (\%)
+{
+  my ($version) = @_;
+  my $name = $version->{"name"};
+  my $date = iso_date_to_str ($version->{"date"});
+  my $status = $version_status_enum{$version->{"status"}};
+  my $notes = $version->{"notes"};
+  my $license_verified_by = $version->{"license_verified_by"};
+  my $license_verified_on = iso_date_to_str
+      ($version->{"license_verified_on"});
+  my $source_code = $version->{"source_code"};
+  my $licenses = join (" | ", licenses (%$version));
+  my $interfaces = join (" | ", interfaces (%$version));
+  print "version: $name\n";
+  print "  date: $date\n";
+  print "  status: $status\n";
+  print "  notes: $notes\n" if defined $notes and ! ($notes eq '');
+  print "  license-verified-by: $license_verified_by\n";
+  print "  license-verified-on: $license_verified_on\n";
+  print "  source-code: $source_code\n"
+      if defined $source_code and ! ($source_code eq '');
+  print "  licenses: $licenses\n" if ! ($licenses eq '');
+  print "  interfaces: $interfaces\n" if ! ($interfaces eq '');
+}
+
+# Dump a project to STDOUT.
+sub project (\%)
+{
+  my ($project) = @_;
+  my $id = $project->{"id"};
+  my $slug = $project->{"slug"};
+  my $name = $project->{"name"};
+  print "package: $project->{slug}\n";
+
+  my $mundane_name = mundane_name (%$project);
+  print "mundane-name: $mundane_name\n" if $mundane_name;
+
+  my $homepage = homepage (%$project);
+  print "homepage: $homepage\n" if $homepage;
+
+  my $download_url = download_url (%$project);
+  print "download-url: $download_url\n" if $download_url;
+
+  my $checkout_cmd = $project->{"checkout_command"};
+  if (defined $checkout_cmd and ! ($checkout_cmd eq '')) {
+    print "checkout-command: $checkout_cmd\n";
+  }
+
+  my $activity_status = activity_status (%$project);
+  print "activity-status: $activity_status\n";
+
+  my $user_level = $user_level_enum{$project->{"user_level"}};
+  print "user-level: $user_level\n";
+
+  my $computer_lang = join (" | ", computer_languages (%$project));
+  print "computer-languages: $computer_lang\n" if ! ($computer_lang eq '');
+
+  my $subprograms = join (" | ", subprograms (%$project));
+  print "subprograms: $subprograms\n" if ! ($subprograms eq '');
+
+  print "category: $_\n" foreach (categories (%$project));
+
+  my $keywords = join (" | ", keywords (%$project));
+  print "keywords: $keywords\n" if ! ($keywords eq '');
+
+  my $related = join (" | ", related (%$project));
+  print "related-packages: $related\n" if ! ($related eq '');
+
+  print "entry-compiled-by: $project->{entry_compiled_by}\n";
+
+  my @updated = iso_date_to_str ($project->{"updated"});
+  print "updated: @updated\n";
+
+  my $full_descr = format_full_descr($project->{"full_description"});
+  print "description: $project->{short_description}\n";
+  print "$full_descr\n";
+
+  my $versions = versions (%$project);
+  for my $version (@{$versions}) {
+    version (%$version);
+  }
+
+  print "\n";
+}
+
+# Main entry point.
+sub main
+{
+  db_connect ();
+  my $projects = projects ();
+  foreach my $project (@{$projects}) {
+    project (%$project);
+  }
+  print STDERR "DONE: " . @{$projects} . " projects exported.\n";
+  db_disconnect ();
+  return 0;
+}

Index: fsd/fsd-schema.texi
===================================================================
RCS file: fsd/fsd-schema.texi
diff -N fsd/fsd-schema.texi
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ fsd/fsd-schema.texi 11 May 2019 10:44:53 -0000      1.1
@@ -0,0 +1,1281 @@
+\input texinfo
address@hidden %**start of header
address@hidden fsd-schema.info
address@hidden Free Software Directory DB Schema Reference
address@hidden lastupdate 06.06.2009
+
address@hidden
+
+This reference manual is for the database schema of the Free Software
+Directory, catalog of useful free software that runs under free
+operating systems — particularly the GNU operating system and its
+GNU/Linux address@hidden Last updated on @value{lastupdate}.
address@hidden 1
+Copyright @copyright{} 2008, 2009 Free Software Foundation, Inc.
+
address@hidden
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the @acronym{GNU} Free Documentation License,
+Version 1.2 or any later version published by the Free Software
+Foundation; with no Invariant Sections, no Front-Cover Texts, and no
+Back-Cover Texts.  A copy of the license is included in the section
+entitled address@hidden Free Documentation License.''
address@hidden quotation
address@hidden copying
+
address@hidden
address@hidden Free Software Directory DB Schema Reference
address@hidden (last updated @value{lastupdate})
address@hidden by Kaloian Doganov <@email{kaloian@@gnu.org}>
address@hidden
address@hidden 0pt plus 1filll
address@hidden
address@hidden titlepage
+
address@hidden
+
address@hidden
address@hidden Top, Essential Concepts, (dir), (dir)
address@hidden Free Software Directory DB Schema Reference
address@hidden
address@hidden ifnottex
+
address@hidden
+* Essential Concepts::
+* Not Interesting::             Tables that are not directly related to the
+                                Free Software Directory's essential data.
+* Index::                       
+* Copying This Manual::         The GNU Free Documentation License.
address@hidden menu
+
address@hidden Essential Concepts, Project, Top, Top
address@hidden Essential Concepts
+
address@hidden
+* Project::
+* Category::
+* Computer Language::
+* Entity::
+* Interface::
+* IRC Network::
+* IRC Resource::
+* Keyword::
+* Legacy Category::
+* License::
+* Software Requirement::
+* Subprogram::
+* Version::
+* Network Resource::
address@hidden menu
+
address@hidden Project, Category, Essential Concepts, Essential Concepts
address@hidden Project
+
+The primary purpose of the Free Software Directory is to catalog free
+software projects, so the project is the central and most complex
+entity represented in the database.  The most important attributes of
+a project are stored in the @code{directory_project} table
+(@pxref{directory_project}).
+
+Projects are organized in categories (@pxref{Category}).  The
+information about which projects is filed in which category is stored
+in the @code{directory_project_categories} table
+(@pxref{directory_project_categories}).
+
+A project can be implemented using one or more computer languages
+(@pxref{Computer Language}).  Which project is implemented in which
+language is stored in the @code{directory_project_computer_languages}
+(@pxref{directory_project_computer_languages}).
+
+To facilitate the search function, one or more keywords
+(@pxref{Keyword}) could be associated with a project.  Those
+associations are stored in the @code{directory_project_keywords} table
+(@pxref{directory_project_keywords}).
+
+A project can relate to one or more other projects in the Free
+Software Directory.  Those relations are stored in the
address@hidden table
+(@pxref{directory_project_related}).
+
+Various public network resources (@pxref{Network Resource}) could be
+published for a project.
+
address@hidden
+* directory_project::
+* directory_project_categories:: 
+* directory_project_computer_languages::
+* directory_project_keywords::
+* directory_project_related::
address@hidden menu
+
address@hidden directory_project, directory_project_categories, Project, Project
address@hidden @code{directory_project}
+
address@hidden Column directory_project id
+Primary key.
address@hidden defcv
+
address@hidden Column directory_project name
+Human readable name of the project.
address@hidden defcv
+
address@hidden Column directory_project slug
+Short system name of the project, free of funny characters.
address@hidden defcv
+
address@hidden Column directory_project user_level
+Single character that denotes the experience level of the audience for
+which the project is suitable.  Possible values are:
+
address@hidden @samp
address@hidden 0
+Unknown (user level is not set yet);
+
address@hidden 1
+Beginner;
+
address@hidden 2
+Intermediate;
+
address@hidden 3
+Advanced.
+
address@hidden table
address@hidden defcv
+
address@hidden Column directory_project short_description
+One-line short description of the project.
address@hidden defcv
+
address@hidden Column directory_project full_description
+Longer text description of the project.  Paragraphs are marked up in
+HTML-like manner with surrounding @code{<p>} and @code{</p>}, except
+for the first paragraph, which need not to be marked this way.
address@hidden defcv
+
address@hidden Column directory_project entry_compiled_by
+Name and e-mail address of the person who filled this project record
+in the database.
address@hidden defcv
+
address@hidden Column directory_project updated
+Stamp of the last time when this project record was updated.
address@hidden defcv
+
address@hidden Column directory_project gnu
+Boolean value pointing whether this project is official part of the
+GNU project or not.
+
address@hidden @code
address@hidden true
+Part of the GNU project;
+
address@hidden false
+Not part of the GNU project.
+
address@hidden table
address@hidden defcv
+
address@hidden Column directory_project documentation
+Plain text containing pointers to various project documentation,
+available online (if any).
address@hidden defcv
+
address@hidden Column directory_project screen_shot
+Currently unused.
address@hidden defcv
+
address@hidden Column directory_project source_template
+Unknown purpose. (FIXME)
address@hidden defcv
+
address@hidden Column directory_project comments
+Free text with HTML markup.  Usually contains a copyright notice.
+Currently this value is not displayed to users on the web.
address@hidden defcv
+
address@hidden Column directory_project status
+FIXME
+Possible values are:
+
address@hidden @samp
address@hidden 1
+Published.  The project is visible to users.
+
address@hidden 2
+FIXME. The project is not visible to users.
+
address@hidden 3
+FIXME. The project is not visible to users.
+
address@hidden 4
+FIXME. The project is not visible to users.
address@hidden table
address@hidden defcv
+
address@hidden Column directory_project checkout_command
+Shell command used to checkout the current sources from the public
+source code repository (if any).
address@hidden defcv
+
address@hidden Column directory_project rating_count
+The number of users that took the action to rate the project.
address@hidden defcv
+
address@hidden Column directory_project avg_rating
+The average project rating in the scale 0-5.
address@hidden defcv
+
address@hidden Column directory_project internal_notes
+Free text reserved for notes by the directory maintainers.  This text
+is not published on the web.
address@hidden defcv
+
+
address@hidden @command{psql} description
+
address@hidden
+                                       Table "public.directory_project"
+      Column       |          Type           |                           
Modifiers                            
+-------------------+-------------------------+----------------------------------------------------------------
+ id                | integer                 | not null default 
nextval('directory_project_id_seq'::regclass)
+ name              | character varying(80)   | not null
+ slug              | character varying(80)   | not null
+ user_level        | character varying(1)    | not null
+ short_description | character varying(350)  | not null
+ full_description  | text                    | not null
+ entry_compiled_by | character varying(60)   | not null
+ updated           | date                    | not null
+ gnu               | boolean                 | not null
+ documentation     | text                    | 
+ screen_shot       | character varying(100)  | 
+ source_template   | character varying(200)  | 
+ comments          | text                    | 
+ status            | character varying(1)    | not null
+ checkout_command  | character varying(1000) | 
+ rating_count      | integer                 | not null
+ avg_rating        | numeric(4,2)            | not null
+ internal_notes    | text                    | 
+Indexes:
+    "directory_project_pkey" PRIMARY KEY, btree (id)
+    "directory_project_slug_uniq" UNIQUE, btree (slug)
address@hidden verbatim
+
address@hidden directory_project_categories, 
directory_project_computer_languages, directory_project, Project
address@hidden @code{directory_project_categories}
+
+Represents a relationship between a project (@pxref{Project}) and a
+category (@pxref{Category}).
+
address@hidden Column directory_project_caterogies id
+Primary key.
address@hidden defcv
+
address@hidden Column directory_project_caterogies project_id
+The id of the project record (@pxref{directory_project}) associated
+with the category.
address@hidden defcv
+
address@hidden Column directory_project_categories category_id
+The id of the category record (@pxref{directory_category}) associated
+with the project.
address@hidden defcv
+
address@hidden @command{psql} description
+
address@hidden
+                            Table "public.directory_project_categories"
+   Column    |  Type   |                                 Modifiers             
                    
+-------------+---------+---------------------------------------------------------------------------
+ id          | integer | not null default 
nextval('directory_project_categories_id_seq'::regclass)
+ project_id  | integer | not null
+ category_id | integer | not null
+Indexes:
+    "directory_project_categories_pkey" PRIMARY KEY, btree (id)
+    "directory_project_categories_project_id_key" UNIQUE, btree (project_id, 
category_id)
+Foreign-key constraints:
+    "directory_project_categories_category_id_fkey" FOREIGN KEY (category_id) 
REFERENCES directory_category(id) DEFERRABLE INITIALLY DEFERRED
+    "directory_project_categories_project_id_fkey" FOREIGN KEY (project_id) 
REFERENCES directory_project(id) DEFERRABLE INITIALLY DEFERRED
address@hidden verbatim
+
address@hidden directory_project_computer_languages, 
directory_project_keywords, directory_project_categories, Project
address@hidden @code{directory_project_computer_languages}
+
+Represents a relationship between project (@pxref{Project}) and
+computer language (@pxref{Computer Language}).
+
address@hidden Column directory_project_computer_languages id
+Primary key.
address@hidden defcv
+
address@hidden Column directory_project_computer_languages project_id
+The id of the project record (@pxref{directory_project}) associated
+with the computer language.
address@hidden defcv
+
address@hidden Column directory_project_computer_languages computerlanguage_id
+The id of the computer language record
+(@pxref{directory_computerlanguage}) associated with the project.
address@hidden defcv
+
address@hidden @command{psql} description
+
address@hidden
+                               Table 
"public.directory_project_computer_languages"
+       Column        |  Type   |                                     Modifiers 
                                    
+---------------------+---------+-----------------------------------------------------------------------------------
+ id                  | integer | not null default 
nextval('directory_project_computer_languages_id_seq'::regclass)
+ project_id          | integer | not null
+ computerlanguage_id | integer | not null
+Indexes:
+    "directory_project_computer_languages_pkey" PRIMARY KEY, btree (id)
+    "directory_project_computer_languages_project_id_key" UNIQUE, btree 
(project_id, computerlanguage_id)
+Foreign-key constraints:
+    "directory_project_computer_languages_computerlanguage_id_fkey" FOREIGN 
KEY (computerlanguage_id) REFERENCES directory_computerlanguage(id) DEFERRABLE 
INITIALLY DEFERRED
+    "directory_project_computer_languages_project_id_fkey" FOREIGN KEY 
(project_id) REFERENCES directory_project(id) DEFERRABLE INITIALLY DEFERRED
address@hidden verbatim
+
address@hidden directory_project_keywords, directory_project_related, 
directory_project_computer_languages, Project
address@hidden @code{directory_project_keywords}
+
+Represents an association between project (@pxref{Project}) and
+keyword (@pxref{Keyword}).
+
address@hidden Column directory_project_keywords id
+Primary key.
address@hidden defcv
+
address@hidden Column directory_project_keywords project_id
+The id of the project record (@pxref{directory_project}) associated
+with the keyword.
address@hidden defcv
+
address@hidden Column directory_project_keywords keyword_id
+The id of the keyword record (@pxref{directory_keyword}) associated
+with the project.
address@hidden defcv
+
address@hidden @command{psql} description
+
address@hidden
+                           Table "public.directory_project_keywords"
+   Column   |  Type   |                                Modifiers               
                 
+------------+---------+-------------------------------------------------------------------------
+ id         | integer | not null default 
nextval('directory_project_keywords_id_seq'::regclass)
+ project_id | integer | not null
+ keyword_id | integer | not null
+Indexes:
+    "directory_project_keywords_pkey" PRIMARY KEY, btree (id)
+    "directory_project_keywords_project_id_key" UNIQUE, btree (project_id, 
keyword_id)
+Foreign-key constraints:
+    "directory_project_keywords_keyword_id_fkey" FOREIGN KEY (keyword_id) 
REFERENCES directory_keyword(id) DEFERRABLE INITIALLY DEFERRED
+    "directory_project_keywords_project_id_fkey" FOREIGN KEY (project_id) 
REFERENCES directory_project(id) DEFERRABLE INITIALLY DEFERRED
address@hidden verbatim
+
address@hidden directory_project_related,  , directory_project_keywords, Project
address@hidden @code{directory_project_related}
+
+Represents a directed edge (arrow) from a (tail) project to another
+(head) project.  The set of all records in this table form the edges
+of a directed graph, where project records (@pxref{directory_project})
+are graph's nodes.
+
address@hidden Column directory_project_related id
+Primary key.
address@hidden defcv
+
address@hidden Column directory_project_related from_project_id
+The id of the tail project record (@pxref{directory_project}).
address@hidden defcv
+
address@hidden Column directory_project_related to_project_id
+The id of the head project record (@pxref{directory_project}).
address@hidden defcv
+
address@hidden @command{psql} description
+
address@hidden
+                              Table "public.directory_project_related"
+     Column      |  Type   |                               Modifiers           
                     
+-----------------+---------+------------------------------------------------------------------------
+ id              | integer | not null default 
nextval('directory_project_related_id_seq'::regclass)
+ from_project_id | integer | not null
+ to_project_id   | integer | not null
+Indexes:
+    "directory_project_related_pkey" PRIMARY KEY, btree (id)
+    "directory_project_related_from_project_id_key" UNIQUE, btree 
(from_project_id, to_project_id)
+Foreign-key constraints:
+    "directory_project_related_from_project_id_fkey" FOREIGN KEY 
(from_project_id) REFERENCES directory_project(id) DEFERRABLE INITIALLY DEFERRED
+    "directory_project_related_to_project_id_fkey" FOREIGN KEY (to_project_id) 
REFERENCES directory_project(id) DEFERRABLE INITIALLY DEFERRED
address@hidden verbatim
+
address@hidden Category, Computer Language, Project, Essential Concepts
address@hidden Category
+
+Project entries in the Free Software Directory are organized in
+categories.  Category is a general topic of some sort (for example,
+Science, Education, Audio, etc.) that classifies a project.  A single
+project can be filed in more than one category.
+
+Categories are organized to form a tree hierarchy, where every
+category (except one) must have exactly one parent category.  There is
+a single category with slug @code{index} and name @code{Top} that has
+no parent and serves as a tree root.  All other categories have the
address@hidden category as it's parent, either directly or indirectly.
+
+Categories are represented in the table @code{directory_category}
+(@pxref{directory_category}).  Assosiations between projects and
+categories (information about which project is filled in which
+category) are stored in the table @code{directory_project_categories}
+(@pxref{directory_project_categories}).
+
address@hidden
+* directory_category::
address@hidden menu
+
address@hidden directory_category,,, Category
address@hidden @code{directory_category}
+
address@hidden Column directory_category id
+Primary key.
address@hidden defcv
+
address@hidden Column directory_category name
+Human readable name of the category.
address@hidden defcv
+
address@hidden Column directory_category slug
+Short system name of the category, free of funny characters.
address@hidden defcv
+
address@hidden Column directory_category description
+Long, human readable description.  Usually empty.
address@hidden defcv
+
address@hidden Column directory_category parent_category_id
+If not null, points to the @code{id} of the parent category.  Thus,
+all categories in the database form a tree structure where root is
+this category for which @code{parent_category_id} is @code{NULL}.
address@hidden defcv
+
address@hidden @command{psql} description
+
address@hidden
+                                       Table "public.directory_category"
+       Column       |          Type          |                            
Modifiers                            
+--------------------+------------------------+-----------------------------------------------------------------
+ id                 | integer                | not null default 
nextval('directory_category_id_seq'::regclass)
+ name               | character varying(60)  | not null
+ slug               | character varying(50)  | not null
+ description        | character varying(120) | not null
+ parent_category_id | integer                | 
+Indexes:
+    "directory_category_pkey" PRIMARY KEY, btree (id)
+    "directory_category_slug_uniq" UNIQUE, btree (slug)
+    "directory_category_parent_category_id" btree (parent_category_id)
+Foreign-key constraints:
+    "parent_category_id_refs_id_349faff9" FOREIGN KEY (parent_category_id) 
REFERENCES directory_category(id) DEFERRABLE INITIALLY DEFERRED
address@hidden verbatim
+
address@hidden Computer Language, Entity, Category, Essential Concepts
address@hidden Computer Language
+
+The Free Software Directory keeps a list of all computer languages
+used to implement free software projects.  The list is represented in
+the table @code{directory_computerlanguage}
+(@pxref{directory_computerlanguage}).
+
+A project is usually implemented in one or more computer languages.
+For example, Emacs is written in C and Lisp, and GnuCash is written in
+C and Scheme.  This relationship between projects and computer
+languages is represented in the table
address@hidden
+(@pxref{directory_project_computer_languages}).
+
address@hidden
+* directory_computerlanguage::
address@hidden menu
+
address@hidden directory_computerlanguage,,, Computer Language
address@hidden @code{directory_computerlanguage}
+
address@hidden Column directory_computerlanguage id
+Primary key.
address@hidden defcv
+
address@hidden Column directory_computerlanguage name
+Common name of the language in human-readable form.  For example
address@hidden, @code{Lisp}, etc.
address@hidden defcv
+
address@hidden @command{psql} description
+
address@hidden
+                                Table "public.directory_computerlanguage"
+ Column |         Type          |                                Modifiers     
                           
+--------+-----------------------+-------------------------------------------------------------------------
+ id     | integer               | not null default 
nextval('directory_computerlanguage_id_seq'::regclass)
+ name   | character varying(80) | not null
+Indexes:
+    "directory_computerlanguage_pkey" PRIMARY KEY, btree (id)
+    "directory_computerlanguage_name_uniq" UNIQUE, btree (name)
address@hidden verbatim
+
address@hidden Entity, Interface, Computer Language, Essential Concepts
address@hidden Entity
+
+FIXME
+
address@hidden
+* directory_entity::
+* directory_entityrole::
address@hidden menu
+
address@hidden directory_entity, directory_entityrole,, Entity
address@hidden @code{directory_entity}
+
address@hidden Column directory_entity id
+Primary key.
address@hidden defcv
+
address@hidden Column directory_entity name
+Common name of the person, organisation or team.
address@hidden defcv
+
address@hidden Column directory_entity url
+Homepage of the entity.  Currently is usually empty.
address@hidden defcv
+
address@hidden Column directory_entity email
+Email address for contact.  Currently almost all entity records have
+an email filled in.
address@hidden defcv
+
address@hidden @command{psql} description
+
address@hidden
+                                 Table "public.directory_entity"
+ Column |          Type          |                           Modifiers         
                  
+--------+------------------------+---------------------------------------------------------------
+ id     | integer                | not null default 
nextval('directory_entity_id_seq'::regclass)
+ name   | character varying(100) | not null
+ url    | character varying(500) | 
+ email  | character varying(75)  | 
+Indexes:
+    "directory_entity_pkey" PRIMARY KEY, btree (id)
address@hidden verbatim
+
address@hidden directory_entityrole,, directory_entity, Entity
address@hidden @code{directory_entityrole}
+
+Represents a relationship between an entity (@pxref{Entity}) and a
+project (@pxref{Project}).
+
address@hidden Column directory_entityrole id
+Primary key.
address@hidden defcv
+
address@hidden Column directory_entityrole project_id
+The id of the project record (@pxref{directory_project}) associated
+with the entity.
address@hidden defcv
+
address@hidden Column directory_entityrole entity_id
+The id of the entity record (@pxref{directory_entity}) associated with
+the project.
address@hidden defcv
+
address@hidden Column directory_entityrole role
address@hidden @samp
address@hidden 1
+Maintainer
+
address@hidden 2
+Contributor
+
address@hidden 3
+Developer
+
address@hidden 4
+Sponsor
address@hidden table
address@hidden defcv
+
address@hidden Column directory_entityrole private
+Boolean value pointing whether this role shouldn't be displayed on the
+web.
address@hidden defcv
+
address@hidden @command{psql} description
+
address@hidden
+                                  Table "public.directory_entityrole"
+   Column   |         Type         |                             Modifiers     
                        
+------------+----------------------+-------------------------------------------------------------------
+ id         | integer              | not null default 
nextval('directory_entityrole_id_seq'::regclass)
+ project_id | integer              | not null
+ entity_id  | integer              | not null
+ role       | character varying(1) | not null
+ private    | boolean              | default false
+Indexes:
+    "directory_entityrole_pkey" PRIMARY KEY, btree (id)
+    "directory_entityrole_entity_id" btree (entity_id)
+    "directory_entityrole_project_id" btree (project_id)
+Foreign-key constraints:
+    "directory_entityrole_project_id_fkey" FOREIGN KEY (project_id) REFERENCES 
directory_project(id) DEFERRABLE INITIALLY DEFERRED
+    "entity_id_refs_id_463c73" FOREIGN KEY (entity_id) REFERENCES 
directory_entity(id) DEFERRABLE INITIALLY DEFERRED
address@hidden verbatim
+
address@hidden Interface, IRC Network, Entity, Essential Concepts
address@hidden Interface
+
+Computer programs are used directly by users or by other programs
+using interfaces.  The Free Software Directory keeps a list of all
+interfaces provided by free software projects.  The list is
+represented in the table @code{directory_interface}
+(@pxref{directory_interface}).
+
+FIXME: explain relationship between versions and interfaces.
address@hidden A project could provide one or more interfaces, for example
address@hidden graphical interface (using the X Window System) and a console
address@hidden interface.
+
address@hidden
+* directory_interface::
address@hidden menu
+
address@hidden directory_interface,,, Interface
address@hidden @code{directory_interface}
+
address@hidden Column directory_interface id
+Primary key.
address@hidden defcv
+
address@hidden Column directory_interface id
+Common name of the interface in human-readable form.  For example
address@hidden Line}, @code{X Window System}, @code{Web}, etc.
address@hidden defcv
+
address@hidden @command{psql} description
+
address@hidden
+                                Table "public.directory_interface"
+ Column |         Type          |                            Modifiers         
                    
+--------+-----------------------+------------------------------------------------------------------
+ id     | integer               | not null default 
nextval('directory_interface_id_seq'::regclass)
+ name   | character varying(25) | not null
+Indexes:
+    "directory_interface_pkey" PRIMARY KEY, btree (id)
+    "directory_interface_name_uniq" UNIQUE, btree (name)
address@hidden verbatim
+
address@hidden IRC Network, IRC Resource, Interface, Essential Concepts
address@hidden IRC Network
+
+FIXME
+
address@hidden
+* directory_ircnetwork::
address@hidden menu
+
address@hidden directory_ircnetwork,,, IRC Network
address@hidden @code{directory_ircnetwork}
+
+FIXME
+
address@hidden @command{psql} description
+
address@hidden
+                                 Table "public.directory_ircnetwork"
+ Column  |          Type          |                             Modifiers      
                       
+---------+------------------------+-------------------------------------------------------------------
+ id      | integer                | not null default 
nextval('directory_ircnetwork_id_seq'::regclass)
+ network | character varying(100) | not null
+Indexes:
+    "directory_ircnetwork_pkey" PRIMARY KEY, btree (id)
+    "directory_ircnetwork_network_uniq" UNIQUE, btree (network)
address@hidden verbatim
+
address@hidden IRC Resource, Keyword, IRC Network, Essential Concepts
address@hidden IRC Resource
+
+FIXME
+
address@hidden
+* directory_ircresource::
address@hidden menu
+
address@hidden directory_ircresource,,, IRC Resource
address@hidden @code{directory_ircresource}
+
+FIXME
+
address@hidden @command{psql} description
+
address@hidden
+                                   Table "public.directory_ircresource"
+   Column   |          Type          |                             Modifiers   
                           
+------------+------------------------+--------------------------------------------------------------------
+ id         | integer                | not null default 
nextval('directory_ircresource_id_seq'::regclass)
+ channel    | character varying(100) | not null
+ purpose    | character varying(1)   | not null
+ network_id | integer                | not null
+ project_id | integer                | not null
+Indexes:
+    "directory_ircresource_pkey" PRIMARY KEY, btree (id)
+    "directory_ircresource_network_id" btree (network_id)
+    "directory_ircresource_project_id" btree (project_id)
+Foreign-key constraints:
+    "directory_ircresource_network_id_fkey" FOREIGN KEY (network_id) 
REFERENCES directory_ircnetwork(id) DEFERRABLE INITIALLY DEFERRED
+    "directory_ircresource_project_id_fkey" FOREIGN KEY (project_id) 
REFERENCES directory_project(id) DEFERRABLE INITIALLY DEFERRED
address@hidden verbatim
+
address@hidden Keyword, Legacy Category, IRC Resource, Essential Concepts
address@hidden Keyword
+
+Projects (@pxref{Project}) in the directory can be tagged with one or
+more keywords.  This way, projects could be discovered not only by
+their name or category (@pxref{Category}), but also by association
+with a keyword.
+
+The list of all keywords is stored in the table
address@hidden (@pxref{directory_keyword}).  Assosiations
+between projects and keywords are stored in the table
address@hidden
+(@pxref{directory_project_keywords}).
+
address@hidden
+* directory_keyword::
address@hidden menu
+
address@hidden directory_keyword,,, Keyword
address@hidden @code{directory_keyword}
+
address@hidden Column directory_keyword id
+Primary key.
address@hidden defcv
+
address@hidden Column directory_keyword keyword
+The keyword (or phrase) itself in plantext.
address@hidden defcv
+
address@hidden @command{psql} description
+
address@hidden
+                                 Table "public.directory_keyword"
+ Column  |         Type          |                           Modifiers         
                   
+---------+-----------------------+----------------------------------------------------------------
+ id      | integer               | not null default 
nextval('directory_keyword_id_seq'::regclass)
+ keyword | character varying(80) | not null
+Indexes:
+    "directory_keyword_pkey" PRIMARY KEY, btree (id)
+    "directory_keyword_keyword_uniq" UNIQUE, btree (keyword)
address@hidden verbatim
+
address@hidden Legacy Category, License, Keyword, Essential Concepts
address@hidden Legacy Category
+
+FIXME
+
address@hidden
+* directory_legacycategory::
address@hidden menu
+
address@hidden directory_legacycategory,,, Legacy Category
address@hidden @code{directory_legacycategory}
+
+FIXME
+
address@hidden @command{psql} description
+
address@hidden
+                                   Table "public.directory_legacycategory"
+   Column    |          Type          |                               
Modifiers                               
+-------------+------------------------+-----------------------------------------------------------------------
+ id          | integer                | not null default 
nextval('directory_legacycategory_id_seq'::regclass)
+ category_id | integer                | not null
+ hierarchy   | character varying(100) | not null
+Indexes:
+    "directory_legacycategory_pkey" PRIMARY KEY, btree (id)
+    "directory_legacycategory_category_id" btree (category_id)
+Foreign-key constraints:
+    "directory_legacycategory_category_id_fkey" FOREIGN KEY (category_id) 
REFERENCES directory_category(id) DEFERRABLE INITIALLY DEFERRED
address@hidden verbatim
+
address@hidden License, Software Requirement, Legacy Category, Essential 
Concepts
address@hidden License
+
+FIXME
+
address@hidden
+* directory_license::
address@hidden menu
+
address@hidden directory_license,,, License
address@hidden @code{directory_license}
+
+FIXME
+
address@hidden @command{psql} description
+
address@hidden
+                                   Table "public.directory_license"
+    Column    |         Type          |                           Modifiers    
                        
+--------------+-----------------------+----------------------------------------------------------------
+ id           | integer               | not null default 
nextval('directory_license_id_seq'::regclass)
+ slug         | character varying(50) | not null
+ display_name | character varying(80) | not null
+ full_text    | text                  | not null
+Indexes:
+    "directory_license_pkey" PRIMARY KEY, btree (id)
+    "directory_license_slug_uniq" UNIQUE, btree (slug)
address@hidden verbatim
+
address@hidden Software Requirement, Subprogram, License, Essential Concepts
address@hidden Software Requirement
+
+FIXME
+
address@hidden
+* directory_softwarerequirement::
address@hidden menu
+
address@hidden directory_softwarerequirement,,, Software Requirement
address@hidden @code{directory_softwarerequirement}
+
+FIXME
+
address@hidden @command{psql} description
+
address@hidden
+                                   Table "public.directory_softwarerequirement"
+   Column   |          Type          |                                 
Modifiers                                  
+------------+------------------------+----------------------------------------------------------------------------
+ id         | integer                | not null default 
nextval('directory_softwarerequirement_id_seq'::regclass)
+ name       | character varying(200) | not null
+ project_id | integer                | not null
+ purpose    | character varying(1)   | not null
+Indexes:
+    "directory_softwarerequirement_pkey" PRIMARY KEY, btree (id)
+    "directory_softwarerequirement_project_id" btree (project_id)
+Foreign-key constraints:
+    "directory_softwarerequirement_project_id_fkey" FOREIGN KEY (project_id) 
REFERENCES directory_project(id) DEFERRABLE INITIALLY DEFERRED
address@hidden verbatim
+
address@hidden Subprogram, Version, Software Requirement, Essential Concepts
address@hidden Subprogram
+
+FIXME
+
address@hidden
+* directory_subprogram::
address@hidden menu
+
address@hidden directory_subprogram,,, Subprogram
address@hidden @code{directory_subprogram}
+
+FIXME
+
address@hidden @command{psql} description
+
address@hidden
+                                  Table "public.directory_subprogram"
+   Column   |         Type          |                             Modifiers    
                         
+------------+-----------------------+-------------------------------------------------------------------
+ id         | integer               | not null default 
nextval('directory_subprogram_id_seq'::regclass)
+ name       | character varying(80) | 
+ project_id | integer               | not null
+Indexes:
+    "directory_subprogram_pkey" PRIMARY KEY, btree (id)
+    "directory_subprogram_project_id" btree (project_id)
+Foreign-key constraints:
+    "directory_subprogram_project_id_fkey" FOREIGN KEY (project_id) REFERENCES 
directory_project(id) DEFERRABLE INITIALLY DEFERRED
address@hidden verbatim
+
address@hidden Version, Network Resource, Subprogram, Essential Concepts
address@hidden Version
+
+Over time, a typical software project (@pxref{Project}) makes one or
+more releases, or is available in more than one variant -- stable,
+testing or development, each suitable for specific audience.  Those
+different releases of a project are called @emph{versions} in the
+terms of the Free Software Database.  A project could have many
+versions, but one version belongs exactly to one project.  The most
+important attributes of a version are stored in the
address@hidden table (@pxref{directory_version}).
+
+Each version could provide it's own set of interfaces
+(@pxref{Interface}).  The information about what interfaces are
+provided by a version is stored in the
address@hidden table
+(@pxref{directory_version_interfaces}).
+
+Also, a version could come with it's own license (or set of licenses).
+(@pxref{License}).  The information about which licences are
+applicable for a version is stored in the
address@hidden table
+(@pxref{directory_version_licenses}).
+
address@hidden
+* directory_version::
+* directory_version_interfaces::
+* directory_version_licenses::
address@hidden menu
+
address@hidden directory_version, directory_version_interfaces,, Version
address@hidden @code{directory_version}
+
address@hidden Column directory_version id
+Primary key.
address@hidden defcv
+
address@hidden Column directory_version name
+Unique string that identifies the version among all other versions of
+the same project.  Usually contains the so called version number, for
+example @samp{21.1} or @samp{1.0beta}.  When such number is not
+available, this column contains the string literal
address@hidden
address@hidden defcv
+
address@hidden Column directory_version date
+The date when this version is released.
address@hidden defcv
+
address@hidden Column directory_version status
+Code maturity.  Possible values are:
+
address@hidden @samp
address@hidden 2
+Alpha
+
address@hidden 3
+Beta
+
address@hidden 4
+Developmental
+
address@hidden 5
+Testing
+
address@hidden 6
+Unstable
+
address@hidden 7
+Stable
+
address@hidden 8
+Mature
+
address@hidden table
address@hidden defcv
+
address@hidden Column directory_version project_id
+The id of the project record (@pxref{directory_project}) which has
+released this version.
address@hidden defcv
+
address@hidden Column directory_version notes
+Arbitrary string, visualised on the web next to the version's
address@hidden
address@hidden defcv
+
address@hidden Column directory_version license_verified_by_id
+The id of the directory operator (FIXME: reference to auth_user) that
+is responsible for license verification.
address@hidden defcv
+
address@hidden Column directory_version license_verified_on
+The date on which the license verification is completed.
address@hidden defcv
+
address@hidden Column directory_version source_archive
+Currently unused.
address@hidden defcv
+
address@hidden Column directory_version source_code
+Provides means of retrieving the source code.  Usually contains a
+public URL of the release tarball.  If such an URL is not available
+for some reason, then the column contains notes explaining other means
+of retrieving the source code, like using source control system or
+person that should be contacted.
address@hidden defcv
+
address@hidden Column directory_version deb_system
+Currently unused.
address@hidden defcv
+
address@hidden Column directory_version rpm_system
+Currently unused.
address@hidden defcv
+
address@hidden @command{psql} description
+
address@hidden
+                                         Table "public.directory_version"
+         Column         |          Type          |                           
Modifiers                            
+------------------------+------------------------+----------------------------------------------------------------
+ id                     | integer                | not null default 
nextval('directory_version_id_seq'::regclass)
+ name                   | character varying(20)  | not null
+ date                   | date                   | not null
+ status                 | character varying(1)   | not null
+ project_id             | integer                | not null
+ notes                  | text                   | 
+ license_verified_by_id | integer                | not null
+ license_verified_on    | date                   | not null
+ source_archive         | character varying(100) | 
+ source_code            | character varying(500) | not null
+ deb_system             | character varying(500) | 
+ rpm_system             | character varying(500) | 
+Indexes:
+    "directory_version_pkey" PRIMARY KEY, btree (id)
+    "directory_version_license_verified_by_id" btree (license_verified_by_id)
+    "directory_version_project_id" btree (project_id)
+Foreign-key constraints:
+    "directory_version_license_verified_by_id_fkey" FOREIGN KEY 
(license_verified_by_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED
+    "directory_version_project_id_fkey" FOREIGN KEY (project_id) REFERENCES 
directory_project(id) DEFERRABLE INITIALLY DEFERRED
address@hidden verbatim
+
address@hidden directory_version_interfaces, directory_version_licenses, 
directory_version, Version
address@hidden @code{directory_version_interfaces}
+
+Represents a relationship between a version (@pxref{Version}) and an
+interface (@pxref{Interface}).
+
address@hidden Column directory_version_interfaces id
+Primary key.
address@hidden defcv
+
address@hidden Column directory_version_interfaces version_id
+The id of the version record (@pxref{directory_version}) associated
+with the interface.
address@hidden defcv
+
address@hidden Column directory_version_interfaces interface_id
+The id of the interface record (@pxref{directory_interface})
+associated with the version.
address@hidden defcv
+
address@hidden @command{psql} description
+
address@hidden
+                            Table "public.directory_version_interfaces"
+    Column    |  Type   |                                 Modifiers            
                     
+--------------+---------+---------------------------------------------------------------------------
+ id           | integer | not null default 
nextval('directory_version_interfaces_id_seq'::regclass)
+ version_id   | integer | not null
+ interface_id | integer | not null
+Indexes:
+    "directory_version_interfaces_pkey" PRIMARY KEY, btree (id)
+    "directory_version_interfaces_version_id_key" UNIQUE, btree (version_id, 
interface_id)
+Foreign-key constraints:
+    "directory_version_interfaces_interface_id_fkey" FOREIGN KEY 
(interface_id) REFERENCES directory_interface(id) DEFERRABLE INITIALLY DEFERRED
+    "directory_version_interfaces_version_id_fkey" FOREIGN KEY (version_id) 
REFERENCES directory_version(id) DEFERRABLE INITIALLY DEFERRED
address@hidden verbatim
+
address@hidden directory_version_licenses,, directory_version_interfaces, 
Version
address@hidden @code{directory_version_licenses}
+
+Represents a relationship between a version (@pxref{Version}) and a
+license (@pxref{License}).
+
address@hidden Column directory_version_licenses id
+Primary key.
address@hidden defcv
+
address@hidden Column directory_version_licenses version_id
+The id of the version record (@pxref{directory_version}) associated
+with the license.
address@hidden defcv
+
address@hidden Column directory_version_licenses license_id
+The id of the license record (@pxref{directory_license}) associated
+with the version.
address@hidden defcv
+
address@hidden @command{psql} description
+
address@hidden
+                           Table "public.directory_version_licenses"
+   Column   |  Type   |                                Modifiers               
                 
+------------+---------+-------------------------------------------------------------------------
+ id         | integer | not null default 
nextval('directory_version_licenses_id_seq'::regclass)
+ version_id | integer | not null
+ license_id | integer | not null
+Indexes:
+    "directory_version_licenses_pkey" PRIMARY KEY, btree (id)
+    "directory_version_licenses_version_id_key" UNIQUE, btree (version_id, 
license_id)
+Foreign-key constraints:
+    "directory_version_licenses_license_id_fkey" FOREIGN KEY (license_id) 
REFERENCES directory_license(id) DEFERRABLE INITIALLY DEFERRED
+    "directory_version_licenses_version_id_fkey" FOREIGN KEY (version_id) 
REFERENCES directory_version(id) DEFERRABLE INITIALLY DEFERRED
address@hidden verbatim
+
address@hidden Network Resource, Not Interesting, Version, Essential Concepts
address@hidden Network Resource
+
+A typical free software project publishes various kinds of network
+resources -- like homepage, mailing list archives or newsgroups.  Most
+of those various kinds of resources can be addressed to a specific
+audience.  For example, a project could use two different mailing
+lists -- one intended for general users and another for developers.
+Such network resources are represented in the table
address@hidden
+(@pxref{directory_projectwebresource}).
+
address@hidden
+* directory_projectwebresource::
address@hidden menu
+
address@hidden directory_projectwebresource,  , Network Resource, Network 
Resource
address@hidden @code{directory_projectwebresource}
+
+The name of this table is somewhat misleading since it keeps records
+for various kind of network resources, not just web addresses.
+
address@hidden Column directory_projectwebresource id
+Primary key.
address@hidden defcv
+
address@hidden Column directory_projectwebresource link
+Network address.  This may be an URL, email address, etc. according to
+the value of the @code{kind} column.
address@hidden defcv
+
address@hidden Column directory_projectwebresource project_id
+The id of the project record (@pxref{directory_project}) for which
+this resource is about.
address@hidden defcv
+
address@hidden Column directory_projectwebresource audience
+Intended audience that might find this resource useful.  Possible
+values are:
+
address@hidden @samp
address@hidden 1
+Developers
+
address@hidden 2
+User Support
+
address@hidden 3
+Bug Tracking
+
address@hidden 4
+Announcement
+
address@hidden 5
+General
address@hidden table
address@hidden defcv
+
address@hidden Column directory_projectwebresource kind
+FIXME.  Possible values are:
+
address@hidden @samp
address@hidden 1
+Mailing List Subscribe
+
address@hidden 2
+Mailing List Info/Archive
+
address@hidden 3
+Forum
+
address@hidden 4
+VCS Repository Webview
+
address@hidden 5
+Homepage
+
address@hidden 6
+Bug Tracker
+
address@hidden 7
+ChangeLog
+
address@hidden 8
+E-mail
+
address@hidden 9
+Newsgroup (NNTP)
+
address@hidden 10
+Paid support information.  The link usually contains free text with
+inline URLs, for example: @samp{Paid technical support available from
+http://foo.com/support.html}.
+
address@hidden 11
+Download
address@hidden table
+
address@hidden defcv
+
address@hidden @command{psql} description
+
address@hidden
+                                   Table "public.directory_projectwebresource"
+   Column   |          Type           |                                 
Modifiers                                 
+------------+-------------------------+---------------------------------------------------------------------------
+ id         | integer                 | not null default 
nextval('directory_projectwebresource_id_seq'::regclass)
+ link       | character varying(1000) | not null
+ project_id | integer                 | not null
+ audience   | character varying(2)    | not null
+ kind       | character varying(2)    | not null
+Indexes:
+    "directory_projectwebresource_pkey" PRIMARY KEY, btree (id)
+    "directory_projectwebresource_project_id" btree (project_id)
+Foreign-key constraints:
+    "directory_projectwebresource_project_id_fkey" FOREIGN KEY (project_id) 
REFERENCES directory_project(id) DEFERRABLE INITIALLY DEFERRED
address@hidden verbatim
+
address@hidden Not Interesting, Index, Network Resource, Top
address@hidden Tables that are not directly related to the FSD data
+
address@hidden
address@hidden
+auth_group
+
address@hidden
+auth_group_permissions
+
address@hidden
+auth_message
+
address@hidden
+auth_permission
+
address@hidden
+auth_user
+
address@hidden
+auth_user_groups
+
address@hidden
+auth_user_user_permissions
+
address@hidden
+django_admin_log
+
address@hidden
+django_content_type
+
address@hidden
+django_redirect
+
address@hidden
+django_session
+
address@hidden
+django_site
address@hidden itemize
+
address@hidden Index, Copying This Manual, Not Interesting, Top
address@hidden Index
+
address@hidden cp
+
address@hidden Copying This Manual,  , Index, Top
address@hidden GNU Free Documentation License
+
+FIXME: Insert GFDL here.
+
address@hidden

Index: rec/pkgblurbs.rec
===================================================================
RCS file: rec/pkgblurbs.rec
diff -N rec/pkgblurbs.rec
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ rec/pkgblurbs.rec   11 May 2019 10:44:54 -0000      1.1
@@ -0,0 +1,2855 @@
+# $Id: pkgblurbs.rec,v 1.1 2019/05/11 10:44:54 ineiev Exp $
+# Public domain.
+#
+# This file is maintained in the CVS repository of GNU womb,
+# http://cvs.savannah.gnu.org/viewvc/gnumaint/?root=womb
+#
+# This file specifies a short blurb for each GNU package.  These are
+# used by www.gnu.org, GSRC, and Guix.
+
+%rec: Blurb
+%doc: Extended package descriptions
+%key: id
+%mandatory: package blurb
+# Unless the blurb is a redirect or null (e.g. for a new package), it
+# should be at least 70 characters long.
+%constraint: blurb ~ ".{70,}" || blurb ~ "^redirect" || blurb ~ "^null"
+
+
+id: 3dldf_blurb
+package: 3dldf
+blurb: GNU 3DLDF supports 3D drawing with output to the MetaPost format via
++ a language similar to Metafont.  It is primarily
++ intended to provide a means of creating 3D content for TeX documents,
++ but it can also create animations containing text typeset by TeX.
+
+id: 8sync_blurb
+package: 8sync
+blurb: 8sync (pronounced "eight-sync") is an asynchronous programming library
++ for GNU Guile.  It makes use of delimited continuations to avoid a mess of
++ callbacks, resulting in clean, easy-to-read, non-blocking code.
+
+id: a2ps_blurb
+package: a2ps
+blurb: GNU a2ps converts almost anything to a PostScript file, ready for
++ printing.  It accomplishes this by being able to delegate files to
++ external handlers, such as Groff and Gzip.  It handles as many steps
++ as is necessary to produce a pretty-printed file.  It also includes
++ some extra abilities for special cases, such as pretty-printing
++ "--help" output.
+
+id: acct_blurb
+package: acct
+blurb: GNU acct provides a means for system administrators to determine
++ system usage patterns.  It provides information on, for example,
++ connections, programs executed, and system resources used.
+
+id: acm_blurb
+package: acm
+blurb: GNU ACM is a flight simulator in which players can compete in aerial
++ combat from different computers, piloting well-equipped jet aircraft
++ similar to an F-16C Falcon or a MiG-29 Fulcrum.
+
+id: adns_blurb
+package: adns
+blurb: GNU adns is a C library that provides easy-to-use DNS resolution
++ functionality.  The library is asynchronous, allowing several
++ concurrent calls.  The package also includes several command-line
++ utilities for use in scripts.
+
+id: alive_blurb
+package: alive
+blurb: GNU Alive sends periodic pings to a server, generally to keep a
++ connection alive.
+
+id: anubis_blurb
+package: anubis
+blurb: Anubis is a daemon that sits between the Mail User Agent (MUA) and
++ the Mail Transfer Agent (MTA).  When a mail is sent by a user in the
++ MUA, it is first passed to Anubis, which performs additional
++ processing to the message before passing it on for delivery by the
++ MTA.  Anubis may, for example, modify the message headers or body, or
++ encrypt or sign the message.
+
+id: apl_blurb
+package: apl
+blurb: GNU APL is a free interpreter for the programming language APL.  It is
++ an implementation of the ISO standard 13751.
+
+id: archimedes_blurb
+package: archimedes
+blurb: Archimedes is a free package for semiconductor device simulations.
++ It is intended to assist engineers in designing and simulating
++ submicron and mesoscopic semiconductor devices based on the Ensemble
++ Monte Carlo method.  It is able to handle a wide variety of materials
++ and structures, which are described through simple scripts.
+
+id: aris_blurb
+package: aris
+blurb: Aris is a program for performing logical proofs.  It supports
++ propositional and predicate logic, as well as Boolean algebra and
++ arithmetical logic.  In addition to its predefined inference and
++ equivalence rules, Aris also supports references to older proofs.
++ Its use of standard logical symbols and its natural deduction
++ interface make it easy to use for beginners.
+
+id: artanis_blurb
+package: artanis
+blurb: GNU Artanis is a web application framework written in Guile
++ Scheme.  A web application framework (WAF) is a software framework
++ that is designed to support the development of dynamic websites, web
++ applications, web services and web resources.  The framework aims to
++ alleviate the overhead associated with common activities performed in
++ web development.  Artanis provides several tools for web development:
++ database access, templating frameworks, session management,
++ URL-remapping for RESTful, page caching, and more.
+
+id: aspell_blurb
+package: aspell
+blurb: Aspell is a spell-checker which can be used either as a library or as
++ a standalone program.  Notable features of Aspell include its full
++ support of documents written in the UTF-8 encoding and its ability to
++ use multiple dictionaries, including personal ones.
+
+id: auctex_blurb
+package: auctex
+blurb: AUCTeX is an integrated environment for producing TeX documents in
++ Emacs.  It allows many different standard TeX macros to be inserted
++ with simple keystrokes or menu selection.  It offers an interface to
++ external programs, enabling you to compile or view your documents
++ from within Emacs.  AUCTeX also features the ability to place inline
++ previews of complex TeX statements such as mathematical formulae.
+
+id: autoconf_blurb
+package: autoconf
+blurb: Autoconf offers the developer a robust set of M4 macros which expand
++ into shell code to test the features of Unix-like systems and to
++ adapt automatically their software package to these systems.  The
++ resulting shell scripts are self-contained and portable, freeing the
++ user from needing to know anything about Autoconf or M4.
+
+id: autoconf_archive_blurb
+package: autoconf-archive
+blurb: Autoconf Archive is a collection of over 450 new macros for Autoconf,
++ greatly expanding the domain of its functionality.  These macros have
++ been contributed as free software by the community.
+
+id: autogen_blurb
+package: autogen
+blurb: AutoGen is a program to ease the maintenance of programs that contain
++ large amounts of repetitive text.  It automates the construction of
++ these sections of the code, simplifying the task of keeping the
++ text in sync.  It also includes an
++ add-on package called AutoOpts, which is specialized for the
++ maintenance and documentation of program options.
+
+id: automake_blurb
+package: automake
+blurb: Automake the part of the GNU build system for producing
++ standards-compliant Makefiles.  Build requirements are entered in an
++ intuitive
++ format and then Automake works with Autoconf to produce a robust
++ Makefile, simplifying the entire process for the developer.
+
+id: avl_blurb
+package: avl
+blurb: libavl provides a large collection of binary search tree and balanced
++ tree routines for C.  These trees offer at least O(log n) performance
++ for usually costly operations such as searching, inserting or
++ deleting items from a data structure.
+
+id: ballandpaddle_blurb
+package: ballandpaddle
+blurb: Ball and Paddle is a classic arcade game in which you use a paddle at
++ the bottom of the screen to bounce a ball against bricks in the upper
++ region, eliminating the bricks as they are hit.  As a novel twist,
++ events and attributes of all the objects (bricks, ball, etc.) may be
++ scripted with GNU Guile.
+
+id: barcode_blurb
+package: barcode
+blurb: GNU Barcode is a flexible tool to produce printed barcodes from text
++ strings.  It supports a variety of encoding standards and sizing
++ measurements.  Barcodes can be output in PostScript or Encapsulated
++ PostScript formats.
+
+id: bash_blurb
+package: bash
+blurb: Bash is the shell, or command-line interpreter, of the GNU system.  It
++ is compatible with the Bourne Shell, but it also integrates useful
++ features from the Korn Shell and the C Shell and new improvements of
++ its own.  It allows command-line editing, unlimited command history,
++ shell functions and aliases, and job control while still allowing
++ most sh scripts to be run without modification.
+
+id: bayonne_blurb
+package: bayonne
+blurb: Bayonne is the telephony server of the GNU Telephony project.  It
++ offers a scalable environment for the development and deployment of
++ telephony solutions, with a focus on SIP.
+
+id: bc_blurb
+package: bc
+blurb: bc is an arbitrary precision numeric processing language.  It
++ includes an interactive environment for evaluating mathematical
++ statements.  Its syntax is similar to that of C, so basic usage is
++ familiar.  It also includes "dc", a reverse-polish calculator.
+
+id: bfd_blurb
+package: bfd
+blurb: redirect binutils
+
+id: binutils_blurb
+package: binutils
+blurb: GNU Binutils is a collection of tools for working with binary files.
++ Perhaps the most notable are "ld", a linker, and "as", an assembler.
++ Other tools include programs to display binary profiling
++ information, list the strings in a binary file,
++ and utilities for working with archives.  The "bfd" library for
++ working with executable and object formats is also included.
+
+id: bison_blurb
+package: bison
+blurb: GNU Bison is a general-purpose parser generator.  It can build a
++ deterministic or generalized LR parser from an annotated,
++ context-free grammar.  It is versatile enough to have many
++ applications, from parsers for simple tools through complex
++ programming languages.
+
+id: bool_blurb
+package: bool
+blurb: GNU Bool is a utility to perform text searches on files using Boolean
++ expressions.  For example, a search for "hello AND world" would
++ return a file containing the phrase "Hello, world!".  It supports
++ both AND and OR statements, as well as the NEAR statement to search
++ for the occurrence of words in close proximity to each other.  It
++ handles context gracefully, accounting for new lines and paragraph
++ changes.  It also has robust support for parsing HTML files.
+
+id: bpel2owfn_blurb
+package: bpel2owfn
+blurb: GNU BPEL2oWFN translates a web service expressed in Web Service Business
++ Process Execution Language (WS-BPEL) into an open Workflow Net
++ (oWFN).  It may additionally convert a BPEL4Chor choreography to a
++ Petri Net model.  Properties of Petri Nets may be analyzed
++ efficiently, due to the use of static analysis to make the models
++ compact.  Control and data flow analysis, as well as basic checks for
++ deadlocks and other such properties are available.
+
+id: bazaar_blurb
+package: bazaar
+blurb: GNU Bazaar is a version control system that allows
++ you to record changes
++ to project files over time.
++ It supports both a distributed workflow
++ as well as the classic centralized workflow.
+
+id: c_graph_blurb
+package: c-graph
+blurb: GNU C-Graph is a tool for demonstrating the theory of convolution.  
Thus,
++ it can serve as an excellent aid to students of signal and systems
++ theory in visualizing the convolution process.  Rather than forcing
++ the student to write code, the program offers an intuitive interface
++ with interactive dialogs to guide them.
+
+id: ccaudio_blurb
+package: ccaudio
+blurb: GNU ccAudio2 is a portable C++ class for working with audio data from
++ disk.  The classes are both endian and content aware; rather than
++ treating audio as binary data, this library treats it as an sequence
++ of samples.  It can also handle metadata information.  ccAudio2
++ supports sun audio, raw samples, and RIFF encoded audio data.
+
+id: ccd2cue_blurb
+package: ccd2cue
+blurb: GNU ccd2cue is a preprocessor for CD burning software that allows
++ the conversion of the proprietary CCD format to the CUE format, which
++ is well-supported by free software.  These files are commonly
++ distributed with CD images and are used to describe how tracks are
++ laid out on the image.
+
+id: ccide_blurb
+package: ccide
+blurb: GNU Ccide is a decision table code generator for the C language.  This
++ helps to avoid unmanageable and error-prone chains of nested if-else
++ statements.  Instead, decision tables are entered in an intuitive and
++ easy-to-read format, which is then expanded into portable C code.
+
+id: ccrtp_blurb
+package: ccrtp
+blurb: GNU ccRTP is an implementation of RTP, the real-time transport protocol
++ from the IETF.  It is suitable both for high capacity servers and
++ personal client applications.  It is flexible in its design, allowing
++ it to function as a framework for the framework, rather than just
++ being a packet-manipulation library.
+
+id: ccscript_blurb
+package: ccscript
+blurb: GNU ccScript3 is a library to add a virtual machine execution system for
++ use with/as a scripting or assembler language for real-time,
++ state-transition driven systems.
+
+id: cfengine_blurb
+package: cfengine
+blurb: Cfengine, or the configuration engine, is an agent/software robot to
++ configure and administer large computer networks.  It also functions
++ as a high-level language for designing expert systems to perform such
++ tasks.  It consists of a primitive intelligence for defining and
++ automating the configuration and maintenance of the system state.
+
+id: cflow_blurb
+package: cflow
+blurb: GNU cflow analyzes C source files and produces a graph charting the
++ control flow of the program.  It can output the graph in several
++ styles and in either the POSIX format or in an extended GNU format.
++ cflow also includes a major mode for Emacs for examining the
++ flowcharts that it produces.
+
+id: cgicc_blurb
+package: cgicc
+blurb: GNU cgicc is an ANSI-compliant C++ library for writing CGI applications,
++ featuring support for FastCGI.  The library supports several features,
++ including handling both GET and POST data, handling a variety of form
++ data types, and on-the-fly HTML generation.
+
+id: chess_blurb
+package: chess
+blurb: GNU Chess is a chess engine.  It allows you to compete against the
++ computer in a game of chess, either through the default terminal
++ interface or via an external visual interface such as GNU XBoard.
+
+id: cim_blurb
+package: cim
+blurb: Cim is the GNU compiler for Simula, the first object-oriented
++ programming language.
+
+id: classpath_blurb
+package: classpath
+blurb: GNU Classpath provides essential libraries for Java virtual machines
++ and compilers.  It is compatible with a large percentage of the
++ language API specifications and provides a wide array of
++ functionality.
+
+id: classpathx_blurb
+package: classpathx
+blurb: null (inactive, mostly merged into classpath)
+
+id: clisp_blurb
+package: clisp
+blurb: GNU CLISP is an implementation of ANSI Common Lisp.  Common Lisp is a
++ high-level, object-oriented functional programming language.  CLISP
++ includes an interpreter, a compiler, a debugger, and much more.
+
+id: combine_blurb
+package: combine
+blurb: GNU combine works to merge files based on a common key in a hash table.
++ It can be seen as similar to, albeit much more powerful than, the
++ standard "join" utility.  Unlike "join", any number of files
++ may be merged based on the matches found.  combine also has other
++ advanced features, such as date parsing and directory traversal.
+
+id: commoncpp_blurb
+package: commoncpp
+blurb: GNU Common C++ is an portable, optimized class framework for
++ threaded applications, supporting concurrent synchronization,
++ inter-process communications via sockets, and various methods for data
++ handling, such as serialization and XML parsing.  It includes the uCommon
++ C++ library, a smaller reimplementation.
+
+id: complexity_blurb
+package: complexity
+blurb: GNU complexity provides tools for finding procedures that are
++ convoluted, overly long or otherwise difficult to understand.  This
++ may help in learning or reviewing unfamiliar code or perhaps
++ highlighting your own code that seemed comprehensible when you wrote it.
+
+id: config_blurb
+package: config
+blurb: The "config.guess" script tries to guess a canonical system triple,
++ and "config.sub" validates and canonicalizes.  These are used as part
++ of configuration in nearly all GNU packages (and many others).
+
+id: consensus_blurb
+package: consensus
+blurb: null (container for network work)
+
+id: coreutils_blurb
+package: coreutils
+blurb: GNU Coreutils includes all of the basic command-line tools that are
++ expected in a POSIX system.  These provide the basic file, shell and
++ text manipulation functions of the GNU system.  Most of these tools
++ offer extended functionality beyond that which is outlined in the
++ POSIX standard.
+
+id: cpio_blurb
+package: cpio
+blurb: GNU cpio copies files into or out of cpio or tar archives.
++ Indeed, many formats are supported, including legacy formats.  The
++ format is determined automatically by the program and is handled
++ appropriately.  Furthermore, the location of the archive is not
++ important.  It can be another file on the drive, a tape, or data on a
++ pipe.
+
+id: cppi_blurb
+package: cppi
+blurb: GNU Cppi processes C source code files to properly indent the
++ preprocessor directives to reflect their nesting.  It also performs
++ other standardizations, such as correcting the number of spaces
++ between directives and the text following them.
+
+id: cssc_blurb
+package: cssc
+blurb: GNU CSSC provides a replacement for the legacy Unix source code control
++ system SCCS.  This allows old code still under that system to be
++ accessed and migrated on modern systems.
+
+id: cursynth_blurb
+package: cursynth
+blurb: GNU cursynth is a polyphonic synthesizer that runs graphically
++ in the terminal.  It is built on a full-featured subtractive synthesis
++ engine.  Notes and parameter changes may be entered via MIDI or the
++ computer's keyboard.
+
+id: dap_blurb
+package: dap
+blurb: GNU Dap is a statistics and graphics package.  It can read programs
++ written for the proprietary statistics system SAS.  Its syntax is
++ similar to, but simpler than C, making performing most tasks
++ relatively easy while still providing advanced graphical
++ capabilities.
+
+id: datamash_blurb
+package: datamash
+blurb: Perform basic numeric, textual and statistical operations on
++ plain text files.  Designed to work within standard pipelines without
++ additional code.
+
+id: dc_blurb
+package: dc
+blurb: redirect bc
+
+id: dia_blurb
+package: dia
+blurb: redirect gnome
+
+id: direvent_blurb
+package: direvent
+blurb: A daemon that monitors directories for events, such as creating,
++ deleting or modifying files.  It can monitor different sets of
++ directories for different events.  When an event is detected, direvent
++ calls a specified external program with information about the event,
++ such as the location within the file system where it occurred.  Thus,
++ "direvent" provides an easy way to react immediately if given files
++ undergo changes, for example, to track changes in important system
++ configuration files.
+
+id: djgpp_blurb
+package: djgpp
+blurb: null (DOS-only package)
+
+id: dr_geo_blurb
+package: dr-geo
+blurb: null (stale)
+
+id: ddd_blurb
+package: ddd
+blurb: GNU DDD, the Data Display Debugger, is a graphical front-end for
++ command-line debuggers.  Many back-end debuggers are supported, notably
++ the GNU debugger, GDB.  In addition to usual debugging features
++ such as viewing the source files, DDD has additional graphical,
++ interactive features to aid in debugging.
+
+id: ddrescue_blurb
+package: ddrescue
+blurb: GNU ddrescue is a fully automated data recovery tool.  It copies data
++ from one file to another, working to rescue data in case of read
++ errors.  The program also includes a tool for manipulating its
++ log files, which are used to recover data more efficiently by only
++ reading the necessary blocks.
+
+id: dejagnu_blurb
+package: dejagnu
+blurb: DejaGnu is a framework for testing software.  In effect, it serves as
++ a front-end for all tests written for a program.  Thus, each program
++ can have multiple test suites, which are then all managed by a
++ single harness.
+
+id: denemo_blurb
+package: denemo
+blurb: GNU Denemo is a music notation editor that provides a convenient
++ interface to the powerful music engraving program Lilypond.  Music
++ can be typed in using the computer keyboard, played in using a MIDI
++ keyboard, or even input via a microphone connected to the sound card.
++ The final product is publication-quality music notation that is
++ continuously generated in the background while you work.
+
+id: dico_blurb
+package: dico
+blurb: GNU Dico implements a flexible dictionary server and client according
++ to RFC 2229 (DICT Server).  It is able to access any database
++ available, regardless of format, thanks to its modular structure.
++ New modules may be written in C, Guile or Python.  Dico also includes
++ a command-line client, which may be used to query remote dictionary
++ databases.
+
+id: diction_blurb
+package: diction
+blurb: A package providing two classic Unix commands, style and diction.
++ Diction is used to identify wordy and commonly misused phrases in a
++ body of text.  Style instead analyzes surface aspects of a written
++ work, such as sentence length and other readability measures.
+
+id: diffutils_blurb
+package: diffutils
+blurb: GNU Diffutils is a package containing tools for finding the
++ differences between files.  The "diff" command is used to show how two
++ files differ, while "cmp" shows the offsets and line numbers where they
++ differ.  "diff3" allows you to compare three files.  Finally, "sdiff"
++ offers an interactive means to merge two files.
+
+id: dionysus_blurb
+package: dionysus
+blurb: GNU Dionysus is a convenient system for quickly retrieving the values of
++ mathematical constants used in science and engineering.  Values can
++ be searched using a simple command-line tool, choosing from three
++ databases: universal constants, atomic numbers, and constants related
++ to semiconductors.
+
+id: dominion_blurb
+package: dominion
+blurb: GNU Dominion is a multi-player world simulation game.  In it,
++ each player rules a nation and must maintain their nation in the face
++ of competition from the other players.  Players must make political,
++ economical, military and diplomatic decisions in order for their
++ nations to survive.  This game is intended to be played by players all
++ with access to the same computer system.
+
+id: easejs_blurb
+package: easejs
+blurb: ease.js is a classical object-oriented framework for JavaScript,
++ intended to eliminate boilerplate code and ease the transition
++ to JavaScript from other object-oriented languages.
+
+id: ed_blurb
+package: ed
+blurb: Ed is a line-oriented text editor: rather than offering an overview
++ of a document, ed performs editing one line at a time.  It can be
++ executed both interactively and via shell scripts.  Its method of
++ command input allows complex tasks to be performed in an automated way.
++ GNU ed offers several extensions over the standard utility.
+
+id: edma_blurb
+package: edma
+blurb: GNU EDMA is a development environment that combines ideas from both
++ object-oriented programming and component-based systems.  It is used
++ to build modular, evolving applications as well as reusable
++ components.  EDMA provides a convenient means to build
++ object-oriented programs in C without requiring C++.
++ Also, it has a unique component system, unlike other free software
++ component-based systems which imitate the design of proprietary
++ counterparts.  It includes a graphical wizard, gidfwizard,
++ a tool for building GNU EDMA Interface
++ definition files and to create skeleton files necessary to build
++ EDMA classes, and a graphical class browser, gecb.
+
+id: electric_blurb
+package: electric
+blurb: GNU Electric is a CAD program for designing electrical circuits,
++ handling custom IC layout, schematic drawing and hardware
++ description language specifications.  Several CAD operations are
++ supported, such as rule checking and simulation.  Many different
++ types of designs can be produced and input or output in a wide
++ variety of formats.
+
+id: emacs_blurb
+package: emacs
+blurb: GNU Emacs is an extensible and highly customizable text editor.  It
++ is based on an Emacs Lisp interpreter with extensions for text
++ editing.  Emacs has been extended in essentially all areas of
++ computing, giving rise to a vast array of packages supporting, e.g.,
++ email, IRC and XMPP messaging, spreadsheets, remote server editing,
++ and much more.  Emacs includes extensive documentation on all
++ aspects of the system, from basic editing to writing large Lisp
++ programs.  It has full Unicode support for nearly all human
++ languages.
+
+id: emacs_muse_blurb
+package: emacs-muse
+blurb: Muse is an authoring and publishing environment for GNU Emacs.  It
++ supports entering text in a convenient and easy-to-learn format.
++ Later, your documents may be published in a variety of different
++ formats, such as HTML, LaTeX or PDF.  Muse supports projects
++ consisting of several documents, which are properly merged according
++ to the output format.
+
+id: emms_blurb
+package: emms
+blurb: EMMS is the Emacs Multimedia System.  It is a small front-end which
++ can control one of the supported external players.  Thus, it supports
++ whatever formats are supported by your music player.  It also
++ supports tagging and playlist management, all behind a clean and
++ light user interface.
+
+id: enscript_blurb
+package: enscript
+blurb: GNU Enscript is a program to convert ASCII text files to PostScript,
++ HTML or RTF formats, to be stored in files or sent immediately to a
++ printer.  It also includes the capability to perform syntax
++ highlighting for several different programming languages.
+
+id: eprints_blurb
+package: eprints
+blurb: null (skip, no evidence of GNU on web site)
+
+id: epsilon_blurb
+package: epsilon
+blurb: null (stale)
+
+id: fdisk_blurb
+package: fdisk
+blurb: GNU fdisk provides a GNU version of the common disk partitioning tool
++ fdisk.  fdisk is used for the creation and manipulation of disk
++ partition tables, and it understands a variety of different formats.
+
+id: ferret_blurb
+package: ferret
+blurb: GNU Ferret is a graphical data modeler for the Entity/Relationship
++ paradigm.  It can automatically create relational schemas from the
++ data models and it can be used to generate SQL statements in a
++ variety of dialects.
+
+id: findutils_blurb
+package: findutils
+blurb: Findutils supplies the basic file directory searching utilities of
++ the GNU system.  It consists of two primary searching utilities:
++ "find" recursively searches for files in a directory according to
++ given criteria and "locate" lists files in a database that match a
++ query.  Two auxiliary tools are included: "updatedb" updates the file
++ name database and "xargs" may be used to apply commands with arbitrarily
++ long arguments.
+
+id: fisicalab_blurb
+package: fisicalab
+blurb: GNU FisicaLab is an educational application for solving physics
++ problems.  Its main objective is allow the user to focus on physics
++ concepts, leaving aside the mathematical details.
+
+id: flex_manual_blurb
+package: flex manual
+blurb: null (stale)
+
+id: foliot_blurb
+package: foliot
+blurb: GNU Foliot is an application for keeping track of time spent working
++ on projects.
+
+id: fontopia_blurb
+package: fontopia
+blurb: Fontopia is an easy-to-use, text-based, console font editor. It's used
++ to edit the fonts that GNU/Linux uses to display text on text-based 
terminals.
++ Fontopia works on both PSF 1 & 2, BDF, Code Paged (CP) fonts, and Raw font
++ files. It provides a user-friendly, easy-to-use glyph editor and it can
++ easily change font metrics (e.g. length, width, and height) and convert
++ between different font formats.
+
+id: fontutils_blurb
+package: fontutils
+blurb: GNU Fontutils is a collection of programs for handling fonts.
++ Bitmaps can be extracted from scanned images of characters, edited,
++ and converted into outline fonts.  In general, Fontutils supports the
++ font formats supported by the TeX typesetting environment, including
++ PostScript Type 1 fonts.
+
+id: freedink_blurb
+package: freedink
+blurb: GNU FreeDink is a free and portable re-implementation of the engine
++ for the role-playing game Dink Smallwood.  It supports not only the
++ original game data files but it also supports user-produced game
++ mods or "D-Mods".  To that extent, it also includes a front-end for
++ managing all of your D-Mods.
+
+id: freefont_blurb
+package: freefont
+blurb: GNU FreeFont is a collection of scalable outline fonts that are
++ suitable for general computer use and for desktop publishing. A
++ serif, a sans serif and a monospace font are included, all available in both
++ TrueType and OpenType formats.  The fonts support a broad
++ range of characters for many different writing systems, and have
++ excellent coverage of mathematical notation.
+
+id: freeipmi_blurb
+package: freeipmi
+blurb: GNU FreeIPMI is a collection of in-band and out-of-band IPMI software
++ in accordance with the IPMI v1.5/2.0 specification.  These programs
++ provide a set of interfaces for platform management.  Common
++ functionality includes sensor monitoring, system event monitoring,
++ power control and serial-over-LAN.
+
+id: freetalk_blurb
+package: freetalk
+blurb: GNU Freetalk is a command-line Jabber/XMPP chat client.  It notably
++ uses the Readline library to handle input, so it features convenient
++ navigation of text as well as tab-completion of buddy names, commands
++ and English words.  It is also scriptable and extensible via Guile.
+
+id: fribidi_blurb
+package: fribidi
+blurb: GNU FriBidi is an implementation of the Unicode Bidirectional
++ Algorithm.  This algorithm is used to properly display text in
++ left-to-right or right-to-left ordering as necessary.
+
+id: ggolf_blurb
+package: g-golf
+blurb: G-Golf (Gnome: (Guile Object Library for)) is a library for developing
++ modern applications in Guile Scheme.  It comprises a direct binding to the
++ GObject Introspection API and higher-level functionality for importing Gnome
++ libraries and making GObject classes (and methods) available in Guile's 
++ object-oriented programming system, GOOPS.
+
+id: gama_blurb
+package: gama
+blurb: GNU Gama is a program for the adjustment of geodetic networks.  It is
++ useful in measurements where Global Positioning System (GPS) is not
++ available, such as underground.  It features the ability to adjust in
++ local Cartesian coordinates as well as partial support for
++ adjustments in global coordinate systems.
+
+id: garpd_blurb
+package: garpd
+blurb: GNU garpd broadcasts Gratuitous ARP (Address Resolution Protocol)
++ requests/replies for a list of MAC address <-> IP address mappings on
++ specified interfaces at regular intervals.  Gratuitous ARP request
++ packets are those where the source and the destination IPs are both
++ the IP of the requesting machine.  Gratuitous ARP replies are those
++ made without a corresponding request.
+
+id: gawk_blurb
+package: gawk
+blurb: Gawk is the GNU implementation of Awk, a specialized programming
++ language for the easy manipulation of formatted text, such as tables
++ of data.  Gawk features many extensions beyond the traditional
++ implementation, including network access, sorting, and large
++ libraries.
+
+id: gbehistun_blurb
+package: gbehistun
+blurb: GNU Behistun consists of software and utilities for geological
++ and geophysical modeling and mapping of internal structures and
++ dynamics.  Like the Behistun Multilingual Inscription, the Behistun
++ software utilities provide knowledge and functionality to work on
++ planetary systems and investigate their interior in freedom.
+
+id: gcal_blurb
+package: gcal
+blurb: Gcal is a program to calculate and print calendars on the
++ command-line.  Calendars can be printed in 1-month, 3-month or whole-year
++ views.  In addition, eternal holiday lists can be generated for many
++ countries, which can be complemented by user-made lists of fixed
++ dates to make an agenda.  Gcal can also calculate astronomical data,
++ such as the phases of the moon, and supports alternative calendar
++ formats: Julian, Gregorian, Islamic, Chinese and more.
+
+id: gcc_blurb
+package: gcc
+blurb: GCC is the GNU Compiler Collection.  It provides compiler front-ends
++ for several languages, including C, C++, Objective-C, Fortran, Java,
++ Ada, and Go.  It also includes runtime support libraries for these
++ languages.
+
+id: gcide_blurb
+package: gcide
+blurb: GCIDE is a free dictionary based on a combination of sources.  It can
++ be used via the GNU Dico program or accessed online at
++ http://gcide.gnu.org.ua/
+
+id: gcl_blurb
+package: gcl
+blurb: GCL is an implementation of the Common Lisp language.  It features
++ the ability to compile to native object code and to load native
++ object code modules directly into its lisp core.  It also features a
++ stratified garbage collection strategy, a source-level debugger and a
++ built-in interface to the Tk widget system.
+
+id: gcompris_blurb
+package: gcompris
+blurb: GCompris is a suite of educational software for children.  It
++ features a variety of activities suitable for kids aged 2 to 10 years
++ old.  The suite includes activities to introduce and develop skills
++ in computer use, algebra, science, reading and more.  It also
++ features some games such as chess and sudoku.
+
+id: gdb_blurb
+package: gdb
+blurb: GDB is the GNU debugger.  With it, you can monitor what a program is
++ doing while it runs or what it was doing just before a crash.  It
++ allows you to specify the runtime conditions, to define breakpoints,
++ and to change how the program is running to try to fix bugs.  It can
++ be used to debug programs written in C, C++, Ada, Objective-C, Pascal
++ and more.
+
+id: gdbm_blurb
+package: gdbm
+blurb: GDBM is a library for manipulating hashed databases.  It is used to
++ store key/value pairs in a file in a manner similar to the Unix dbm
++ library and provides interfaces to the traditional file format.
+
+id: gengen_blurb
+package: gengen
+blurb: GNU Gengen is a program to generate text-generators, i.e., functions
++ producing text with variable sections.  The text is first specified
++ by the user in a template file containing parameters, then processed by
++ gengen to create the text-generator.  At runtime, the variable text is
++ defined by the rest of the program and passed to the text-generator,
++ which then substitutes it into the template parameters and returns the
++ result.  Gengen can be used to generate C and C++ code.
+
+id: gengetopt_blurb
+package: gengetopt
+blurb: GNU Gengetopt is a program to generate a C/C++ function for parsing
++ command-line options using the getopt_long function found in GNU
++ libc, removing some of the tedium of this task for large programs
++ that accept many options.  The options parsed by the generated
++ function may be in both short (e.g., "-h") and long ("--help")
++ formats, as specified by the GNU coding standards.  Additionally, the
++ output of the standard options "--help" and "--version" is generated
++ automatically.
+
+id: gettext_blurb
+package: gettext
+blurb: GNU Gettext is a package providing a framework
++ for translating the textual output of programs into multiple
++ languages.  It provides translators with the means to create message
++ catalogs, as well as an Emacs mode to work with them, and a runtime
++ library to load translated messages from the catalogs.  Nearly all GNU
++ packages use Gettext.
+
+id: gforth_blurb
+package: gforth
+blurb: Gforth is a fast and portable implementation of the ANSI Forth
++ language.  It includes an editing mode for Emacs and an interpreter
++ featuring completion and history.  A generic virtual machine
++ environment, vmgen, is also included.
+
+id: gg_network_blurb
+package: gg-network
+blurb: null (group)
+
+id: ggradebook_blurb
+package: ggradebook
+blurb: GNU Gradebook is an application for teachers for tracking student
++ grades. It supports several grading styles, including American (A, B,
++ C, D, F) and European numeric scales.
+
+id: ghostscript_blurb
+package: ghostscript
+blurb: Ghostscript is an interpreter for the PostScript language and the PDF
++ file format.  It also includes a C library that implements the
++ graphics capabilities of the PostScript language.  It supports a wide
++ variety of output file formats and printers.
+
+id: gift_blurb
+package: gift
+blurb: The GNU Image-Finding Tool (GIFT) is a Content Based Image Retrieval
++ System.  It uses the content of images to perform queries on a
++ collection, enabling you to query by example.  Also, a tool to index
++ whole directory trees is included.
+
+id: gimp_blurb
+package: gimp
+blurb: GIMP is an application for image manipulation tasks such as photo
++ retouching, composition and authoring.  It supports all common image
++ formats as well as specialized ones.  It features a highly
++ customizable interface that is extensible via a plugin system.
+
+id: gimp_www_pages_blurb
+package: gimp www pages
+blurb: null (container)
+
+id: glean_blurb
+package: glean
+blurb: GNU glean is a modular system for self-study, considerably more
++ intricate than standard flash cards method.  It is very
++ customizable, allowing the user to define subjects of interest and
++ activities to study them.  For now, it has a text-based interface
++ inside the Guile REPL and an experimental web interface.
+
+id: gleem_blurb
+package: gleem
+blurb: GNU gleem is a library for Java and C++ offering a set of 3D
++ widgets that support direct user interaction with a 3D scene.  These
++ widgets are used to translate along a line, translate in a plane, and
++ do three-dimensional translation and rotation.
+
+id: glib_blurb
+package: glib
+blurb: redirect gnome
+
+id: global_blurb
+package: global
+blurb: GNU GLOBAL is a source code tagging system that functions in the same 
way
++ across a wide array of environments, such as different text editors,
++ shells and web browsers.  The resulting tags are useful for quickly
++ moving around in a large, deeply nested project.
+
+id: glpk_blurb
+package: glpk
+blurb: GLPK is a C library for solving large-scale linear programming (LP),
++ mixed integer programming (MIP), and other related problems.  It
++ supports the GNU MathProg modeling language, a subset of the AMPL
++ language, and features a translator for the language.  In addition to
++ the C library, a stand-alone LP/MIP solver is included in the
++ package.
+
+id: glue_blurb
+package: glue
+blurb: null (stale)
+
+id: gmediaserver_blurb
+package: gmediaserver
+blurb: GMediaServer is a UPnP-compatible media server.  It serves audio and
++ video files to network-connected media players via a command-line
++ program that runs in the background.
+
+id: gmp_blurb
+package: gmp
+blurb: GMP is a library for arbitrary precision arithmetic, operating on
++ signed integers, rational numbers and floating point numbers.  The
++ precision is only limited by the available memory.  The library is
++ highly optimized, with a design focus on execution speed.  It is
++ aimed at use in, for example, cryptography and computational algebra.
+
+id: gnash_blurb
+package: gnash
+blurb: Gnash is a free Flash movie player.  It supports SWF version v7 and
++ some of v8 and v9.  It is possible to configure Gnash to use several
++ different audio or video backends, ensuring good performance.
+
+id: gnat_blurb
+package: gnat
+blurb: redirect gcc
+
+id: gnats_blurb
+package: gnats
+blurb: GNATS is a set of tools for tracking bugs and other user-reported
++ software issues.  It is completely open-ended in how its database may
++ be queried, edited and maintained, featuring interfaces ranging from
++ the command-line to Emacs, though the main means of interaction is
++ via its web interface.  It is also flexible enough to support
++ user-made utilities.
+
+id: gnatsweb_blurb
+package: gnatsweb
+blurb: redirect gnats
+
+id: gneuralnetwork_blurb
+package: gneuralnetwork
+blurb: Gneural Network implements a programmable neural network.  It
++ currently supports feed-forward networks which can learn simple tasks such
++ as curve-fitting.
+
+id: gnome_blurb
+package: gnome
+blurb: GNOME is the graphical desktop for GNU.  It includes a wide
++ variety of applications for browsing the web, editing text and images,
++ creating documents and diagrams, playing media, scanning, and much
++ more.
+
+id: gnowsys_blurb
+package: gnowsys
+blurb: null (stale)
+
+id: gnu_c_manual_blurb
+package: gnu-c-manual
+blurb: This is a reference manual for the C programming language, as
++ implemented by the GNU C Compiler (gcc).  As a reference, it is not
++ intended to be a tutorial of the language.  Rather, it outlines all
++ of the constructs of the language.  Library functions are not
++ included.
+
+id: gnu_crypto_blurb
+package: gnu-crypto
+blurb: null (inactive, mostly merged in classpath)
+
+id: gnu_pw_mgr_blurb
+package: gnu-pw-mgr
+blurb: This program is designed to make it easy to reconstruct difficult
++ passwords when they are needed while limiting the risk of attack.  The
++ user of this program inputs a self-defined transformation of a web
++ site URL and obtains the password and user name hint for that web
++ site.
+
+id: gnuae_blurb
+package: gnuae
+blurb: null (stale)
+
+id: gnuastro_blurb
+package: gnuastro
+blurb: null (newpkg/20150216)
+
+id: gnubatch_blurb
+package: gnubatch
+blurb: GNUbatch is an advanced batch scheduling system.  It executes
++ computational jobs at specified dates and times or according to
++ interdependencies.  The jobs may be completed on any number of
++ processors shared across a network.  Full access-control of the jobs
++ is supported.
+
+id: gnubg_blurb
+package: gnubg
+blurb: The GNU backgammon application can be used for playing, analyzing
++ and teaching the game.  It has an advanced evaluation engine based on
++ artificial neural networks suitable for both beginners and advanced
++ players.  In addition to a command-line interface, it also features an
++ attractive, 3D representation of the playing board.
+
+id: gnubiff_blurb
+package: gnubiff
+blurb: GNUbiff is a program that checks for mail and notifies you when new
++ messages arrive.  It supports multiple mailboxes which may be
++ accessed via a variety of methods such as POP3, IMAP, MH and
++ mailfiles.  Graphical notifications are provided with GTK and
++ complete integration with GNOME is supported.
+
+id: gnubik_blurb
+package: gnubik
+blurb: GNUbik is a puzzle game in which you must manipulate a cube to make
++ each of its faces have a uniform color.  The game is customizable,
++ allowing you to set the size of the cube (the default is 3x3) or to
++ change the colors.  You may even apply photos to the faces instead of
++ colors.  The game is scriptable with Guile.
+
+id: gnucap_blurb
+package: gnucap
+blurb: GNUcap is a circuit analysis package.  It offers a general purpose
++ circuit simulator and can perform DC and transient analyses, fourier
++ analysis and AC analysis.  The engine is designed to do true
++ mixed-mode simulation.
+
+id: gnucash_blurb
+package: gnucash
+blurb: GnuCash is personal and professional financial-accounting
++ software.  It can be used to track bank accounts, stocks, income and
++ expenses, based on the double-entry accounting practice.  It includes
++ support for QIF/OFX/HBCI import and transaction matching.  It also
++ automates several tasks, such as financial calculations or scheduled
++ transactions.
+
+id: gnucobol_blurb
+package: gnucobol
+blurb: null (stale)
+
+id: gnucomm_blurb
+package: gnucomm
+blurb: Telecom subsystem of the GNU Project: umbrella project for
++ GNU Telephony software, currently Bayonne, SIP Witch, and their
++ supporting libraries (Common C++ / uCommon, ccAudio, ccScript,
++ ccRTP and ZRTP / ZRTP4J).
+
+id: gnudos_blurb
+package: gnudos
+blurb: GnuDOS is a set of programs designed to help new users of the GNU
++ system in growing accustomed to the system, particularly users who
++ might be coming from a DOS background.  It consists of a file manager,
++ a text editor and a form designer for the console as well as a core
++ library for building similar utilities.
+
+id: gnue_blurb
+package: gnue
+blurb: GNU Enterprise supports enterprise planning.  It includes an
++ application server, common development library, an IDE for designing
++ data forms, forms interface, navigator and menu system, and data
++ reporting system.
+
+id: gnufm_blurb
+package: gnufm
+blurb: null (stale)
+
+id: gnugo_blurb
+package: gnugo
+blurb: GNU Go is a program that plays the game of Go, in which players place
++ stones on a grid to form territory or capture other stones.  While it
++ can be played directly from the terminal, rendered in ASCII
++ characters, it is also possible to play GNU Go with 3rd party
++ graphical interfaces or even in Emacs.  It supports the standard
++ game storage format (SGF, Smart Game Format) and inter-process
++ communication format (GMP, Go Modem Protocol).
+
+id: gnuit_blurb
+package: gnuit
+blurb: The GNU Interactive Tools are a set of lightweight, interactive
++ command-line tools.  They include an extensible, orthodox (two-pane)
++ file manager, an ASCII/hex file viewer, and a process viewer/killer.
++ The package also includes some related utilities and scripts, such as
++ a tool to decompress any type of archive file.  All the
++ tools can be enhanced and extended through their configuration files
++ to perform new commands.
+
+id: gnujdoc_blurb
+package: gnujdoc
+blurb: null (container for Japanese translations)
+
+id: gnujump_blurb
+package: gnujump
+blurb: GNUjump is a simple, yet addictive game in which you must jump from
++ platform to platform to avoid falling, while the platforms drop at
++ faster rates the higher you go.  The game features multiplayer,
++ unlimited FPS, smooth floor falling, themeable graphics and sounds,
++ and replays.
+
+id: gnukart_blurb
+package: gnukart
+blurb: null (stale)
+
+id: gnulib_blurb
+package: gnulib
+blurb: Gnulib is a central location for common infrastructure needed by
++ GNU packages.  It provides a wide variety of functionality, e.g.,
++ portability across many systems, working with Unicode strings,
++ cryptographic computation, and much more.  The code is intended to be
++ shared at the level of source files, rather than being a standalone
++ library that is distributed, built, and installed.  The included
++ "gnulib-tool" script helps with using Gnulib code in other packages.
++ Gnulib also includes copies of licensing and maintenance-related
++ files, for convenience.
+
+id: gnumach_blurb
+package: gnumach
+blurb: redirect hurd
+
+id: gnumed_blurb
+package: gnumed
+blurb: GNUmed is Electronic Medical Record software, supporting
++ paperless medical practices.  Several interface languages are supported.
+
+id: gnumeric_blurb
+package: gnumeric
+blurb: GNUmeric is a GNU spreadsheet application, running under
++ GNOME.  It is interoperable with other spreadsheet applications.  It
++ has a vast array of features beyond typical spreadsheet functionality,
++ such as support for linear and non-linear solvers, statistical
++ analysis, and telecommunication engineering.
+
+id: gnump3d_blurb
+package: gnump3d
+blurb: GNUMP3d is a streaming server for MP3 and Ogg Vorbis audio files,
++ movies, and other media formats.  It is small and self-contained,
++ presenting a simple, themeable HTML interface.  The audio files can
++ then be played in any player that supports streaming over HTTP.
+
+id: gnun_blurb
+package: gnun
+blurb: GNUnited Nations is a build system for translating the web site at
++ www.gnu.org.  It works via template files, which allow changes to be
++ merged into individual translations of a page, from which the final
++ HTML is generated.  In effect, this helps to keep all translations of
++ a page up-to-date.
+
+id: gnunet_blurb
+package: gnunet
+blurb: GNUnet is a framework for secure peer-to-peer networking.  The
++ high-level goal is to provide a strong foundation of free software for a
++ global, distributed network that provides security and privacy.  GNUnet
++ in that sense aims to replace the current internet protocol stack.  Along
++ with an application for secure publication of files, it has grown to include
++ all kinds of basic applications for the foundation of a GNU internet.
+
+id: gnupg_blurb
+package: gnupg
+blurb: The GNU Privacy Guard is a complete implementation of the OpenPGP
++ standard.  It is used to encrypt and sign data and communication.  It
++ features powerful key management and the ability to access public key
++ servers.  It includes several libraries: libassuan (IPC between GnuPG
++ components), libgpg-error (centralized GnuPG error values), and libskba
++ (working with X.509 certificates and CMS data).
+
+id: gnupod_blurb
+package: gnupod
+blurb: GNUpod is a collection of scripts for using iPods with GNU/Linux and
++ other operating systems.  It can be used for transferring music and
++ cover art, searching files, removing files, editing tags,
++ creating playlists and more.
+
+id: gnuprologjava_blurb
+package: gnuprologjava
+blurb: GNU Prolog for Java is an implementation of the ISO Prolog standard
++ as a Java library (gnu.prolog).  Thus, with it you can use Prolog
++ from within Java programs.
+
+id: gnuradio_blurb
+package: gnuradio
+blurb: GNU Radio is a toolkit for implementing software radios.  Its signal
++ processing blocks can be combined with low-cost external RF hardware
++ to create software-defined radios.  Without hardware, it can be used
++ for simulation.  Radio applications are primarily written in Python,
++ with C++ support for performance-critical processing tasks.
+
+id: gnurobots_blurb
+package: gnurobots
+blurb: GNU Robots is a game in which you program a robot to explore a world
++ full of enemies that can hurt it, obstacles and food to be eaten.
++ The goal of the game is to stay alive and collect prizes.  The robot
++ program conveniently may be written in a plain text file in the
++ Scheme programming language.
+
+id: gnuschool_blurb
+package: gnuschool
+blurb: GNUschool is a web application for students, teachers and school
++ administrators.  With it, teachers can create tests for the students
++ to take online, give feedback and assign grades.  School
++ administrators can use it to monitor student attendance and edit
++ student information.
+
+id: gnushogi_blurb
+package: gnushogi
+blurb: GNU Shogi is a program that plays the game Shogi (Japanese Chess).
++ It also includes a graphical interface to the game.  While similar to
++ standard chess, this variant is far more complicated.
+
+id: gnusound_blurb
+package: gnusound
+blurb: GNUsound is a multitrack sound editor for GNOME 1 and 2.  It can read
++ and write many audio file formats such as WAV, MP3 and FLAC.  It can
++ work with the OSS, ALSA or JACK audio backends.  It provides many
++ different built-in audio processing modules, such as fades in/out,
++ delay, and filters.  GLADSPA plugins may also be used for further
++ processing.
+
+id: gnuspeech_blurb
+package: gnuspeech
+blurb: null (stale)
+
+id: gnuspool_blurb
+package: gnuspool
+blurb: GNUspool is an advanced print spooling system.  In addition to the
++ functionality of the standard printing system, it provides
++ post-processing capabilities, form type handling, alignment pages and
++ other features.  It functions transparently on a network, sharing jobs
++ on any host with printers on any other host.  Several user different
++ interfaces are available.
+
+id: gnustandards_blurb
+package: gnustandards
+blurb: null (infrastructure doc)
+
+id: gnustep_blurb
+package: gnustep
+blurb: GNUstep is a fully-functional object-oriented development
++ environment; a number of user applications are also
++ included.  It closely follows the Cocoa APIs but is
++ platform-independent.
+
+id: gnutls_blurb
+package: gnutls
+blurb: GnuTLS is a secure communications library implementing the SSL, TLS
++ and DTLS protocols.  It is provided in the form of a C library to support
++ the protocols, as well as to parse and write X.5009, PKCS 12, OpenPGP
++ and other required structures.
+
+id: gnutrition_blurb
+package: gnutrition
+blurb: GNUtrition is a free nutrition analysis software.  With it, one can
++ keep track of the nutritional information of food.  The software uses
++ the Nutrient Database of Standard Reference of the US Department of
++ Agriculture as a source of food nutrient information.
+
+id: gnuzilla_blurb
+package: gnuzilla
+blurb: redirect icecat
+
+id: goptical_blurb
+package: goptical
+blurb: Goptical is a library for optical design and simulation in C++.  It
++ provides model classes for optical components, surfaces and
++ materials.  With it, one can simulate building an optical system by
++ creating and placing optical components in a 3d space, and visualize light
++ propagating through the system.
+
+id: gorm_blurb
+package: gorm
+blurb: redirect gnustep
+
+id: gpaint_blurb
+package: gpaint
+blurb: GNU Paint is a simple, easy-to-use paint program for the GNOME
++ environment.  It supports drawing freehand as well as basic shapes
++ and text.  It features cut-and-paste for irregular regions or
++ polygons.
+
+id: gperf_blurb
+package: gperf
+blurb: gperf is a perfect hash function generator.  For a given list of
++ strings, it produces a hash function and hash table in C or C++ code.
++ That the hash function is perfect means that no collisions can exist
++ and that look-ups can be made by single string comparisons.
+
+id: gprolog_blurb
+package: gprolog
+blurb: GNU Prolog is a standards-compliant Prolog compiler with constraint
++ solving over finite domains.  It accepts Prolog+ constraint programs
++ and produces a compiled, native binary which can function in a
++ stand-alone manner.  It also features an interactive interpreter.
+
+id: grabcomics_blurb
+package: grabcomics
+blurb: phpGrabComics is a program that fetches and saves comic strips from
++ the web.  It features both a server, which can download strips from
++ different sources, and ports, tiny applications which get the list of
++ available comics from the server.
+
+id: greg_blurb
+package: greg
+blurb: GNU Greg is a framework for testing programs and libraries.  It provides
++ a single front-end for all tests of a package as well as a simple
++ framework for writing the tests.  It is loaded as a Guile module into
++ any software with an embedded Guile interpreter.  It also provides a
++ compiled module that may be dynamically linked into Guile to permit
++ testing external programs.
+
+id: grep_blurb
+package: grep
+blurb: grep is a tool for finding text inside files.  Text is found by
++ matching a pattern provided by the user in one or many files.  The
++ pattern may be provided as a basic or extended regular expression, or
++ as fixed strings.  By default, the matching text is simply printed to
++ the screen, however the output can be greatly customized to include,
++ for example, line numbers.  GNU grep offers many extensions over the
++ standard utility, including, for example, recursive directory
++ searching.
+
+id: gretl_blurb
+package: gretl
+blurb: GNU Gretl is a package for performing statistical computations for
++ econometrics.  It consists of both a command-line client and a
++ graphical client.  It features a variety of estimators such as
++ least-squares and maximum likelihood; several time series methods such
++ as ARIMA and GARCH; limited dependent variables such as logit,
++ probit and tobit; and a powerful scripting language.  It can output
++ models as LaTeX files.  It also may be linked to
++ GNU R and GNU Octave for further data analysis.
+
+id: groff_blurb
+package: groff
+blurb: Groff is a typesetting package that reads plain text and produces
++ formatted output based on formatting commands contained within the
++ text.  It is usually the formatter of "man" documentation pages.
+
+id: grub_blurb
+package: grub
+blurb: GRUB is a multiboot bootloader.  It is used for initially loading
++ the kernel of an operating system and then transferring control to
++ it.  The kernel then goes on to load the rest of the operating system.
++ As a multiboot bootloader, GRUB handles the presence of multiple
++ operating systems installed on the same computer; upon booting the
++ computer, the user is presented with a menu to select one of the
++ installed operating systems.
+
+id: gsasl_blurb
+package: gsasl
+blurb: GNU SASL is an implementation of the Simple Authentication and
++ Security Layer framework.  On network servers such as IMAP or SMTP
++ servers, SASL is used to handle client/server authentication.  This
++ package contains both a library and a command-line tool to access the
++ library.
+
+id: gsegrafix_blurb
+package: gsegrafix
+blurb: GSEGrafix is an application which produces high-quality graphical
++ plots for science and engineering.  Plots are specified via simple
++ ASCII parameter files and data files and are presented in an
++ anti-aliased GNOME canvas.  The program supports rectangular
++ two-dimensional plots, histograms, polar-axis plots and three-dimensional
++ plots.  Plots can be printed or saved to BMP, JPEG or PNG image
++ formats.
+
+id: gsl_blurb
+package: gsl
+blurb: The GNU Scientific Library is a library for numerical analysis in C
++ and C++.  It includes a wide range of mathematical routines, with
++ over 1000 functions in total.  Subject areas covered by the library
++ include: differential equations, linear algebra, Fast Fourier
++ Transforms and random numbers.
+
+id: gslip_blurb
+package: gslip
+blurb: GNU Slip is a functional extension of the capabilities provided
++ in the C++ Standard Template Library (STL) list and queue containers,
++ though SLIP is not a replacement for the STL containers.  SLIP data
++ cells can be used in application-specific computations, among other
++ enhancements.
+
+id: gsrc_blurb
+package: gsrc
+blurb: GSRC supports installing the latest releases of GNU packages on
++ an existing system.  New versions are installed in a separate
++ place so as not to interfere with the system versions.  The goal is to
++ make it easier to work with the original, upstream, GNU sources, and
++ perhaps help with development and testing.
+
+id: gss_blurb
+package: gss
+blurb: The GNU Generic Security Service provides a free implementation of
++ the GSS-API specification.  It provides a generic application
++ programming interface for programs to access security services.
++ Security services present a generic, GSS interface, with which the
++ calling application interacts via this library, freeing the
++ application developer from needing to know about the underlying
++ security implementation.
+
+id: gtick_blurb
+package: gtick
+blurb: GTick is a metronome application.  It supports different meters, such
++ as 2/4, 3/4, 4/4, etc.  It also supports a wide range of speeds, from
++ 10 to 1000 BPM. It provides a GTK+-based user interface and it can
++ use both OSS and ALSA as the audio back-end.
+
+id: gtk+_blurb
+package: gtk+
+blurb: redirect gnome
+
+id: gtypist_blurb
+package: gtypist
+blurb: GNU Typist is a universal typing tutor.  It can be used to learn and
++ practice touch-typing.  Several tutorials are included; in addition
++ to tutorials for the standard QWERTY layout, there are also tutorials
++ for the alternative layouts Dvorak and Colemak, as well as for the
++ numpad.  Tutorials are primarily in English, however some in other
++ languages are provided.
+
+id: guile_blurb
+package: guile
+blurb: Guile is the GNU Ubiquitous Intelligent Language for Extensions, the
++ official extension language of the GNU system.  It is an
++ implementation of the Scheme language which can be easily embedded
++ in other applications to provide a convenient means of extending the
++ functionality of the application without requiring the source code to
++ be rewritten.
+
+id: guile_cv_blurb
+package: guile-cv
+blurb: Guile-CV is a Computer Vision functional programming library for the
++ Guile Scheme language. Guile-CV is based on Vigra (Vision with Generic
++ Algorithms). It comprises a direct binding to vigra_c (a C wrapper
++ to a subset of the Vigra library), and a higher level API written in
++ Guile Scheme.
+
+id: guile_dbi_blurb
+package: guile-dbi
+blurb: guile-dbi is a library for Guile that provides a convenient interface
++ to SQL databases.  Database programming with guile-dbi is generic in
++ that the same programming interface is presented regardless of which
++ database system is used.  It currently supports MySQL, Postgres and
++ SQLite3.
+
+id: guile_opengl_blurb
+package: guile-opengl
+blurb: Guile-OpenGL is a library for Guile that provides bindings to the
++ OpenGL graphics API.
+
+id: guile_gnome_blurb
+package: guile-gnome
+blurb: Includes guile-clutter, guile-gnome-gstreamer,
++ guile-gnome-platform (GNOME developer libraries), and guile-gtksourceview.
+
+id: guile_ncurses_blurb
+package: guile-ncurses
+blurb: guile-ncurses provides Guile language bindings for the ncurses library.
+
+id: guile_rpc_blurb
+package: guile-rpc
+blurb: null (stale)
+
+id: guile_sdl_blurb
+package: guile-sdl
+blurb: Guile-SDL is a set of bindings to the Simple DirectMedia Layer (SDL).
++ With them, Guile programmers can have easy access to graphics, sound
++ and device input (keyboards, joysticks, mice, etc.).
+
+id: guix_blurb
+package: guix
+blurb: GNU Guix is a functional package manager for the GNU system, and is
++ also a distribution thereof.  It includes a virtual machine image.
++ Besides the usual package management features, it also supports
++ transactional upgrades and roll-backs, per-user profiles, and much more.
++ It is based on the Nix package manager.
+
+id: gurgle_blurb
+package: gurgle
+blurb: GURGLE produces database report listings from record and field
++ information from a file.  It uses the report to produce
++ (La)TeX-formatted output, plain ASCII text, troff, PostScript, HTML, XML,
++ or any other ASCII-based output format.  It may be used for producing
++ large bodies of text where small parts of the text are substituted
++ with information from the database.  GURGLE supports GNUSQL,
++ PostgreSQL, MySQL and CA-Ingres databases.
+
+id: gv_blurb
+package: gv
+blurb: GNU GV is a graphical user interface to the Ghostscript interpreter.
++ With it, one can view and navigate through PostScript and PDF
++ documents in X Windows.
+
+id: gvpe_blurb
+package: gvpe
+blurb: The GNU Virtual Private Ethernet creates a virtual network
++ with multiple nodes using a variety of transport protocols.  It works
++ by creating encrypted host-to-host tunnels between multiple
++ endpoints.
+
+id: gwl_blurb
+package: gwl
+blurb: GWL is a workflow language that extends Guix's declarative language
++ for package management to automate execution of programs.  Additionally,
++ GWL can use Grid Engine to offload program execution.
+
+id: gxmessage_blurb
+package: gxmessage
+blurb: GNU gxmessage is a program that pops up dialog windows, which display a
++ message to the user and waits for their action.  The program then
++ exits with an exit code corresponding to the response.
+
+id: gzip_blurb
+package: gzip
+blurb: GNU Gzip provides data compression and decompression utilities;
++ the typical extension is ".gz".  Unlike the "zip" format, it
++ compresses a single file; as a result, it is often used in conjunction
++ with "tar", resulting in ".tar.gz" or ".tgz", etc.
+
+id: halifax_blurb
+package: halifax
+blurb: HaliFAX supports sending and viewing faxes, including
++ a wrapper around the "lpr" command.
+
+id: health_blurb
+package: health
+blurb: GNU Health is a free medical software system, including support
++ for electronic medical records (EMR), a hospital information system
++ (HIS), and health information system.  It supports both Spanish and
++ English interfaces.  It has been adopted by the United Nations
++ University for implementation and training, and several hospitals and
++ health ministries around the world.
+
+id: hello_blurb
+package: hello
+blurb: GNU Hello prints the message "Hello, world!" and then exits.  It
++ serves as an example of standard GNU coding practices.  As such, it
++ supports command-line arguments, multiple languages, and so on.
+
+id: help2man_blurb
+package: help2man
+blurb: GNU help2man is a program that converts the output of standard "--help"
++ and "--version" command-line arguments into a manual page
++ automatically.
+
+id: hp2xx_blurb
+package: hp2xx
+blurb: GNU hp2xx converts vector graphics specified in the HP-GL plotter
++ language into a variety of graphical formats, both vector- and
++ raster-based, including EPS, PCX, IMG, and formats intended for use
++ within TeX documents.
+
+id: html_info_blurb
+package: html-info
+blurb: null (does not exist yet)
+
+id: httptunnel_blurb
+package: httptunnel
+blurb: GNU httptunnel creates a bidirectional data path tunneled in HTTP
++ requests.  This allows users behind firewalls to send and receive
++ data that would otherwise be blocked, such as telnet or ssh
++ connections.
+
+id: hurd_blurb
+package: hurd
+blurb: The Hurd is the kernel for the GNU system, a replacement and
++ augmentation of standard Unix kernels.  It is a collection of
++ protocols for system interaction (file systems, networks,
++ authentication), and servers implementing them.  Subprojects include Mach,
++ the microkernel on which the Hurd is based, which provides a basic
++ inter-process communication mechanism, and MIG, an interface generator
++ for Mach.
+
+id: hyperbole_blurb
+package: hyperbole
+blurb: Hyperbole is a programmable information and hypertext system for
++ GNU Emacs.  It allows hypertext to be embedded within documents, mail
++ messages and news articles.  This permits mouse-based control of
++ the displayed information.
+
+id: icecat_blurb
+package: icecat
+blurb: IceCat is the GNU version of the Firefox browser.  It is entirely
++ free software, which does not recommend non-free plugins and addons.
++ It also features built-in privacy-protecting features.
+
+id: idutils_blurb
+package: idutils
+blurb: The GNU idutils package includes tools to create an index of
++ textual tokens used in a list of file names and then to query that
++ index.  Thus, it allows the user to, for example, find all the uses of
++ a particular function in a large programming project.  In addition to
++ handling textual tokens, it can also handle numeric constants and the
++ contents of character strings.
+
+id: ignuit_blurb
+package: ignuit
+blurb: Ignuit is a tool for aiding in the memorization of new information
++ based on the Leitner flashcard system.  In this system, new cards are
++ studied with decreasing frequency as they grow older, unless you
++ encounter difficulty memorizing them, after which you encounter them
++ more often.  Cards can include embedded audio, images and
++ mathematical formulae and a card collection can be exported to
++ several formats.
+
+id: indent_blurb
+package: indent
+blurb: Indent is a program that makes source code easier to read by
++ reformatting it in a consistent style.  It can change the style to
++ one of several different styles such as GNU, BSD or K&R.  It has some
++ flexibility to deal with incomplete or malformed syntax.  GNU indent
++ offers several extensions over the standard utility.
+
+id: inetutils_blurb
+package: inetutils
+blurb: Inetutils is a collection of common network programs, such as an ftp
++ client and server, a telnet client and server, and an rsh client and
++ server.
+
+id: inklingreader_blurb
+package: inklingreader
+blurb: GNU InklingReader is a package to support the
++ Wacom Inkling device, including data conversion to various free formats,
++ basic editing features, and an Inkscape plugin.
+
+id: intlfonts_blurb
+package: intlfonts
+blurb: GNU intlfonts contains free X11 fonts in the BDF and TrueType formats.
++ They notably cover a large number of characters from different
++ writing systems: European, Asian, Chinese, Japanese, Korean, Ethiopic
++ and others.
+
+id: jacal_blurb
+package: jacal
+blurb: GNU JACAL is an interactive symbolic mathematics program based on
++ Scheme.  It manipulate and simplify a range of mathematical
++ expressions such as equations, scalars, vectors, and matrices.
+
+id: java_getopt_blurb
+package: java-getopt
+blurb: java-getopt provides a Java port of the GNU getopt function from
++ glibc.  It supports parsing both long and short command-line
++ arguments in a flexible manner, which is completely compatible with
++ the C version.
+
+id: jtw_blurb
+package: jtw
+blurb: GNU Java Training wheels provides a less steep learning curve
++ for learning to program in Java.  The system is powered by
++ a preprocessor that adds features to Java such as a superfor
++ macro and a file inclusion system much like the C language's
++ preprocessor.
+
+id: jel_blurb
+package: jel
+blurb: GNU JEL is a library that lets a program accept user-defined expressions
++ to be entered and evaluated at runtime.  In fact, the expressions are
++ compiled by JEL to Java bytecode to avoid the performance penalty of
++ adding interpreted expressions to an already-interpreted language.
+
+id: jwhois_blurb
+package: jwhois
+blurb: GNU jwhois is a client for the WHOIS protocol, which allows you to query
++ the owner of a domain name.  The program uses an extensible
++ configuration file to determine the most appropriate server to query
++ and, upon success displays the result to the user, otherwise it can
++ optionally redirect the query to another server.
+
+id: kawa_blurb
+package: kawa
+blurb: GNU Kawa is an implementation of the Scheme programming language that is
++ built on top of the Java platform.  It is thus conveniently
++ integrated with Java and benefits from this by having a compiler,
++ optional static typing, and so on.  Kawa also serves as a framework for
++ implementing other programming languages on the Java platform.
++ Included in Kawa is qexo, a partial implementation of XQuery in Java.
+
+id: kopi_blurb
+package: kopi
+blurb: null (stale)
+
+id: leg_blurb
+package: leg
+blurb: GNU Leg is a set of libraries for game engines and game development.
++ In addition to the libraries, it also includes resource editors
++ designed to make game creation easier.  The package is designed to be
++ generic and modular, supporting many different styles of games.
+
+id: less_blurb
+package: less
+blurb: GNU less is a pager, a program that allows you to view large amounts
++ of text in page-sized chunks.  Unlike traditional pagers, it allows
++ both backwards and forwards movement through the document.  It also
++ does not have to read the entire input file before starting, so it
++ starts faster than most text editors.
+
+id: libc_blurb
+package: libc
+blurb: The GNU C Library is the standard C library of the GNU system.  It
++ defines the system calls and other basic functionality necessary to
++ write programs in the C language.  It handles low-level functionality
++ that communicates with the kernel, such as process and file
++ management, as well as higher-level functionality such as string
++ manipulation or command-line argument handling.
+
+id: libcdio_blurb
+package: libcdio
+blurb: The GNU Compact Disc Input and Control Library (libcdio) is a library
++ for CD-ROM and CD image file access.  It allows the developer to add
++ CD access to an application without having to worry about the OS- and
++ device-dependent properties of CD-ROM or the specific details of CD
++ image formats.  It includes pycdio, a Python interface to libcdio, and
++ libcdio-paranoia, a library providing jitter-free and
++ error-free audio extraction from CDs.
+
+id: libdbh_blurb
+package: libdbh
+blurb: libdbh provides disk-based hash tables, providing quick lookup of
++ key-value pairs.  While its usage is similar in general to that of
++ (G)DBM, it has a different design supporting advanced, atypical usage.
+
+id: liberty_eiffel_blurb
+package: liberty-eiffel
+blurb: Liberty Eiffel project is the GNU Eiffel Compiler.  Eiffel is an
++ advanced object-oriented programming language that emphasizes the
++ design and construction of high-quality and reusable software. Liberty
++ Eiffel is a complete, small and fast Eiffel compiler, including an
++ Eiffel to C compiler, documentation tools, a pretty printer, a
++ debugger and various other tools. It also includes a large library of
++ classes as well as a comprehensive set of wrappers/bindings for
++ widespread Free-Software libraries.
+
+id: libextractor_blurb
+package: libextractor
+blurb: GNU libextractor is a library for extracting metadata from files.  It
++ supports a very large number of file formats, including audio files,
++ document files, and archive files.  Each file format is implemented
++ as a plugin, so new formats can be added easily.  The package also
++ contains a command-line tool to extract metadata from a file and
++ print the results.
+
+id: libffcall_blurb
+package: libffcall
+blurb: null (stale)
+
+id: libgcrypt_blurb
+package: libgcrypt
+blurb: Libgcrypt is a general-purpose cryptographic library.  It provides
++ the standard cryptographic building blocks such as symmetric ciphers,
++ hash algorithms, public key algorithms, large integer functions and
++ random number generation.
+
+id: libiconv_blurb
+package: libiconv
+blurb: libiconv provides an implementation of the iconv function for systems
++ that lack it.  iconv is used to convert between character encodings
++ in a program.  It supports a wide variety of different encodings.
+
+id: libidn_blurb
+package: libidn
+blurb: libidn is a library implementing of the Stringprep, Punycode
++ and IDNA specifications.  These are used to encode and decode
++ internationalized domain names.  It includes native C, C# and Java
++ libraries.
+
+id: libjit_blurb
+package: libjit
+blurb: null (stale)
+
+id: libmatheval_blurb
+package: libmatheval
+blurb: GNU libmatheval is a library to parse and evaluate symbolic
++ expressions input by the user as text.  It can be loaded from both C
++ and Fortran.  The interpreter is flexible, supporting any number of
++ variables of arbitrary names, decimal and symbolic constants, basic
++ unary and binary operators, and elementary mathematical functions.
++ It can also compute symbolic derivatives and output expressions to
++ strings.
+
+id: libmicrohttpd_blurb
+package: libmicrohttpd
+blurb: GNU libmicrohttpd is a small, embeddable HTTP server implemented as a C
++ library.  It makes it easy to run an HTTP server as part of another
++ application.  The library is fully HTTP 1.1 compliant.  It can listen
++ on multiple ports, supports four different threading models, and
++ supports IPv6.  It also features security features such as basic and
++ digest authentication and support for SSL3 and TLS.
+
+id: libredwg_blurb
+package: libredwg
+blurb: null (stale)
+
+id: librejs_blurb
+package: librejs
+blurb: LibreJS is an add-on for GNU Icecat and other Firefox-based browsers.
++ It detects non-trivial and non-free JavaScript code from being loaded
++ without your consent when you browse the web.  JavaScript code that
++ is free or trivial is allowed to be loaded.
+
+id: libsigsegv_blurb
+package: libsigsegv
+blurb: GNU libsigsegv is a library to handle page faults, which occur when a
++ program tries to access an unavailable region of memory, in user
++ mode.  By catching and handling page faults, the program can
++ implement pageable virtual memory, stack overflow handlers, and so
++ on.
+
+id: libtasn1_blurb
+package: libtasn1
+blurb: GNU libtasn1 is a library implementing the ASN.1 notation.  It is used
++ for transmitting machine-neutral encodings of data objects in
++ computer networking, allowing for formal validation of data according
++ to some specifications.
+
+id: libtool_blurb
+package: libtool
+blurb: GNU Libtool helps in the creation and use of shared libraries, by
++ presenting a single consistent, portable interface that hides the
++ usual complexity of working with shared libraries across platforms.
+
+id: libunistring_blurb
+package: libunistring
+blurb: GNU libunistring is a library providing functions to manipulate Unicode
++ strings and for manipulating C strings according to the Unicode
++ standard.
+
+id: libxmi_blurb
+package: libxmi
+blurb: GNU libxmi is a library for rasterizing 2D vector graphics for C and 
C++.
++ It supports drawing 2D primitives into a user-supplied matrix of
++ pixels.  It also supports the specification of sophisticated line
++ styles such as multi-colored dashed patterns.  Filling and texturing
++ polygons is also supported.
+
+id: lightning_blurb
+package: lightning
+blurb: GNU Lightning is a library that generates assembly language code at
++ run-time.  Thus, it is useful in creating Just-In-Time compilers.  It
++ abstracts over the target CPU by exposing a standardized RISC
++ instruction set to the clients.
+
+id: lilypond_blurb
+package: lilypond
+blurb: GNU LilyPond is a music typesetter, which produces high-quality sheet
++ music.  Music is input in a text file containing control sequences
++ which are interpreted by LilyPond to produce the final document.  It
++ is extendable with Guile.
+
+id: lims_blurb
+package: lims
+blurb: GNU LIMS is a laboratory information management system.  It is
++ used for managing a scientific laboratory of any field.  It consists
++ of a set of modules for the Tryton enterprise management framework,
++ so it is flexible to the specific needs of the laboratory.  For
++ example, the system includes modules for sample management, lab
++ equipment integration, accounting and stock management.
+
+id: linux_libre_blurb
+package: linux-libre
+blurb: GNU Linux-Libre is a free (as in freedom) variant of the Linux kernel.
++ It has been modified to remove all non-free binary blobs.
+
+id: liquidwar6_blurb
+package: liquidwar6
+blurb: GNU Liquid War 6 is a fast-paced, unique action game.  Each player
++ controls a blob of liquid with the goal of conquering the entire map.
++ It has 13 levels by default and over 100 more with a bonus pack; new
++ levels can be easily created using simple image files.
+
+id: lispintro_blurb
+package: lispintro
+blurb: redirect emacs
+
+id: lrzsz_blurb
+package: lrzsz
+blurb: GNU lrzsz is a communication package supporting the XMODEM, YMODEM and
++ ZMODEM file transfer protocols.
+
+id: lsh_blurb
+package: lsh
+blurb: GNU lsh is a free implementation of the SSH version 2 protocol.  It is
++ used to create a secure line of communication between two computers,
++ providing shell access to the server system from the client.  It
++ provides both the server daemon and the client application, as well
++ as tools for manipulating key files.
+
+id: m4_blurb
+package: m4
+blurb: GNU M4 is an implementation of the M4 macro language, which features
++ some extensions over other implementations, some of which are
++ required by GNU Autoconf.  It is used as a macro processor, which
++ means it processes text, expanding macros as it encounters them.  It
++ also has some built-in functions, for example to run shell commands
++ or to do arithmetic.
+
+id: macchanger_blurb
+package: macchanger
+blurb: GNU MAC Changer is a utility for viewing and changing MAC addresses
++ of networking devices.  New addresses may be set explicitly or
++ randomly.  They can include MAC addresses of the same or other
++ hardware vendors or, more generally, MAC addresses of the same
++ category of hardware.
+
+id: mailman_blurb
+package: mailman
+blurb: GNU Mailman is software for managing email discussion and mailing
++ lists.  Both users and administrators generally perform their actions
++ in a web interface, although email and command-line interfaces are
++ also provided.  The system features built-in archiving, automatic
++ bounce processing, content filtering, digest delivery, and more.
+
+id: mailutils_blurb
+package: mailutils
+blurb: GNU Mailutils is a collection of programs for managing, viewing
++ and processing electronic mail.  It contains both utilities and server
++ daemons and all operate in a protocol-agnostic way.  The underlying
++ libraries are also available, simplifying the addition of mail
++ capabilities to new software.
+
+id: make_blurb
+package: make
+blurb: Make is a program that is used to control the production of
++ executables or other files from their source files.  The process is
++ controlled from a Makefile, in which the developer specifies how
++ each file is generated from its source.  It has powerful dependency
++ resolution and the ability to determine when files have to be
++ regenerated after their sources change.  GNU make offers many powerful
++ extensions over the standard utility.
+
+id: marst_blurb
+package: marst
+blurb: GNU MARST is an Algol-to-C translator.  The package consists of the
++ translator itself, a library that contains the necessary Algol 60
++ procedures, and a converter that converts existing Algol 60 programs
++ from other representations to the MARST representation.
+
+id: maverik_blurb
+package: maverik
+blurb: GNU MAVERIK is a development toolkit that supports 3D virtual
++ environments and interaction with those environments.  It sits on top
++ of a low-level rendering engine that uses OpenGL or Mesa, and
++ provides mechanisms to render different kinds of objects, to manage
++ environments and to provide support for 3D interaction.
+
+id: mc_blurb
+package: mc
+blurb: GNU Midnight Commander is a command-line file manager laid out in a
++ common two-pane format.  In addition to standard file management
++ tasks such as copying and moving, Midnight Commander also supports
++ viewing the contents of RPM package files and other archives and
++ managing files on other computers via FTP or FISH.  It also includes
++ a powerful text editor for opening text files.
+
+id: mcron_blurb
+package: mcron
+blurb: GNU Mcron is a complete replacement for Vixie cron.  It is used to run
++ tasks on a schedule, such as every hour or every Monday.  Mcron is
++ written in Guile, so its configuration can be written in Scheme;
++ the original cron format is also supported.
+
+id: mcsim_blurb
+package: mcsim
+blurb: GNU MCSim is a package to perform simulations.  It supports statistical
++ or deterministic simulation models via Monte Carlo stochastic
++ simulations or dynamic, ODE-based simulations.  It also can do
++ Bayesian inference through Markov Chain Monte Carlo simulations.
+
+id: mempool_blurb
+package: mempool
+blurb: The MemPool library is a stand-alone memory allocation library.
++ It is a block allocator library that uses a single fixed size memory
++ pool to allocate variable sized memory blocks, and exports functions
++ similar to malloc, realloc and free.
++ It is intended to either simulate low memory targets on GNU/Linux and
++ other systems, or to completely replace the system memory management.
+
+id: mdk_blurb
+package: mdk
+blurb: GNU MDK is the Mix Development Kit, an emulation of the pedagogical
++ computer MIX and its assembly language MIXAL.  MIX has a virtual CPU
++ with standard features such as registers, memory cells, an overflow
++ toggle, comparison flags, input-output devices, and a set of binary
++ instructions.  The package includes a compiler, a virtual machine, a
++ GUI for the virtual machine, and more.
+
+id: mediagoblin_blurb
+package: mediagoblin
+blurb: GNU MediaGoblin is a free media publishing platform.  It runs in a
++ federalized manner, freeing the user from centralized web services.
++ It supports pictures, videos and audio.
+
+id: melting_blurb
+package: melting
+blurb: GNU MELTING computes the enthalpy, entropy and melting temperature of
++ helix-coil transitions of a nucleic acid duplex.
+
+id: mes_blurb
+package: mes
+blurb: GNU Mes aims to help create full source bootstrapping for GNU/Linux
++ systems such as GuixSD.  It features a mutual self-hosting Scheme
++ interpreter written in a simple C, and a Nyacc-based C compiler written in
++ GNU Guile-compatible Scheme.  The Mes C library supports bootstrapping gcc.
+
+id: metaexchange_blurb
+package: metaexchange
+blurb: null (stale)
+
+id: metahtml_blurb
+package: metahtml
+blurb: GNU MetaHTML is a server-side programming language designed for the
++ World Wide Web.  It has a syntax that is similar to HTML and Lisp.
++ It provides a large function library, including support for sockets,
++ image creation and connections to other programs.
+
+id: metalogic_inference_blurb
+package: metalogic-inference
+blurb: null (newpkg/20170419)
+
+id: mifluz_blurb
+package: mifluz
+blurb: GNU mifluz is a C++ library to store a full-text inverted index.  It
++ stores the occurrences of words in a set of texts in such a way that
++ they can later be searched.  Upon searching for a word, the index
++ returns the list of documents which contain that word.
+
+id: mig_blurb
+package: mig
+blurb: redirect hurd
+
+id: miscfiles_blurb
+package: miscfiles
+blurb: GNU Miscfiles is a collection of common data files.  They
++ include, for example, country abbreviations, names and capital cities;
++ currency abbreviations and names; a Best Current Practices index; a map
++ of the ASCII character set; a list of three-letter airport codes; and
++ an English word list.
+
+id: mit_scheme_blurb
+package: mit-scheme
+blurb: GNU/MIT Scheme is an implementation of the Scheme programming
++ language.  It provides an interpreter, a compiler and a debugger.  It
++ also features an integrated Emacs-like editor and a large runtime
++ library.
+
+id: moe_blurb
+package: moe
+blurb: GNU Moe is a powerful-but-simple-to-use text editor.  It works in a
++ modeless manner, and features an intuitive set of key-bindings that
++ assign a degree of severity to each key; for example, key
++ combinations with the Alt key are for harmless commands like cursor
++ movements while combinations with the Control key are for commands
++ that will modify the text.  Moe features multiple windows, unlimited
++ undo/redo, unlimited line length, global search and replace, and
++ more.
+
+id: motti_blurb
+package: motti
+blurb: GNU Motti is a simple multiplayer strategy game played in a terminal.
++ The objective of the game is to conquer enemy capitals by occupying and
++ encircling territory.
+
+id: mpc_blurb
+package: mpc
+blurb: GNU MPC is a C library for performing arithmetic on complex numbers.
++ It supports arbitrarily high precision and it correctly rounds the
++ results.
+
+id: mpfr_blurb
+package: mpfr
+blurb: GNU MPFR is a C library for performing multiple-precision,
++ floating-point computations with correct rounding.
+
+id: mpria_blurb
+package: mpria
+blurb: GNU MPRIA is a C library for performing rational arithmetic 
++ computations with arbitrarily high precision.  It builds on 
++ the GMP library.
+
+id: mtools_blurb
+package: mtools
+blurb: GNU Mtools is a set of utilities for accessing MS-DOS disks from
++ a GNU or Unix system.  It supports long file names and multiple disk
++ formats.  It also supports some FAT-specific features such as volume
++ labels and FAT-specific file attributes.
+
+id: nana_blurb
+package: nana
+blurb: GNU Nana is a framework for adding assertion checking, logging and
++ performance measurement to C and C++ programs.  Operations can either
++ be implemented directly in C or by generating debugger commands.
++ Checking and logging features can be enabled or disabled at compile
++ or runtime.
+
+id: nano_blurb
+package: nano
+blurb: GNU nano is a small and simple text editor for use in a terminal.
++ Besides basic editing, it supports: undo/redo, syntax highlighting,
++ spell checking, justifying, auto-indentation, bracket matching,
++ interactive search-and-replace (with regular expressions), and the
++ editing of multiple files.
+
+id: nano_archimedes_blurb
+package: nano-archimedes
+blurb: nano-archimedes is a free package for the simulation of quantum
++ systems.  It is based on the Wigner equation, a formulation of quantum
++ mechanics in terms of a phase-space which is mathematically equivalent
++ to the Schroedinger equation.  nano-archimedes implements the Wigner
++ Monte Carlo method.  The code can be easily extended to density
++ functional theory (DFT) and time-dependent ab-initio simulations.
+
+id: ncurses_blurb
+package: ncurses
+blurb: GNU Ncurses is a library which provides capabilities to write text to a
++ terminal in a terminal-independent manner.  It supports pads and
++ color as well as multiple highlights and forms characters.  It is
++ typically used to implement user interfaces for command-line
++ applications.  The accompanying ncursesw library provides wide character
++ support.
+
+id: nettle_blurb
+package: nettle
+blurb: GNU Nettle is a low-level cryptographic library.  It is designed to fit
++ in easily in almost any context.  It can be easily included in
++ cryptographic toolkits for object-oriented languages or in
++ applications themselves.
+
+id: network_blurb
+package: network
+blurb: null (container for network work)
+
+id: ocrad_blurb
+package: ocrad
+blurb: GNU Ocrad is an optical character recognition program based on a feature
++ extraction method.  It can read images in PBM, PGM or PPM formats and
++ it produces text in 8-bit or UTF-8 formats.
+
+id: octave_blurb
+package: octave
+blurb: GNU Octave is a high-level interpreted language that is specialized
++ for numerical computations.  It can be used for both linear and
++ non-linear applications and it provides great support for visualizing
++ results.  Work may be performed both at the interactive command-line
++ as well as via script files.
+
+id: oleo_blurb
+package: oleo
+blurb: GNU Oleo is a spreadsheet program.  It offers both a terminal interface
++ and a LessTif-based graphical user interface.  It features familiar,
++ Emacs-like keybindings.  It supports many standard spreadsheet
++ features such as macros and functions.
+
+id: oo_browser_blurb
+package: oo-browser
+blurb: null (newpkg/20160810)
+
+id: orgadoc_blurb
+package: orgadoc
+blurb: GNU OrgaDoc is a system for easily maintaining a pool of documents
++ between computers.  Documents are synchronized by rsync or unison; no
++ database or HTTP server is required.
+
+id: osip_blurb
+package: osip
+blurb: GNU oSIP is an implementation of the SIP protocol.  It is used to 
provide
++ multimedia and telecom software developers with an interface to
++ initiate and control SIP sessions.
+
+id: panorama_blurb
+package: panorama
+blurb: GNU Panorama is a framework for producing 3D graphics.  It can perform
++ various effects, such as focal blur, arbitrary light sources, bump
++ mapping, and several lighting effects.
+
+id: parallel_blurb
+package: parallel
+blurb: GNU Parallel is a tool for executing shell jobs in parallel using one
++ or more computers.  Jobs can consist of single commands or of scripts
++ and they are executed on lists of files, hosts, users or other items.
+
+id: parted_blurb
+package: parted
+blurb: GNU Parted is a package for creating and manipulating disk
++ partition tables.  It includes a library and command-line utility.
+
+id: pascal_blurb
+package: pascal
+blurb: null (stale)
+
+id: patch_blurb
+package: patch
+blurb: Patch is a program that applies changes to files based on differences
++ laid out as by the program "diff".  The changes may be applied to one or
++ more files depending on the contents of the diff file.  It accepts
++ several different diff formats.  It may also be used to revert
++ previously applied differences.
+
+id: paxutils_blurb
+package: paxutils
+blurb: GNU paxutils is a suite of archive utilities.  It contains versions
++ of the cpio, tar and pax archivers.
+
+id: pcb_blurb
+package: pcb
+blurb: GNU PCB is an interactive tool for editing printed circuit board 
layouts.
++ It features a rats-nest implementation, schematic/netlist import, and
++ design rule checking.  It also includes an autorouter and a trace
++ optimizer; and it can produce photorealistic and design review
++ images.
+
+id: pdf_blurb
+package: pdf
+blurb: null (stale)
+
+id: pem_blurb
+package: pem
+blurb: GNU Pem is a simple tool for tracking personal income and
++ expenses.  It operates from the command line and it stores its data
++ in a basic text format in your home directory.  It can easily print
++ reports of your spending on different expenses via a basic search
++ feature.
+
+id: pexec_blurb
+package: pexec
+blurb: GNU pexec is a program for executing commands or shell scripts in
++ parallel on one or many computers.  As it works, execution parameters
++ such as the environment variables or standard input, output and
++ error can be varied.
+
+id: pgccfd_blurb
+package: pgccfd
+blurb: null (stale)
+
+id: home_blurb
+package: phantom_home
+blurb: null (stale)
+
+id: pies_blurb
+package: pies
+blurb: GNU pies is a program that supervises the invocation and execution of
++ other programs.  It reads the list of programs to be started from its
++ configuration file, executes them, and then monitors their status,
++ re-executing them as necessary.
+
+id: pipo_blurb
+package: pipo
+blurb: null (stale)
+
+id: plotutils_blurb
+package: plotutils
+blurb: GNU Plotutils is a package for plotting and working with
++ 2D graphics.  It includes a library, "libplot", for C and C++ for
++ exporting 2D vector graphics in many file formats.  It also has
++ support for 2D vector graphics animations.  The package also contains
++ command-line programs for plotting scientific data.
+
+id: polyxmass_blurb
+package: polyxmass
+blurb: null (stale)
+
+id: powerguru_blurb
+package: powerguru
+blurb: null (stale)
+
+id: proxyknife_blurb
+package: proxyknife
+blurb: GNU proxyknife is a tool to validate free proxies from behind a
++ firewall.  The validation process is fully customizable to meet your
++ needs.
+
+id: pspp_blurb
+package: pspp
+blurb: GNU PSPP is a statistical analysis program.  It can perform descriptive
++ statistics, T-tests, linear regression and non-parametric tests.  It
++ features both a graphical interface as well as command-line input.
++ PSPP is designed to interoperate with Gnumeric, LibreOffice and
++ OpenOffice.  Data can be imported from spreadsheets, text files and
++ database sources and it can be output in text, PostScript, PDF or
++ HTML.
+
+id: psychosynth_blurb
+package: psychosynth
+blurb: GNU Psychosynth is an interactive, modular soft-synth.  It emulates a 3D
++ surface on which modules are placed and manipulated, generating and
++ altering music.  Psychosynth consists of a C++ library, a 3D
++ interface and a command-line interface.
+
+id: pythonwebkit_blurb
+package: pythonwebkit
+blurb: null (stale)
+
+id: pth_blurb
+package: pth
+blurb: GNU Pth is a portable library providing non-preemptive, priority-based
++ scheduling for multiple execution threads.  Each thread has its own
++ program-counter, run-time stack, signal mask and errno variable.
++ Threads are scheduled in a cooperative way, rather than in the
++ standard preemptive way, such that they are managed according to
++ priority and events.  However, Pth also features emulation of
++ POSIX.1c threads ("pthreads") for backwards compatibility.
+
+id: pyconfigure_blurb
+package: pyconfigure
+blurb: GNU pyconfigure provides template files for easily implementing
++ standards-compliant configure scripts and Makefiles for Python-based
++ packages.  It is designed to work alongside existing Python setup
++ scripts, making it easy to integrate into existing projects.  Powerful
++ and flexible Autoconf macros are available, allowing you to easily
++ make adjustments to the installation procedure based on the
++ capabilities of the target computer.
+
+id: qexo_blurb
+package: qexo
+blurb: redirect kawa
+
+id: quickthreads_blurb
+package: quickthreads
+blurb: null (stale)
+
+id: r_blurb
+package: r
+blurb: R is a language and environment for statistical computing and
++ graphics.  It provides a variety of statistical techniques, such as
++ linear and nonlinear modeling, classical statistical tests,
++ time-series analysis, classification and clustering.  It also provides
++ robust support for producing publication-quality data plots.  A large
++ amount of 3rd-party packages are available, greatly increasing its
++ breadth and scope.
+
+id: radius_blurb
+package: radius
+blurb: Radius is a server for remote user authentication and accounting.
++ It is generally useful for networks that require a centralized
++ authentication and accounting services for its workstations.
++ Authentication can be performed in a variety of ways, such as via
++ "/etc/passwd" or credentials stored in an SQL database.
+
+id: rcs_blurb
+package: rcs
+blurb: RCS is the original Revision Control System.  It works on a
++ file-by-file basis, in contrast to subsequent version control systems
++ such as CVS, Subversion, and Git.  This can make it suitable for
++ system administration files, for example, which are often inherently
++ local to one machine.
+
+id: readline_blurb
+package: readline
+blurb: The GNU readline library allows users to edit command lines as they
++ are typed in.  It can maintain a searchable history of previously
++ entered commands, letting you easily recall, edit and re-enter past
++ commands.  It features both Emacs-like and vi-like keybindings,
++ making its usage comfortable for anyone.
+
+id: recutils_blurb
+package: recutils
+blurb: GNU Recutils is a set of tools and libraries for creating and
++ manipulating text-based, human-editable databases.  Despite being
++ text-based, databases created with Recutils carry all of the expected
++ features such as unique fields, primary keys, time stamps and more.
++ Many different field types are supported, as is encryption.
+
+id: reftex_blurb
+package: reftex
+blurb: GNU RefTex is a package for implementing labels, references, citations
++ and indices in LaTeX documents.  It works by wrapping around four
++ LaTeX macros: label, ref, cite and index.  It automates the common
++ tasks that normally are required when using these macros.
+
+id: jami_blurb
+package: jami
+blurb: Jami is a program for universal communication which respects freedoms
++ and privacy of its users. Jami uses distributed hash tables for
++ establishing communication. This avoids keeping centralized registries
++ of users and storing personal data.
+
+id: remotecontrol_blurb
+package: remotecontrol
+blurb: GNU Remotecontrol is a web application for managing IP-enabled HVAC
++ thermostats and other building automation devices.  The application
++ can read data from and write data to multiple such devices.
+
+id: rottlog_blurb
+package: rottlog
+blurb: GNU Rot[t]log is a program for managing log files.  It is used to
++ automatically rotate out log files when they have reached a given
++ size or according to a given schedule.  It can also be used to
++ automatically compress and archive such logs.  Rot[t]log will mail
++ reports of its activity to the system administrator.
+
+id: rpge_blurb
+package: rpge
+blurb: The GNU Role Playing Game Engine provides an engine for
++ creating two-dimensional, graphical role-playing games, providing,
++ for example, a sprite-tiling grid, sprite rendering, and event
++ handling.
+
+id: rush_blurb
+package: rush
+blurb: GNU Rush is a restricted user shell, for systems on which users
++ are to be provided with only limited functionality or resources.
++ Administrators set user rights via a configuration file which can be
++ used to limit, for example, the commands that can be executed, CPU
++ time, or virtual memory usage.
+
+id: sather_blurb
+package: sather
+blurb: GNU Sather is an object-oriented programming language similar to Eiffel.
++ It is designed to be simple, efficient, safe, and non-proprietary.
++ It features garbage collection, statically-checked strong typing,
++ multiple inheritance, parameterized classes and more.  This package
++ consists of a compiler, a class library, the language specification
++ and programming manual, and a browser for displaying sources and
++ directed graphs of class inheritance.
+
+id: scm_blurb
+package: scm
+blurb: GNU SCM is an implementation of Scheme.  This implementation includes
++ Hobbit, a Scheme-to-C compiler, which can generate C files whose
++ binaries can be dynamically or statically linked with a SCM
++ executable.
+
+id: screen_blurb
+package: screen
+blurb: GNU Screen is a terminal window manager that multiplexes a single
++ terminal between several processes.  The virtual terminals each
++ provide features such as a scroll-back buffer and a copy-and-paste
++ mechanism.  Screen then manages the different virtual terminals,
++ allowing you to easily switch between them, to detach them from the
++ current session, or even splitting the view to show two terminals at
++ once.
+
+id: sed_blurb
+package: sed
+blurb: Sed is a non-interactive, text stream editor.  It receives a text
++ input from a file or from standard input and it then applies a series
++ of text editing commands to the stream and prints its output to
++ standard output.  It is often used for substituting text patterns in
++ a stream.  The GNU implementation offers several extensions over the
++ standard utility.
+
+id: serveez_blurb
+package: serveez
+blurb: GNU Serveez is a server framework providing the routines necessary to
++ easily implement IP-based servers in your application.  It
++ demonstrates aspects of network programming in a portable manner,
++ making it convenient for both simplifying the process of adding a
++ server to your application or for learning about how network services
++ work.  Several example servers are provided already, such as an HTTP
++ server and an IRC server.
+
+id: sharutils_blurb
+package: sharutils
+blurb: GNU sharutils is a package for creating and manipulating shell
++ archives that can be readily emailed.  A shell archive is a file
++ that can be processed by a Bourne-type shell to unpack the original
++ collection of files.  This package is mostly for compatibility and
++ historical interest.
+
+id: shepherd_blurb
+package: shepherd
+blurb: The GNU Shepherd is a daemon-managing daemon, meaning that it
++ supervises the execution of system services, replacing similar
++ functionality found in typical init systems.  It provides
++ dependency-handling through a convenient interface and is based on
++ GNU Guile.
+
+id: shishi_blurb
+package: shishi
+blurb: GNU Shishi is a free implementation of the Kerberos 5 network security
++ system.  It is used to allow non-secure network nodes to communicate
++ in a secure manner through client-server mutual authentication via
++ tickets.
+
+id: shmm_blurb
+package: shmm
+blurb: GNU SHMM is a shared memory manager.  It can read or write to shared
++ memory.  It also supports other commands such as locking or unlocking
++ a block of shared memory identified by key and size.
+
+id: shtool_blurb
+package: shtool
+blurb: GNU shtool is a multipurpose shell tool.  It can perform the
++ functions of many different commands, in order to provide a single
++ tool to distribute with a source distribution in order to ensure
++ portability of shell scripts.  For example, shtool can perform the
++ jobs of the common commands "install", "mkdir" or "echo" on systems
++ that lack them.
+
+id: sipwitch_blurb
+package: sipwitch
+blurb: GNU SIP Witch is a peer-to-peer Voice-over-IP server that uses the
++ SIP protocol.  Calls can be made from behind NAT firewalls and
++ without the need for a service provider.  Its peer-to-peer design
++ ensures that there is no central point for media intercept or capture
++ and thus it can be used to construct a secure telephone system that
++ operates over the public internet.
+
+id: slib_blurb
+package: slib
+blurb: GNU SLIB is a portable common library for the Scheme programming
++ language.  It supports a large variety of different Scheme
++ implementations, offering them a framework for using packages of
++ Scheme procedures and syntax.
+
+id: smalltalk_blurb
+package: smalltalk
+blurb: GNU Smalltalk is a free implementation of the Smalltalk language.  It
++ implements the ANSI standard for the language and also includes extra
++ classes such as ones for networking and GUI programming.
+
+id: social_blurb
+package: social
+blurb: null (stale)
+
+id: solfege_blurb
+package: solfege
+blurb: GNU Solfege is a program for practicing musical ear-training.  With it,
++ you can practice your recognition of various musical intervals and
++ chords.  It features a statistics overview so you can monitor your
++ progress across several sessions.  Solfege is also designed to be
++ extensible so you can easily write your own lessons.
+
+id: spacechart_blurb
+package: spacechart
+blurb: GNU SpaceChart lets you view how the stars are distributed in
++ three-dimensional space.  It allows you, for example, to determine
++ the distances between stars, to view them from any point of view, or
++ to filter your view by spectral class and luminosity.
+
+id: speex_blurb
+package: speex
+blurb: GNU Speex is a patent-free audio compression codec specially
++ designed for speech.  It is well-adapted to internet applications,
++ such as VoIP.  It features compression of different bands in the same
++ bitstream, intensity stereo encoding, and voice activity detection.
+
+id: spell_blurb
+package: spell
+blurb: Spell is a command-line spell-checking program.  It reads through a
++ text input and prints each misspelled word on a line of its own.  It
++ is implemented as a wrapper for GNU aspell or ispell.
+
+id: sqltutor_blurb
+package: sqltutor
+blurb: GNU Sqltutor is a web-based, interactive SQL tutorial.  It features
++ multiple tutorials available in different languages.  The tutorials
++ present a series of questions in a dialog and, when complete, they
++ display a final evaluation including correct answers for wrong
++ solutions.
+
+id: ssw_blurb
+package: ssw
+blurb: A Gtk+ widget providing a 2 dimensional array to view and manipulate
++ tabular data similar to that provided by popular spread sheet programs.
++ The design follows the model-view-controller paradigm and is O(1) in both
++ time and space, providing very fast and efficient operation even on very
++ large data.  Features such as cut and paste, drag and drop etc are
++ included.
+
+id: src_highlite_blurb
+package: src-highlite
+blurb: GNU source-highlight reads in a source code file and produces an output
++ file in which the keywords are highlighted in different colors to
++ designate their syntactic role.  It supports over 150 different
++ languages and it can output to 8 different formats, including HTML,
++ LaTeX and ODF.  It can also output to ANSI color escape sequences,
++ so that highlighted source code can be seen in a terminal.
+
+id: stalkerfs_blurb
+package: stalkerfs
+blurb: null (stale)
+
+id: stow_blurb
+package: stow
+blurb: GNU Stow is a symlink manager.  It generates symlinks to directories of
++ data and makes them appear to be merged into the same directory.  It
++ is typically used for managing software packages installed from source,
++ by letting you install them apart in distinct directories and then
++ create symlinks to the files in a common directory such as
++ /usr/local.
+
+id: stump_blurb
+package: stump
+blurb: GNU STUMP is a robomoderator program for USENET newsgroups and mailing
++ lists, featuring web-based moderation.  It supports group moderation
++ via multiple human moderators.  It can also automatically reject
++ non-conforming messages without human intervention.  It includes a web
++ interface.
+
+id: superopt_blurb
+package: superopt
+blurb: GNU Superopt is a function sequence generator for superoptimization.  It
++ uses an exhaustive generate-and-test approach to find the shortest
++ instruction sequence for a given function.
+
+id: swbis_blurb
+package: swbis
+blurb: Swbis is a software administration system specified by POSIX.  It
++ features network-transparent management of software packages for
++ system administrators.  For example, entire file system directories
++ can be copied host-to-host across a network in a transparent manner.
++ The package also features advanced tarball creation methods and
++ integrity checking mechanisms.
+
+id: sysutils_blurb
+package: sysutils
+blurb: null (stale)
+
+id: taler_blurb
+package: taler
+blurb: null (newpkg/20150206)
+
+id: talkfilters_blurb
+package: talkfilters
+blurb: The GNU Talk Filters are programs that convert English text into
++ stereotyped or otherwise humorous dialects.  The filters are provided
++ as a C library, so they can easily be integrated into other programs.
+
+id: tar_blurb
+package: tar
+blurb: Tar provides the ability to create tar archives, as well as the
++ ability to extract, update or list files in an existing archive.  It
++ is useful for combining many files into one larger file, while
++ maintaining directory structure and file information such as
++ permissions and creation/modification dates.  GNU tar offers many
++ extensions over the standard utility.
+
+id: termcap_blurb
+package: termcap
+blurb: GNU termcap is a library and a database that are used to enable the use
++ of display terminals in a terminal-independent manner.  The database
++ describes the capabilities of many different display terminals.  The
++ library can then adapt generalized instructions given by a program to
++ the specific capabilities of the display terminal as found in the
++ database.
+
+id: termutils_blurb
+package: termutils
+blurb: The GNU Termutils package contains two programs, "tput" and
++ "tabs".  "tput" is used in shell scripts to manipulate the terminal
++ display, for example by clearing it or moving the cursor to a specific
++ point, centering text or underlining text.  "tabs" is used to specify
++ and set hardware tab stops on terminals that support it.
+
+id: teseq_blurb
+package: teseq
+blurb: GNU Teseq is a program that analyzes files that contain control
++ sequences.  It converts the sequences that it encounters into a
++ human-readable description of what actions those sequences perform.
++ It can also translate its output back into machine-readable control
++ sequences.
+
+id: teximpatient_blurb
+package: teximpatient
+blurb: TeX for the Impatient is a ~350 page book on TeX, plain TeX and
++ Eplain, written by Paul Abrahams, Kathryn Hargreaves and Karl Berry.
+
+id: texinfo_blurb
+package: texinfo
+blurb: Texinfo is the official documentation format of the GNU project.  It
++ uses a single source file using explicit commands to
++ produce a final document in any of several supported output formats,
++ such as HTML or PDF.  This package includes both the tools necessary
++ to produce Info documents from their source and the
++ command-line Info reader.  The emphasis of the language is on
++ expressing the content semantically, avoiding physical markup commands.
+
+id: texmacs_blurb
+package: texmacs
+blurb: GNU TeXmacs is a text editing platform which is specialized for
++ scientists.  It is ideal for editing structured documents with
++ different types of content.  It has robust support for mathematical
++ formulas and plots.  It can also act as an interface to external
++ mathematical programs such as R and Octave.  TeXmacs is completely
++ extensible via Guile.
+
+id: thales_blurb
+package: thales
+blurb: GNU Thales provides macros for performing unit testing in Guile
++ and for checking the stability of the public interface of your 
++ modules.
+
+id: time_blurb
+package: time
+blurb: Time is a command that displays information about the resources that
++ a program uses.  The display output of the program can be customized
++ or saved to a file.
+
+id: tramp_blurb
+package: tramp
+blurb: TRAMP is a GNU Emacs package that allows you to access files on remote
++ machines as though they were local files.  This includes editing
++ files, performing version control tasks and modifying directory
++ contents with dired.  Access is performed via ssh, rsh, rlogin,
++ telnet or other similar methods.
+
+id: trans_coord_blurb
+package: trans-coord
+blurb: redirect gnun
+
+id: trueprint_blurb
+package: trueprint
+blurb: GNU Trueprint translates C source code files as PostScript files.
++ In addition to the basic source code output, it can also perform
++ diff-marking, indentation counting, function and file indices and
++ more.
+
+id: unifont_blurb
+package: unifont
+blurb: GNU Unifont is a bitmap font covering essentially all of
++ Unicode's Basic Multilingual Plane.  The package also includes
++ utilities to ease adding new glyphs to the font.
+
+id: units_blurb
+package: units
+blurb: GNU Units converts numeric quantities between units
++ of measure.  It can handle scale changes through adaptive usage of
++ standard scale prefixes (micro-, kilo-, etc.).  It can also
++ handle nonlinear conversions such as Fahrenheit to Celsius.  Its
++ interpreter is powerful enough to be used effectively as a scientific
++ calculator.
+
+id: unrtf_blurb
+package: unrtf
+blurb: GNU UnRTF converts text documents from RTF to HTML,
++ LaTeX, or troff.  It supports changes in font characteristics,
++ underlines and strikethroughs, superscripts and subscripts, and more.
+
+id: userv_blurb
+package: userv
+blurb: GNU Userv is a utility that allows one program to invoke another even
++ when only limited trust exists between them.  This prevents the need
++ from having to first switch to a different user account to perform
++ certain tasks.
+
+id: uucp_blurb
+package: uucp
+blurb: Taylor UUCP is the GNU implementation of UUCP (Unix-to-Unix Copy), a
++ set of utilities for remotely transferring files, email and net news
++ between computers.
+
+id: vc_dwim_blurb
+package: vc-dwim
+blurb: The vc-dwim package contains two tools, "vc-dwim" and "vc-chlog".
++ vc-dwim is a tool that simplifies the task of maintaining a ChangeLog
++ and using version control at the same time, for example by printing
++ a reminder when a file change has been described in the ChangeLog but
++ the file has not been added to the VC.  vc-chlog scans changed files
++ and generates standards-compliant ChangeLog entries based on the
++ changes that it detects.
+
+id: vcdimager_blurb
+package: vcdimager
+blurb: GNU VCDImager is a suite of programs for working with Video CDs
++ and Super Video CDs.  It can be used for authoring, disassembling and
++ analyzing discs.  It supports full playback control, segment play
++ items, automatic padding of MPEG streams on the fly, and extraction of
++ Video CDs into files.
+
+id: vera_blurb
+package: vera
+blurb: V.E.R.A. (Virtual Entity of Relevant Acronyms) is a list of computing
++ acronyms distributed as an info document.
+
+id: vmgen_blurb
+package: vmgen
+blurb: redirect gforth
+
+id: wb_blurb
+package: wb
+blurb: GNU WB is a disk-based, sorted, associative-array database
++ package for C, Scheme, Java and C#.  Rather than being implemented via
++ hashing, WB uses B-trees, which are optimized for using the minimum
++ number of disk operations.
+
+id: wdiff_blurb
+package: wdiff
+blurb: GNU Wdiff is a front-end to the diff program from Diffutils that allows
++ you to compare files on a word-by-word basis, where a word is
++ anything between whitespace.
+
+id: websocket4j_blurb
+package: websocket4j
+blurb: GNU Websocket4j is a Java library implementing the WebSocket protocol.
++ With it, you can build web applications that interact with Java
++ applications.  The library includes both server- and client-side
++ functionality.
+
+id: webstump_blurb
+package: webstump
+blurb: redirect stump
+
+id: wget_blurb
+package: wget
+blurb: GNU Wget is a non-interactive tool for fetching files using the HTTP,
++ HTTPS and FTP protocols.  It can resume interrupted downloads, use
++ file name wild cards, supports proxies and cookies, and it can convert
++ absolute links in downloaded documents to relative links.
+
+id: which_blurb
+package: which
+blurb: The which program finds the location of executables in PATH, with
++ a variety of options.  It is an alternative to the shell "type"
++ built-in command.
+
+id: womb_blurb
+package: womb
+blurb: null (infrastructure randomness)
+
+id: xaos_blurb
+package: xaos
+blurb: GNU XaoS is a graphical program that generates fractal patterns and
++ allows you to zoom in and out of them infinitely in a fluid,
++ continuous manner.  It also includes tutorials that help to explain
++ how fractals are built.  It can generate many different fractal types
++ such as the Mandelbrot set.
+
+id: xboard_blurb
+package: xboard
+blurb: GNU XBoard is a graphical board for all varieties of chess, including
++ international chess, xiangqi (Chinese chess), shogi (Japanese chess)
++ and Makruk.  Several lesser-known variants are also supported.  It
++ presents a fully interactive graphical interface and it can load and
++ save games in the Portable Game Notation.
+
+id: xlogmaster_blurb
+package: xlogmaster
+blurb: GNU Xlogmaster is a program with a graphical user interface that lets 
you
++ monitor your system logs in a convenient way.  The logs can be
++ displayed with filters for highlighting or hiding lines.  The program
++ can also be used to automate taking actions upon user-defined events.
+
+id: xmlat_blurb
+package: xmlat
+blurb: null (stale)
+
+id: xnee_blurb
+package: xnee
+blurb: GNU Xnee is a program that can record, replay and distribute user
++ actions in X11.  It can be used to automate user interactions for
++ testing or demonstration purposes.
+
+id: xorriso_blurb
+package: xorriso
+blurb: GNU Xorriso is a tool for copying files to and from ISO 9660 Rock
++ Ridge, a.k.a. Compact Disc File System, filesystems and it allows
++ session-wise manipulation of them.  It features a formatter and burner
++ for CD, DVD and BD.  It can operate on existing ISO images or it can
++ create new ones.  xorriso can then be used to copy files directly into
++ or out of ISO files.
+
+id: zile_blurb
+package: zile
+blurb: GNU Zile is a lightweight Emacs clone.  It usage is similar to
++ the default Emacs configuration, but it carries a much lighter feature set.
+
+# Local Variables:
+# compile-command: "recfix pkgblurbs.rec"
+# End:

Index: rec/nonpackages.rec
===================================================================
RCS file: rec/nonpackages.rec
diff -N rec/nonpackages.rec
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ rec/nonpackages.rec 11 May 2019 10:44:54 -0000      1.1
@@ -0,0 +1,21 @@
+# $Id: nonpackages.rec,v 1.1 2019/05/11 10:44:54 ineiev Exp $
+# Public domain.
+# 
+# This file records information about software that is not an official
+# GNU package on its own, but we want to automatically generate entries
+# about it anyway.  There is nothing private in this file. 
+
+%rec: Package rec/package-descriptor.rec
+%doc: Packages which are not official or independent
+
+package: gnus
+doc_category: Email
+doc_summary: Emacs-based mail and news reader.
+activity_status: nonpkg
+
+package: mh-e
+doc_category: Email
+doc_summary: Emacs interface to the MH mail system.
+activity_status: nonpkg
+
+# End. (Do not remove this line or the blank line before it.  Thanks.)

Index: rec/oldpackages.rec
===================================================================
RCS file: rec/oldpackages.rec
diff -N rec/oldpackages.rec
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ rec/oldpackages.rec 11 May 2019 10:44:54 -0000      1.1
@@ -0,0 +1,618 @@
+# $Id: oldpackages.rec,v 1.1 2019/05/11 10:44:54 ineiev Exp $
+# Public domain.
+# 
+# This file is maintained in the CVS repository of GNU womb,
+# http://cvs.savannah.gnu.org/viewvc/gnumaint/?root=womb
+#
+# This file records information and the old gnupackages entries for
+# packages which we have decommissioned.
+# 
+# There is nothing private in this file.
+
+%rec: Package rec/package-descriptor.rec
+%doc: Decommissioned GNU packages
+%mandatory: gone
+## In all cases, the last_activity date is the date of decommissioning
+## (if known).  The "gone" field provides the reason for
+## decommissioning, however in some cases this was never recorded.
+
+package: cobol
+copyright_holder: fsf-no-reply
+doc_category: Software
+doc_summary: COBOL for GCC
+doc_url: none
+blurb_id: cobol_blurb
+download_url: http://sourceforge.net/project/showfiles.php?group_id=5709
+gplv3_status: next-release
+last_release: 0.1.2
+last_release_date: 20000812
+last_contact: 26oct08 replied
+note: dedicated maintainer, but will not be able to resume full-time work
+note: for 4-5 years (after 6 months full-time work).  But it's a Cobol
+note: compiler, hardly likely to find other implementors, and lots and lots
+note: of work has been done.  Mail from tej, 26 Oct 2008 12:42:10 +1100.
+activity_status: moribund
+last_activity: 20000812
+
+package: libreboot
+copyright_holder: notfsf
+logo: https://libreboot.org/logo/logo.png
+language: shell,c
+doc_category: Sysadmin
+doc_summary: A free BIOS/UEFI replacement
+doc_url: none
+gplv3_status: ok
+activity_status: newpkg
+last_activity: 20160514
+
+package: dmd
+copyright_holder: fsf-no-reply-individual-name-in-files
+doc_category: Sysadmin
+doc_summary: Daemon managing daemons
+doc_url: none
+gplv3_status: not-done-in-0.5
+download_url: http://www.wt-lorsch.de/dmd--0.5.tar.gz
+last_release:  0.5
+note: exact last release date unknown
+last_release_date: 20030101
+activity_status: decommissioned
+last_activity: 20160117
+gone: per maintainer: renamed to shepherd
+
+package: sovix
+copyright_holder: notfsf
+doc_category: Web
+doc_summary: Emacs-like website revision system
+doc_url: none
+gplv3_status: done-in-0.0.1.5 (agplv3)
+last_release: 0.0.1.7
+last_release_date: 20081215
+activity_status: decommissioned
+last_activity: 20150312
+gone: per englund; maintainer long since took it from GNU
+
+package: myserver
+copyright_holder: fsf-ok-with-dependencies-libxml-libevent-#786724
+language: c++
+logo: /software/myserver/logo.png
+doc_category: Internet
+doc_summary: Multi-threaded web server
+doc_url: none
+gplv3_status: done-as-of-0.9.2
+last_release: 0.11
+last_release_date: 20110716
+activity_status: decommissioned
+last_activity: 20140314
+note: doc_url was htmlxref, but gone now, author working 11mar12
+gone: per maintainer
+
+package: fcrypt
+copyright_holder: fsf-ok-#786630
+doc_category: Sysadmin
+doc_summary: on-the-fly encrypted filesystems, including secret partitions
+doc_url: none
+gplv3_status: should-be-ok
+activity_status: decommissioned
+note: no-release
+last_activity: 20131005
+gone: strange behavior by maintainer
+
+package: w3
+copyright_holder: fsf-no-reply
+doc_category: Internet
+doc_summary: Web browser written entirely in Emacs Lisp
+doc_url: none
+gplv3_status: not-done-since-stale
+activity_status: decommissioned
+note: no-release
+gone: now http://elpa.gnu.org/packages/w3.html
+
+package: dismal
+copyright_holder: fsf-no-reply
+doc_category: Spreadsheets
+doc_summary: Emacs spreadsheet mode
+doc_url: none
+download_url: http://acs.ist.psu.edu/dismal/
+gplv3_status: working (gnumaint-reply 22 Aug 2007 01:16:36)
+last_release: 1.4
+last_release_date: 20130528
+activity_status: decommissioned
+last_activity: 20130809
+note: copyright.list says fsf, but actual copyrights don't
+note: http://acs.ist.psu.edu/dismal/dismal-1.4.tar.gz
+last_contact: 25jan11 replied soon, 17nov10, 29oct08 asked
+gone: now http://elpa.gnu.org/packages/dismal.html (M-x list-packages)
+
+package: gnu-arch
+mundane_name: Arch
+copyright_holder: notfsf-#786554
+doc_category: Version
+doc_summary: Distributed version control system
+doc_url: htmlxref
+logo: /software/gnu-arch/graphics/octopus-a-small.png
+gplv3_status: decommissioning-since-no-changes (atai 17 Dec 2007 10:00:18 
-0800)
+last_release: 1.3.5
+last_release_date: 20060720
+activity_status: decommissioned
+last_activity: 20130529
+last_contact: 1jul12 asked, 10oct11,2dec08 replied
+gone: inaction, have bazaar
+
+package: jdresolve
+language: perl
+doc_category: Internet
+doc_summary: Fast, recursive DNS name resolver for log files
+doc_url: none
+gplv3_status: not-done-since-stale
+activity_status: decommissioned
+last_activity: 20130522
+note: no-release
+gone: vaporware
+
+package: phpgroupware
+mundane_name: phpGroupWare
+copyright_holder: fsf-no-reply
+logo: http://www.phpgroupware.org/templates/new/images/logo.png
+doc_category: Business
+doc_summary: Multi-user groupware suite
+doc_url: none
+download_url: http://sourceforge.net/projects/phpgroupware/files/phpgroupware/
+gplv3_status: in-dev-sources-maybe
+last_release: 0.9.16.017
+last_release_date: 20100707
+activity_status: decommissioned
+last_activity: 20130522
+gone: inaction, hardly ever GNU
+
+package: gmorph
+doc_category: Graphics
+doc_summary: Image morphing program
+doc_url: none
+#download_url-of-xmorph: 
http://sourceforge.net/project/showfiles.php?group_id=11808
+gplv3_status: not-done-since-stale
+last_release: 20060817
+last_release_date: 20060817
+activity_status: decommissioned
+last_activity: 20130522
+last_contact: 16feb13 asked, 24jan12 replied to jmd but doing nothing, 4jan11 
asked
+note: renamed from xmorph, which continues to be non-GNU.
+gone: inaction, still have xmorph
+
+package: gnuskies
+doc_category: Science
+doc_summary: Stargazing
+doc_url: none
+gplv3_status: not-done-since-no-release
+activity_status: decommissioned
+last_activity: 20130413
+note: no-release
+last_contact: 20mar13 brandon asked, 24jun09 asked, 2011 copyright finally done
+gone: never anything done, have celestia, per maintainer and rms
+
+package: vmslib
+doc_category: Software
+doc_summary: Help porting GNU software to VMS
+doc_url: none
+gplv3_status: not-done-since-nomaint
+activity_status: decommissioned
+last_activity: 20130528
+gone: too stale and have GNV, per maintainer and rms
+
+package: packaging
+copyright_holder: fsf-no-reply
+doc_category: Software
+doc_summary: Packaging for GNU
+doc_url: none
+logo: /software/packaging/packaging.png
+gplv3_status: not-done-since-mia
+activity_status: decommissioned
+last_activity: 20130328
+note: no-release
+gone: too stale and have guix and gsrc, per maintainer and rms
+
+package: aetherspace
+doc_category: Games
+doc_summary: Massively multiplayer online (MMO) game
+doc_url: none
+gplv3_status: in-dev-sources (18jun08) # stated on web pages too
+activity_status: decommissioned
+last_activity: 20130324
+note: no-release
+last_contact: 20mar13 brandon asked, 12nov10 asked, 14dec09 replied, "spring 
2010"
+gone: nonexistent, per maintainer and rms
+
+package: sourceinstall
+copyright_holder: fsf-no-reply
+doc_category: Sysadmin
+doc_summary: Managing distribution sources as packages
+doc_url: /software/sourceinstall/manual/
+gplv3_status: done-in-2.5rc1 (11may08)
+last_release: 2.5
+last_release_date: 20080719
+activity_status: decommissioned
+last_activity: 20130319
+gone: gsrc + guix do the job, per maintainer and rms
+
+package: guile-gtk
+copyright_holder: fsf-no-reply
+doc_category: Libraries
+doc_summary: Guile bindings to GTK libraries
+doc_url: htmlxref
+gplv3_status: done-as-of-2.1
+last_release: 2.1
+last_release_date: 20071230
+activity_status: decommissioned
+last_activity: 20130310
+gone: replaced by guile-gnome, per maintainer and rms
+
+package: paperclips
+logo: /software/paperclips/Paperclips-GNU-small.jpg
+language: java
+doc_category: Internet
+doc_summary: Java Servlet engine with EEP! template language support
+doc_url: none
+gplv3_status: not-done-since-no-release
+activity_status: decommissioned
+last_activity: 20130213
+note: no-release
+last_contact: 11feb13 asked, 3mar10 asked
+gone: never any release, per maintainer and rms
+
+package: snakecharmer
+doc_category: Graphics
+doc_summary: Image finding with GNU GIFT
+doc_url: none
+gplv3_status: not-done-since-nomaint
+activity_status: decommissioned
+last_activity: 20130209
+note: no-release
+last_contact: see gift
+gone: never any release, no volunteers, raw sources on web page
+
+package: vc-changelog
+doc_category: Version
+doc_summary: ChangeLog management especially with distributed version control
+doc_url: none
+gplv3_status: in-dev-sources
+activity_status: decommissioned
+last_activity: 20130201
+gone: no active developers, never any release, can be under vc-dwim
+
+package: dotgnu
+mundane_name: DotGNU
+doc_category: Software
+doc_summary: Web services and C#
+doc_url: none
+gplv3_status: ok-since-container
+container: for-dotgnu-pnet-etc.
+activity_status: decommissioned
+last_activity: 20121218
+gone: no development
+
+package: dotgnu-forum
+doc_category: Internet
+doc_summary: Web site revision system for DotGNU
+doc_url: none
+gplv3_status: not-done-since-stale
+activity_status: decommissioned
+last_activity: 20121218
+note: copyright.list seems clear
+gone: no development
+
+package: dotgnu-pnet
+copyright_holder: notfsf
+doc_category: Software
+doc_summary: DotGNU Portable.NET support for .NET applications
+doc_url: http://dotgnu.org/pnetlib-doc/index.html
+download_url: ftp://ftp.gnu.org/gnu/dotgnu/
+gplv3_status: not-done-in-0.1.2
+last_release: 0.8
+last_release_date: 20070308
+last_release: libjit-0.1.2
+last_release_date: 20081210
+activity_status: decommissioned
+last_activity: 20121218
+gone: no development
+
+package: gnu-queue
+mundane_name: Queue
+copyright_holder: address@hidden and other authors
+doc_category: Sysadmin
+doc_summary: Allocate jobs to nodes in a cluster
+doc_url: none
+gplv3_status: under-discussion partly at GPLv1, but should be updatable
+last_release: 1.30.1
+last_release_date: 20001101
+activity_status: decommissioned
+last_activity: 20120811
+gone: parallel does the job
+
+package: goldwater
+doc_category: Business
+doc_summary: Middleware server
+doc_url: none
+gplv3_status: not-done-since-dotgnu-nomaint
+activity_status: decommissioned
+last_activity: 20120811
+last_contact: 31jan10 replied
+note: cvs -d:pserver:address@hidden:/sources/dgee co goldwater
+note: download_url: ftp.gnu.org:gnu/dotgnu -- taken offline, though
+gone: 11aug12
+
+package: goodbye
+doc_category: Software
+doc_summary: Kiosk management
+doc_url: none
+gplv3_status: not-done-since-no-release
+activity_status: decommissioned
+last_activity: 20120725
+note: no-release
+gone: per rms on gnu-prog-discuss
+
+package: aeneas
+doc_category: Science
+doc_summary: Design and simulation of submicron semiconductor devices
+doc_url: /software/aeneas/#documentation
+gplv3_status: done-in-1.2 (14jul08)
+last_release: 1.2
+last_release_date: 20080714
+activity_status: decommissioned
+last_activity: 20120513
+gone: subsumed into archimedes
+
+package: sxml
+download_url: http://medialab.di.unipi.it/Project/SXML/resources.html
+doc_category: Web
+doc_summary: Simple XML for defining and implementing markup languages
+doc_url: none
+gplv3_status: not-done-since-stale
+last_release: 0.96
+last_release_date: 20010829
+activity_status: decommissioned
+last_activity: 20120512
+last_contact: 14nov10 stepped down
+gone: replaced by xmlat
+
+package: proto
+copyright_holder: confused
+note: copyright.list says fsf, sources don't
+doc_category: Software
+doc_summary: Find prototypes in header files
+doc_url: none
+download_url: http://www.oualline.com/sw/
+gplv3_status: done-since-public-domain
+activity_status: decommissioned
+last_activity: 20110319
+last_contact: 3mar11 to rms, 14mar10 replied, no plans to work on it
+gone: maintainer not interested, rms ok with decommissioning it
+
+package: libiberty
+copyright_holder: fsf
+gplv3_status: under-discussion
+activity_status: decommissioned
+last_activity: 20101202
+note: released-in-combination
+gone: redundant with gcc
+
+package: gnotary
+mundane_name: GNotary
+doc_category: Business
+doc_summary: Digitally sign electronic health records
+doc_url: none
+gplv3_status: not-done-since-stale
+last_release: 0.1.rc1
+last_release_date: 20050827
+activity_status: decommissioned
+last_activity: 20101128
+last_contact: see gnumed
+gone: never got off the ground, maintainers have no time for it
+
+package: songanizer
+copyright_holder: fsf
+doc_category: Audio
+doc_summary: Organize collections of audio files
+doc_url: none
+gplv3_status: not-done-in-1.0
+last_release: 1.0
+last_release_date: 20070326
+activity_status: decommissioned
+last_activity: 20101122
+last_contact: 19nov10 wrote, 10feb09 wrote
+gone: maintainer resigned, never caught on
+
+package: dictionary
+download_url: ftp://ftp.gnu.org/gnu/gcide
+gplv3_status: not-done-since-moribund
+last_release: 0.46
+last_release_date: 20020101
+activity_status: decommissioned
+last_activity: 20101117
+last_contact: 21jun10 replied
+note: exact last release date not known
+note: renamed to/from gcide
+note: gray will make an interface and spruce it up as part of dico.
+gone: no need to be separate from dico
+
+package: beacon
+gplv3_status: not-done-since-no-release
+activity_status: decommissioned
+last_activity: 20101114
+note: nonesuch
+note: no-release
+last_contact: see aroundme
+gone: like aroundme, but never existed
+
+package: aroundme
+mundane_name: AROUNDMe
+download_url: http://www.barnraiser.org/aroundme/
+doc_category: Web
+gplv3_status: done-in-aroundme_pi_20080116a
+activity_status: decommissioned
+last_activity: 20101114
+last_contact: 200808 wrote author, working
+gone: discovered resignation
+
+package: libopts
+gplv3_status: not-done-in-27.6
+last_release: 27.6
+last_release_date: 20070127
+activity_status: decommissioned
+last_activity: 20101109
+last_contact: 15feb10 wrote
+gone: effectively part of autogen, unused on its own.
+
+package: zebra
+download_url: ftp://ftp.zebra.org/pub/zebra/
+logo: http://www.zebra.org/zebralogo.jpg
+gplv3_status: not-done-since-stale
+last_release: 0.95a
+last_release_date: 20050908
+activity_status: decommissioned
+last_activity: 20101108
+last_contact: 10feb10 wrote
+note: 18dec09 quagga unlikely replacement, some developers anti-gplv3.
+note: see also http://www.zebra.org
+gone: maintainer disappeared for years, quagga fork is active.
+
+package: isofsmk
+gplv3_status: not-done-in-1.11.3
+last_release: 1.13
+last_release_date: 20100108
+activity_status: decommissioned
+last_activity: 20100708
+gone: per author, replaced by xorriso.
+
+package: toutdoux
+doc_url: http://www.gnu.org/software/toutdoux/en/documentation.html
+activity_status: decommissioned
+last_activity: 20090420
+gone: per author.
+
+package: octal
+doc_url: http://www.gnu.org/software/octal/ox_api_main/
+activity_status: decommissioned
+last_activity: 20090409
+gone: per author.
+
+package: abcsh
+activity_status: decommissioned
+gone: per author, #332187.
+
+package: gnufi
+activity_status: decommissioned
+last_activity: 20100213
+gone: 13feb10
+
+package: cons
+activity_status: decommissioned
+last_activity: 20100103
+gone: 3jan10
+
+package: radar
+activity_status: decommissioned
+last_activity: 20081013
+gone: 13oct08
+
+package: recode
+activity_status: decommissioned
+last_activity: 20081013
+gone: 13oct08
+
+package: balsa
+activity_status: decommissioned
+last_activity: 20080304
+gone: 4mar08
+
+package: hydrant
+activity_status: decommissioned
+last_activity: 20080218
+gone: 18feb08
+
+package: cfs-el
+activity_status: decommissioned
+last_activity: 20070831
+gone: 31aug07 or so
+
+package: music
+activity_status: decommissioned
+last_activity: 20070828
+gone: 28aug07
+
+package: mana
+activity_status: decommissioned
+last_activity: 20070817
+gone: 17aug07
+
+package: leonardo
+activity_status: decommissioned
+last_activity: 20070512
+gone: 12may07
+
+package: hegemonie
+activity_status: decommissioned
+last_activity: 20070329
+gone: 29mar07
+
+package: gnusql
+activity_status: decommissioned
+last_activity: 20060316
+gone: 16mar06
+
+package: free
+activity_status: decommissioned
+last_activity: 20021025
+gone: 25oct02
+
+package: dld
+activity_status: decommissioned
+last_activity: 20010711
+gone: 11jul01 or so
+
+package: rx
+activity_status: decommissioned
+gone: long ago
+
+package: doschk
+activity_status: decommissioned
+gone: always nongnu
+
+package: emacs-wiki
+activity_status: decommissioned
+gone: never dubbed
+
+package: adhoc
+activity_status: decommissioned
+gone: never dubbed
+
+package: fileutils
+activity_status: decommissioned
+gone: long ago merged into coreutils
+
+package: textutils
+activity_status: decommissioned
+gone: long ago merged into coreutils
+
+package: sh-utils
+activity_status: decommissioned
+gone: long ago merged into coreutils
+
+package: finger
+activity_status: decommissioned
+gone: long ago merged into inetutils
+
+package: gfe
+activity_status: decommissioned
+gone: long ago
+
+package: gts
+mundane_name: G Transaction Server (?)
+activity_status: decommissioned
+gone: long ago
+note: Todd Lewis
+note: http://archives.postgresql.org/pgsql-hackers/1999-03/msg00200.php
+
+package: winboard
+activity_status: decommissioned
+gone: part of xboard
+
+# End. (Do not remove this line or the blank line before it.  Thanks.)

Index: rec/gnupackages2txt.awk
===================================================================
RCS file: rec/gnupackages2txt.awk
diff -N rec/gnupackages2txt.awk
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ rec/gnupackages2txt.awk     11 May 2019 10:44:54 -0000      1.1
@@ -0,0 +1,204 @@
+# $Id: gnupackages2txt.awk,v 1.1 2019/05/11 10:44:54 ineiev Exp $
+# gnupackages.rec to old gnupackages.txt
+#
+#  Copyright (C) 2018 Mike Gerwitz
+#
+#  This program is free software: you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# This script converts the gnupackages.rec recfile into the old txt format
+# that used to be committed directly to the repository.  The txt format
+# will eventually be entirely removed; this is intended to allow that
+# transition to proceed incrementally.
+
+BEGIN {
+    FS = OFS = ": "
+}
+
+{
+    if ( ( substr( $1, 1, 1 ) == "+" ) && ( key != "" ) ) {
+        # next line of a multiline record
+        sub( /^[+] */, "", $0 )
+        add_key( key, $0 )
+        next
+    }
+    key   = is_key() ? $1 : ""
+    value = $2
+}
+
+# recfile headers (replace the first one with a warning)
+/^%rec:/ {
+    print "# THIS FILE IS NOW GENERATED FROM rec/gnupackages.rec;"
+    print "# DO NOT MODIFY DIRECTLY!"
+}
+/^%/ { next }
+
+is_key_assign() {
+    add_key( key, value )
+}
+
+# A number of keys are handled differently in the recfile
+key == "package"         { package = value }
+key == "blurb_id"        { next }
+key == "activity_status" { next }
+key == "last_activity"   { next }
+key == "container"       { next }
+key == "last_contact"    { next }  # output at end (reorder)
+key == "next_contact"    { next }  # output at end (reorder)
+key == "note"            { next }  # output at end (reorder)
+key ~ /^last_release/    { next }
+
+# End of package block
+eob() {
+    print "activity-status", mkactivity()
+    printkey( "last_contact" )
+    printkey( "next_contact" )
+    printnotes()
+
+    package = ""
+    delete pkginfo
+    delete pkginfon
+}
+
+{
+    # recfiles use snake case and gnupackages.txt uses dashes
+    gsub( /_/, "-", $1 )
+    print
+}
+
+
+# Key abstractions and predicates
+function is_key()        { return $1 ~ /^[a-z_]+$/ }
+function is_key_assign() { return is_key() && value }
+function eob()           { return $0 ~ /^$/ && package }
+function is_symnote()    { return get_key( "note" ) ~ /^[a-z-]+$/ }
+
+
+# Print a "key: value" line for each value of key K
+#
+# K may have multiple values if `add_key' was called multiple times for
+# the same K.
+function printkey( k,   n, i )
+{
+    n = keylen( k )
+
+    for ( i = 0; i < n; i++ ) {
+        print gensub( /_/, "-", "g", k ), get_key( k, i )
+    }
+}
+
+# Print note unless it is a symbolic note
+#
+# Symbolic notes have special meaning and are concatenated with the
+# activity status in the output.  Note that `is_symnote` only checks
+# the first key value, and so this may not work correctly given multiple
+# notes; it just hasn't been a problem yet, as of this time of writing.
+function printnotes()
+{
+    if ( is_symnote() ) {
+        return
+    }
+
+    printkey( "note" )
+}
+
+
+# Generate activity status line
+function mkactivity()
+{
+    return mkstatus() mkrelease()
+}
+
+
+# Generate status portion of activity status
+#
+# The status may be suffixed by a date and a symbolic note.
+function mkstatus(    status, last_act )
+{
+    status   = get_key( "activity_status" )
+    last_act = get_key( "last_activity" )
+
+    switch ( status )
+    {
+        case "newmaint":
+        case "newcomaint":
+        case "newpkg":
+        case "nomaint":
+            status = status "/" last_act
+            break;
+
+        case "container":
+            status = status " " get_key( "container" )
+            break;
+    }
+
+    # notes that look like symbols were taken from the
+    # old activity-status, so re-add them
+    if ( is_symnote() ) {
+        status = status " " get_key( "note" )
+    }
+
+    return status;
+}
+
+
+# Generate release portion of activity status
+#
+# If there are multiple release versions, then all but the first will
+# have a date suffixed with the form "%s/%d".
+function mkrelease(    last_date, last_ver, release, i )
+{
+    i = keylen( "last_release" ) - 1
+
+    if ( i == -1 ) {
+        return ""
+    }
+
+    # begin string with latest version number (last index)
+    release = sprintf( " %d (%s",
+                       get_key( "last_release_date", i ),
+                       get_key( "last_release", i ) )
+
+    # all other releases, if any
+    while ( i-- > 0 ) {
+        release = sprintf( "%s, %s/%d",
+                           release,
+                           get_key( "last_release", i ),
+                           get_key( "last_release_date", i ) )
+    }
+
+    return release ")"
+}
+
+
+# Append a value V for key K
+#
+# If K already has a value, another will be added; values are
+# never replaced by this function.
+function add_key( k, v,   i )
+{
+    i = pkginfon[k]++;
+    pkginfo[k][i] = v
+}
+
+# Get value of key K at index I (default 0)
+function get_key( k, i )
+{
+    return pkginfo[k][ or( i, 0 ) ]
+}
+
+# Get number of values for key K
+function keylen( k )
+{
+    return pkginfon[k]
+}

Index: rec/pkgblurbs2txt.awk
===================================================================
RCS file: rec/pkgblurbs2txt.awk
diff -N rec/pkgblurbs2txt.awk
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ rec/pkgblurbs2txt.awk       11 May 2019 10:44:54 -0000      1.1
@@ -0,0 +1,43 @@
+# $Id: pkgblurbs2txt.awk,v 1.1 2019/05/11 10:44:54 ineiev Exp $
+# pkgblurbs.rec to old pkgblurbs.txt
+#
+#  Copyright (C) 2018 Mike Gerwitz
+#
+#  This program is free software: you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# This script converts the pkgblurbs.rec recfile into the old txt format
+# that used to be committed directly to the repository.
+
+BEGIN {
+  print "# Public domain."
+  print "#"
+  print "# This source code for this file is maintained in GNU womb:"
+  print "# http://cvs.savannah.gnu.org/viewvc/gnumaint/?root=womb";
+  print "#"
+  print "# This file specifies a short blurb for each GNU package.  These are"
+  print "# used by www.gnu.org, GSRC, and Guix."
+  print "#"
+  print "# THIS FILE IS NOW GENERATED FROM rec/pkgblurbs.rec;"
+  print "# DO NOT MODIFY DIRECTLY!"
+  print ""
+}
+
+# essentially just omits ^id: and %rec headers
+/^package:/,/^$/ { print }
+
+END {
+  print "# Local Variables:"
+  print "# compile-command: \"make pkgblurbs.txt\""
+  print "# End:"
+}

Index: rec/gnupackages.rec
===================================================================
RCS file: rec/gnupackages.rec
diff -N rec/gnupackages.rec
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ rec/gnupackages.rec 11 May 2019 10:44:54 -0000      1.1
@@ -0,0 +1,5036 @@
+# $Id: gnupackages.rec,v 1.1 2019/05/11 10:44:54 ineiev Exp $
+# Public domain.
+#
+# This file is maintained in the CVS repository of GNU womb,
+# http://cvs.savannah.gnu.org/viewvc/gnumaint/?root=womb
+#
+# This file records information about GNU packages on a per-package
+# basis, *not* including the maintainers (that's in
+# /gd/gnuorg/maintainers).  There is nothing private in this file.
+#
+# Since some things are unique to the package and other things are
+# unique to the maintainer(s), it seems cleanest to have two files.
+#
+# This file is in GNU Recutils' format, meaning it is easiest to query
+# the content via that software.  This file contains one record type,
+# Package, and uses the package name as the record key.
+#
+# Info/constraints about the fields:
+# - The package name should always be all-lowercase.
+#
+# - When mundane_name is not specified, default is to capitalize the first
+#   letter of the package identifier.
+#
+# - Default for download_url is http://ftp.gnu.org/gnu/PKGNAME.
+#
+# - A doc_url value of "none" means no specific documentation page (home
+#     page is used).
+#   "htmlxref" means to extract a list of additional manuals from the
+#     Texinfo htmlxref.cnf file.
+#   Otherwise, it can be a url, which can be used together with htmlxref,
+#   but multiple explicit urls or other combinations are not supported.
+#
+# - doc_category values are in doc-categories.txt (following FSD).
+# (doc stuff is used to generate gnu.org/manual.)
+#
+# - each package should always have an activity_status
+#
+# - allowed activity_status values:
+#   ok;
+#   newmaint,newcomaint (newly-appointed);
+#   newpkg (newly-dubbed);
+#   nomaint (no maintainer);
+#   container (doesn't get released);
+#   subpkg (released as part of another package);
+#   stable (no current release, but none needed);
+#   stale (needs release);
+#   moribund (needs release, but not likely to ever get one).
+#   alpha (alpha-only releases so far)
+#
+# - most activity statuses must have an associated date of last
+#   activity
+#
+# - as a consistency check, the last activity should always be at
+# least the last release date
+#
+# The home page is not a field because that *always* is (should be)
+# /software/PACKAGE, even if that does nothing but redirect.  Any other
+# method leads to redundant (hence inevitably inconsistent) information.
+#
+# Finally, this file as a whole is more or less sorted by package
+# identifier, for human convenience.  However, software reading this
+# file should accept any order of packages or fields.
+
+# See the file pkg-descriptor.rec in this directory for the full
+# definition of the Package record type.
+
+%rec: Package rec/package-descriptor.rec
+%doc: Current GNU packages
+
+
+package: 3dldf
+mundane_name: 3DLDF
+copyright_holder: notfsf
+doc_category: Graphics
+doc_summary: 3D drawing with MetaPost output
+doc_url: /software/3dldf/manual/
+blurb_id: 3dldf_blurb
+logo: /software/3dldf/graphics/dhnlogo.png
+gplv3_status: in-dev-sources (gnumaint-reply 29 Aug 2007 19:26:27)
+last_release: 2.0.3
+last_release_date: 20131213
+activity_status: stale
+last_activity: 20131213
+
+package: 8sync
+copyright_holder: notfsf
+doc_category: Libraries
+doc_summary: An asynchronous programming library for Guile
+doc_url: /software/8sync/manual/
+blurb_id: 8sync_blurb
+gplv3_status: done
+last_release: 0.4.1
+last_release_date: 20170108
+activity_status: ok
+last_activity: 20170108
+
+package: a2ps
+mundane_name: a2ps
+copyright_holder: notfsf
+doc_category: Printing
+doc_summary: Any file to PostScript, including pretty-printing
+doc_url: none
+blurb_id: a2ps_blurb
+gplv3_status: done-in-4.14
+last_release: 4.14
+last_release_date: 20071228
+activity_status: newcomaint
+last_activity: 20170421
+
+package: acct
+copyright_holder: fsf-ok-#786467
+doc_category: Sysadmin
+doc_summary: Standard login and process accounting utilities
+doc_url: /software/acct/manual/accounting.html
+blurb_id: acct_blurb
+gplv3_status: done-as-of-6.5
+last_release: 6.6.2
+last_release_date: 20141107
+activity_status: ok
+last_activity: 20141107
+
+package: acm
+doc_category: Games
+doc_summary: Multiplayer aerial combat simulation
+doc_url: none
+blurb_id: acm_blurb
+download_url: http://www.websimulations.com/download.htm
+gplv3_status: done-in-5.1
+last_release: 5.1
+last_release_date: 20101205
+last_contact: 16nov10 replied, soon
+activity_status: stale
+last_activity: 20101205
+
+package: adns
+doc_category: Libraries
+doc_summary: Asynchronous DNS client library and utilities
+doc_url: none
+blurb_id: adns_blurb
+download_url: http://www.chiark.greenend.org.uk/~ian/adns/ftp/
+gplv3_status: done-in-1.5.0
+last_release: 1.5.1
+last_release_date: 20160812
+activity_status: ok
+last_activity: 20160812
+
+package: alive
+doc_category: Internet
+doc_summary: Autologin and keep-alive daemon
+doc_url: /software/alive/manual/
+blurb_id: alive_blurb
+download_url: http://download.savannah.gnu.org/releases/alive/
+gplv3_status: not-done-in-1.4.0-nomaint
+last_release: 2.0.2
+last_release_date: 20120908
+activity_status: stale
+last_activity: 20120908
+
+package: anubis
+doc_category: Email
+doc_summary: SMTP message submission daemon
+doc_url: /software/anubis/manual/
+blurb_id: anubis_blurb
+gplv3_status: done-in-4.1.1
+last_release: 4.2
+last_release_date: 20140523
+activity_status: ok
+last_activity: 20140523
+
+package: apl
+mundane_name: APL
+doc_category: Software
+doc_summary: APL interpreter
+doc_url: none
+blurb_id: apl_blurb
+gplv3_status: done-in-1.0
+last_release: 1.6
+last_release_date: 20160828
+activity_status: ok
+last_activity: 20160828
+
+package: archimedes
+doc_category: Science
+doc_summary: Semiconductor device simulator
+doc_url: /software/archimedes/manual/
+blurb_id: archimedes_blurb
+gplv3_status: done-in-0.8.0 (14jul08)
+last_release: 2.0.1
+last_release_date: 20130429
+activity_status: stale
+last_activity: 20130429
+
+package: aris
+doc_category: Mathematics
+doc_summary: Natural deduction first-order logic interface
+doc_url: none
+blurb_id: aris_blurb
+gplv3_status: ok
+last_release: 2.2
+last_release_date: 20140306
+activity_status: ok
+last_activity: 20140306
+
+package: artanis
+language: guile
+doc_category: Internet
+doc_summary: Web application framework written in Guile
+doc_url: htmlxref
+blurb_id: artanis_blurb
+gplv3_status: ok
+activity_status: newpkg
+last_activity: 20150118
+
+package: aspell
+doc_category: Text
+doc_summary: Spell checker
+doc_url: htmlxref
+blurb_id: aspell_blurb
+gplv3_status: under-discussion-library (gnumaint-reply 20 Aug 2007 20:31:07)
+last_release: 0.60.6.1
+last_release_date: 20110604
+activity_status: stale
+last_activity: 20110604
+
+package: auctex
+copyright_holder: fsf-maybe-ok-remaining-few-in-process-#786529
+logo: /software/auctex/img/auctex-logo.png
+mundane_name: AUCTeX
+doc_category: Text
+doc_summary: Emacs environment for editing (all flavors of) TeX files
+doc_url: /software/auctex/manual/
+blurb_id: auctex_blurb
+gplv3_status: done-in-11.85
+last_release: 11.90
+last_release_date: 20170110
+activity_status: ok
+last_activity: 20170110
+
+package: autoconf
+copyright_holder: fsf-ok-#786485
+doc_category: Software
+doc_summary: Create source code configuration scripts
+doc_url: /software/autoconf/manual/
+blurb_id: autoconf_blurb
+gplv3_status: done-in-2.65-with-exception-#349136
+last_release: 2.69
+last_release_date: 20120424
+activity_status: stale
+last_activity: 20120424
+
+package: autoconf-archive
+language: autoconf
+doc_category: Software
+doc_summary: Collection of freely reusable Autoconf macros
+doc_url: none
+blurb_id: autoconf_archive_blurb
+gplv3_status: not-applicable
+last_release: 2016.09.16
+last_release_date: 20160916
+activity_status: ok
+last_activity: 20160916
+
+package: autogen
+copyright_holder: notfsf
+logo: /software/autogen/pix/autogen_back.png
+doc_category: Software
+doc_summary: Automated program generator
+doc_url: /software/autogen/manual/
+blurb_id: autogen_blurb
+gplv3_status: done-in-5.9.5
+last_release: 5.18.10
+last_release_date: 20160524
+activity_status: ok
+last_activity: 20160524
+
+package: automake
+copyright_holder: fsf-no-reply
+language: perl
+doc_category: Software
+doc_summary: Making GNU standards-compliant Makefiles
+doc_url: /software/automake/manual/
+blurb_id: automake_blurb
+gplv3_status: done-with-exception-#349136
+last_release: 1.15
+last_release_date: 20150105
+activity_status: ok
+last_activity: 20150105
+
+package: avl
+copyright_holder: fsf-ok-#786498
+doc_category: Libraries
+doc_summary: Binary and balanced search trees
+doc_url: htmlxref
+blurb_id: avl_blurb
+gplv3_status: done-in-2.0.3
+last_release: 2.0.3
+last_release_date: 20070825
+activity_status: stable
+last_activity: 20070825
+
+package: ballandpaddle
+mundane_name: Ball and Paddle
+doc_category: Games
+doc_summary: Ball and paddle game extensible with Guile
+doc_url: none
+blurb_id: ballandpaddle_blurb
+gplv3_status: done-in-0.7.1
+last_release: 0.8.1
+last_release_date: 20090715
+last_contact: 11feb13 replied soon
+activity_status: stale
+last_activity: 20090715
+
+package: barcode
+doc_category: Business
+doc_summary: Convert text strings to printed bars in various standards
+doc_url: none
+blurb_id: barcode_blurb
+gplv3_status: under-discussion (3nov09)
+last_release: 0.99
+last_release_date: 20130329
+activity_status: stale
+last_activity: 20130329
+
+package: bash
+copyright_holder: fsf-ok-with-examples-#790945
+doc_category: Software
+doc_summary: The GNU Bourne-Again SHell
+doc_url: /software/bash/manual/
+blurb_id: bash_blurb
+gplv3_status: done-in-4.0
+last_release: 4.4
+last_release_date: 20160917
+activity_status: ok
+last_activity: 20160917
+
+package: bayonne
+copyright_holder: notfsf
+doc_category: Telephony
+doc_summary: Telephony server
+doc_url: /software/bayonne/bayonne.html#documentation
+blurb_id: bayonne_blurb
+gplv3_status: next-release-early-2009 (licensing #373278)
+last_release: bayonne-2.99+3.0apionly2
+last_release_date: 20111218
+activity_status: stale
+last_activity: 20111218
+
+package: bazaar
+search_alias: bzr
+savannah: none
+copyright_holder: notfsf
+logo: //planet.bazaar.canonical.com/images/logo.png
+language: c,xpython
+doc_category: Version
+doc_summary: Version control system supporting both distributed and 
centralized workflows
+doc_url: http://doc.bazaar.canonical.com/en/
+blurb_id: bazaar_blurb
+download_url: http://bazaar-vcs.org/Download
+gplv3_status: not-done-in-2.02/14dec09-asked-rms, doc-license-is-gpl-too 
https://bugs.edge.launchpad.net/bzr/+bug/433734
+last_release: 2.7.0
+last_release_date: 20160131
+note: the bazaar project on savannah is not this; not on savannah at all
+activity_status: ok
+last_activity: 20160131
+
+package: bc
+copyright_holder: fsf-no-reply
+doc_category: Mathematics
+doc_summary: Arbitrary precision numeric processing language
+doc_url: /software/bc/manual/bc.html
+blurb_id: bc_blurb
+gplv3_status: next-release
+last_release: 1.06
+last_release_date: 20001115
+last_contact: 7may12 ken replied, 6may12 phil replied, 22may08 pizzini replied
+activity_status: stale
+last_activity: 20001115
+
+package: bfd
+mundane_name: BFD
+copyright_holder: fsf-ok-#787030
+doc_category: Libraries
+doc_summary: Binary File Descriptor library
+doc_url: htmlxref
+blurb_id: bfd_blurb
+gplv3_status: unknown
+container: is-binutils
+activity_status: container
+
+package: binutils
+copyright_holder: fsf-ok-#787031
+doc_category: Software
+doc_summary: Binary utilities: bfd gas gprof ld
+doc_url: /software/binutils/manual/
+blurb_id: binutils_blurb
+doc_url: htmlxref
+gplv3_status: done-in-binutils-2.18
+last_release: 2.27
+last_release_date: 20160825
+activity_status: ok
+last_activity: 20160825
+
+package: bison
+copyright_holder: fsf-ok-#786486,#786486
+doc_category: Software
+doc_summary: Parser generator
+doc_url: /software/bison/manual/
+blurb_id: bison_blurb
+doc_shop: The Bison Manual
+doc_shop: http://shop.fsf.org/product/bison-manual/
+gplv3_status: done-in-2.4-without-exception-#502111
+last_release: 3.0.4
+last_release_date: 20150123
+activity_status: ok
+last_activity: 20150123
+
+package: bool
+copyright_holder: fsf-no-reply
+doc_category: Text
+doc_summary: Finding text and HTML files that match boolean expressions
+doc_url: none
+blurb_id: bool_blurb
+gplv3_status: done-in-bool-0.2.2
+last_release: 0.2.2
+last_release_date: 20150511
+last_contact: 5sep08,17dec09 asked
+activity_status: ok
+last_activity: 20150511
+
+package: bpel2owfn
+mundane_name: BPEL2oWFN
+logo: /software/bpel2owfn/ressource/bpel2owfn.png
+doc_category: Business
+doc_summary: Translating web service in BPEL to Open Workflow Nets
+doc_url: htmlxref
+blurb_id: bpel2owfn_blurb
+download_url: https://github.com/nlohmann/bpel2owfn
+gplv3_status: done-in-2.0.4
+last_release: 2.4
+last_release_date: 20100124
+last_contact: 9apr10 replied
+activity_status: stable
+last_activity: 20100124
+
+package: c-graph
+logo: /software/c-graph/images/c-graph.png
+doc_category: Mathematics
+doc_summary: Visualizing and demonstrating convolution
+doc_url: /software/c-graph/manual/
+blurb_id: c_graph_blurb
+gplv3_status: done
+last_release: 2.0
+last_release_date: 20120426
+activity_status: stale
+last_activity: 20120426
+
+package: ccaudio
+mundane_name: ccAudio
+doc_category: Telephony
+doc_summary: Standalone C++ class framework for manipulating audio data
+doc_url: /software/ccaudio/ccaudio.html#documentation
+blurb_id: ccaudio_blurb
+gplv3_status: done-in-1.0.0
+last_release: ccaudio2-2.2.0
+last_release_date: 20151213
+activity_status: ok
+last_activity: 20151213
+
+package: ccd2cue
+doc_category: Audio
+doc_summary: CCD to CUE sheet conversion
+doc_url: /software/ccd2cue/manual/
+blurb_id: ccd2cue_blurb
+gplv3_status: done
+last_release: 0.5
+last_release_date: 20150313
+activity_status: ok
+last_activity: 20150313
+
+package: ccide
+doc_category: Software
+doc_summary: Decision table code generator
+doc_url: none
+blurb_id: ccide_blurb
+gplv3_status: done
+download_url: http://sourceforge.net/projects/ccide/files/
+last_release: 0.6.6
+last_release_date: 20120905
+activity_status: stale
+last_activity: 20120905
+
+package: ccrtp
+mundane_name: ccRTP
+copyright_holder: notfsf
+doc_category: Telephony
+doc_summary: Implementation of RTP (real-time transport protocol)
+doc_url: /software/ccrtp/ccrtp.html#documentation
+blurb_id: ccrtp_blurb
+gplv3_status: not-done-in-1.6.2, gplv3 done in libzrtpcpp-1.1.0
+last_release: libzrtpcpp-2.3.4
+last_release_date: 20130701
+last_release: 2.1.2
+last_release_date: 20150329
+activity_status: ok
+last_activity: 20140414
+
+package: ccscript
+mundane_name: ccScript
+doc_category: Telephony
+doc_summary: C++ class framework for virtual machine execution
+doc_url: /software/ccscript/ccscript.html#documentation
+blurb_id: ccscript_blurb
+gplv3_status: done-in-4.0.0
+last_release: ccscript3-1.1.7
+last_release_date: 20090214
+last_release: 5.1.0
+last_release_date: 20151213
+activity_status: ok
+last_activity: 20151213
+
+package: cfengine
+copyright_holder: fsf-no-reply
+logo: //cfengine.com/wp-content/uploads/2014/06/logo_with_box.png
+doc_category: Sysadmin
+doc_summary: Configuration engine for system and network administration
+doc_url: /software/cfengine/docs/cfdocs.html
+blurb_id: cfengine_blurb
+download_url: http://www.cfengine.org/pages/download
+gplv3_status: done-in-v3-but-no-longer-gnu
+last_release: 2.2.8
+last_release_date: 20080805
+last_contact: feb10 gscrivano prepared patches for rms
+activity_status: stale
+last_activity: 20080805
+
+package: cflow
+doc_category: Software
+doc_summary: Create a graph of control flow within a program
+doc_url: /software/cflow/manual/
+blurb_id: cflow_blurb
+gplv3_status: done-in-1.3
+last_release: 1.5
+last_release_date: 20160517
+activity_status: ok
+last_activity: 20160517
+
+package: cgicc
+copyright_holder: notfsf
+doc_category: Libraries
+doc_summary: C++ class library for writing CGI applications
+doc_url: none
+blurb_id: cgicc_blurb
+gplv3_status: done-in-3.2.5
+logo: /software/cgicc/images/cgicc.png
+last_release: 3.2.16
+last_release_date: 20141207
+activity_status: ok
+last_activity: 20141207
+
+package: chess
+copyright_holder: fsf-ok-#786709-also-#786476,794064,795361
+doc_category: Games
+doc_summary: Full chess implementation
+doc_url: /software/chess/manual/
+blurb_id: chess_blurb
+gplv3_status: done-in-6.0.0
+last_release: 6.2.4
+last_release_date: 20161029
+activity_status: ok
+last_activity: 20161029
+
+package: cim
+doc_category: Software
+doc_summary: Simula compiler
+doc_url: none
+blurb_id: cim_blurb
+gplv3_status: not-done-in-3.30
+last_release: 5.1
+last_release_date: 20140518
+activity_status: ok
+last_activity: 20140518
+
+package: classpath
+copyright_holder: fsf-no-reply
+#logowithtoomuchquoting: 
//developer.classpath.org/mediation/ClasspathBanners?action=AttachFile&amp;do=get&amp;target=GNU_Classpath_badge-180x180.png
+doc_category: Libraries
+doc_summary: Core class libraries for Java
+doc_url: /software/classpath/docs/
+blurb_id: classpath_blurb
+gplv3_status: needs-exception-not-done-in-0.98-#530926
+last_release: inetlib-1.1.2
+last_release_date: 20100325
+last_release: 0.99
+last_release_date: 20120316
+activity_status: stale
+last_activity: 20120316
+
+package: classpathx
+copyright_holder: fsf-ok-#786644
+logo: /software/classpathx/classpathx-logo.jpg
+language: java
+doc_category: Libraries
+doc_summary: Classpath extensions: javax.* libraries
+doc_url: none
+blurb_id: classpathx_blurb
+gplv3_status: not-done-worry-about-classpath-first
+last_release: activation-1.1.2
+last_release_date: 20131112
+note: jaxp module is not copyright fsf?
+note: mostly merged into classpath
+activity_status: stale
+last_activity: 20131112
+
+package: clisp
+mundane_name: CLISP
+logo: /software/clisp/clisp.png
+doc_category: Software
+doc_summary: A Common Lisp implementation
+doc_url: /software/clisp/impnotes/clisp.html
+blurb_id: clisp_blurb
+gplv3_status: not-done-gplv2-only-in-2.4.5-bruno:24oct07-asked-rms:oct09
+last_release: 2.49
+last_release_date: 20100707
+last_contact: #773646 4oct12 asked bruno, 3jan11-rms-talking,
+activity_status: stale
+last_activity: 20100707
+
+package: combine
+doc_category: Text
+doc_summary: Extensible file matching and filtering
+doc_url: /software/combine/manual/
+blurb_id: combine_blurb
+gplv3_status: in-dev-sources (gnumaint-reply 20 Aug 2007 20:11:22)
+last_release: 0.4.0
+last_release_date: 20130729
+activity_status: stale
+last_activity: 20130729
+
+package: commoncpp
+mundane_name: [u]Common C++
+doc_category: Libraries
+doc_summary: [u]Common C++ framework for threaded applications
+doc_url: /software/commoncpp/commoncpp.html#documentation
+blurb_id: commoncpp_blurb
+gplv3_status: not-done-commoncpp2-1.6.3.tar.gz, done-ucommon-1.9.1
+last_release: commoncpp2-1.8.0
+last_release_date: 20100224
+last_release: ucommon-7.0.0
+last_release_date: 20151213
+activity_status: ok
+last_activity: 20151213
+
+package: complexity
+doc_category: Software
+doc_summary: Analyze complexity of C functions
+doc_url: /software/complexity/manual/
+blurb_id: complexity_blurb
+gplv3_status: done
+last_release: 1.10
+last_release_date: 20160309
+activity_status: ok
+last_activity: 20160309
+
+package: config
+copyright_holder: fsf-ok-#786463
+doc_category: Software
+doc_summary: Ubiquitious config.guess and config.sub scripts
+doc_url: none
+blurb_id: config_blurb
+gplv3_status: done-with-exception-#341945 (gnumaint-reply 21 Aug 2007 18:39:06)
+note: released-through-vc
+activity_status: ok
+
+package: consensus
+doc_category: Internet
+doc_summary: Coordinate free software social networking projects
+doc_url: none
+blurb_id: consensus_blurb
+gplv3_status: not-done-since-no-release
+activity_status: newpkg
+last_activity: 20121227
+
+package: coreutils
+copyright_holder: fsf-no-reply
+doc_category: Software
+doc_summary: Core GNU utilities (file, text, shell)
+doc_url: /software/coreutils/manual/
+blurb_id: coreutils_blurb
+gplv3_status: done-in-7.1
+last_release: 8.26
+last_release_date: 20161130
+activity_status: ok
+last_activity: 20161130
+
+package: cpio
+copyright_holder: fsf-ok-#793767
+doc_category: Archiving
+doc_summary: Manage cpio and tar file archives
+doc_url: /software/cpio/manual/
+blurb_id: cpio_blurb
+gplv3_status: done-in-2.9
+last_release: 2.12
+last_release_date: 20150912
+activity_status: ok
+last_activity: 20150912
+
+package: cppi
+copyright_holder: fsf-no-reply
+gplv3_status: done-in-1.14
+doc_category: Software
+doc_summary: Indent C preprocessor directives to reflect nesting and more
+doc_url: /software/cppi/manual/
+blurb_id: cppi_blurb
+last_release: 1.17
+last_release_date: 20130316
+activity_status: stale
+last_activity: 20130316
+
+package: cssc
+mundane_name: CSSC
+copyright_holder: fsf-ok-with-sccs-bsd-#786553
+doc_category: Version
+doc_summary: File-based version control like SCCS
+doc_url: htmlxref
+blurb_id: cssc_blurb
+gplv3_status: done-in-1.1.0-plus-bsd
+last_release: CSSC-1.4.0
+last_release_date: 20140711
+activity_status: ok
+last_activity: 20140711
+
+package: cursynth
+doc_category: Music
+doc_summary: Polyphonic and MIDI subtractive music synthesizer using curses
+doc_url: none
+blurb_id: cursynth_blurb
+gplv3_status: done-initially
+last_release: 1.5
+last_release_date: 20140413
+activity_status: ok
+last_activity: 20140413
+
+package: dap
+copyright_holder: fsf-no-reply
+language: c
+doc_category: Mathematics
+doc_summary: Statistics and graphics package
+doc_url: none
+blurb_id: dap_blurb
+gplv3_status: not-done-maintainer-wants-volunteer (4 Sep 2007 22:37:48, 28 Jan 
2008 20:23:40)
+last_release: 3.10
+last_release_date: 20140416
+activity_status: ok
+last_activity: 20140416
+
+package: datamash
+copyright_holder: notfsf
+doc_category: Mathematics
+doc_summary: Scriptable statistics and data calculation
+doc_url: none
+blurb_id: datamash_blurb
+last_release: 1.1.1
+last_release_date: 20170120
+activity_status: ok
+last_activity: 20170120
+
+package: dc
+copyright_holder: see-bc
+doc_category: Mathematics
+doc_summary: Arbitrary precision numeric processing with reverse-polish 
notation
+doc_url: /software/bc/manual/dc-1.05/
+blurb_id: dc_blurb
+gplv3_status: see-bc
+note: merged into the bc package (dc.README)
+last_contact: see bc
+activity_status: subpkg
+
+package: ddd
+copyright_holder: fsf-no-reply
+mundane_name: DDD
+copyright_holder: notfsf
+doc_category: Software
+doc_summary: Graphical front-end for GDB and other debuggers
+doc_url: htmlxref
+blurb_id: ddd_blurb
+logo: /graphics/dddlogo.jpg
+gplv3_status: done-as-of-3.3.12
+last_release: 3.3.12
+last_release_date: 20090211
+activity_status: newmaint
+last_activity: 20130118
+
+package: ddrescue
+mundane_name: ddrescue
+doc_category: Sysadmin
+doc_summary: Data recovery utility
+doc_url: htmlxref
+blurb_id: ddrescue_blurb
+gplv3_status: done-in-1.5
+last_release: 1.21
+last_release_date: 20160321
+activity_status: ok
+last_activity: 20160321
+
+package: dejagnu
+mundane_name: DejaGnu
+copyright_holder: fsf-ok-#786474,#786759
+logo: /software/dejagnu/images/logo.png
+doc_category: Software
+doc_summary: GNU software testing framework
+doc_url: /software/dejagnu/manual/
+blurb_id: dejagnu_blurb
+doc_source_format: docbook
+gplv3_status: done?-in-1.5
+last_release: 1.6
+last_release_date: 20160416
+activity_status: ok
+last_activity: 20160416
+
+package: denemo
+doc_category: Music
+doc_summary: Graphical music notation, front-end to GNU Lilypond
+doc_url: none
+blurb_id: denemo_blurb
+logo: //denemo.sourceforge.net/images/logo1.png
+gplv3_status: not-done-as-of-0.8.16-old-authors?
+last_release: 2.0.14
+last_release_date: 20161130
+activity_status: ok
+last_activity: 20161130
+
+package: dia
+logo: //static.gnome.org/img/dialogo.jpg
+doc_category: Graphics
+doc_summary: Diagram creation for GNOME
+doc_url: http://wiki.gnome.org/Apps/Dia/Documentation
+blurb_id: dia_blurb
+download_url: http://ftp.gnome.org/pub/gnome/sources/dia/
+gplv3_status: not-done-in-0.97-awaiting-gnome-in-general-i-suppose
+last_release: 0.97.2
+last_release_date: 20111218
+note: not clear if this is really a GNU package
+activity_status: stale
+last_activity: 20111218
+
+package: dico
+doc_category: Dictionaries
+doc_summary: Implementation of DICT server (RFC 2229)
+doc_url: http://dico.man.gnu.org.ua/
+blurb_id: dico_blurb
+gplv3_status: done-as-of-2.0
+last_release: 2.4
+last_release_date: 20161121
+activity_status: ok
+last_activity: 20161121
+
+package: diction
+doc_category: Text
+doc_summary: Identifies wordy and commonly misused phrases
+doc_url: none
+blurb_id: diction_blurb
+gplv3_status: done-in-1.11
+last_release: 1.11
+last_release_date: 20070917
+activity_status: stable
+last_activity: 20070917
+
+package: diffutils
+copyright_holder: fsf-ok-#786489
+doc_category: Text
+doc_summary: Comparing and merging files
+doc_url: htmlxref
+blurb_id: diffutils_blurb
+gplv3_status: done-in-2.9
+last_release: 3.5
+last_release_date: 20160821
+activity_status: ok
+last_activity: 20160821
+
+package: dionysus
+doc_category: Science
+doc_summary: Local search for universal constants and scientific values
+doc_url: none
+blurb_id: dionysus_blurb
+gplv3_status: done-as-of-1.1.0
+last_release: 1.3.0
+last_release_date: 20100829
+activity_status: stale
+last_activity: 20100829
+
+package: direvent
+doc_category: Sysadmin
+doc_summary: Daemon to monitor directories for events such as file removal
+doc_url: none
+blurb_id: direvent_blurb
+gplv3_status: done
+last_release: 5.1
+last_release_date: 20160706
+activity_status: ok
+last_activity: 20160706
+
+package: djgpp
+mundane_name: DJGPP
+copyright_holder: notfsf (DJ Delorie and others)
+doc_category: Software
+doc_summary: Development system and GNU utilities for DOS on x86 hardware
+doc_url: none
+blurb_id: djgpp_blurb
+gplv3_status: needs-exception-#342079 (gnumaint-reply 20 Aug 2007 21:43:02)
+download_url: http://www.delorie.com/pub/djgpp/current/v2gnu/?M=A
+last_release: 2.03
+last_release_date: 20130205
+note: not clear how to download "djgpp" as a whole.
+last_contact: eliz, in bug-gnulib 26 Jan 2011 20:56:24, says no more releases
+activity_status: stable
+last_activity: 20130205
+
+package: dominion
+doc_category: Games
+doc_summary: Multi-player world simulation and role-playing game
+doc_url: none
+blurb_id: dominion_blurb
+gplv3_status: not-done-since-stale
+last_release: 2.8.2
+last_release_date: 20050217
+last_contact: 8jan10 asked
+activity_status: stale
+last_activity: 20050217
+
+package: dr-geo
+mundane_name: Dr. Geo
+doc_category: Education
+doc_summary: Interactive geometry software
+doc_url: https://www.gnu.org/software/dr-geo/doc/
+blurb_id: dr_geo_blurb
+download_url: 
http://sourceforge.net/project/showfiles.php?group_id=13320&package_id=91900
+gplv3_status: not-done-since-nomaint
+last_release: 16.10a
+last_release_date: 20160911
+activity_status: ok
+last_activity: 20160911
+
+package: easejs
+copyright_holder: fsf-ok
+doc_category: Web
+doc_summary: Classical object-oriented framework for JavaScript
+doc_url: http://www.gnu.org/software/easejs/manual.html
+blurb_id: easejs_blurb
+gplv3_status: done-in-0.1.0
+last_release: 0.2.8
+last_release_date: 20160715
+activity_status: ok
+last_activity: 20160715
+
+package: ed
+copyright_holder: notfsf-#786696
+doc_category: Text
+doc_summary: Line-oriented text editor
+doc_url: htmlxref
+blurb_id: ed_blurb
+gplv3_status: done-in-1.0
+last_release: 1.14.1
+last_release_date: 20170112
+activity_status: ok
+last_activity: 20170112
+
+package: edma
+mundane_name: EDMA
+doc_category: Software
+doc_summary: Object-oriented component-based development environment
+doc_url: none
+blurb_id: edma_blurb
+gplv3_status: in-dev-sources
+last_release: 0.18.6, gecb-0.8.4, gidfwizard-0.6.4
+last_release_date: 20130314
+activity_status: stale
+last_activity: 20130314
+
+package: electric
+copyright_holder: fsf-ok-with-dependencies-#786479
+logo: /software/electric/electric.jpg
+doc_category: Science
+doc_url: http://www.staticfreesoft.com/jmanual/
+blurb_id: electric_blurb
+doc_summary: Electrical CAD system
+gplv3_status: in-dev-sources (gnumaint-reply 20 Aug 2007 18:50:41 -0700)
+last_release: 9.07
+last_release_date: 20161123
+activity_status: ok
+last_activity: 20161123
+
+package: emacs
+copyright_holder: fsf-maybe-ok-with-external-#786663
+#logowithtoomuchquoting: 
http://cvs.savannah.gnu.org/viewvc/*checkout*/emacs/etc/images/icons/emacs_48.png?root=emacs&amp;revision=1.3
+doc_category: Editors
+doc_summary: The extensible, customizable, self-documenting text editor
+doc_url: /software/emacs/#Manuals
+blurb_id: emacs_blurb
+doc_url: htmlxref
+doc_shop: Emacs Reference Cards
+doc_shop: https://shop.fsf.org/books-docs/emacs-reference-card-v25
+doc_shop: GNU Emacs Manual
+doc_shop: https://shop.fsf.org/books/gnu-emacs-manual-18th-edition-v-261
+gplv3_status: done-in-22.3
+last_release: 25.1
+last_release_date: 20160917
+activity_status: ok
+last_activity: 20160917
+
+package: emacs-muse
+copyright_holder: fsf-ok-#786499
+doc_category: Web
+doc_summary: Authoring and publishing environment for Emacs
+doc_url: /software/emacs-muse/manual/
+blurb_id: emacs_muse_blurb
+download_url: 
https://web.archive.org/web/20160507124048/http://download.gna.org/muse-el/
+gplv3_status: done-in-3.10
+last_release: 3.12
+last_release_date: 20080128
+activity_status: stale
+last_activity: 20080128
+
+package: emms
+copyright_holder: fsf-no-reply
+mundane_name: EMMS
+doc_category: Audio
+doc_summary: Emacs Multimedia System
+doc_url: htmlxref
+blurb_id: emms_blurb
+logo: /software/emms/emms-logo-small-2.png
+gplv3_status: done-as-of-3.0
+last_release: 4.2
+last_release_date: 20161108
+activity_status: ok
+last_activity: 20161108
+
+package: enscript
+copyright_holder: fsf-no-reply
+doc_category: Printing
+doc_summary: Generating PostScript, including pretty-printing
+doc_url: none
+blurb_id: enscript_blurb
+gplv3_status: done-in-1.6.5
+last_release: 1.6.6
+last_release_date: 20120925
+activity_status: newmaint
+last_activity: 20140305
+
+package: eprints
+logo: //www.eprints.org/style/eprintslogo.gif
+doc_category: Education
+doc_summary: Web-based repository software, with a default setup for research 
papers
+doc_url: http://wiki.eprints.org/w/EPrints_Manual
+blurb_id: eprints_blurb
+download_url: http://files.eprints.org/view/type/release.html
+gplv3_status: not-done-in-3.1.3
+last_release: 3.3.12
+last_release_date: 20130724
+last_contact: 23nov09 replied, no gplv3 decision
+note: explicit ok from rms that this is hosted remotely.
+note: explicitly don't want to release via ftp.gnu.org (11mar10->karl)
+activity_status: stale
+last_activity: 20130724
+
+package: epsilon
+copyright_holder: notfsf-#786552,#374046
+doc_category: Software
+doc_summary: A purely functional programming language
+doc_url: /software/epsilon/manual/
+blurb_id: epsilon_blurb
+gplv3_status: done-per-agreement-#374046
+note: no-release
+last_contact: 12dec12 replied "alpha soon"
+activity_status: stale
+
+package: fdisk
+copyright_holder: fsf-no-reply
+doc_category: Sysadmin
+doc_summary: Low-level disk partitioning and formatting
+doc_url: none
+blurb_id: fdisk_blurb
+gplv3_status: done-in-1.0
+last_release: 2.0.0a1
+last_release_date: 20111204
+activity_status: stale
+last_activity: 20111204
+
+package: ferret
+logo: /software/ferret/ferret.png
+doc_category: Database
+doc_summary: Entity/relationship based data modeler
+doc_url: none
+blurb_id: ferret_blurb
+gplv3_status: done-in-0.7
+last_release: 0.7
+last_release_date: 20081116
+activity_status: newmaint
+last_activity: 20130414
+
+package: findutils
+copyright_holder: fsf-ok-#786556
+doc_category: Software
+doc_summary: Operating on files matching given criteria
+doc_url: /software/findutils/manual/
+blurb_id: findutils_blurb
+gplv3_status: in-dev-sources (gnumaint-reply 23 Aug 2007 10:14:01 +0100)
+last_release: 4.6.0
+last_release_date: 20151228
+last_contact: 1may12-replied-four-blocking-bugs
+activity_status: ok
+last_activity: 20151228
+
+package: fisicalab
+mundane_name: FisicaLab
+copyright_holder: notfsf
+doc_category: Education
+doc_summary: Educational application for solving physics problems
+doc_url: none
+blurb_id: fisicalab_blurb
+gplv3_status: done-in-0.3.3
+last_release: 0.3.5
+last_release_date: 20150530
+activity_status: ok
+last_activity: 20150530
+
+package: flex manual
+doc_summary: null
+blurb_id: flex_manual_blurb
+gplv3_status: doc
+note: no-release
+activity_status: stale
+
+package: foliot
+copyright_holder: notfsf
+doc_category: Business
+doc_summary: An application for tracking time spent on projects
+doc_url: none
+blurb_id: foliot_blurb
+gplv3_status: done-in-0.9.5
+last_release: 0.9.6
+last_release_date: 20160308
+activity_status: ok
+last_activity: 20160308
+
+package: fontopia
+copyright_holder: notfsf
+doc_category: Fonts
+doc_summary: A console font editor
+doc_url: none
+gplv3_status: done-in-1.0
+activity_status: newpkg
+last_activity: 20160426
+
+package: fontutils
+copyright_holder: fsf-ok-#788255
+doc_category: Fonts
+doc_summary: Scanned image, bitmap, outline font manipulation
+doc_url: http://www.delorie.com/gnu/docs/fontutils/fontu_toc.html
+blurb_id: fontutils_blurb
+gplv3_status: not-done-since-stale
+last_release: 0.7
+last_release_date: 20000401
+last_contact: 12feb13 not soon
+activity_status: stale
+last_activity: 20000401
+
+package: freedink
+mundane_name: FreeDink
+search_alias: FreeDink DFArc frontend
+doc_category: Games
+doc_summary: Twisted adventures of young pig farmer Dink Smallwood
+doc_url: http://www.freedink.org/doc/
+blurb_id: freedink_blurb
+copyright_holder: notfsf
+gplv3_status: done-in-1.08 (gnumaint-reply 24 Aug 2007 19:47:56 +0200)
+last_release: 108.4, dfarc-3.10/20120427
+last_release_date: 20141022
+activity_status: ok
+last_activity: 20141022
+
+package: freefont
+mundane_name: Free UCS Outline Fonts
+doc_category: Fonts
+doc_summary: Unicode-encoded outline fonts
+doc_url: none
+blurb_id: freefont_blurb
+gplv3_status: done-in-20090104
+last_release: freefont-src
+last_release_date: 20120503
+activity_status: stale
+last_activity: 20120503
+
+package: freeipmi
+mundane_name: FreeIPMI
+doc_category: Libraries
+doc_summary: Platform management, including sensor and power monitoring
+doc_url: /software/freeipmi/documentation.html
+blurb_id: freeipmi_blurb
+logo: /software/freeipmi/images/freeipmi-logo-small.jpg
+gplv3_status: in-dev-sources
+last_contact: 14jan10 replied, next major release
+last_release: 1.5.4
+last_release_date: 20160930
+activity_status: ok
+last_activity: 20160930
+
+package: freetalk
+doc_category: Internet
+doc_summary: Extensible console-based Jabber client
+doc_url: /software/freetalk/freetalk.html
+blurb_id: freetalk_blurb
+download_url: http://download.savannah.gnu.org/releases/freetalk/
+gplv3_status: done-as-of-3.2
+last_release: 4.1
+last_release_date: 20141220
+activity_status: nomaint
+last_activity: 20161114
+
+package: fribidi
+mundane_name: FriBiDi
+doc_category: Localization
+doc_summary: Implementation of the Unicode bidirectional algorithm
+doc_url: none
+blurb_id: fribidi_blurb
+download_url: http://fribidi.org/download/
+gplv3_status: under-discussion-with-brett (gnumaint-reply 3 Oct 2007 11:06:24)
+last_release: 0.19.2
+last_release_date: 20090326
+activity_status: stale
+last_activity: 20090326
+
+package: g-golf
+mundane_name: G-Golf
+doc_category: Interface
+doc_summary: Guile bindings for GObject Introspection
+doc_url: none
+gplv3_status: not-done
+activity_status: newpkg
+last_activity: 20160725
+
+package: gama
+doc_category: Science
+doc_summary: Adjustment of geodetic networks
+doc_url: /software/gama/manual/
+logo: /software/gama/g-logo.png
+blurb_id: gama_blurb
+gplv3_status: done-in-1.9.04
+last_release: 1.18
+last_release_date: 20160816
+activity_status: ok
+last_activity: 20160816
+
+package: garpd
+mundane_name: Gratuitous ARP Daemon
+doc_category: Internet
+doc_summary: Broadcast gratuitous ARP requests for IPMI and more
+doc_url: none
+blurb_id: garpd_blurb
+gplv3_status: done-in-0.2.0
+last_release: 0.2.0
+last_release_date: 20101206
+last_contact: 21nov10 reply, "soon"
+activity_status: stale
+last_activity: 20101206
+
+package: gawk
+copyright_holder: fsf-maybe-ok-just-doc/macros-#787150
+doc_category: Text
+doc_summary: Text scanning and processing language
+doc_url: /software/gawk/manual/
+blurb_id: gawk_blurb
+doc_url: htmlxref
+gplv3_status: done-in-3.1.6
+last_release: 4.1.4
+last_release_date: 20160825
+activity_status: ok
+last_activity: 20160825
+
+package: gbehistun
+copyright_holder: notfsf
+doc_category: Science
+doc_summary: Planetary Science tools
+doc_url: none
+gplv3_status: unknown
+activity_status: newpkg
+last_activity: 20170129
+
+package: gcal
+copyright_holder: notfsf
+doc_category: Business
+doc_summary: Calculating and printing a wide variety of calendars
+doc_url: /software/gcal/manual/
+blurb_id: gcal_blurb
+gplv3_status: done-in-3.5
+last_release: 4.1
+last_release_date: 20170122
+activity_status: ok
+last_activity: 20170122
+
+package: gcc
+mundane_name: GCC
+copyright_holder: fsf-ok-with-external-#786963
+doc_category: Software
+doc_summary: GNU Compiler Collection
+doc_url: /software/gcc/
+blurb_id: gcc_blurb
+doc_url: htmlxref
+doc_shop: Using GCC: The GNU Compiler Collection Reference Manual
+doc_shop: 
http://shop.fsf.org/product/using-gcc-gnu-compiler-collection-reference-manual/
+logo: /software/gcc/img/gccegg-65.png
+gplv3_status: done
+last_release: 4.9.4
+last_release_date: 20160803
+last_release: 5.3
+last_release_date: 20151204
+last_release: 6.3
+last_release_date: 20161221
+activity_status: ok
+last_activity: 20161221
+
+package: gcide
+doc_category: Dictionaries
+doc_summary: GNU Collaborative International Dictionary of English
+doc_url: none
+blurb_id: gcide_blurb
+gplv3_status: unknown
+last_release: 0.51
+last_release_date: 20120304
+activity_status: stale
+last_activity: 20120304
+
+package: gcl
+mundane_name: GNU Common Lisp
+doc_category: Software
+doc_summary: A Common Lisp implementation
+doc_url: none
+blurb_id: gcl_blurb
+gplv3_status: not-done-is-lgplv2+-has-gplv2-only-users-9nov10-asked-rms
+last_release: 2.6.12
+last_release_date: 20141028
+activity_status: ok
+last_activity: 20141028
+
+package: gcompris
+mundane_name: GCompris
+doc_category: Education
+doc_summary: Educational games for small children
+doc_url: http://gcompris.net/wiki/Manual
+blurb_id: gcompris_blurb
+gplv3_status: done-in-8.4beta2 (gnumaint-reply 22 Aug 2007 02:04:12)
+download_url: http://sourceforge.net/project/showfiles.php?group_id=6865
+last_release: 15.02
+last_release_date: 20150224
+activity_status: ok
+last_activity: 20150224
+
+package: gdb
+mundane_name: GDB
+copyright_holder: fsf-not-completely-#786588
+doc_category: Software
+doc_summary: The GNU debugger
+doc_url: /software/gdb/documentation/
+blurb_id: gdb_blurb
+doc_url: htmlxref
+doc_shop: Debugging with GDB: The GNU Source-Level Debugger
+doc_shop: 
http://shop.fsf.org/product/debugging-gdb-gnu-source-level-debugger-10/
+gplv3_status: done-in-6.7
+logo: /software/gdb/images/archer.jpg
+last_release: 7.12.1
+last_release_date: 20170121
+activity_status: ok
+last_activity: 20170121
+
+package: gdbm
+copyright_holder: fsf-ok-#793768
+doc_category: Database
+doc_summary: Hash library of database functions compatible with traditional dbm
+doc_url: http://www.gnu.org.ua/software/gdbm/manual/
+blurb_id: gdbm_blurb
+gplv3_status: not-done
+last_release: 1.12
+last_release_date: 20160516
+activity_status: ok
+last_activity: 20160516
+
+package: gengen
+doc_category: Software
+doc_summary: A parameterized-text-generator generator based on a template
+doc_url: /software/gengen/gengen.html
+blurb_id: gengen_blurb
+gplv3_status: done-in-1.3
+last_release: 1.4.2
+last_release_date: 20100906
+activity_status: stale
+last_activity: 20100906
+
+package: gengetopt
+copyright_holder: fsf-ok-#796330
+doc_category: Software
+doc_summary: Create parsers for command line options
+doc_url: /software/gengetopt/gengetopt.html
+blurb_id: gengetopt_blurb
+gplv3_status: done-in-2.22.1
+last_release: 2.22.6
+last_release_date: 20121107
+activity_status: stale
+last_activity: 20121107
+
+package: gettext
+copyright_holder: fsf-ok-with-external-#786766
+doc_category: Localization
+doc_summary: Tools and documentation for translation
+doc_url: /software/gettext/manual/
+blurb_id: gettext_blurb
+gplv3_status: done-except-for-dependencies-in-0.17
+last_release: 0.19.8.1
+last_release_date: 20160611
+activity_status: ok
+last_activity: 20160611
+
+package: gforth
+copyright_holder: fsf-ok-#786710
+logo: /software/gforth/gnu-forth.png
+doc_category: Software
+doc_summary: Forth interpreter
+doc_url: htmlxref
+blurb_id: gforth_blurb
+gplv3_status: done-in-0.7.0
+last_release: 0.7.3
+last_release_date: 20140709
+activity_status: ok
+last_activity: 20140709
+
+package: gg-network
+copyright_holder: not-applicable
+doc_summary: null
+blurb_id: gg_network_blurb
+gplv3_status: not-applicable
+container: for-gnu-group
+note: first gnu group
+activity_status: container
+
+package: ggradebook
+doc_category: Education
+doc_summary: GNOME application to track students' grades for teachers
+doc_url: none
+blurb_id: ggradebook_blurb
+gplv3_status: not-done-since-stale
+last_release: 0.91
+last_release_date: 20000410
+last_contact: 22feb13 replied, 18feb13 asked
+next_contact: 15apr13
+activity_status: newmaint
+last_activity: 20160503
+
+package: ghostscript
+mundane_name: GNU Ghostscript
+copyright_holder: notfsf
+doc_category: Printing
+doc_summary: PostScript and PDF interpreter
+doc_url: none
+blurb_id: ghostscript_blurb
+logo: /software/ghostscript/images/gnugs-head.png
+gplv3_status: done-in-8.71.0
+last_release: 9.14.0
+last_release_date: 20141204
+activity_status: ok
+last_activity: 20141204
+
+package: gift
+mundane_name: GIFT
+logo: /software/gift/gnu.image.finder.png
+doc_category: Graphics
+doc_summary: GNU Image Finding Tool, with query by example
+doc_url: none
+blurb_id: gift_blurb
+gplv3_status: not-done
+last_release: 0.1.14
+last_release_date: 20050324
+last_contact: 18feb13 replied, asked
+activity_status: newmaint
+last_activity: 20110826
+
+package: gimp
+mundane_name: GIMP
+logo: //www.gimp.org/images/wilber_the_gimp.png
+doc_category: Graphics
+doc_summary: GNU Image Manipulation Program
+doc_url: http://www.gimp.org/docs/
+blurb_id: gimp_blurb
+download_url: ftp://ftp.gimp.org/pub/gimp/
+gplv3_status: not-done-in-2.6.8-probably-depends-on-gnome
+last_release: 2.8.14
+last_release_date: 20140826
+activity_status: ok
+last_activity: 20140826
+
+package: gimp www pages
+doc_summary: null
+blurb_id: gimp_www_pages_blurb
+gplv3_status: doc
+container: is-gimp
+note: there is no particularly good reason why this is listed
+note: separately from gimp itself; just historical accident.
+activity_status: container
+
+package: glean
+language: guile
+doc_category: Education
+doc_summary: extensible quizzing and tutorial for self-study
+doc_url: /software/glean/
+blurb_id: glean_blurb
+gplv3_status: ok-agplv3+
+activity_status: newpkg
+last_activity: 20141221
+
+package: gleem
+language: java,c++
+doc_category: Libraries
+doc_summary: OpenGL Extremely Easy-to-use Manipulators
+doc_url: /software/gleem/doc/
+blurb_id: gleem_blurb
+gplv3_status: not-done-since-nomaint
+last_release: 1.2.1
+last_release_date: 20020205
+activity_status: nomaint
+last_activity: 20160921
+note: Package does not meet gnueval standards.  Please ensure that
++ prospective maintainers are willing to do that work.
+
+package: glib
+mundane_name: GLib
+doc_category: Libraries
+doc_summary: Thread-safe general utility library; basis of GTK+ and GNOME
+doc_url: http://library.gnome.org/devel/glib/unstable/
+blurb_id: glib_blurb
+download_url: http://ftp.gnome.org/pub/gnome/sources/glib/
+gplv3_status: see-gtk+
+last_release: 2.46.2
+last_release_date: 20151112
+activity_status: ok
+last_activity: 201511122
+
+package: global
+doc_category: Software
+doc_summary: Cross-environment source code tag system
+doc_url: htmlxref
+blurb_id: global_blurb
+gplv3_status: done-in-5.6.2
+logo: /software/global/globe.png
+last_release: 6.5.4
+last_release_date: 20160327
+activity_status: ok
+last_activity: 20160327
+
+package: glpk
+mundane_name: GLPK
+doc_category: Libraries
+doc_summary: GNU Linear Programming Kit, supporting the MathProg language
+doc_url: none
+blurb_id: glpk_blurb
+gplv3_status: done-in-directory
+last_release: 4.61
+last_release_date: 20170122
+activity_status: ok
+last_activity: 20170122
+
+package: glue
+mundane_name: GLUE
+logo: /software/glue/glue-butterfly.jpg
+doc_category: Software
+doc_summary: Distributed groupware application framework
+doc_url: none
+blurb_id: glue_blurb
+gplv3_status: not-done-since-nonexistent
+note: no-release
+activity_status: moribund
+
+package: gmediaserver
+doc_category: Audio
+doc_summary: UPnP compatible media server
+doc_url: htmlxref
+blurb_id: gmediaserver_blurb
+download_url: http://download.savannah.gnu.org/releases/gmediaserver/
+gplv3_status: done-in-0.13.0 (18 Oct 2007 17:50:13)
+last_release: 0.13.0
+last_release_date: 20071110
+last_contact: 20nov10 replied, this year
+activity_status: stale
+last_activity: 20071110
+
+package: gmp
+mundane_name: GMP
+copyright_holder: fsf-no-reply
+doc_category: Mathematics
+doc_summary: Multiple-precision arithmetic library
+doc_url: /software/gmp/manual/
+blurb_id: gmp_blurb
+logo: //gmplib.org/gmplogo2.png
+gplv3_status: lgplv3+-as-of-4.2.2-in-2007
+last_release: 6.0.0a
+last_release_date: 20140325
+activity_status: ok
+last_activity: 20140325
+
+package: gnash
+copyright_holder: fsf-ok-#786466
+logo: /software/gnash/images/small-GnashGnu.png
+doc_category: Internet
+doc_summary: Flash movie player
+doc_url: /software/gnash/documentation.html
+blurb_id: gnash_blurb
+doc_source_format: docbook
+gplv3_status: done-in-0.8.2
+last_release: 0.8.10
+last_release_date: 20120131
+activity_status: stale
+last_activity: 20120131
+
+package: gnat
+mundane_name: GNAT
+copyright_holder: fsf-no-reply
+doc_category: Software
+doc_summary: Ada compiler
+doc_url: none
+blurb_id: gnat_blurb
+download_url: http://libre.adacore.com/libre/download2/
+gplv3_status: done-as-of-2009
+last_release: 2013
+last_release_date: 20130523
+activity_status: stale
+last_activity: 20130523
+
+package: gnats
+mundane_name: GNATS
+copyright_holder: fsf-ok-almost-completely-#790955
+logo: /software/gnats/images/gnatslogo.png
+doc_category: Software
+doc_summary: GNU problem report and bug management system
+doc_url: /software/gnats/#documentation
+blurb_id: gnats_blurb
+gplv3_status: in-dev-sources rms (gnumaint-reply 21 Aug 2007 23:53:43)
+last_release: 4.2.0
+last_release_date: 20150226
+activity_status: ok
+last_activity: 20150226
+
+package: gnatsweb
+copyright_holder: fsf-no-reply
+doc_category: Software
+doc_summary: Web interface to GNATS
+doc_url: none
+blurb_id: gnatsweb_blurb
+gplv3_status: not-done-in-4.0.0-newmaint
+last_release: 4.00
+last_release_date: 20030729
+activity_status: newmaint
+last_activity: 20140320
+
+package: gneuralnetwork
+mundane_name: Gneural Network
+copyright_holder: notfsf
+doc_category: Science
+doc_summary: Programmable neural network
+doc_url: none
+blurb_id: gneuralnetwork_blurb
+gplv3_status: done-in-0.0.1
+last_release: 0.9.1
+last_release_date: 20160504
+activity_status: ok
+last_activity: 20160504
+
+package: gnome
+mundane_name: GNOME
+logo: //www.gnome.org/wp-content/themes/gnome-grass/images/gnome-logo.png
+copyright_holder: notfsf
+doc_category: Interface
+doc_summary: The GNU desktop environment
+doc_url: http://library.gnome.org
+blurb_id: gnome_blurb
+gplv3_status: under-discussion-per-bkuhn-speters-mail-23nov09
+last_release: 3.22
+last_release_date: 20160921
+activity_status: ok
+last_activity: 20160921
+
+package: gnowsys
+mundane_name: GNOWSYS
+logo: /software/gnowsys/GNOWSYS_files/g1014.png
+doc_category: Web
+doc_summary: Distributed network-based memory and knowledge management
+doc_url: none
+blurb_id: gnowsys_blurb
+#broken 8apr12 doc_url: http://trac.gnowledge.org/trac/wiki/GnowsysDocumenation
+download_url: http://download.savannah.gnu.org/releases/gnowsys/
+gplv3_status: in-dev-sources
+last_release: 0.6r2
+last_release_date: 20060617
+last_contact: 18mar10 replied
+activity_status: stale
+last_activity: 20060617
+
+package: gnu-c-manual
+mundane_name: GNU C reference manual
+copyright_holder: fsf-ok-#786666
+doc_category: Software
+doc_summary: Reference manual for the C programming language
+doc_url: htmlxref
+blurb_id: gnu_c_manual_blurb
+gplv3_status: doc
+last_release: 0.2.2
+last_release_date: 20130618
+note: to be superseded by rms manual? #786666
+activity_status: stale
+last_activity: 20130618
+
+package: gnu-crypto
+mundane_name: Crypto
+logo: /software/gnu-crypto/graphics/gc-ls-c.png
+doc_category: Security
+doc_summary: Cryptographic primitives and tools for Java programming
+doc_url: htmlxref
+blurb_id: gnu_crypto_blurb
+gplv3_status: not-done-since-no-changes
+last_release: 2.1.0
+last_release_date: 20051023
+last_contact: see classpath
+activity_status: stable
+last_activity: 20051023
+
+package: gnu-pw-mgr
+doc_category: Security
+doc_summary: Retrieve login credentials without recording passwords
+doc_url: none
+blurb_id: gnu_pw_mgr_blurb
+gplv3_status: done-in-1.0
+last_release: 2.0
+last_release_date: 20160508
+activity_status: ok
+last_activity: 20160508
+
+package: gnuae
+mundane_name: GnuAE
+copyright_holder: fsf-ok-#786471
+logo: /software/gnuae/images/gnuae-logo.png
+doc_category: Science
+doc_summary: Designing alternate energy systems
+doc_url: /software/gnuae/manual/
+blurb_id: gnuae_blurb
+gplv3_status: in-dev-sources
+note: no-release
+activity_status: newcomaint
+last_activity: 20130404
+
+package: gnuastro
+mundane_name: Gnuastro
+doc_category: Science
+doc_summary: Astronomy utilities
+doc_url: none
+blurb_id: gnuastro_blurb
+gplv3_status: done-from-beginning
+last_release: 0.2
+last_release_date: 20161003
+activity_status: ok
+last_activity: 20161003
+
+package: gnubatch
+copyright_holder: fsf-ok-#786525
+doc_category: Sysadmin
+doc_summary: Advanced batch scheduling and job control
+doc_url: none
+blurb_id: gnubatch_blurb
+gplv3_status: done-in-1.0
+last_release: 1.11
+last_release_date: 20140422
+activity_status: ok
+last_activity: 20140422
+
+package: gnubg
+mundane_name: Backgammon
+doc_category: Games
+doc_summary: Backgammon game
+doc_url: /software/gnubg/manual/
+blurb_id: gnubg_blurb
+gplv3_status: in-dev-sources (gnumaint-reply 22 Aug 2007 20:47:21)
+last_release: 1.02.000
+last_release_date: 20130728
+last_contact: 20mar13 brandon asked
+activity_status: stale
+last_activity: 20130728
+
+package: gnubiff
+logo: //gnubiff.sourceforge.net/images/tux-sit-small.png
+doc_category: Email
+doc_summary: Mail notification program
+doc_url: http://gnubiff.sourceforge.net/documentation.php
+blurb_id: gnubiff_blurb
+download_url: http://sourceforge.net/project/showfiles.php?group_id=94176
+gplv3_status: done-in-2.2.8 (sowadart 9 Sep 2007 21:00:37 +0200)
+last_release: 2.2.16
+last_release_date: 20150228
+activity_status: ok
+last_activity: 20150228
+
+package: gnubik
+doc_category: Games
+doc_summary: 3d Rubik's cube game
+doc_url: /software/gnubik/manual/
+blurb_id: gnubik_blurb
+gplv3_status: done-in-2.3
+last_release: 2.4.2
+last_release_date: 20150506
+activity_status: ok
+last_activity: 20150506
+
+package: gnucap
+doc_category: Science
+doc_summary: Mixed analog and digital circuit simulator
+doc_url: /software/gnucap/gnucap-man-html/
+blurb_id: gnucap_blurb
+download_url: http://www.gnucap.org/archive/
+gplv3_status: needs-exception-#342232 done-in-aug20-snapshot (gnumaint-reply 
28 Aug 2007 15:45:43)
+last_release: 0.35
+last_release_date: 20060920
+last_contact: 15aug08 asked about gplv3
+activity_status: stale
+last_activity: 20060920
+
+package: gnucash
+mundane_name: GnuCash
+logo: //www.gnucash.org/images/banner5.png
+download_url: http://www.gnucash.org/download.phtml
+doc_category: Business
+doc_summary: Personal and small business financial accounting software
+doc_url: http://www.gnucash.org/docs.phtml
+blurb_id: gnucash_blurb
+tech_address: address@hidden
+gplv3_status: not-done-in-2.3.8-some-gplv2-only-files
+last_release: 2.6.14
+last_release_date: 20160917
+last_contact: 24jan10 asked
+activity_status: ok
+last_activity: 20160917
+
+package: gnucobol
+mundane_name: GnuCOBOL
+doc_category: Software
+doc_summary: A modern COBOL compiler
+doc_url: http://open-cobol.sourceforge.net/doc/gnucobol.html
+blurb_id: gnucobol_blurb
+gplv3_status: planned-for-2.x
+last_release: 1.1
+last_release_date: 20140118
+activity_status: stale
+last_activity: 20140118
+
+package: gnucomm
+mundane_name: GnuComm
+doc_category: Telephony
+doc_summary: GNU telecommunications project / GNU Telephony
+doc_url: /software/gnucomm/overview.html
+blurb_id: gnucomm_blurb
+gplv3_status: ok-since-container
+container: for-bayonne-etc.
+activity_status: container
+
+package: gnudos
+mundane_name: GnuDOS
+doc_category: Interface
+doc_summary: MS-DOS-like file manager, editor, and other tools
+doc_url: none
+blurb_id: gnudos_blurb
+gplv3_status: done-in-1.0
+last_release: 1.8
+last_release_date: 20141218
+activity_status: ok
+last_activity: 20141218
+
+package: gnue
+mundane_name: GNU Enterprise
+copyright_holder: fsf-ok-#786904
+fsd: gnuenterprise
+doc_category: Business
+doc_summary: Enterprise resource planning, et al
+doc_url: none
+blurb_id: gnue_blurb
+gplv3_status: done-in-0.5.3
+last_release: gnue-*-0.5.3
+last_release_date: 20100506
+note: many other sub-packages
+activity_status: stale
+last_activity: 20100506
+
+package: gnufm
+copyright_holder: fsf-ok-with-dependencies-#786606
+doc_category: Audio
+doc_summary: Social music explorations
+doc_url: none
+blurb_id: gnufm_blurb
+gplv3_status: not-done-since-no-release
+note: no-release
+activity_status: stale
+last_activity: 20100316
+
+package: gnugo
+copyright_holder: fsf-maybe-ok-two-files-#786733
+logo: /software/gnugo/logo-36.jpg
+doc_category: Games
+doc_summary: Play the game of Go
+doc_url: /software/gnugo/gnugo_toc.html
+blurb_id: gnugo_blurb
+gplv3_status: done-in-3.8
+last_release: 3.8
+last_release_date: 20090219
+activity_status: stable
+last_activity: 20090219
+
+package: gnuit
+copyright_holder: fsf-no-reply
+mundane_name: GNU Interactive Tools
+doc_category: Interface
+doc_summary: Interactive utilities for file browsing, viewing, and more
+doc_url: /software/gnuit/manual/
+blurb_id: gnuit_blurb
+gplv3_status: done-before-4.9.3
+last_release: 4.9.5
+last_release_date: 20090223
+activity_status: stale
+last_activity: 20090223
+
+package: gnujdoc
+doc_category: Translation
+doc_summary: Japanese translations of GNU documents
+doc_url: none
+blurb_id: gnujdoc_blurb
+gplv3_status: not-applicable-since-doc
+last_contact: 26jan10 asked, 15dec08 replied
+note: japanese translations of documents
+activity_status: stable
+
+package: gnujump
+logo: /software/gnujump/logo.png
+doc_category: Games
+doc_summary: Game of jumping to the next floor, trying not to fall
+doc_url: none
+blurb_id: gnujump_blurb
+gplv3_status: done-in-1.0.5 (13aug08)
+last_release: 1.0.8
+last_release_date: 20120724
+activity_status: stale
+last_activity: 20120724
+
+package: gnukart
+doc_category: Games
+doc_summary: Racing game
+doc_url: none
+blurb_id: gnukart_blurb
+gplv3_status: not-done-since-stale
+last_release: 0.1.4d
+last_release_date: 2010707
+last_contact: replied 21apr10
+note: renamed from speedx
+activity_status: newmaint
+last_activity: 20140420
+
+package: gnulib
+copyright_holder: fsf-ok-per-rms-#786492
+doc_category: Software
+doc_summary: Source files to share among distributions
+doc_url: /software/gnulib/manual/
+blurb_id: gnulib_blurb
+gplv3_status: done-as-much-as-possible
+note: released-through-vc
+activity_status: ok
+
+package: gnumach
+mundane_name: Mach
+copyright_holder: see-hurd
+doc_category: Software
+doc_summary: Microkernel of the GNU system
+doc_url: /software/hurd/microkernel/mach/documentation.html
+blurb_id: gnumach_blurb
+gplv3_status: see-hurd
+last_release: 1.8
+last_release_date: 20161218
+last_contact: see hurd
+activity_status: ok
+last_activity: 20161218
+
+package: gnumed
+doc_category: Health
+doc_summary: Paperless medical practice
+doc_url: http://wiki.gnumed.de/bin/view/Gnumed/GnumedManual
+blurb_id: gnumed_blurb
+download_url: http://www.gnumed.de/downloads/
+gplv3_status: working
+last_release: gnumed-server-21.9, gnumed-client-1.6.9
+last_release_date: 20160912
+activity_status: ok
+last_activity: 20160912
+
+package: gnumeric
+doc_category: Spreadsheets
+doc_summary: Spreadsheet application
+doc_url: http://www.gnome.org/projects/gnumeric/doc/gnumeric.shtml
+blurb_id: gnumeric_blurb
+download_url: http://ftp.gnome.org/pub/GNOME/sources/gnumeric/
+gplv3_status: not-done-in-1.9.18-uses-goffice-gnome-not-done
+last_release: 1.12.32
+last_release_date: 20160820
+note: FIXXXME Gnumeric has a logo, but I couldn't find it online.  yavor
+activity_status: ok
+last_activity: 20160820
+
+package: gnump3d
+logo: /software/gnump3d/gnump3d.jpg
+doc_category: Audio
+doc_summary: Server for streaming audio files
+doc_url: /software/gnump3d/documents.html
+blurb_id: gnump3d_blurb
+download_url: http://savannah.gnu.org/download/gnump3d/
+gplv3_status: not-done-in-3.0
+last_release: 3.0
+last_release_date: 20071018
+last_contact: 11feb10 asked
+activity_status: stable
+last_activity: 20071018
+
+package: gnun
+copyright_holder: fsf-ok-with-external-#786604
+mundane_name: GNUnited Nations
+doc_category: Translation
+doc_summary: Build system for www.gnu.org translations
+doc_url: /software/trans-coord/manual/
+blurb_id: gnun_blurb
+doc_url: htmlxref
+gplv3_status: done-in-0.1
+last_release: 0.11
+last_release_date: 20161008
+activity_status: ok
+last_activity: 20161008
+
+package: gnunet
+doc_category: Internet
+doc_summary: Secure, decentralized, peer-to-peer networking framework
+doc_url: https://docs.gnunet.org/
+blurb_id: gnunet_blurb
+gplv3_status: depends-on-mysql (gnumaint-reply 20 Aug 2007 20:40:48)
+last_release: java-0.10.1
+last_release_date: 20140408
+last_release: gtk-0.10.1
+last_release_date: 20140408
+last_release: fuse-0.10.0
+last_release_date: 20131222
+last_release: 0.10.1
+last_release_date: 20140408
+activity_status: ok
+last_activity: 20140408
+
+package: gnupg
+mundane_name: GnuPG
+copyright_holder: fsf-maybe-ok-couple-pieces-#786522
+doc_category: Security
+doc_summary: GNU Privacy Guard
+doc_url: http://www.gnupg.org/documentation/
+blurb_id: gnupg_blurb
+doc_url: htmlxref
+download_url: ftp://ftp.gnupg.org/gcrypt/gnupg/
+gplv3_status: done-in-2.0.7
+last_release: 1.4.21
+last_release_date: 20160817
+last_release: 2.0.30
+last_release_date: 20160331
+last_release: 2.1.18
+last_release_date: 20170124
+alias: gpg
+activity_status: ok
+last_activity: 20170123
+
+package: gnupod
+doc_category: Audio
+doc_summary: Manage portable audio device
+doc_url: /software/gnupod/gnupod.html
+blurb_id: gnupod_blurb
+gplv3_status: done-in-0.99.3
+last_release: 0.99.8
+last_release_date: 20091102
+activity_status: stable
+last_activity: 20091102
+
+package: gnuprologjava
+doc_category: Software
+doc_summary: Implementation of Prolog as a Java library
+doc_url: /software/gnuprologjava/api/
+blurb_id: gnuprologjava_blurb
+doc_url: htmlxref
+download_url: http://sourceforge.net/projects/gnuprologjava/
+gplv3_status: done-in-0.2.5-lgplv3+
+last_release: 0.2.6
+last_release_date: 20110106
+note: requires jdk 1.2, released under lgpl (no exception?)
+activity_status: stale
+last_activity: 20110106
+
+package: gnuradio
+mundane_name: Radio
+copyright_holder: fsf-no-reply
+logo: //www.gnuradio.org/assets/imgs/gnuradio_logo_glyphs_as_paths.svg
+language: python
+doc_category: Audio
+doc_summary: Software radio implementations
+doc_url: https://wiki.gnuradio.org/index.php/Main_Page
+blurb_id: gnuradio_blurb
+gplv3_status: done-in-3.1.0-probably-earlier
+last_release: 3.7.5.1
+last_release_date: 20141021
+activity_status: ok
+last_activity: 20141021
+
+package: gnurobots
+mundane_name: Robots
+doc_category: Games
+doc_summary: Program a little robot and watch him explore a world
+doc_url: /software/gnurobots/readme.html
+blurb_id: gnurobots_blurb
+gplv3_status: done-in-1.2.0
+last_release: 1.2.0
+last_release_date: 20080803
+activity_status: stale
+last_activity: 20080803
+
+package: gnuschool
+doc_category: Education
+doc_summary: Web application for educators, students, and school administrators
+doc_url: htmlxref
+blurb_id: gnuschool_blurb
+gplv3_status: done-in-0.2
+last_release: 2.2
+last_release_date: 20130718
+activity_status: stale
+last_activity: 20130718
+
+package: gnushogi
+copyright_holder: fsf-ok-#786568
+doc_category: Games
+doc_summary: The game of Shogi (Japanese chess)
+doc_url: http://www.cs.caltech.edu/~mvanier/hacking/gnushogi/gnushogi_toc.html
+blurb_id: gnushogi_blurb
+download_url: http://www.cs.caltech.edu/~mvanier/hacking/gnushogi/
+gplv3_status: not-done-in-1.3.2-nomaint
+last_release: 1.4.2
+last_release_date: 20140217
+last_contact: 13mar12 replied
+activity_status: ok
+last_activity: 20140217
+
+package: gnusound
+doc_category: Audio
+doc_summary: Multi-track sound editor for GNOME
+doc_url: /software/gnusound/Documentation/
+blurb_id: gnusound_blurb
+gplv3_status: not-done-in-0.7.5
+last_release: 0.7.5
+last_release_date: 20080706
+last_contact: 17sep11 asked #709362, 30jan10 asked
+activity_status: stale
+last_activity: 20080706
+
+package: gnuspeech
+doc_category: Interface
+doc_summary: Extensible rule-based text-to-speech
+doc_url: /software/gnuspeech/#Manuals
+blurb_id: gnuspeech_blurb
+gplv3_status: in-dev-sources
+last_release: gnuspeechsa-0.1.5
+last_release_date: 20151019
+last_release: gnuspeech-0.9
+last_release_date: 20151019
+activity_status: ok
+last_activity: 20151019
+
+package: gnuspool
+copyright_holder: fsf-ok-#786526
+doc_category: Printing
+doc_summary: Spooling system with a variety of interfaces
+doc_url: none
+blurb_id: gnuspool_blurb
+gplv3_status: done-in-1.0
+last_release: 1.8
+last_release_date: 20101021
+activity_status: stale
+last_activity: 20101021
+
+package: gnustandards
+mundane_name: GNU organization
+copyright_holder: fsf-ok
+doc_category: gnuorg
+doc_summary: GNU coding standards and maintainer information
+doc_url: htmlxref
+blurb_id: gnustandards_blurb
+gplv3_status: doc
+note: released-through-vc
+activity_status: ok
+
+package: gnustep
+copyright_holder: fsf-ok-#786917
+logo: //wiki.gnustep.org/skins/common/images/GNUstep-MediaWiki.png
+doc_category: Software
+doc_summary: Object-oriented application development environment
+doc_url: http://www.gnustep.org/developers/documentation.html
+blurb_id: gnustep_blurb
+gplv3_status: not-applicable-stays-v2+-brett 03 Jun 2008 14:47:17
+download_url: ftp://ftp.gnustep.org/pub/gnustep
+note: many packages
+activity_status: ok
+
+package: gnutls
+mundane_name: GnuTLS
+copyright_holder: fsf-no-reply
+logo: /software/gnutls/graphics/gnutls-logo.png
+doc_category: Libraries
+doc_summary: Transport layer security library
+doc_url: /software/gnutls/manual/
+blurb_id: gnutls_blurb
+gplv3_status: stays-v2-indefinitely (gnumaint-reply 21 Aug 2007 11:13:04)
+last_release: 3.3.26
+last_release_date: 20170109
+last_release: 3.4.15
+last_release_date: 20160908
+last_release: 3.5.8
+last_release_date: 20170109
+activity_status: ok
+last_activity: 20170109
+
+package: gnutrition
+copyright_holder: notfsf-#786495
+language: python
+doc_category: Health
+doc_summary: Nutrition analysis
+doc_url: /software/gnutrition/manual/
+blurb_id: gnutrition_blurb
+gplv3_status: done-in-0.31
+last_release: 0.31.2
+last_release_date: 20120901
+activity_status: stale
+last_activity: 20120901
+
+package: gnuzilla
+copyright_holder: notfsf
+doc_category: Internet
+doc_summary: Entirely free browser derived from Mozilla Firefox
+doc_url: none
+blurb_id: gnuzilla_blurb
+gplv3_status: ok-since-container
+container: for-icecat
+activity_status: container
+
+package: goptical
+copyright_holder: fsf-maybe-ok-with-five-generic-C++-templates-#786535
+doc_category: Science
+doc_summary: C++ optical design and simulation library
+doc_url: /software/goptical/manual/
+blurb_id: goptical_blurb
+gplv3_status: done
+last_release: 1.0
+last_release_date: 20120107
+last_contact: 29nov10 replied, before xmas
+activity_status: stale
+last_activity: 20120107
+
+package: gorm
+logo: //gnustep.org/experience/images/Gorm.png
+download_url: ftp://ftp.gnustep.org/pub/gnustep/dev-apps/
+doc_category: Software
+doc_summary: GNUstep interface designer
+doc_url: http://wiki.gnustep.org/index.php/Gorm_Manual
+blurb_id: gorm_blurb
+gplv3_status: not-applicable-since-gnustep
+last_release: 1.2.23
+last_release_date: 20160719
+activity_status: ok
+last_activity: 20160719
+
+package: gpaint
+doc_category: Graphics
+doc_summary: Simple paint program for GNOME
+doc_url: none
+blurb_id: gpaint_blurb
+download_url: ftp://alpha.gnu.org/gpaint/
+gplv3_status: in-0.3.2-alpha-but-unreleased (was gnumaint-reply 20 Aug 2007 
23:52:53)
+last_release: 0.3.3
+last_release_date: 20070910
+activity_status: stale
+last_activity: 20070910
+
+package: gperf
+copyright_holder: fsf-ok-#786473
+doc_category: Software
+doc_summary: Perfect hash function generator
+doc_url: /software/gperf/manual/
+blurb_id: gperf_blurb
+gplv3_status: done-in-3.0.4
+last_release: 3.1
+last_release_date: 20170113
+activity_status: ok
+last_activity: 20170113
+
+package: gprolog
+doc_category: Software
+doc_summary: Prolog compiler
+doc_url: http://www.gprolog.org/manual/
+blurb_id: gprolog_blurb
+gplv3_status: not-done-in-1.3.1
+last_release: 1.4.4
+last_release_date: 20130423
+activity_status: stale
+last_activity: 20130423
+
+package: grabcomics
+mundane_name: phpGrabComics
+doc_category: Web
+doc_summary: Saves comic strips from the web
+doc_url: http://server.phpgrabcomics.org/docs/
+blurb_id: grabcomics_blurb
+download_url: http://sourceforge.net/project/showfiles.php?group_id=33239
+gplv3_status: not-done-in-1.5.4
+last_release: 1.5.4
+last_release_date: 20101118
+last_contact: 18nov10 replied
+activity_status: stale
+last_activity: 20101118
+
+package: greg
+copyright_holder: fsf-no-reply
+download_url: 
https://web.archive.org/web/20140927003247/http://download.gna.org/greg/
+doc_category: Software
+doc_summary: Software testing framework
+doc_url: /software/greg/gregdoc.html
+blurb_id: greg_blurb
+gplv3_status: not-done-since-stale
+last_release: 2.0.0
+last_release_date: 20060925
+last_contact: 14dec08 asked
+activity_status: stale
+last_activity: 20060925
+
+package: grep
+copyright_holder: fsf-ok-#786534
+doc_category: Text
+doc_summary: Print lines matching a pattern
+doc_url: /software/grep/manual/
+blurb_id: grep_blurb
+gplv3_status: done-in-2.5.4
+last_release: 2.27
+last_release_date: 20161207
+activity_status: ok
+last_activity: 20161207
+
+package: gretl
+logo: //gretl.sourceforge.net/images/gretl-image.png
+doc_category: Business
+doc_summary: Statistical analysis of economic data (econometrics)
+doc_url: http://sourceforge.net/projects/gretl/files/manual/
+blurb_id: gretl_blurb
+download_url: http://sourceforge.net/project/showfiles.php?group_id=36234
+gplv3_status: done-as-of-1.9.2
+last_release: 2016d
+last_release_date: 20161119
+activity_status: ok
+last_activity: 20161119
+
+package: groff
+search_alias: GNU troff
+copyright_holder: fsf-ok-with-external-and-hyphenations-#786537
+doc_category: Text
+doc_summary: Typesetting from plain text mixed with formatting commands
+doc_url: htmlxref
+blurb_id: groff_blurb
+logo: /graphics/groff-head.png
+gplv3_status: done-in-1.20.1
+last_release: 1.22.3
+last_release_date: 20141104
+activity_status: ok
+last_activity: 20141104
+
+package: grub
+mundane_name: GRUB
+copyright_holder: fsf-maybe-ok-external-mostly-followed-#786720
+doc_category: Sysadmin
+doc_summary: GRand Unified Boot loader
+doc_url: /software/grub/grub-documentation.html
+blurb_id: grub_blurb
+gplv3_status: done-as-of-1.97.2
+last_release: 2.00
+last_release_date: 20120627
+activity_status: stale
+last_activity: 20120627
+
+package: gsasl
+copyright_holder: notfsf
+doc_category: Libraries
+doc_summary: Simple Authentication and Security Layer library
+doc_url: /software/gsasl/manual/
+blurb_id: gsasl_blurb
+gplv3_status: stays-lgplv2.1+
+last_release: 1.8.0, libgsasl-1.8.0/20120528
+last_release_date: 20120528
+activity_status: stale
+last_activity: 20120528
+
+package: gsegrafix
+doc_category: Graphics
+doc_summary: GNOME application to create scientific and engineering plots
+doc_url: none
+blurb_id: gsegrafix_blurb
+gplv3_status: done-as-of-1.0.5
+last_release: 1.0.6
+last_release_date: 20110910
+last_contact: 13feb11 asked
+activity_status: stale
+last_activity: 20110910
+
+package: gsl
+mundane_name: GNU Scientific Library
+copyright_holder: notfsf-gough-did-not-assign-though-others-did
+doc_category: Mathematics
+doc_summary: Numerical library for C and C++
+doc_url: htmlxref
+blurb_id: gsl_blurb
+gplv3_status: done-in-1.10 (gnumaint-reply 21 Aug 2007 10:01:29)
+last_release: 2.3
+last_release_date: 20161209
+activity_status: ok
+last_activity: 20161209
+
+package: gslip
+mundane_name: GNU Slip
+doc_category: Libraries
+doc_summary: SLIP (Symmetric LIst Processor) implementation
+doc_url: none
+blurb_id: gslip_blurb
+gplv3_status: should-be-done
+activity_status: newpkg
+last_activity: 20150810
+
+package: gsrc
+mundane_name: GNU Source Release Collection
+copyright_holder: notfsf-#786658
+doc_category: Sysadmin
+doc_summary: Install latest official GNU releases from original source
+doc_url: /software/gsrc/manual/
+blurb_id: gsrc_blurb
+gplv3_status: done
+last_release: 2014.07.06
+last_release_date: 20140706
+activity_status: ok
+last_activity: 20140706
+
+package: gss
+mundane_name: Generic Security Service
+doc_category: Libraries
+doc_summary: Generic Security Service library
+doc_url: /software/gss/manual/
+blurb_id: gss_blurb
+gplv3_status: done-as-of-1.0.0
+last_release: 1.0.3
+last_release_date: 20141009
+activity_status: ok
+last_activity: 20141009
+
+package: gtick
+mundane_name: GTick
+logo: //www.antcom.de/gtick/logo.www.jpg
+doc_category: Music
+doc_summary: Customizable metronome application
+doc_url: none
+blurb_id: gtick_blurb
+gplv3_status: done-in-0.4.0
+download_url: http://www.antcom.de/gtick/download/
+last_release: 0.5.4
+last_release_date: 20140727
+activity_status: ok
+last_activity: 20140727
+
+#package: gts
+#mundane_name: GNU Triangulated Surface Library
+#gplv3_status: not-done-in-4.0.0
+#homepage: http://gts.sourceforge.net/
+#activity_status: ? # 13nov08 asked about gnu status
+
+
+package: gtk+
+mundane_name: GTK+
+doc_category: Interface
+doc_summary: Cross-platform toolkit for creating graphical user interfaces
+doc_url: http://library.gnome.org/devel/gtk/stable/
+blurb_id: gts_blurb
+gplv3_status: under-discussion # stormy.peters mail 23 Nov 2009 19:26:17
+last_release: 3.18.4
+last_release_date: 20151112
+activity_status: ok
+last_activity: 20151112
+
+package: gtypist
+doc_category: Education
+doc_summary: Typing tutor
+doc_url: htmlxref
+blurb_id: gtypist_blurb
+gplv3_status: done-in-2.8
+last_release: 2.9.5
+last_release_date: 20140812
+activity_status: ok
+last_activity: 20140812
+
+package: guile
+copyright_holder: fsf-maybe-ok-just-goops-#786545
+logo: /software/guile/static/base/img/branding.png
+doc_category: Software
+doc_summary: Scheme implementation intended especially for extensions
+doc_url: /software/guile/manual/
+blurb_id: guile_blurb
+gplv3_status: not-done-in-1.8.6-planned-for-1.10/2.0-in-2009 # neil 12jan09
+last_release: 2.0.13
+last_release_date: 20161012
+activity_status: ok
+last_activity: 20161012
+
+package: guile-cv
+doc_category: Libraries
+doc_summary: Computer Vision library for Guile
+doc_url: none
+gplv3_status: unknown
+activity_status: newpkg
+last_activity: 20170421
+
+package: guile-dbi
+doc_category: Database
+doc_summary: Guile database abstraction layer
+doc_url: 
http://htmlpreview.github.io/?https://github.com/opencog/guile-dbi/blob/master/website/guile-dbi.html
+blurb_id: guile_dbi_blurb
+gplv3_status: not-done-in-2.1.2
+download_url: https://github.com/opencog/guile-dbi
+last_release: 2.1.6
+last_release_date: 20150802
+activity_status: ok
+last_activity: 20150802
+
+package: guile-opengl
+doc_category: Graphics
+doc_summary: Guile binding for the OpenGL graphics API
+doc_url: none
+blurb_id: guile_opengl_blurb
+gplv3_status: done-in-0.1.0
+last_release: 0.1.0
+last_release_date: 20140518
+activity_status: ok
+last_activity: 20140518
+
+package: guile-gnome
+doc_category: Software
+doc_summary: Guile interface for GTK+ programming for GNOME
+doc_url: /software/guile-gnome/docs/
+blurb_id: guile_gnome_blurb
+doc_url: htmlxref
+gplv3_status: not-done-in-2.16.3
+last_release: guile-gnome-platform-2.16.4
+last_release_date: 20151208
+last_release: guile-clutter-1.12.2.1
+last_release_date: 20151208
+activity_status: ok
+last_activity: 20151208
+
+package: guile-ncurses
+doc_category: Interface
+doc_summary: Guile bindings to ncurses
+doc_url: /software/guile-ncurses/manual/
+blurb_id: guile_ncurses_blurb
+gplv3_status: done-in-0.9
+last_release: 2.1
+last_release_date: 20161113
+activity_status: ok
+last_activity: 20161113
+
+package: guile-rpc
+copyright_holder: fsf-ok-with-external-#786605
+doc_category: Software
+doc_summary: Pure Scheme implementation for the ONC RPC standard
+doc_url: /software/guile-rpc/manual/
+blurb_id: guile_rpc_blurb
+gplv3_status: done-in-0.3-alpha (gnumaint-reply 21 Aug 2007 09:35:53 +0200)
+last_release: 0.4
+last_release_date: 20140521
+activity_status: ok
+last_activity: 20140521
+
+package: guile-sdl
+mundane_name: Guile-SDL
+copyright_holder: notfsf
+doc_category: Audio
+doc_summary: Guile interface for SDL (Simple DirectMedia Layer)
+doc_url: /software/guile-sdl/manual/
+blurb_id: guile_sdl_blurb
+gplv3_status: done-originally
+last_release: 0.5.2
+last_release_date: 20150308
+activity_status: ok
+last_activity: 20150308
+
+package: guix
+search_alias: Guix & GuixSD
+logo: /software/guix/static/base/img/icon.png
+doc_category: Sysadmin
+doc_summary: Functional package manager for installed software packages and 
versions
+doc_url: /software/guix/manual/
+blurb_id: guix_blurb
+gplv3_status: done-in-0.0
+last_release: 0.10.0
+last_release_date: 20160329
+activity_status: alpha
+last_activity: 20160329
+
+package: gurgle
+doc_category: Database
+doc_summary: GNU Report Generator Language
+doc_url: http://homepages.inf.ed.ac.uk/timc/gurgle/gurgle.html
+blurb_id: gurgle_blurb
+gplv3_status: done-in-1.61
+last_release: 1.75
+last_release_date: 20130718
+activity_status: stable
+last_activity: 20130718
+
+package: gv
+copyright_holder: notfsf
+doc_category: Printing
+doc_summary: PostScript and PDF viewer using Ghostscript as a back-end
+doc_url: /software/gv/manual/
+blurb_id: gv_blurb
+gplv3_status: done-in-3.6.5
+last_release: 3.7.4
+last_release_date: 20130317
+activity_status: stale
+last_activity: 20130317
+
+package: gvpe
+mundane_name: GVPE
+doc_category: Security
+doc_summary: Secure VPN among multiple nodes over an untrusted network
+doc_url: none
+blurb_id: gvpe_blurb
+gplv3_status: done-in-2.0
+last_release: 2.25
+last_release_date: 20130716
+activity_status: stale
+last_activity: 20130716
+
+package: gwl
+mundane_name: GWL
+doc_category: Libraries
+doc_summary: Workflow language for GNU Guix
+doc_url: none
+gplv3_status: done-originally
+activity_status: newpkg
+last_activity: 20180221
+
+package: gxmessage
+gplv3_status: done
+doc_category: Interface
+doc_summary: Open popup message window with buttons for return
+doc_url: none
+blurb_id: gxmessage_blurb
+last_release: 3.4.1; 20150522 2.20.2
+last_release_date: 20150522
+activity_status: ok
+last_activity: 20150522
+
+package: gzip
+copyright_holder: fsf-ok-with-gailly-contract-#786477
+doc_category: Archiving
+doc_summary: General file (de)compression (using lzw)
+doc_url: /software/gzip/manual/
+blurb_id: gzip_blurb
+gplv3_status: done-as-of-1.4
+last_release: 1.8
+last_release_date: 20160426
+activity_status: ok
+last_activity: 20160426
+
+package: halifax
+mundane_name: HaliFAX
+doc_category: Telephony
+doc_summary: Fax support
+doc_url: none
+blurb_id: halifax_blurb
+gplv3_status: not-done-since-nomaint
+last_release: 0.22.0
+last_release_date: 20010508
+last_contact: wolfgang replied 6jul12
+activity_status: nomaint
+last_activity: 20010508
+
+package: health
+language: python
+doc_category: Health
+doc_summary: Health and hospital information system
+doc_url: none
+blurb_id: health_blurb
+gplv3_status: done
+last_release: gnuhealth-3.0.2
+last_release_date: 20160713
+activity_status: ok
+last_activity: 20160713
+
+package: hello
+copyright_holder: fsf-ok-#786611
+doc_category: Software
+doc_summary: Hello, GNU world: An example GNU package
+doc_url: /software/hello/manual/
+blurb_id: hello_blurb
+gplv3_status: done-in-2.3
+last_release: 2.10
+last_release_date: 20141116
+activity_status: ok
+last_activity: 20141116
+
+package: help2man
+copyright_holder: fsf-ok-#786697
+doc_category: Text
+doc_summary: Automatically generate man pages from program --help
+doc_url: none
+blurb_id: help2man_blurb
+gplv3_status: done-in-1.37.1
+last_release: 1.47.2
+last_release_date: 20150911
+activity_status: ok
+last_activity: 20150911
+
+package: hp2xx
+copyright_holder: notfsf
+doc_category: Printing
+doc_summary: Convert HP-GL format graphics to other vector and bitmap formats
+doc_url: none
+blurb_id: hp2xx_blurb
+gplv3_status: not-done-since-stale
+last_release: 3.4.4
+last_release_date: 20030623
+activity_status: stable
+last_activity: 20030623
+
+package: html-info
+doc_category: Text
+doc_summary: HTML-Info viewer and tools
+doc_url: none
+blurb_id: html_info_blurb
+activity_status: newpkg
+last_activity: 20150113
+
+package: httptunnel
+logo: /graphics/httptunnel-w.png
+doc_category: Internet
+doc_summary: Bidirectional connection tunnelled inside HTTP requests
+doc_url: none
+blurb_id: httptunnel_blurb
+gplv3_status: not-done-since-stale
+last_release: 3.3
+last_release_date: 20020116
+last_contact: 28apr09 replied, 9feb10 asked
+activity_status: stale
+last_activity: 20020116
+
+package: hurd
+copyright_holder: fsf-ok-with-linux-code-rms
+doc_category: Software
+doc_summary: The kernel servers for the GNU operating system
+doc_url: /software/hurd/doc/doc.html
+blurb_id: hurd_blurb
+gplv3_status: under-discussion
+logo: /graphics/hurd_sm_mf.jpg
+last_release: 0.9
+last_release_date: 20161218
+activity_status: ok
+last_activity: 20161218
+
+package: hyperbole
+doc_category: Text
+doc_summary: Emacs hypertext system via customizable buttons
+doc_url: none
+blurb_id: hyperbole_blurb
+gplv3_status: done-in-5.0.3
+last_release: 6.0.1
+last_release_date: 20160727
+activity_status: ok
+last_activity: 20160727
+
+package: icecat
+copyright_holder: notfsf
+logo: /software/gnuzilla/icecat-128.png
+doc_category: Internet
+doc_summary: Entirely free browser derived from Mozilla Firefox
+doc_url: none
+blurb_id: icecat_blurb
+gplv3_status: not-applicable-since-not-our-program
+last_release: 45.7.0
+last_release_date: 20170305
+activity_status: ok
+last_activity: 20170305
+
+package: idutils
+copyright_holder: fsf-no-reply
+doc_category: Software
+doc_summary: Identifier database utilities
+doc_url: /software/idutils/manual/
+blurb_id: idutils_blurb
+gplv3_status: done-in-4.5
+last_release: 4.6
+last_release_date: 20120203
+activity_status: stale
+last_activity: 20120203
+
+package: ignuit
+doc_category: Education
+doc_summary: Memorization aid based on Leitner flashcards
+doc_url: none
+blurb_id: ignuit_blurb
+gplv3_status: done
+last_release: 2.24.2
+last_release_date: 20160403
+activity_status: ok
+last_activity: 20160403
+
+package: indent
+copyright_holder: notfsf
+doc_category: Software
+doc_summary: Code reformatter
+doc_url: /software/indent/manual/
+blurb_id: indent_blurb
+gplv3_status: notgpl-is-bsd
+last_release: 2.2.10
+last_release_date: 20090215
+activity_status: newmaint
+last_activity: 20140319
+
+package: inetutils
+doc_category: Internet
+doc_summary: Basic networking utilities
+doc_url: /software/inetutils/manual/
+blurb_id: inetutils_blurb
+gplv3_status: done
+last_release: 1.9.4
+last_release_date: 20150610
+activity_status: ok
+last_activity: 20150610
+
+package: inklingreader
+doc_category: Interface
+doc_summary: Wacom Inkling sketch format conversion and manipulation
+doc_url: none
+blurb_id: inklingreader_blurb
+gplv3_status: done-except-for-inkscape-plugin
+activity_status: newpkg
+last_activity: 20141028
+
+package: intlfonts
+doc_category: Fonts
+doc_summary: TrueType and BDF fonts covering many scripts
+doc_url: none
+blurb_id: intlfonts_blurb
+gplv3_status: needs-exception-#341653-fonts (21 Aug 2007 10:41:44)
+last_release: 1.2.1
+last_release_date: 20030703
+last_contact: 27jan09 asked
+activity_status: stale
+last_activity: 20030703
+
+package: jacal
+mundane_name: JACAL
+logo: //people.csail.mit.edu/jaffer/Logo/equal96.png
+doc_category: Mathematics
+doc_summary: Symbolic mathematics system
+doc_url: http://people.csail.mit.edu/jaffer/jacal_toc.html
+blurb_id: jacal_blurb
+gplv3_status: done-without-guile-licensing-exception (licensing 341651 20 Aug 
2007 21:32:09)
+other_download_url: http://groups.csail.mit.edu/mac/ftpdir/scm/
+last_release: 1c4
+last_release_date: 20150116
+activity_status: ok
+last_activity: 20150116
+
+package: java-getopt
+language: java
+doc_category: Libraries
+doc_summary: Java port of GNU getopt
+doc_url: 
http://www.urbanophile.com/arenn/hacking/getopt/Package-gnu.getopt.html
+blurb_id: java_getopt_blurb
+download_url: ftp://ftp.urbanophile.com/pub/arenn/software/sources/
+gplv3_status: not-applicable-since-libc-fns-per-rms (karl mail 08 May 2008 
04:44:55)
+last_release: 1.0.13
+last_release_date: 20060829
+note: classpath has its own smaller/simpler option parsing library,
+note: per Mark Wielaard, 24apr07.  This is an independent port of libc getopt.
+activity_status: stable
+last_activity: 20060829
+
+package: jtw
+mundane_name: Java Training Wheels
+doc_category: Education
+doc_summary: A simplified Java environment for learning programming
+doc_url: none
+gplv3_status: done
+last_release: 1.1
+last_release_date: 20160708
+activity_status: ok
+last_activity: 20160708
+
+package: jel
+doc_category: Libraries
+doc_summary: Java expression library and compiler
+doc_url: /software/jel/manual.html
+blurb_id: jel_blurb
+gplv3_status: done-in-2.0.1
+last_release: 2.0.1
+last_release_date: 20071012
+last_contact: 24jun09 replied
+activity_status: stable
+last_activity: 20071012
+
+package: jwhois
+copyright_holder: fsf-ok-#786523
+language: c
+doc_category: Internet
+doc_summary: An extended whois client
+doc_url: /software/jwhois/manual/
+blurb_id: jwhois_blurb
+gplv3_status: done-in-4.0
+last_release: 4.0
+last_release_date: 20070701
+last_contact: 12dec12 newmaint needed, 20090620 replied, maybe soon
+activity_status: newmaint
+last_activity: 20161012
+
+package: kawa
+logo: /software/kawa/style/kawa-logo.png
+doc_category: Software
+doc_summary: Java framework and implementation of Scheme, Elisp, and more
+doc_url: none
+blurb_id: kawa_blurb
+gplv3_status: notgpl
+last_release: 2.0
+last_release_date: 20141202
+activity_status: ok
+last_activity: 20141202
+
+package: kopi
+language: java
+doc_category: Software
+doc_summary: Java development environment for interactive database applications
+doc_url: none
+blurb_id: kopi_blurb
+download_url: http://sourceforge.net/projects/kopi/files/
+gplv3_status: not-done-in-2.3B
+last_release: 2.3B
+last_release_date: 20070918
+last_contact: 10mar12 asked, 10mar12 benheni asked
+activity_status: stale
+last_activity: 20070918
+
+package: leg
+copyright_holder: fsf-ok-planned-code-#786483
+language: c++
+doc_category: Games
+doc_summary: Libraries and engines for game programming
+doc_url: none
+blurb_id: leg_blurb
+gplv3_status: not-done-since-no-release
+last_contact: 16feb13 replied end of summer, asked, 8nov10 replied, soon
+activity_status: newmaint
+last_activity: 20110519
+
+package: less
+copyright_holder: notfsf
+doc_category: Text
+doc_summary: Paginator for terminals
+doc_url: none
+blurb_id: less_blurb
+gplv3_status: notgpl
+last_release: 481
+last_release_date: 20151016
+activity_status: ok
+last_activity: 20151016
+
+package: libc
+mundane_name: GNU C Library
+copyright_holder: fsf-ok-per-rms-#786983
+doc_category: Libraries
+doc_summary: C library
+doc_url: /software/libc/manual/
+blurb_id: libc_blurb
+gplv3_status: under-discussion
+download_url: http://ftp.gnu.org/gnu/glibc/
+last_release: 2.24
+last_release_date: 20160804
+# seems to be gone from shop, noticed 8aug14, webmasters #934653
+#doc_shop: GNU C Library Application Fundamentals (Vol.1)
+#doc_shop: http://shop.fsf.org/product/gnu-c-library-application-fundamentals/
+activity_status: ok
+last_activity: 20160804
+
+package: libcdio
+doc_category: Audio
+doc_summary: CD Input and Control library
+doc_url: htmlxref
+blurb_id: libcdio_blurb
+gplv3_status: done-in-0.81
+last_release: 0.93, libcdio-paranoia-10.2+0.93+1/20140929, 
pycdio-0.20/20130906, rbcdio-0.15/200901518
+last_release_date: 20140929
+activity_status: ok
+last_activity: 20140929
+
+package: libdbh
+doc_category: Database
+doc_summary: Advanced library for disk-based hash tables
+doc_url: none
+blurb_id: libdbh_blurb
+gplv3_status: done-in-5.0.17
+last_release: 5.0.17
+last_release_date: 20150313
+activity_status: ok
+last_activity: 20150313
+
+package: libextractor
+logo: /software/libextractor/extractor_logo.png
+doc_category: Audio
+doc_summary: Library to extract meta-data from media files
+doc_url: htmlxref
+blurb_id: libextractor_blurb
+gplv3_status: depends-on-gnunet (gnumaint-reply 20 Aug 2007 20:40:48)
+last_release: 1.3
+last_release_date: 20131223
+activity_status: stale
+last_activity: 20131223
+
+package: libffcall
+doc_category: Libraries
+doc_summary: Foreign function calls from interpreters
+doc_url: none
+blurb_id: libffcall_blurb
+gplv3_status: not-done-in-1.10-used-by-clisp
+last_release: 1.10
+last_release_date: 20040602
+activity_status: newmaint
+last_activity: 20130713
+
+package: libgcrypt
+copyright_holder: notfsf-any-more-#786520
+download_url: ftp://ftp.gnupg.org/gcrypt/libgcrypt/
+doc_category: Libraries
+doc_summary: Cryptographic function library
+doc_url: htmlxref
+blurb_id: libgcrypt_blurb
+gplv3_status: depends-on-gnutls (gnumaint-reply 21 Aug 2007 11:13:04)
+last_release: 1.7.2
+last_release_date: 20160714
+activity_status: ok
+last_activity: 20160714
+
+package: libiconv
+copyright_holder: fsf-no-reply
+doc_category: Libraries
+doc_summary: Character set conversion library
+doc_url: none
+blurb_id: libiconv_blurb
+gplv3_status: not-done-partially-in-1.12
+last_release: 1.14
+last_release_date: 20110807
+activity_status: newmaint
+last_activity: 20140707
+
+package: libidn
+search_alias: libidn2
+copyright_holder: notfsf-simon-did-not-assign-though-others-did
+doc_category: Libraries
+doc_summary: Internationalized string processing library
+doc_url: /software/libidn/manual/
+blurb_id: libidn_blurb
+gplv3_status: not-done-partially-in-1.6-except-java?-20mar08
+last_release: 1.33
+last_release_date: 20160720
+activity_status: ok
+last_activity: 20160720
+
+package: libjit
+copyright_holder: notfsf
+doc_category: Libraries
+doc_summary: Just-in-Time compilation library
+doc_url: none
+blurb_id: libjit_blurb
+gplv3_status: unknown
+activity_status: newpkg
+last_activity: 20121218
+
+package: libmatheval
+copyright_holder: fsf-ok-#786536
+doc_category: Mathematics
+doc_summary: Library for evaluating symbolic expressions
+doc_url: htmlxref
+blurb_id: libmatheval_blurb
+gplv3_status: done-as-of-1.1.7
+last_release: 1.1.11
+last_release_date: 20130814
+activity_status: newmaint
+last_activity: 20131023
+
+package: libmicrohttpd
+copyright_holder: notfsf
+language: c
+doc_category: Libraries
+doc_summary: C library implementing an HTTP 1.1 server
+doc_url: /software/libmicrohttpd/manual/
+blurb_id: libmicrohttpd_blurb
+gplv3_status: depends-on-gnunet-lgplv2.1+
+last_release: 0.9.49
+last_release_date: 20160409
+activity_status: ok
+last_activity: 20160409
+
+package: libredwg
+copyright_holder: fsf-no-info-in-reply-#786464
+language: c
+doc_category: Science
+doc_summary: C library to handle DWG (CAD-related) files
+doc_url: none
+blurb_id: libredwg_blurb
+gplv3_status: not-done-since-no-release
+note: no-release
+last_contact: 16feb10 replied
+activity_status: newpkg
+last_activity: 20091021
+
+package: liberty-eiffel
+mundane_name: Liberty Eiffel
+doc_category: Software
+doc_summary: Eiffel compiler
+doc_url: none
+blurb_id: liberty_eiffel_blurb
+#logo: //smarteiffel.loria.fr/images/Logo_pp_small.png
+#download_url: http://gforge.inria.fr/frs/?group_id=184
+#gplv3_status: not-done-in-2.3
+last_release: 2016.05
+last_release_date: 20160526
+note: renamed from smarteiffel (and smalleiffel before that).
+activity_status: ok
+last_activity: 20160526
+
+package: librejs
+logo: /software/librejs/images/logo-medium.png
+language: javascript
+doc_category: Internet
+doc_summary: Browser add-on that blocks nonfree nontrivial JavaScript
+doc_url: /software/librejs/manual/
+blurb_id: librejs_blurb
+gplv3_status: ok
+last_release: 6.0.13
+last_release_date: 20160504
+activity_status: ok
+last_activity: 20160504
+
+package: libsigsegv
+doc_category: Software
+doc_summary: Library for handling page faults
+doc_url: none
+blurb_id: libsigsegv_blurb
+gplv3_status: not-done-in-2.5-11nov07
+last_release: 2.10
+last_release_date: 20110403
+activity_status: newmaint
+last_activity: 20140715
+
+package: libtasn1
+copyright_holder: fsf-no-reply-see-note
+language: c
+doc_category: Security
+doc_summary: ASN.1 library
+doc_url: /software/libtasn1/manual/
+blurb_id: libtasn1_blurb
+gplv3_status: done-as-of-2.6
+last_release: 4.8
+last_release_date: 20160411
+note: originated with gnutls, so copyright fsf, even though no explicit
+note: assignment has been needed yet.
+activity_status: ok
+last_activity: 20160411
+
+package: libtool
+copyright_holder: fsf-ok-#786491
+logo: /software/libtool/libtool.jpg
+doc_category: Libraries
+doc_summary: Generic shared library support tools
+doc_url: /software/libtool/manual/
+blurb_id: libtool_blurb
+gplv3_status: needs-exception-#349136
+last_release: 2.4.6
+last_release_date: 20150215
+activity_status: ok
+last_activity: 20150215
+
+package: libunistring
+copyright_holder: fsf-ok-#786481
+language: c
+doc_category: Libraries
+doc_summary: C library for manipulating Unicode strings
+doc_url: /software/libunistring/manual/
+blurb_id: libunistring_blurb
+gplv3_status: done-as-of-0.9.2.1-lgpl
+last_release: 0.9.7
+last_release_date: 20161202
+activity_status: ok
+last_activity: 20161202
+
+package: libxmi
+copyright_holder: fsf-no-reply
+doc_category: Graphics
+doc_summary: Library for rasterizing 2-d vector graphics
+doc_url: none
+blurb_id: libxmi_blurb
+gplv3_status: not-done-since-stale
+last_release: 1.2
+last_release_date: 20000621
+activity_status: stale
+last_activity: 20000621
+
+package: lightning
+copyright_holder: fsf-ok-24dec12
+doc_category: Libraries
+doc_summary: Library for generating assembly code at runtime
+doc_url: /software/lightning/manual/
+blurb_id: lightning_blurb
+gplv3_status: not-done-since-stale
+last_release: 2.1.0
+last_release_date: 20150207
+activity_status: ok
+last_activity: 20150207
+
+package: lilypond
+doc_category: Music
+doc_summary: Music typesetting
+doc_url: http://lilypond.org/manuals.html
+blurb_id: lilypond_blurb
+gplv3_status: done-as-of-2.13.13
+download_url: http://download.linuxaudio.org/lilypond/sources/
+last_release: 2.19.18
+last_release_date: 20150405
+activity_status: ok
+last_activity: 20150405
+
+package: lims
+language: python
+doc_category: Science
+doc_summary: Scientific laboratory information management system
+doc_url: none
+blurb_id: lims_blurb
+gplv3_status: should-be-done-initially
+activity_status: newpkg
+last_activity: 20131104
+
+package: linux-libre
+doc_category: Software
+doc_summary: 100% free redistribution of a cleaned Linux kernel
+doc_url: none
+blurb_id: linux_libre_blurb
+gplv3_status: stays-gplv2-due-to-linux
+download_url: http://linux-libre.fsfla.org/pub/linux-libre/releases/
+last_release: 4.8-gnu
+last_release_date: 20161003
+activity_status: ok
+last_activity: 20161003
+
+package: liquidwar6
+mundane_name: Liquid War 6
+doc_category: Games
+doc_summary: Multiplayer wargame where your army is a blob of liquid
+doc_url: /software/liquidwar6/manual/
+blurb_id: liquidwar6_blurb
+gplv3_status: done-in-0.0.2beta
+last_release: 0.6.3902
+last_release_date: 20150507
+activity_status: ok
+last_activity: 20150507
+
+package: lispintro
+copyright_holder: fsf-no-reply
+doc_category: Software
+doc_summary: Introduction to programming in Emacs Lisp
+doc_url: /software/emacs/emacs-lisp-intro/emacs-lisp-intro.html
+blurb_id: lispintro_blurb
+doc_shop: An Introduction to Emacs Lisp
+doc_shop: http://shop.fsf.org/product/Intro_to_Emacs_Lisp_3rd_Ed/
+gplv3_status: doc
+note: released-through-emacs
+activity_status: subpkg
+
+package: lrzsz
+doc_category: Internet
+doc_summary: Implementation of XMODEM/YMODEM/ZMODEM transfer protocols
+doc_url: none
+blurb_id: lrzsz_blurb
+download_url: http://www.ohse.de/uwe/releases/
+gplv3_status: not-done-in-0.12.20
+last_release: 0.12.20
+last_release_date: 19981230
+last_contact: 28nov10 asked, 11apr09 replied, next 3 months
+activity_status: stale
+last_activity: 19981230
+
+package: lsh
+doc_category: Security
+doc_url: http://www.lysator.liu.se/~nisse/lsh/lsh.html
+blurb_id: lsh_blurb
+doc_summary: GNU implementation of the Secure Shell (ssh) protocols
+gplv3_status: not-done-in-2.9-exp
+download_url: http://www.lysator.liu.se/~nisse/archive/
+last_release: 2.1
+last_release_date: 20130626
+activity_status: stale
+last_activity: 20130626
+
+package: m4
+copyright_holder: fsf-ok-#786645
+doc_category: Text
+doc_summary: Macro processor
+doc_url: /software/m4/manual/
+blurb_id: m4_blurb
+gplv3_status: done-as-of-1.14.14
+last_release: 1.4.18
+last_release_date: 20161231
+activity_status: ok
+last_activity: 20161231
+
+package: macchanger
+mundane_name: MAC Changer
+doc_category: Internet
+doc_summary: Viewing and manipulating MAC addresses of network interfaces
+doc_url: none
+blurb_id: macchanger_blurb
+gplv3_status: in-dev-sources (gnumaint-reply 21 Aug 2007 11:29:32 +0200)
+last_release: 1.6.0
+last_release_date: 20130326
+activity_status: stale
+last_activity: 20130326
+
+package: mailman
+copyright_holder: fsf-no-reply
+logo: /graphics/dragonlogo.jpg
+language: c,python
+doc_category: Email
+doc_summary: Mailing list manager
+doc_url: /software/mailman/docs.html
+blurb_id: mailman_blurb
+gplv3_status: next-release-2.2-and-3.0
+last_release: 2.1.21
+last_release_date: 20160228
+activity_status: ok
+last_activity: 20160228
+
+package: mailutils
+copyright_holder: fsf-ok-with-external-libraries-#793769
+doc_category: Email
+doc_summary: Utilities and library for reading and serving mail
+doc_url: /software/mailutils/manual/
+blurb_id: mailutils_blurb
+gplv3_status: done-in-2.0
+last_release: 3.1.1
+last_release_date: 20161216
+activity_status: ok
+last_activity: 20161216
+
+package: make
+copyright_holder: fsf-ok-#788835
+doc_category: Software
+doc_summary: Remake files automatically
+doc_url: /software/make/manual/
+blurb_id: make_blurb
+gplv3_status: in-dev-sources (gnumaint-reply 28 Aug 2007 08:30:15)
+last_release: 4.2.1
+last_release_date: 20160611
+activity_status: ok
+last_activity: 20160611
+
+package: marst
+copyright_holder: fsf-no-reply
+mundane_name: MARST
+doc_category: Software
+doc_summary: Algol-to-C translator
+doc_url: none
+blurb_id: marst_blurb
+gplv3_status: done-in-2.5
+last_release: 2.7
+last_release_date: 20130309
+activity_status: stale
+last_activity: 20130309
+
+package: maverik
+doc_category: Graphics
+doc_summary: Support interactive 3d virtual environments
+doc_url: none
+blurb_id: maverik_blurb
+gplv3_status: done-in-6.4
+last_release: 6.5
+last_release_date: 20130315
+last_contact: 21feb13 replied, 18feb13 asked
+activity_status: stale
+last_activity: 20130315
+
+package: mc
+mundane_name: Midnight Commander
+copyright_holder: fsf-no-reply
+doc_category: Interface
+doc_summary: Graphical file manager
+doc_url: none
+blurb_id: mc_blurb
+gplv3_status: not-done-in-4.6.2-pre1
+last_release: 4.6.2-pre1
+last_release_date: 20070913
+activity_status: stale
+last_activity: 20070913
+
+package: mcron
+logo: /software/mcron/mcron-logo.png
+doc_category: Sysadmin
+doc_summary: Run jobs at scheduled times
+doc_url: none
+blurb_id: mcron_blurb
+gplv3_status: done-in-1.0.4
+last_release: 1.0.8
+last_release_date: 20140525
+activity_status: nomaint
+last_activity: 20140525
+
+package: mcsim
+mundane_name: MCSim
+copyright_holder: fsf-ok-with-pd-#787152
+doc_category: Mathematics
+doc_summary: Monte Carlo simulation and analysis
+doc_url: http://www.gnu.org/software/mcsim/mcsim.html
+blurb_id: mcsim_blurb
+gplv3_status: done-in-5.4.0
+last_release: 5.6.6
+last_release_date: 20170122
+last_contact: 29jan11 replied, 29nov10 replied
+activity_status: ok
+last_activity: 20170122
+
+package: mdk
+mundane_name: MIX Development Kit
+copyright_holder: fsf-ok-#787396
+doc_category: Education
+doc_summary: Virtual development environment for Knuth's MIX
+doc_url: /software/mdk/manual/
+blurb_id: mdk_blurb
+doc_shop: GNU MDK
+doc_shop: http://shop.fsf.org/product/gnu-mdk/
+gplv3_status: done-in-1.2.4-21mar08
+last_release: 1.2.9
+last_release_date: 20151228
+activity_status: ok
+last_activity: 20151228
+
+package: mediagoblin
+logo: //mediagoblin.org/images/logo/mediagoblin_dark_medium.png
+language: python
+doc_category: Internet
+doc_summary: Photo and media sharing
+doc_url: http://docs.mediagoblin.org/
+blurb_id: mediagoblin_blurb
+download_url: http://mediagoblin.org/download/
+gplv3_status: ok
+last_release: 0.9.0
+last_release_date: 20160329
+activity_status: ok
+last_activity: 20160329
+
+package: melting
+logo: //www.ebi.ac.uk/biomodels-static/tools/melting/meltingtop.jpg
+doc_category: Science
+doc_summary: Temperature computations for a nucleic acid duplex
+doc_url: http://www.ebi.ac.uk/compneur-srv/melting/melting5-doc/melting.html
+blurb_id: melting_blurb
+download_url: http://www.ebi.ac.uk/compneur-srv/melting/MELTING5.1.1.tar.gz
+gplv3_status: not-done-in-5.0.3
+last_release: 5.2.0
+last_release_date: 20140808
+last_contact: 22feb10 asked
+activity_status: ok
+last_activity: 20140808
+
+package: mempool
+mundane_name: MemPool
+doc_category: Libraries
+doc_summary: Block allocator library
+doc_url: none
+blob_id: mempool_blob
+activity_status: newmaint
+last_activity: 20170621
+
+package: mes
+doc_category: Sysadmin
+doc_summary: Full source bootstrapping for GNU systems
+doc_url: /software/mes/manual/
+gplv3_status: done
+activity_status: newpkg
+last_activity: 20180725
+
+package: metaexchange
+doc_category: Database
+doc_summary: Manipulate metadata from OAI-PMH and Z39.50
+doc_url: /software/metaexchange/#Documentation
+blurb_id: metaexchange_blurb
+gplv3_status: under-discussion (gnumaint-reply 29 Aug 2007 19:26:27)
+note: no-release
+activity_status: newcomaint
+last_activity: 20130404
+
+package: metahtml
+doc_category: Web
+doc_summary: Combining HTML and Lisp, specifically designed for Web servers
+doc_url: http://metahtml.sourceforge.net/documentation/
+blurb_id: metahtml_blurb
+gplv3_status: not-done-since-nomaint
+last_release: 6.11.01
+last_release_date: 20010306
+note: metahtml.org domain expired
+note: used by gcc (only?), Gerald Pfeifer has patches
+note: bfox has some updates to sources on sf, but has not sent
+last_contact: 27nov11 gerald asked, 19jan11 replied, 23feb10 replied
+activity_status: newmaint
+last_activity: 20160926
+
+package: metalogic-inference
+mundane_name: MLI
+doc_category: Mathematics
+doc_summary: Logical proof program
+doc_url: none
+gplv3_status: unknown
+activity_status: newpkg 
+last_activity: 20170419
+
+package: mifluz
+doc_category: Libraries
+doc_summary: Full text indexing library
+doc_url: /software/mifluz/doc.en.html
+blurb_id: mifluz_blurb
+gplv3_status: done-in-0.24.0 (7jul08)
+last_release: 0.25.0
+last_release_date: 20140417
+activity_status: ok
+last_activity: 20140417
+
+package: mig
+copyright_holder: see-hurd
+doc_category: Software
+doc_summary: Mach 3.0 interface generator for the Hurd
+doc_url: none
+blurb_id: mig_blurb
+gplv3_status: see-hurd
+last_release: 1.8
+last_release_date: 20161218
+activity_status: ok
+last_activity: 20161218
+
+package: miscfiles
+doc_category: Text
+doc_summary: Data files for airport codes, zip codes, a dictionary, and more
+doc_url: none
+blurb_id: miscfiles_blurb
+gplv3_status: not-applicable (gnumaint-reply 02 Oct 2007 20:11:47)
+last_release: 1.4.2
+last_release_date: 20101116
+last_contact: 17nov10 replied
+activity_status: stale
+last_activity: 20101116
+
+package: mit-scheme
+mundane_name: MIT/GNU Scheme
+logo: /software/mit-scheme/lambda.png
+doc_category: Software
+doc_summary: A Scheme implementation with integrated editor and debugger
+doc_url: /software/mit-scheme/#Documentation
+blurb_id: mit_scheme_blurb
+doc_url: htmlxref
+gplv3_status: needs-exception-#555330
+last_release: stable.pkg/9.2
+last_release_date: 20140521
+activity_status: ok
+last_activity: 20140521
+
+package: moe
+doc_category: Editors
+doc_summary: Modeless, multiple-buffer, user-friendly 8-bit text editor
+doc_url: htmlxref
+blurb_id: moe_blurb
+gplv3_status: done-in-1.0
+last_release: 1.8
+last_release_date: 20160217
+activity_status: ok
+last_activity: 20160217
+
+package: motti
+copyright_holder: fsf-ok-#786712
+doc_category: Games
+doc_summary: Multiplayer strategy game
+doc_url: htmlxref
+blurb_id: motti_blurb
+gplv3_status: done-in-2.5.0.5
+last_release: 3.1.0
+last_release_date: 20140328
+activity_status: ok
+last_activity: 20140328
+
+package: mpc
+doc_category: Mathematics
+doc_summary: C library for arbitrary precision complex arithmetic
+doc_url: http://www.multiprecision.org/downloads/mpc-1.1.0.pdf
+blurb_id: mpc_blurb
+gplv3_status: lgplv3+-as-of-1.0-in-july-2012
+last_release: 1.0.3
+last_release_date: 20150220
+activity_status: ok
+last_activity: 20150220
+
+package: mpfr
+copyright_holder: fsf-ok-#786594
+logo: //www.mpfr.org/mpfr500.png
+doc_category: Mathematics
+doc_summary: C library for arbitrary precision floating-point arithmetic
+doc_url: http://www.mpfr.org/mpfr-current/#doc
+blurb_id: mpfr_blurb
+gplv3_status: lgplv3+-as-of-3.0.0-in-june-2010
+last_release: 3.1.5
+last_release_date: 20160927
+activity_status: ok
+last_activity: 20160927
+
+package: mpria
+doc_category: Mathematics
+doc_summary: C library for arbitrary precision rational arithmetic
+doc_url: none
+blurb_id: mpria_blurb
+gplv3_status: done
+activity_status: newpkg
+last_activity: 20140110
+
+package: mtools
+doc_category: Sysadmin
+doc_summary: Access MS-DOS disks without mounting
+doc_url: /software/mtools/manual/mtools.html
+blurb_id: mtools_blurb
+gplv3_status: done-as-of-4.0.12
+last_release: 4.0.18
+last_release_date: 20130109
+activity_status: stale
+last_activity: 20130109
+
+package: nana
+doc_category: Libraries
+doc_summary: Library for assertions, logging, performance measurement
+doc_url: none
+blurb_id: nana_blurb
+download_url: http://download.savannah.gnu.org/releases/nana/
+gplv3_status: notgpl
+last_release: 2.5
+last_release_date: 19990912
+note: release date from ChangeLog
+note: assert stuff for gcc
+last_contact: 3jul12 jmd asked, 10mar11 asked maintainers with new addr
+activity_status: moribund
+last_activity: 19990912
+
+package: nano
+copyright_holder: fsf-no-reply-#786770
+doc_category: Editors
+doc_summary: Small, user-friendly console text editor
+doc_url: http://www.nano-editor.org/docs.php
+blurb_id: nano_blurb
+gplv3_status: done-in-2.1.4
+last_release: 2.5.0
+last_release_date: 20151206
+activity_status: ok
+last_activity: 20151206
+
+package: nano-archimedes
+doc_category: Science
+doc_summary: Simulation of quantum systems using the Wigner Monte Carlo method
+doc_url: none
+blurb_id: nano_archimedes_blurb
+gplv3_status: unknown
+last_release: 2.0
+last_release_date: 20151110
+activity_status: ok
+last_activity: 20151110
+
+package: ncurses
+copyright_holder: fsf-ok-#786484
+doc_category: Interface
+doc_summary: Terminal emulation (termcap, terminfo) library
+doc_url: none
+blurb_id: ncurses_blurb
+gplv3_status: notgpl
+last_release: 6.0
+last_release_date: 20150809
+last_release: tack-1.06
+last_release_date: 20081108
+note: as a special case, we accepted ncurses as a GNU package under the
++ revised BSD license.
+activity_status: ok
+last_activity: 20150809
+
+package: nettle
+doc_category: Security
+doc_summary: C library for low-level cryptographic functionality
+doc_url: htmlxref
+blurb_id: nettle_blurb
+gplv3_status: lgplv2+-as-of-2.2-9nov10-asked-rms
+last_release: 3.3
+last_release_date: 20161001
+activity_status: ok
+last_activity: 20161001
+
+package: network
+doc_category: Internet
+doc_summary: Initiative to encourage development of free network services
+doc_url: none
+blurb_id: network_blurb
+gplv3_status: ok-since-container
+container: for-gnu-"group"
+activity_status: container
+
+package: ocrad
+doc_category: Text
+doc_summary: Optical character recognition based on feature extraction
+doc_url: htmlxref
+blurb_id: ocrad_blurb
+gplv3_status: done-in-0.17
+last_release: 0.25
+last_release_date: 20150416
+activity_status: ok
+last_activity: 20150416
+
+package: octave
+copyright_holder: notfsf-#786632
+logo: /software/octave/images/logo.png
+doc_category: Mathematics
+doc_summary: High-level language for numerical computation
+doc_url: /software/octave/support.html
+blurb_id: octave_blurb
+gplv3_status: done-in-3.0.1 (licensing #345079)
+last_release: 4.2.0
+last_release_date: 20161117
+activity_status: ok
+last_activity: 20161117
+
+package: oleo
+copyright_holder: fsf-no-reply
+doc_category: Spreadsheets
+doc_summary: Spreadsheet for both terminal and graphical interfaces
+doc_url: /software/oleo/doc/oleo.html
+blurb_id: oleo_blurb
+gplv3_status: not-done-since-newmaint
+last_release: 1.99.16
+last_release_date: 20010310
+last_contact: 1feb13 brandon wrote, 5apr12 replied, 1apr12,19feb12,22jan12 jmd 
asked
+activity_status: newmaint
+last_activity: 20100601
+
+package: oo-browser
+mundane_name: OO-Browser
+copyright_holder: notfsf
+doc_category: Interface
+doc_summary: An interactive object-oriented class browser for Emacs
+doc_url: none
+gplv3_status: done-in-5.0
+activity_status: newpkg
+last_activity: 20160810
+
+package: orgadoc
+mundane_name: OrgaDoc
+doc_category: Text
+doc_summary: Eiffel program to maintain and query documents across machines
+doc_url: /software/orgadoc/manual/
+blurb_id: orgadoc_blurb
+gplv3_status: not-done-since-stale
+last_release: 0.8
+last_release_date: 20040331
+last_contact: 1mar10 resign
+activity_status: newmaint
+last_activity: 20170421
+
+package: osip
+mundane_name: oSIP
+copyright_holder: notfsf
+logo: /software/osip/osip-logo-60p.png
+doc_category: Libraries
+doc_summary: Library implementing SIP (RFC-3261)
+doc_url: /software/osip/doc/html/
+blurb_id: osip_blurb
+gplv3_status: not-done-in-3.2.0
+last_release: libosip2-4.1.0
+last_release_date: 20140106
+activity_status: stale
+last_activity: 20140106
+
+package: panorama
+doc_category: Graphics
+doc_summary: Framework for 3D graphics production
+doc_url: none
+blurb_id: panorama_blurb
+download_url: http://sourceforge.net/project/showfiles.php?group_id=7862
+gplv3_status: not-done-since-stale
+last_release: 0.18
+last_release_date: 20030211
+last_contact: 11may09 asked
+activity_status: stale
+last_activity: 20030211
+
+package: parallel
+logo: /software/parallel/logo.png
+copyright_holder: notfsf
+doc_category: Sysadmin
+doc_summary: Build and execute command lines in parallel
+doc_url: /software/parallel/man.html
+blurb_id: parallel_blurb
+gplv3_status: done-in-20100424
+last_release: 20160922
+last_release_date: 20160922
+activity_status: ok
+last_activity: 20160922
+
+package: parted
+copyright_holder: fsf-no-reply
+doc_category: Sysadmin
+doc_summary: Disk partition editor
+doc_url: /software/parted/manual/
+blurb_id: parted_blurb
+gplv3_status: done-in-1.8.8 (gnumaint-reply 20 Aug 2007 21:13:48 -0400)
+last_release: 3.2
+last_release_date: 20140728
+activity_status: ok
+last_activity: 20140728
+
+package: pascal
+copyright_holder: fsf-ok-#787589
+logo: //www.gnu-pascal.de/images/GnuPascal-small.png
+doc_category: Software
+doc_summary: GNU Pascal compiler
+doc_url: htmlxref
+blurb_id: pascal_blurb
+download_url: http://www.gnu-pascal.de/alpha/
+gplv3_status: done-as-of-2007-09-04-per-email
+last_contact: 23feb09 replied
+activity_status: moribund
+last_activity: 20050331
+
+package: patch
+doc_category: Software
+doc_summary: Apply differences to originals, with optional backups
+doc_url: /software/diffutils/manual/#Invoking-patch
+blurb_id: patch_blurb
+gplv3_status: done-as-of-2.6.1
+last_release: 2.7.5
+last_release_date: 20150306
+activity_status: ok
+last_activity: 20150306
+
+package: paxutils
+copyright_holder: fsf-ok-#786468
+doc_category: Archiving
+doc_summary: Manage cpio, tar, and pax file archives
+doc_url: none
+blurb_id: paxutils_blurb
+download_url: ftp://alpha.gnu.org/gnu/paxutils/
+note: http://alpha.gnu.org/gnu/paxutils/paxutils-2.4h.tar.gz
+gplv3_status: not-done-since-stale-maintainer-busy
+last_release: 2.4h
+last_release_date: 19990611
+last_contact: 9dec12 replied "soon", 4feb09 replied, autumn09
+activity_status: stale
+last_activity: 19990611
+
+package: pcb
+doc_category: Science
+doc_summary: Design printed circuit board layouts
+doc_url: none
+blurb_id: pcb_blurb
+download_url: http://sourceforge.net/project/showfiles.php?group_id=73743
+gplv3_status: not-done-in-20100929
+last_release: 20100929
+last_release_date: 20100929
+last_contact: 2jul12,2dec10,4mar10,24mar09 asked
+activity_status: stale
+last_activity: 20100929
+
+package: pdf
+copyright_holder: fsf-ok-#786934
+doc_category: Printing
+doc_summary: Library and programs for manipulating PDF
+doc_url: none
+blurb_id: pdf_blurb
+gplv3_status: not-done-since-no-release
+note: no-release
+activity_status: stale
+
+package: pem
+doc_category: Business
+doc_summary: Personal expenses manager
+doc_url: none
+blurb_id: pem_blurb
+gplv3_status: done-in-0.7.8
+last_release: 0.7.9
+last_release_date: 20110815
+activity_status: stale
+last_activity: 20110815
+
+package: pexec
+doc_category: Software
+doc_summary: Execute a command in parallel on multiple hosts
+doc_url: /software/pexec/pexec.1.html
+blurb_id: pexec_blurb
+#old download_url: http://sourceforge.net/project/showfiles.php?group_id=210655
+gplv3_status: done-as-of-1.0rc8
+last_release: 1.0rc8
+last_release_date: 20090914
+activity_status: stale
+last_activity: 20090914
+
+package: pgccfd
+mundane_name: Porting GCC for Dunces
+doc_category: Software
+doc_summary: Guide on porting the GNU compiler to new platforms
+doc_url: none
+blurb_id: pgccfd_blurb
+download_url: ftp://ftp.axis.se/pub/users/hp/pgccfd/
+gplv3_status: needs-fdl-update-nomaint
+last_release: 0.5
+last_release_date: 20130303
+activity_status: newmaint
+last_activity: 20130303
+
+package: phantom_home
+mundane_name: Phantom.Home
+doc_category: Interface
+doc_summary: Computer-controlled home automation
+doc_url: none
+blurb_id: phantom_home_blurb
+download_url: http://ftp.gnu.org/gnu/phantom/home/
+gplv3_status: not-done-since-stale
+last_release: 1.0
+last_release_date: 20000628
+activity_status: stale
+last_activity: 20000628
+
+package: pies
+doc_category: Software
+doc_summary: Program invocation and execution supervisor
+doc_url: http://www.gnu.org.ua/software/pies/manual.html
+blurb_id: pies_blurb
+gplv3_status: done-as-of-1.2
+last_release: 1.3
+last_release_date: 20161001
+activity_status: ok
+last_activity: 20161001
+
+package: pipo
+download_url: http://maddingue.free.fr/softwares/download/GNU-PipoBBS/
+doc_category: Internet
+doc_summary: Bulletin board system
+doc_url: none
+blurb_id: pipo_blurb
+gplv3_status: not-done-since-stale
+last_contact: 9mar10 asked
+last_release: 0.20
+last_release_date: 19990528
+activity_status: stale
+last_activity: 19990528
+
+package: plotutils
+copyright_holder: fsf-no-reply
+doc_category: Graphics
+doc_summary: Plotting utilities and library
+doc_url: none
+blurb_id: plotutils_blurb
+gplv3_status: done-in-2.6
+last_release: 2.6
+last_release_date: 20090926
+activity_status: stale
+last_activity: 20090926
+
+package: polyxmass
+doc_category: Science
+doc_summary: Mass spectrometric data simulations and analyses
+doc_url: none
+blurb_id: polyxmass_blurb
+download_url: http://debian.cs.binghamton.edu/debian/pool/main/p/polyxmass/
+gplv3_status: not-done-since-nomaint
+note: other polyxmass-* directories there too.
+activity_status: newmaint
+last_activity: 20160314
+
+package: powerguru
+copyright_holder: fsf-ok-#786472
+mundane_name: PowerGuru
+doc_category: Interface
+doc_summary: Monitoring, logging, and remote control of power generation
+doc_url: /software/powerguru/#documentation
+blurb_id: powerguru_blurb
+gplv3_status: in-dev-sources
+note: no-release
+activity_status: newcomaint
+last_activity: 20130404
+
+package: proxyknife
+doc_category: Internet
+doc_summary: Customizable multithread proxy hunter
+doc_url: /software/proxyknife/manual/
+blurb_id: proxyknife_blurb
+gplv3_status: done-in-1.7 (gnumaint-reply 24 Sep 2007 22:54:49 +0800)
+last_release: 1.7
+last_release_date: 20070924
+activity_status: stale
+last_activity: 20070924
+
+package: pspp
+mundane_name: PSPP
+copyright_holder: fsf-ok-with-external-#786643
+logo: /software/pspp/pspplogo.png
+doc_category: Mathematics
+doc_summary: Statistical analysis
+doc_url: /software/pspp/manual/
+blurb_id: pspp_blurb
+gplv3_status: done-in-0.4.0.1
+last_release: 0.10.2
+last_release_date: 20160723
+activity_status: ok
+last_activity: 20160723
+
+package: psychosynth
+doc_category: Music
+doc_summary: Interactive software synthesizer
+doc_url: http://www.psychosynth.com/index.php?title=Documentation
+blurb_id: psychosynth_blurb
+gplv3_status: done-as-of-0.1.5
+last_release: 0.3.0
+last_release_date: 20120402
+activity_status: stale
+last_activity: 20120402
+
+package: pth
+logo: /software/pth/pth.jpg
+doc_category: Libraries
+doc_summary: Portable thread library
+doc_url: /software/pth/pth-manual.html
+blurb_id: pth_blurb
+gplv3_status: next-release rms
+last_release: 2.0.7
+last_release_date: 20060608
+last_contact: 3dec11 replied, 10mar11 asked (rms gave up), 4jan11 to rms, 
12mar10 asked, 1jun09 replied
+activity_status: stale
+last_activity: 20060608
+
+package: pyconfigure
+language: python
+language: autoconf
+doc_category: Software
+doc_summary: Configure interface for Python-based packages
+doc_url: /software/pyconfigure/manual/
+blurb_id: pyconfigure_blurb
+gplv3_status: stays-lgplv2-indefinitely (rms 26 Sep 2010 06:37:43)
+last_release: 0.2.3
+last_release_date: 20160420
+activity_status: ok
+last_activity: 20160420
+
+package: pythonwebkit
+language: python
+doc_category: Software
+doc_summary: W3C DOM bindings to Webkit for use with GTK and more
+doc_url: none
+blurb_id: pythonwebkit_blurb
+gplv3_status: stays-lgplv2-indefinitely (rms 26 Sep 2010 06:37:43)
+note: no-release
+last_contact: 17feb13 no release (urged doing so)
+activity_status: newmaint
+last_activity: 20100926
+
+package: qexo
+doc_category: Software
+doc_summary: Java implementation of XQuery using GNU Kawa
+doc_url: /software/qexo/#Documentation
+blurb_id: qexo_blurb
+download_url: http://ftp.gnu.org/gnu/kawa/
+gplv3_status: notgpl
+note: see kawa
+last_contact: see kawa
+activity_status: subpkg
+
+package: quickthreads
+doc_category: Libraries
+doc_summary: Thread library
+doc_url: none
+blurb_id: quickthreads_blurb
+gplv3_status: not-done-since-nomaint
+last_release: 1.6.8
+last_release_date: 20060528
+last_contact: 12mar10 asked, 23jul09 awaiting code,
+note: used to be part of guile, but dropped in guile 1.8.0
+activity_status: nomaint
+last_activity: 20060528
+
+package: r
+logo: //www.r-project.org/Rlogo.jpg
+doc_category: Mathematics
+doc_summary: Environment for statistical computing and graphics
+doc_url: http://cran.r-project.org/#doc
+blurb_id: r_blurb
+download_url: http://stat.ethz.ch/CRAN/src/base/
+gplv3_status: not-done-as-of-2.10.1 (ticket 319866?)
+last_release: 3.2.0
+last_release_date: 20150416
+activity_status: ok
+last_activity: 20150416
+
+package: radius
+copyright_holder: fsf-no-reply
+doc_category: Security
+doc_summary: Authentication and accounting services and daemon
+doc_url: /software/radius/manual/
+blurb_id: radius_blurb
+gplv3_status: done-in-1.6
+last_release: 1.6.1
+last_release_date: 20081217
+activity_status: stale
+last_activity: 20081217
+
+package: rcs
+mundane_name: RCS
+copyright_holder: notfsf-tichy-eggert-nguyen-#786470
+doc_category: Version
+doc_summary: Per-file local revision control system
+doc_url: /software/rcs/manual/
+blurb_id: rcs_blurb
+gplv3_status: not-done-since-stale
+last_release: 5.9.4
+last_release_date: 20150122
+activity_status: ok
+last_activity: 20150122
+
+package: readline
+copyright_holder: fsf-ok-with-examples-#790941
+doc_category: Editors
+doc_summary: Edit command lines while typing, with history support
+doc_url: htmlxref
+blurb_id: readline_blurb
+gplv3_status: done-in-4.0
+last_release: 7.0
+last_release_date: 20160917
+activity_status: ok
+last_activity: 20160917
+
+package: recutils
+logo: /software/recutils/logo.png
+doc_category: Database
+doc_summary: Manipulate plain text files as databases
+doc_url: /software/recutils/manual/
+blurb_id: recutils_blurb
+gplv3_status: done
+last_release: 1.6
+last_release_date: 20140324
+activity_status: ok
+last_activity: 20140324
+
+package: reftex
+copyright_holder: see-auctex
+doc_category: Text
+doc_summary: Emacs support for LaTeX cross-references of all kinds
+doc_url: /software/auctex/manual/reftex.index.html
+blurb_id: reftex_blurb
+gplv3_status: done-in-4.33
+last_release: 4.34
+last_release_date: 20090809
+activity_status: stale
+last_activity: 20090809
+
+package: remotecontrol
+copyright_holder: notfsf
+logo: /software/remotecontrol/GNU_remotecontrol_CIRCLE.png
+doc_category: Interface
+doc_summary: Management of IP-enabled thermostats and other HVAC devices
+doc_url: /software/remotecontrol/manual/
+blurb_id: remotecontrol_blurb
+gplv3_status: done-from-start
+last_release: 2.0
+last_release_date: 20160425
+activity_status: ok
+last_activity: 20160425
+
+package: jami
+alias: ring
+doc_category: Live
+doc_summary: A privacy-respecting communication program
+doc_url: none
+gplv3_status: done-from-start
+activity_status: newpkg
+last_activity: 20161018
+
+package: rottlog
+doc_category: Sysadmin
+doc_summary: Log rotation and management
+doc_url: /software/rottlog/manual/
+blurb_id: rottlog_blurb
+gplv3_status: done-in-0.71.2
+last_release: 0.72.2
+last_release_date: 20100330
+activity_status: newmaint
+last_activity: 20130724
+
+package: rpge
+doc_category: Games
+doc_summary: Role playing game engine
+doc_url: none
+blurb_id: rpge_blurb
+gplv3_status: done-in-0.0.1
+last_release: 0.0.3
+last_release_date: 20140106
+note: revived 6jan14, was gone 22may13 per inaction+leg
+activity_status: stale
+last_activity: 20140106
+
+package: rush
+doc_category: Software
+doc_summary: Restricted user (login) shell
+doc_url: http://puszcza.gnu.org.ua/software/rush/manual.html
+blurb_id: rush_blurb
+gplv3_status: done-in-1.5
+last_release: 1.8
+last_release_date: 20161001
+activity_status: ok
+last_activity: 20161001
+
+package: sather
+doc_category: Software
+doc_summary: An object-oriented language designed to be simple, efficient, safe
+doc_url: /software/sather/#doc
+blurb_id: sather_blurb
+gplv3_status: done-in-1.2.3
+last_release: 1.2.3
+last_release_date: 20070707
+last_contact: 20feb13 replied, 19feb13 asked, 14apr12 asked
+activity_status: newmaint
+last_activity: 20120305
+
+package: scm
+mundane_name: SCM
+copyright_holder: fsf-ok-#786490
+language: c
+logo: //people.csail.mit.edu/jaffer/Logo/SCM_64.png
+doc_category: Software
+doc_summary: A Scheme implementation
+doc_url: http://people.csail.mit.edu/jaffer/scm_toc.html
+blurb_id: scm_blurb
+other_download_url: http://people.csail.mit.edu/jaffer/SCM.html
+gplv3_status: done-without-exception-#502112-lgpl-but-done-in-scm-5e5 
(info-gnu 4 Feb 2008 00:27:30)
+last_release: 5f2
+last_release_date: 20150116
+activity_status: ok
+last_activity: 20150116
+
+package: screen
+copyright_holder: notfsf-Juergen Weigert, Michael Schroeder, Oliver Laumann, 
et al.
+doc_category: Software
+doc_summary: Full-screen window manager providing multiple terminals
+doc_url: /software/screen/manual/
+blurb_id: screen_blurb
+gplv3_status: not-done-in-4.0.3
+last_release: 4.5.0
+last_release_date: 20170118
+activity_status: ok
+last_activity: 20170118
+
+package: sed
+copyright_holder: fsf-ok-#786533
+doc_category: Text
+doc_summary: Stream editor
+doc_url: /software/sed/manual/
+blurb_id: sed_blurb
+gplv3_status: done-in-4.2
+last_release: 4.3
+last_release_date: 20170104
+activity_status: ok
+last_activity: 20170104
+
+package: serveez
+logo: /software/serveez/logo.jpg
+doc_category: Sysadmin
+doc_summary: Framework for implementing IP-based servers
+doc_url: /software/serveez/manual/
+blurb_id: serveez_blurb
+gplv3_status: not-done-in-0.1.7
+last_release: 0.2.2
+last_release_date: 20131202
+activity_status: stale
+last_activity: 20131202
+
+package: sharutils
+copyright_holder: fsf-ok-with-external-29dec-mail
+doc_category: Archiving
+doc_summary: Archives in shell scripts, uuencode/uudecode
+doc_url: /software/sharutils/manual/
+blurb_id: sharutils_blurb
+gplv3_status: done-in-4.7
+last_release: 4.15.2
+last_release_date: 20150530
+activity_status: ok
+last_activity: 20150530
+
+package: shepherd
+copyright_holder: fsf-no-reply-individual-name-in-files
+doc_category: Sysadmin
+doc_summary: System service manager
+doc_url: none
+blurb_id: shepherd_blurb
+gplv3_status: not-done-in-0.5
+download_url: http://www.wt-lorsch.de/dmd--0.5.tar.gz
+last_release: 0.5
+# The exact last release date (as GNU dmd) is not known
+last_release_date: 20030101
+activity_status: newmaint
+last_activity: 20130925
+
+package: shishi
+copyright_holder: notfsf
+logo: /software/shishi/shishi.png
+doc_category: Internet
+doc_summary: Implementation of the Kerberos 5 network security system
+doc_url: /software/shishi/#status
+blurb_id: shishi_blurb
+gplv3_status: done-in-alpha-releases
+last_release: 1.0.2
+last_release_date: 20120403
+activity_status: stale
+last_activity: 20120403
+
+package: shmm
+doc_category: Software
+doc_summary: Shared memory manager utility
+doc_url: none
+blurb_id: shmm_blurb
+gplv3_status: done-in-1.0
+last_release: 1.0
+last_release_date: 20080628
+activity_status: stable
+last_activity: 20080628
+
+package: shtool
+doc_category: Software
+doc_summary: Compilation of utility shell scripts into a shell tool
+doc_url: none
+blurb_id: shtool_blurb
+gplv3_status: not-done rms
+last_release: 2.0.8
+last_release_date: 20080718
+last_contact: see pth
+note: pending (l)gplv3, current address, rationalE?, info-gnu announcement
+activity_status: stale
+last_activity: 20080718
+
+package: sipwitch
+doc_category: Telephony
+doc_summary: Secure peer-to-peer VoIP server for the SIP protocol
+doc_url: /software/sipwitch/sipwitch.html#documentation
+blurb_id: sipwitch_blurb
+gplv3_status: done-in-0.1
+last_release: 1.9.15
+last_release_date: 20151213
+activity_status: ok
+last_activity: 20151213
+
+package: slib
+mundane_name: SLIB
+doc_category: Software
+doc_summary: Portable library for Scheme
+doc_url: http://people.csail.mit.edu/jaffer/slib/index.html
+blurb_id: slib_blurb
+logo: //people.csail.mit.edu/jaffer/Logo/SLIB_64.png
+other_download_url: http://groups.csail.mit.edu/mac/ftpdir/scm/
+gplv3_status: done-since-public-domain (licensing 341650, 20 Aug 2007 21:16:08)
+last_release: 3b5
+last_release_date: 20150116
+activity_status: ok
+last_activity: 20150116
+
+package: smalltalk
+copyright_holder: fsf-ok-with-external-#786531
+doc_category: Software
+doc_summary: Smalltalk environment
+doc_url: http://smalltalk.gnu.org/documentation
+blurb_id: smalltalk_blurb
+doc_url: htmlxref
+logo: //smalltalk.gnu.org/files/gst_logo.png
+gplv3_status: needs-exception-#362488, brett 29 Oct 2009 18:02:27
+last_release: 3.2.5
+last_release_date: 20130407
+note: html manuals are constructed ok, but have generic names ("manual")
+activity_status: stale
+last_activity: 20130407
+
+package: social
+doc_category: Internet
+doc_summary: Decentralized social networking server
+doc_url: none
+blurb_id: social_blurb
+gplv3_status: not-done-since-no-release
+note: no-release
+activity_status: stale
+last_activity: 20100313
+
+package: solfege
+doc_category: Music
+doc_summary: Ear training
+doc_url: none
+logo: //www.solfege.org/static/logo.png
+blurb_id: solfege_blurb
+gplv3_status: done-in-3.10.3
+last_release: 3.22.2
+last_release_date: 20140318
+activity_status: newmaint
+last_activity: 20140318
+
+package: spacechart
+mundane_name: SpaceChart
+copyright_holder: fsf-no-reply
+doc_category: Science
+doc_summary: Stargazing in 3D under GNOME
+doc_url: none
+blurb_id: spacechart_blurb
+gplv3_status: not-done-since-stale
+last_release: 0.9.5
+last_release_date: 20021206
+last_contact: 21mar10,14feb09 asked
+activity_status: stale
+last_activity: 20021206
+
+package: speex
+logo: //www.speex.org/images/logos/parrot_speex_org-3.png
+doc_category: Audio
+doc_summary: Library for patent-free audio compression format
+doc_url: http://www.speex.org/docs/
+blurb_id: speex_blurb
+download_url: http://downloads.xiph.org/releases/speex/
+gplv3_status: notgpl
+last_release: 1.2rc1
+last_release_date: 20080724
+activity_status: stable
+last_activity: 20080724
+
+package: spell
+copyright_holder: fsf-ok-#786524
+doc_category: Text
+doc_summary: Spell checking
+doc_url: none
+blurb_id: spell_blurb
+gplv3_status: not-done-since-stale
+last_release: 1.1
+last_release_date: 20110721
+activity_status: stale
+last_activity: 20110721
+
+package: sqltutor
+copyright_holder: fsf-ok-with-external-#787535
+doc_category: Database
+doc_summary: Interactively learn SQL by example
+doc_url: /software/sqltutor/manual/
+blurb_id: sqltutor_blurb
+gplv3_status: done-as-of-0.6
+last_release: 0.7
+last_release_date: 20140601
+activity_status: ok
+last_activity: 20140601
+
+package: src-highlite
+search_alias: source-highlight
+doc_category: Text
+doc_summary: Produce a document with syntax highlighting from a source file
+doc_url: htmlxref
+blurb_id: src_highlite_blurb
+gplv3_status: done-in-2.8
+last_release: source-highlight-3.1.8
+last_release_date: 20150330
+activity_status: ok
+last_activity: 20150330
+
+package: ssw
+mundane_name: Spread Sheet Widget
+doc_category: Spreadsheets
+doc_summary: Gtk+ widget for viewing and manipulating tabular data
+doc_url: none
+gplv3_status: done
+activity_status: newpkg
+last_activity: 20170525
+
+package: stalkerfs
+copyright_holder: fsf-no-reply
+doc_category: Interface
+doc_summary: Desktop search engine for local files, using FUSE
+doc_url: none
+blurb_id: stalkerfs_blurb
+gplv3_status: in-dev-sources (gnumaint-reply 21 Aug 2007 18:41:09 +0200)
+note: no-release
+activity_status: stale
+
+package: stow
+doc_category: Sysadmin
+doc_summary: Managing installed software packages
+doc_url: /software/stow/manual/
+blurb_id: stow_blurb
+gplv3_status: not-done-since-stale
+last_release: 2.2.2
+last_release_date: 20151109
+activity_status: ok
+last_activity: 20151109
+
+package: stump
+logo: //www.algebra.com/~ichudov/images/active/stump.jpg
+doc_category: Internet
+doc_summary: Secure team-based Usenet moderation program
+doc_url: none
+blurb_id: stump_blurb
+download_url: http://www.algebra.com/~ichudov/stump/
+gplv3_status: not-done-since-stale
+last_release: 2.5
+last_release_date: 20000622
+last_contact: 9dec10 asked, 24mar10 asked, 16mar09 replied
+activity_status: stable
+last_activity: 20000622
+
+package: superopt
+copyright_holder: fsf-no-reply
+doc_category: Software
+doc_summary: Super-optimizer of given functions
+doc_url: none
+blurb_id: superopt_blurb
+gplv3_status: not-done-since-stale
+last_release: 2.5
+last_release_date: 19950614
+note: maintainers@ received patch from ttn, 04 Jan 2014 13:33:11.
+activity_status: newmaint
+last_activity: 20150624
+
+package: swbis
+doc_category: Software
+doc_summary: POSIX software packaging utilities
+doc_url: htmlxref
+blurb_id: swbis_blurb
+gplv3_status: done-in-0.951 (20apr08)
+last_release: 1.12
+last_release_date: 20140803
+activity_status: ok
+last_activity: 20140803
+
+package: sysutils
+copyright_holder: fsf-no-reply
+doc_category: Sysadmin
+doc_summary: Standard system administration utilities: passwd, chsh, and more
+doc_url: none
+blurb_id: sysutils_blurb
+download_url: http://download.savannah.gnu.org/releases/sysutils/
+gplv3_status: not-done-since-stale
+last_release: 0.1.5
+last_release_date: 20060329
+last_contact: 19jan11 asked, 26mar10 asked
+note: real maintainer is David Weinhall <address@hidden>
+activity_status: nomaint
+last_activity: 20150322
+
+package: taler
+doc_category: Business
+doc_summary: Electronic payments for a liberal society
+doc_url: none
+blurb_id: taler_blurb
+gplv3_status: done-from-beginning
+last_release: 0.0.0
+last_release_date: 20160603
+activity_status: ok
+last_activity: 20160603
+
+package: talkfilters
+doc_category: Games
+doc_summary: Convert English text to humorous dialects
+doc_url: http://www.hyperrealm.com/talkfilters/talkfilters.pdf
+blurb_id: talkfilters_blurb
+download_url: http://www.hyperrealm.com/talkfilters/
+gplv3_status: not-done-in-2.3.8 # 27mar10 replied
+last_release: 2.3.8
+last_release_date: 20071228
+activity_status: stable
+last_activity: 20071228
+
+package: tar
+copyright_holder: fsf-ok-#786475
+doc_category: Archiving
+doc_summary: Managing tar archives
+doc_url: /software/tar/manual/
+blurb_id: tar_blurb
+gplv3_status: done-in-1.21
+last_release: 1.29
+last_release_date: 20150516
+activity_status: ok
+last_activity: 20150516
+
+package: termcap
+copyright_holder: fsf-ok-#786501
+doc_category: Interface
+doc_summary: Terminal-independent display support
+doc_url: /software/termutils/manual/termcap-1.3/termcap.html
+blurb_id: termcap_blurb
+gplv3_status: not-done-since-stale-and-not-updated-in-emacs
+last_release: 1.3.1
+last_release_date: 20020313
+last_contact: see termutils
+activity_status: stable
+last_activity: 20020313
+
+package: termutils
+copyright_holder: fsf-ok-#786502
+doc_category: Interface
+doc_summary: The tput and tabs utilities for terminal operations
+doc_url: /software/termutils/manual/termutils-2.0/tput.html
+blurb_id: termutils_blurb
+gplv3_status: not-done-since-stale-and-move-to-ncurses
+last_release: 2.0
+last_release_date: 19951201
+last_contact: 8nov10 asked, 23feb09 replied/asked
+activity_status: stable
+last_activity: 19951201
+
+package: teseq
+doc_category: Software
+doc_summary: Analyze files with terminal control sequences, for debugging
+doc_url: /software/teseq/manual/
+blurb_id: teseq_blurb
+gplv3_status: done-in-1.0.0
+last_release: 1.1.1
+last_release_date: 20150814
+activity_status: ok
+last_activity: 20150814
+
+package: teximpatient
+mundane_name: TeX for the Impatient
+copyright_holder: notfsf
+doc_category: Text
+doc_summary: Book on TeX, plain TeX, and Eplain
+doc_url: none
+blurb_id: teximpatient_blurb
+gplv3_status: doc
+download_url: ftp://tug.org/tex/impatient/
+last_release: 2.3
+last_release_date: 20130530
+activity_status: newmaint
+last_activity: 20160321
+
+package: texinfo
+copyright_holder: fsf-ok
+doc_category: Text
+doc_summary: The GNU documentation format
+doc_url: /software/texinfo/manual/
+blurb_id: texinfo_blurb
+doc_url: htmlxref
+gplv3_status: done-#502113
+last_release: 6.3
+last_release_date: 20160910
+activity_status: ok
+last_activity: 20160910
+
+package: texmacs
+mundane_name: TeXmacs
+gplv3_status: not-done-in-1.0.7
+doc_category: Text
+doc_summary: Editing platform with special features for scientists
+doc_url: none
+blurb_id: texmacs_blurb
+download_url: http://www.texmacs.org/tmweb/download/sources.en.html
+last_release: 1.99.4
+last_release_date: 20151218
+activity_status: ok
+last_activity: 20151218
+
+package: thales
+doc_category: Software
+doc_summary: Unit test framework for Guile
+doc_url: htmlxref
+blurb_id: thales_blurb
+gplv3_status: unknown
+last_release: 1.99
+last_release_date: 20140319
+activity_status: ok
+last_activity: 20140319
+
+package: time
+copyright_holder: fsf-ok-#786500
+doc_category: Sysadmin
+doc_summary: Run a command, then display its resource usage
+doc_url: none
+blurb_id: time_blurb
+gplv3_status: not-done-since-stale
+last_release: 1.7.2
+last_release_date: 20150123
+last_contact: 16feb13 replied on bug-gnu-utils, no eta; 14oct11 replied, 
13jan11 replied-within-a-month
+activity_status: ok
+last_activity: 20150123
+
+package: tramp
+mundane_name: TRAMP
+copyright_holder: fsf-ok-#786547
+doc_category: Interface
+doc_summary: Transparent Remote Access, Multiple Protocol GNU Emacs package
+doc_url: htmlxref
+blurb_id: tramp_blurb
+gplv3_status: done-in-2.1.14
+last_release: 2.2.11
+last_release_date: 20141229
+activity_status: ok
+last_activity: 20141229
+
+package: trans-coord
+copyright_holder: fsf-ok
+fsd: none
+doc_category: Translation
+doc_summary: Organizational infrastructure for translating www.gnu.org
+doc_url: /software/trans-coord/manual/
+blurb_id: trans_coord_blurb
+gplv3_status: ok-since-container
+container: for-gnun
+note: savannah project for www.gnu.org translation coordination
+activity_status: container
+
+package: trueprint
+doc_category: Printing
+doc_summary: Pretty-print C sources and other plain text to PostScript
+doc_url: none
+blurb_id: trueprint_blurb
+gplv3_status: unknown
+last_release: 5.4
+last_release_date: 20130311
+activity_status: newmaint
+last_activity: 20140305
+
+package: unifont
+copyright_holder: notfsf
+doc_category: Fonts
+doc_summary: Large bitmap font covering Unicode's Basic Multilingual Plane
+doc_url: none
+blurb_id: unifont_blurb
+gplv3_status: stays-gplv2+-per-author-and-rms
+last_release: 9.0.06
+last_release_date: 20161223
+activity_status: ok
+last_activity: 20161223
+
+package: units
+copyright_holder: fsf-no-reply
+doc_category: Science
+doc_summary: Conversion between thousands of scales
+doc_url: /software/units/manual/
+blurb_id: units_blurb
+gplv3_status: done (gnumaint-reply 26 Sep 2007 21:58:19)
+last_release: 2.11
+last_release_date: 20140402
+activity_status: ok
+last_activity: 20140402
+
+package: unrtf
+mundane_name: UnRTF
+gplv3_status: done-in-0.20.5
+doc_category: Text
+doc_summary: Convert Rich Text Format documents to other formats
+doc_url: none
+blurb_id: unrtf_blurb
+last_release: 0.21.9
+last_release_date: 20150102
+activity_status: ok
+last_activity: 20150102
+
+package: userv
+doc_category: Security
+doc_summary: Daemon to control service access
+doc_url: http://www.chiark.greenend.org.uk/~ian/userv/spec.html/
+blurb_id: userv_blurb
+gplv3_status: under-discussion-system-component (gnumaint-reply 21 Aug 2007 
11:55:17 +0100)
+last_release: 1.2.0
+last_release_date: 20170123
+last_contact: 19feb13 maybe soon; see adns
+activity_status: ok
+last_activity: 20170123
+
+package: uucp
+copyright_holder: notfsf-#786532
+mundane_name: UUCP
+doc_category: Sysadmin
+doc_summary: UUCP protocol implementation
+doc_url: none
+blurb_id: uucp_blurb
+gplv3_status: not-done-since-stale
+last_release: 1.07
+last_release_date: 20030603
+last_contact: 9jan11 asked, 3apr10 asked, 19may09 replied
+activity_status: newmaint
+last_activity: 20131008
+
+package: vc-dwim
+fsd: vcdwim
+doc_category: Version
+doc_summary: Version-control-agnostic ChangeLog diff and commit tool
+doc_url: /software/vc-dwim/manual/
+blurb_id: vc_dwim_blurb
+gplv3_status: done-as-of-1.2
+last_release: 1.8
+last_release_date: 20170114
+activity_status: ok
+last_activity: 20170114
+
+package: vcdimager
+mundane_name: VCDImager
+doc_category: Video
+doc_summary: Authoring, disassembling and analyzing (super and) video CDs
+doc_url: none
+blurb_id: vcdimager_blurb
+gplv3_status: under-discussion (4nov07)
+last_release: 0.7.24
+last_release_date: 20110317
+activity_status: stale
+last_activity: 20110317
+
+package: vera
+copyright_holder: notfsf
+doc_category: Dictionaries
+doc_summary: List of acronyms
+doc_url: none
+blurb_id: vera_blurb
+gplv3_status: doc
+last_release: 1.22
+last_release_date: 20140925
+activity_status: ok
+last_activity: 20140925
+
+package: vmgen
+copyright_holder: see-gforth
+doc_category: Software
+doc_summary: Generic virtual machine generation, used by gforth
+doc_url: none
+blurb_id: vmgen_blurb
+download_url: http://ftp.gnu.org/gnu/gforth/
+gplv3_status: in-dev-sources (gnumaint-reply 31 Dec 2007 20:31:05)
+last_release: gforth-0.7.3
+last_release_date: 20140709
+note: vmgen is distributed as part of gforth
+activity_status: ok
+last_activity: 20140709
+
+package: wb
+mundane_name: WB
+logo: //people.csail.mit.edu/jaffer/TreeRoot96.jpg
+doc_category: Libraries
+doc_summary: Disk-based associative array B-tree database library
+doc_url: http://people.csail.mit.edu/jaffer/wb_toc.html
+blurb_id: wb_blurb
+other_download_url: http://groups.csail.mit.edu/mac/ftpdir/scm/
+gplv3_status: done-without-exception-#502112-but-done-in-wb2a2 (info-gnu 4 Feb 
2008 00:29:22)
+last_release: 2b3
+last_release_date: 20150116
+activity_status: ok
+last_activity: 20150116
+
+package: wdiff
+copyright_holder: fsf-no-reply
+doc_category: Text
+doc_summary: Word difference finder
+doc_url: /software/wdiff/manual/
+blurb_id: wdiff_blurb
+gplv3_status: done-in-0.6.0
+last_release: 1.2.2
+last_release_date: 20140414
+activity_status: ok
+last_activity: 20140414
+
+package: websocket4j
+language: java
+doc_category: Internet
+doc_summary: WebSocket protocol implementation for Java-HTML5 communication
+doc_url: /software/websocket4j/manual/
+blurb_id: websocket4j_blurb
+gplv3_status: done
+last_release: 1.3
+last_release_date: 20101024
+activity_status: stale
+last_activity: 20101024
+
+package: webstump
+mundane_name: WebSTUMP
+doc_category: Internet
+doc_summary: Web interface to STUMP
+doc_url: none
+blurb_id: webstump_blurb
+download_url: http://www.algebra.com/~ichudov/stump/
+gplv3_status: see-stump
+note: approx. last_activity 1999
+last_contact: see stump
+activity_status: stable
+
+package: wget
+copyright_holder: fsf-ok-#786732
+doc_category: Internet
+doc_summary: Non-interactive command-line utility for downloading files
+doc_url: /software/wget/manual/
+blurb_id: wget_blurb
+gplv3_status: done-in-1.11
+last_release: 1.18
+last_release_date: 20160609
+activity_status: ok
+last_activity: 20160609
+
+package: which
+copyright_holder: notfsf
+doc_category: Sysadmin
+doc_summary: Find full path of shell commands
+doc_url: none
+blurb_id: which_blurb
+gplv3_status: done-in-2.19
+last_release: 2.21
+last_release_date: 20150320
+activity_status: stable
+last_activity: 20150320
+
+package: womb
+copyright_holder: fsf-ok
+doc_category: Software
+doc_summary: Repository for GNU work not intended to be separate packages
+doc_url: none
+blurb_id: womb_blurb
+gplv3_status: in-dev-sources (aug07)
+note: released-through-vc
+activity_status: ok
+
+package: xaos
+mundane_name: XaoS
+doc_category: Graphics
+doc_summary: Real-time fractal zoomer
+doc_url: http://matek.hu/xaos/doku.php?id=documentation:main
+blurb_id: xaos_blurb
+download_url: http://sourceforge.net/projects/xaos/files/XaoS/
+gplv3_status: working (gnumaint-reply 21 Aug 2007 20:43:33 +0200)
+last_release: 3.6
+last_release_date: 20131101
+activity_status: stale
+last_activity: 20131101
+
+package: xboard
+mundane_name: XBoard
+copyright_holder: fsf-maybe-ok-just-scotti-#786505
+doc_category: Games
+doc_summary: Graphical user interface for chess programs
+doc_url: /software/xboard/manual/
+blurb_id: xboard_blurb
+gplv3_status: done-as-of-4.4.2
+last_release: 4.8.0
+last_release_date: 20141102
+activity_status: ok
+last_activity: 20141102
+
+package: xlogmaster
+logo: /graphics/xlogmaster/logo_small.jpg
+doc_category: Sysadmin
+doc_summary: GUI program for monitoring log and other files
+doc_url: /software/xlogmaster/tutorial_toc.html
+blurb_id: xlogmaster_blurb
+gplv3_status: done-as-of-1.6.2
+last_release: 1.6.2
+last_release_date: 20090624
+last_contact: 19feb12 jmd asked about penguin
+activity_status: stale
+last_activity: 20090624
+
+package: xmlat
+doc_category: Web
+doc_summary: Simple XML for defining and implementing markup languages
+doc_url: none
+blurb_id: xmlat_blurb
+gplv3_status: should-be-done
+last_contact: 27feb13 replied, 26feb13 asked
+activity_status: newmaint
+last_activity: 20120512
+
+package: xnee
+doc_category: Software
+doc_summary: Record, replay and distribute user actions under X11
+doc_url: http://xnee.wordpress.com/documentation/
+blurb_id: xnee_blurb
+gplv3_status: done-in-directory
+last_release: 3.19
+last_release_date: 20140506
+activity_status: ok
+last_activity: 20140506
+
+package: xorriso
+doc_category: Archiving
+doc_summary: Create, manipulate, burn ISO-9660 filesystems
+doc_url: /software/xorriso/man_1_xorriso.html
+blurb_id: xorriso_blurb
+gplv3_status: done
+last_release: 1.4.6
+last_release_date: 20160917
+note: Libburnia project = address@hidden
+note: xorriso support also on address@hidden
+note: mkisofs history at http://lists.debian.org/cdwrite/2004/10/msg00071.html
+activity_status: ok
+last_activity: 20160917
+
+package: zile
+copyright_holder: fsf-no-reply
+doc_category: Editors
+doc_summary: Zile is lossy Emacs, a lightweight Emacs clone
+doc_url: none
+blurb_id: zile_blurb
+gplv3_status: done-in-2.2.58
+last_release: 2.4.13
+last_release_date: 20161018
+activity_status: ok
+last_activity: 20161018
+
+# End. (Do not remove this line or the blank line before it.  Thanks.)

Index: rec/package-descriptor.rec
===================================================================
RCS file: rec/package-descriptor.rec
diff -N rec/package-descriptor.rec
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ rec/package-descriptor.rec  11 May 2019 10:44:54 -0000      1.1
@@ -0,0 +1,92 @@
+# $Id: package-descriptor.rec,v 1.1 2019/05/11 10:44:54 ineiev Exp $
+# Public domain.
+#
+# This file is maintained in the CVS repository of GNU womb,
+# http://cvs.savannah.gnu.org/viewvc/gnumaint/?root=womb
+#
+# Info/constraints about the fields:
+# - The package name should always be all-lowercase.
+#
+# - When mundane_name is not specified, default is to capitalize the first
+#   letter of the package identifier.
+#
+# - Default for download_url is http://ftp.gnu.org/gnu/PKGNAME.
+#
+# - A doc_url value of "none" means no specific documentation page (home
+#     page is used).
+#   "htmlxref" means to extract a list of additional manuals from the
+#     Texinfo htmlxref.cnf file.
+#   Otherwise, it can be a url, which can be used together with htmlxref,
+#   but multiple explicit urls or other combinations are not supported.
+#
+# - doc_category values are in doc-categories.txt (following FSD).
+# (doc stuff is used to generate gnu.org/manual.)
+#
+# - each package should always have an activity_status
+#
+# - allowed activity_status values:
+#   ok;
+#   newmaint,newcomaint (newly-appointed);
+#   newpkg (newly-dubbed);
+#   nomaint (no maintainer);
+#   container (doesn't get released);
+#   subpkg (released as part of another package);
+#   stable (no current release, but none needed);
+#   stale (needs release);
+#   moribund (needs release, but not likely to ever get one).
+#   alpha (alpha-only releases so far)
+#
+# - most activity statuses must have an associated date of last
+#   activity
+#
+# - as a consistency check, the last activity should always be at
+# least the last release date
+#
+# The home page is not a field because that *always* is (should be)
+# /software/PACKAGE, even if that does nothing but redirect.  Any other
+# method leads to redundant (hence inevitably inconsistent) information.
+#
+# Finally, this file as a whole is more or less sorted by package
+# identifier, for human convenience.  However, software reading this
+# file should accept any order of packages or fields.
+
+%rec: Package
+%doc: Basic package metadata
+%key: package
+%sort: package
+%mandatory: activity_status
+%allowed: package alias blob_id search_alias mundane_name
++ copyright_holder savannah fsd
++ language logo doc_category doc_summary doc_url doc_shop download_url
++ other_download_url gplv3_status activity_status last_activity
++ last_release last_release_date last_contact next_contact note
++ container tech_address doc_source_format blurb_id
+# Package names should be all in lower-case
+%type: package regexp /[a-z0-9-]+/
+## Get the blurb separately via a join on the Blurb record type (in
+## pkgblurbs.rec)
+## %type: blurb_id rec Blurb
+## Allowed activity statuses:
+%type: activity_status enum
++ ok newmaint newcomaint newpkg nomaint container subpkg stable
++ stale moribund alpha decommissioned nonpkg
+%type: last_activity,last_release_date date
+##
+## CONSTRAINTS
+## Except in a few cases, there should always be a last_activity
+%constraint: activity_status != 'container' &&
++ activity_status != 'subpkg' &&
++ activity_status != 'stable' &&
++ activity_status != 'decommissioned' &&
++ activity_status != 'nonpkg' &&
++ note != 'no-release' &&
++ note != 'released-through-vc' &&
++ note != 'many packages' => #last_activity
+## If there has been a release, then the last activity should at least
+## be the date of the last release
+%constraint: last_release_date => last_release_date << last_activity ||
++ last_release_date == last_activity
+%constraint: activity_status = 'ok' => last_release_date >> '3 years ago'
+%constraint: activity_status = 'stale' => last_release_date << '3 years ago' ||
++ note = 'no-release'
+

Index: spotlight/spotlight.m4
===================================================================
RCS file: spotlight/spotlight.m4
diff -N spotlight/spotlight.m4
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ spotlight/spotlight.m4      11 May 2019 10:44:54 -0000      1.1
@@ -0,0 +1,27 @@
+NN new GNU releases in the last month (as of DATE):
+
+RELEASES
+
+For announcements of most new GNU releases, subscribe to the info-gnu
+mailing list: <https://lists.gnu.org/mailman/listinfo/info-gnu>.
+
+To download: nearly all GNU software is available from
+<https://ftp.gnu.org/gnu/>, or preferably one of its mirrors from
+<https://www.gnu.org/prep/ftp.html>.  You can use the url
+<https://ftpmirror.gnu.org/> to be automatically redirected to a
+(hopefully) nearby and up-to-date mirror.
+
+This month, we welcome NEWMAINT.
+
+A number of GNU packages, as well as the GNU operating system as a
+whole, are looking for maintainers and other assistance: please see
+<https://www.gnu.org/server/takeaction.html#unmaint> if you'd like to
+help.  The general page on how to help GNU is at
+<https://www.gnu.org/help/help.html>.
+
+If you have a working or partly working program that you'd like
+to offer to the GNU project as a GNU package, see
+<https://www.gnu.org/help/evaluation.html>.
+
+As always, please feel free to write to us at <address@hidden>
+with any GNUish questions or suggestions for future installments.

Index: spotlight/gnubytime.pl
===================================================================
RCS file: spotlight/gnubytime.pl
diff -N spotlight/gnubytime.pl
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ spotlight/gnubytime.pl      11 May 2019 10:44:54 -0000      1.1
@@ -0,0 +1,24 @@
+#!/usr/bin/env perl
+# ftp releases by time,via  rsync listing.
+# -rw-r--r--         918 2002/01/14 14:28:56 .message
+
+$ARGV[0] = "/u/karl/sys/ftp/fp.gnu" unless @ARGV;
+
+while (<>) {
+  next if / -> /;
+  next if /\.(diff|xdelta)\./;
+  next if /snapshot\.pkg/;
+  next if /\.darwin/;
+  next if /-latest/;
+  next if /\.sig/;
+  next unless /\.[tj]ar\./;
+  my (undef,undef,$date,undef,$pkg) = split (" "); # rsync
+  # my ($date,undef,$pkg) = split (" "); # ftp
+  $date =~ tr,-/,,d;
+  $pkg{$pkg} = $date;
+}
+
+for my $p (sort { $pkg{$b} <=> $pkg{$a} } keys %pkg) {
+  ($pfile = $p) =~ s/\.tar\..*$//;
+  print "$pkg{$p}\t$pfile\n";
+}

Index: msg.0802/Makefile
===================================================================
RCS file: msg.0802/Makefile
diff -N msg.0802/Makefile
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ msg.0802/Makefile   11 May 2019 10:44:54 -0000      1.1
@@ -0,0 +1,4 @@
+try:
+       $(MAKE) -s -C .. test-unanswered >tomail.txt
+       send.0802
+       grep To: msgs/*

Index: msg.0802/.cvsignore
===================================================================
RCS file: msg.0802/.cvsignore
diff -N msg.0802/.cvsignore
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ msg.0802/.cvsignore 11 May 2019 10:44:54 -0000      1.1
@@ -0,0 +1,2 @@
+msgs
+tomail.txt

Index: msg.0802/send.0802
===================================================================
RCS file: msg.0802/send.0802
diff -N msg.0802/send.0802
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ msg.0802/send.0802  11 May 2019 10:44:54 -0000      1.1
@@ -0,0 +1,56 @@
+#!/usr/bin/env perl
+# February 2008.
+# - Send to maintainers we have not had established contact with.
+
+exit (&main ());
+
+sub main
+{
+  my $mail_template = "msg0802.txt";
+  chomp (my @tomail = `cat tomail.txt`);  # generated by Makefile
+  system ("rm -rf msgs; mkdir msgs");  # clean anything old
+
+  my %seen;
+  for my $line (@tomail) {
+    my ($pkg,$addr) = split (/ - /, $line, 2);
+    
+    # we arranged things so we don't send this to anyone who maintains
+    # multiple packages.
+    warn "already saw $addr ($seen{$addr})" if $seen{$addr};
+    $seen{$addr} = $pkg;
+
+    my $sed = "n"; # don't need this this time
+    $msg = &make_msg ($mail_template, $sed, $pkg, ($addr));
+  
+    # save it.
+    local *OFILE;
+    ($OFILE = ">msgs/$pkg") =~ tr/ //d;  # remove spaces to keep things easy
+    open (OFILE) || die "open($OFILE) failed: $!";
+    print OFILE $msg;
+    close (OFILE) || warn "close($OFILE) failed: $!";
+  }
+
+  return 0;
+}
+
+
+
+# Play with the message text in MAIL_TEMPLATE, handling the %if noaddr
+# conditional according to SED, and the %fmt: directive, and
+# substituting "%PACKAGE_NAME" and "%MAINTAINER_EMAIL".
+# 
+sub make_msg
+{
+  my ($mail_template,$sed,$pkgname,@maintainer_emails) = @_;
+  
+  my @msg = `sed -e $sed $mail_template | fmt --prefix=%fmt:`;
+  my $msg = join ("", @msg);
+  
+  $msg =~ s/^%fmt://gm;  # strip our reformatting prefix.
+  $msg =~ s/%PACKAGE_NAME/$pkgname/gm;
+  
+  my $recip = join (", ", @maintainer_emails);
+  $msg =~ s/%MAINTAINER_EMAIL/$recip/gm;
+    
+  return $msg;
+}

Index: msg.0802/msg0802.txt
===================================================================
RCS file: msg.0802/msg0802.txt
diff -N msg.0802/msg0802.txt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ msg.0802/msg0802.txt        11 May 2019 10:44:54 -0000      1.1
@@ -0,0 +1,19 @@
+From: address@hidden (GNU Project)
+To: %MAINTAINER_EMAIL
+Subject: maintaining GNU %PACKAGE_NAME?
+Reply-to: address@hidden
+
+Greetings,
+
+To the best of our knowledge, you are the maintainer of the
+GNU %PACKAGE_NAME package.  Unfortunately, it seems we have lost
+contact with you.  We don't know whether you are still working
+on the program or even whether you are still programming at all.
+
+Could you please reply to this message and let us know if you are still
+working on the package?  If we cannot regain contact with you (we will
+also try to find a phone number for you), we will need to find another
+maintainer for the package.
+
+Thank you,
+rms / karl



reply via email to

[Prev in Thread] Current Thread [Next in Thread]