-*- outline -*-
Here are most of the steps we (maintainers) follow when making a release.
We assume that the following environment variables are set:

  GPG_KEY_ID - your gpg key ID
  CURRENT_VERSION - the next release version
  PREVIOUS_VERSION - the previous release version

* Making a snapshot release

** Update 'gnulib' git submodule:

    ./gitsub.sh upgrade
    git add gnulib
    git commit -m 'Update to newest gnulib'

** Run these commands, in this order:

    # Forcing a specific version number, without having to set a git tag.
    echo $CURRENT_VERSION > .tarball-version

    ./autogen.sh
    ./configure
    make
    make dist

    # To prevent auto-updating '.version' file by GNUmakefile due to
    # regenerated PO files, specify Makefile manually.
    make -f Makefile distcheck

  Then you will get a distribution tarball:

    gettext-$CURRENT_VERSION-*.tar.gz

  If necessary, produce variants with higher compression (takes 7 minutes):

    gzip -d -c < gettext-$CURRENT_VERSION-*.tar.gz | xz -c -e > gettext-$CURRENT_VERSION-*.tar.xz
    gzip -d -c < gettext-$CURRENT_VERSION-*.tar.gz | lzip -c -9 > gettext-$CURRENT_VERSION-*.tar.lz

  Rename it e.g. gettext-ss.tar.xz

** Verify that
      gettext-runtime/po/POTFILES.in
      gettext-tools/po/POTFILES.in
  are complete.

  Test the snapshot tarball.  If it seems good, then upload to
  alpha.gnu.org:

    gnulib/build-aux/gnupload --to alpha.gnu.org:gettext \
                              gettext-ss.tar.xz

  Notify translators and testers, by sending an email to:

    coordinator@translationproject.org
    platform-testers@gnu.org

** Finally:

    rm -f .tarball-version

* Making an official release

** Create a branch for release

    git checkout -b release-$CURRENT_VERSION

  or

    # Forcing a specific version number, without having to set a git tag.
    echo $CURRENT_VERSION > .tarball-version

** Update files:

  - gettext-runtime/doc/matrix.texi

    Update with information from the Translation Project, by running
    run.sh in gettext-runtime/doc/Admin/.  Copy resulting matrix.texi
    into gettext-runtime/doc/.  Update the STATUS date in nls.texi.

  - gettext-runtime/intl/locale.alias

    Update with glibc's intl/locale.alias.

  - gettext-runtime/intl/localcharset.h
  - gettext-runtime/intl/localcharset.c

    Update with libcharset inside libiconv.  Check that
    gnulib/lib/{localcharset.h,localcharset.c} agree with it, except
    for copyright header changes.

  - gettext-runtime/po/Makefile.in.in

    Update Origin version.

  - gettext-runtime/m4/*.m4

    Update version at the first line.

  - gettext-runtime/intl/libgnuintl.in.h

    Update LIBINTL_VERSION.

  - libtextstyle/version.sh

    Update VERSION_NUMBER and RELEASE_DATE.

  - gettext-tools/libgettextpo/gettext-po.in.h

    Update LIBGETTEXTPO_VERSION.

  - gettext-runtime/intl/Makefile.am
  - libtextstyle/lib/Makefile.am
  - gettext-tools/libgettextpo/Makefile.am

    Update -version-info arguments, according to libtool versioning
    (info "(libtool) Updating version info").
    Preferrably using the gnulib/build-aux/libtool-next-version program.
    Or manually, using these rules:

      * increment LTV_REVISION,
      * if any interfaces (functions/variables/classes) have been removed
        or changed [i.e. backwards compatibility has been broken],
        increment LTV_CURRENT, set LTV_REVISION to 0, set LTV_AGE to 0.
      * otherwise:
        * if any interfaces (functions/variables/classes) have been added,
          increment LTV_CURRENT, set LTV_REVISION to 0, increment LTV_AGE.

  - gettext-tools/emacs/po-mode.el

    Update po-mode-version-string, if there is any change.

  - gettext-runtime/src/envsubst.c
    gettext-runtime/src/gettext.c
    gettext-runtime/src/gettext.sh.in
    gettext-runtime/src/ngettext.c
    gettext-tools/misc/autopoint.in
    gettext-tools/misc/convert-archive.in
    gettext-tools/misc/gettextize.in
    gettext-tools/src/cldr-plurals.c
    gettext-tools/src/hostname.c
    gettext-tools/src/msgattrib.c
    gettext-tools/src/msgcat.c
    gettext-tools/src/msgcmp.c
    gettext-tools/src/msgcomm.c
    gettext-tools/src/msgconv.c
    gettext-tools/src/msgen.c
    gettext-tools/src/msgexec.c
    gettext-tools/src/msgfilter.c
    gettext-tools/src/msgfmt.c
    gettext-tools/src/msggrep.c
    gettext-tools/src/msginit.c
    gettext-tools/src/msgmerge.c
    gettext-tools/src/msgunfmt.c
    gettext-tools/src/msguniq.c
    gettext-tools/src/recode-sr-latin.c
    gettext-tools/src/urlget.c
    gettext-tools/src/xgettext.c

    Update copyright years of the --version output of all programs.

  - NEWS
  - gettext-runtime/libasprintf/NEWS
  - gettext-runtime/NEWS
  - libtextstyle/NEWS

    Add news entries if any.

** Update autopoint related files:

  - gettext-tools/configure.ac

    Update ARCHIVE_VERSION.

  - gettext-tools/misc/autopoint.in

    Update the 'case' statement around line 371 to include the latest release.

** If you got any translation updates, update translations:

    rsync -Lrtvz translationproject.org::tp/latest/gettext-runtime/ \
          gettext-runtime/po/new
  Optionally merge:
    cd gettext-runtime/po
    make update-po
    cd new
    for f in *.po; do msgmerge --update --lang=${f%.po} --previous $f ../gettext-runtime.pot; done
    mv *.po ../
    cd ..; rm -rf new

    rsync -Lrtvz translationproject.org::tp/latest/gettext-tools/ \
          gettext-tools/po/new
  Optionally merge:
    cd gettext-tools/po
    make update-po
    cd new
    for f in *.po; do msgmerge --update --lang=${f%.po} --previous $f ../gettext-tools.pot; done
    mv *.po ../
    cd ..; rm -rf new

    rsync -Lrtvz translationproject.org::tp/latest/gettext-examples/ \
          gettext-tools/examples/po/new
  Optionally merge:
    cd gettext-tools/examples/po
    make update-po
    cd new
    for f in *.po; do msgmerge --update --lang=${f%.po} --previous $f ../gettext-examples.pot; done
    mv *.po ../
    cd ..; rm -rf new

  Adjust LINGUAS files if any of the languages has been added or
  removed since the last release.  Commit the changes.

** Create a release:

    git clean -xdff
    git checkout .

    # Forcing a specific version number, without having to set a git tag.
    echo $CURRENT_VERSION > .tarball-version

    ./autogen.sh
    ./configure --disable-shared
    make distcheck-hook
    make
    make distcheck

    This last "make distcheck" is supposed to fail: The tests autopoint-2,
    autopoint-3 fail.

  Make 'autopoint' work in the new release:

    (cd gettext-tools/misc
     ./add-to-archive ../../gettext-$CURRENT_VERSION.tar.gz)

  Update the examples:

    Update the AM_GNU_GETTEXT_VERSION argument in the gettext-tools/examples/hello-*/configure.ac
    and gettext-tools/examples/hello-c++-kde/configure.in.in.

    gettext-tools/examples/hello-c/m4/Makefile.am
    gettext-tools/examples/hello-c/autoclean.sh
    gettext-tools/examples/hello-c-gnome/m4/Makefile.am
    gettext-tools/examples/hello-c-gnome/autoclean.sh
    gettext-tools/examples/hello-c-gnome3/m4/Makefile.am
    gettext-tools/examples/hello-c-gnome3/autoclean.sh
    gettext-tools/examples/hello-c++/m4/Makefile.am
    gettext-tools/examples/hello-c++/autoclean.sh
    gettext-tools/examples/hello-c++-kde/m4/Makefile.am
    gettext-tools/examples/hello-c++-kde/autoclean.sh
    gettext-tools/examples/hello-c++-gnome/m4/Makefile.am
    gettext-tools/examples/hello-c++-gnome/autoclean.sh
    gettext-tools/examples/hello-objc/m4/Makefile.am
    gettext-tools/examples/hello-objc/autoclean.sh
    gettext-tools/examples/hello-objc-gnome/m4/Makefile.am
    gettext-tools/examples/hello-objc-gnome/autoclean.sh

    Update list of .m4 files (brought in by autopoint).

    Install the gettext package, so as to overwrite or override the locally
    installed 'autopoint' with the newest version:
      $ type autopoint
      autopoint is SOME_PREFIX/bin/autopoint
      $ make -k distclean
      $ ./configure --prefix=SOME_PREFIX && make && make install

    Then check the build infrastructure of the examples by running
      $ cd gettext-tools/examples
      $ ./check-examples

  Finally really make the release tarball:

    # To prevent auto-updating '.version' file by GNUmakefile due to
    # regenerated PO files, specify Makefile manually.
    make -f Makefile distcheck

  If necessary, produce variants with higher compression (takes 7 minutes):

    gzip -d -c < gettext-$CURRENT_VERSION.tar.gz | xz -c -e > gettext-$CURRENT_VERSION.tar.xz
    gzip -d -c < gettext-$CURRENT_VERSION.tar.gz | lzip -c -9 > gettext-$CURRENT_VERSION.tar.lz

  Add a git tag (an annotated tag, not a lightweight tag):

    git commit --allow-empty -m "Release $CURRENT_VERSION"
    git tag -a -m "Release $CURRENT_VERSION" v$CURRENT_VERSION

** Upload tarballs:

    gnulib/build-aux/gnupload --to ftp.gnu.org:gettext \
                              gettext-$CURRENT_VERSION.tar.{gz,xz,lz}

** Upload autopoint archive to alpha.gnu.org:

  This is needed to compile git master after the release (as
  autogen.sh fetches the archive).

    xz -c -e < gettext-tools/misc/archive.dir.tar > archive.dir-$CURRENT_VERSION.tar.xz
    gnulib/build-aux/gnupload \
      --to alpha.gnu.org:gettext \
      --symlink-regex archive.dir-$CURRENT_VERSION.tar.xz

** Finally:

    rm -f .tarball-version

** Merge release-$CURRENT_VERSION branch to master and push the changes to the
   remote repository:

    git checkout master
    git merge release-$CURRENT_VERSION
    git push origin master
    git push origin release-$CURRENT_VERSION

** Update the homepage on www.gnu.org:

  - Bump the version number in gettext.html.
  - Update FAQ.html from gettext-tools/doc/FAQ.html.

** Regenerate the documentation for www.gnu.org:

    cp gnulib/build-aux/gendocs.sh gettext-tools/doc
    cp gnulib/doc/gendocs_template gettext-tools/doc
    cp -p gettext-runtime/doc/*.texi gettext-tools/doc
    cp build-aux/texinfo.tex gettext-tools/doc
    (cd gettext-tools/doc
     LC_ALL=C ./gendocs.sh --email bug-gnu-gettext gettext "GNU gettext")

    cp gnulib/build-aux/gendocs.sh gettext-runtime/libasprintf
    cp gnulib/doc/gendocs_template gettext-runtime/libasprintf
    cp build-aux/texinfo.tex gettext-runtime/libasprintf
    (cd gettext-runtime/libasprintf
     LC_ALL=C ./gendocs.sh --email bug-gnu-gettext autosprintf "GNU autosprintf")

    cp gnulib/build-aux/gendocs.sh libtextstyle/doc
    cp gnulib/doc/gendocs_template libtextstyle/doc
    cp build-aux/texinfo.tex libtextstyle/doc
    (cd libtextstyle/doc
     LC_ALL=C ./gendocs.sh --email bug-gnu-gettext libtextstyle "GNU libtextstyle")

  FIXME: Add a script to automate this process.

  Copy the resulting manual/ directories.  Commit the resulting
  manual/ directories in CVS, and for every removed HTML file (that
  corresponds to a deleted node) add a line to the .symlinks file in
  the same directory.

** Announce on info-gnu

  The announcement template can be generated with:

    gnulib/build-aux/announce-gen \
      --release-type stable \
      --package-name gettext \
      --previous-version $PREVIOUS_VERSION \
      --current-version $CURRENT_VERSION \
      --gpg-key-id $GPG_KEY_ID \
      --url-directory https://ftp.gnu.org/gnu/gettext \
      --bootstrap-tools=autoconf,automake,libtool,bison,gnulib \
      --gnulib-version=$(cd gnulib && git describe)

* Submit a News entry on https://savannah.gnu.org/projects/gettext/
