This is a summary of the steps required to make a new release.  Do not
attempt to run these manually - instead use the 'makerelease'
application and makerelease.xml file.  Get 'makerelease' from the
makerelease SVN repository:

  svn co https://makerelease.svn.sourceforge.net/svnroot/makerelease/trunk/makerelease
  cd makerelease
  perl Makefile.PL
  make
  sudo make install

Then to run it from a directory to release:

  makerelease -c NETSNMPTRUNK/dist/makerelease.xml

It will prompt you for all needed information and tasks to be done.

IMPORTANT NOTE:
    Don't *ever* release a second tar ball under the same name as the
    first.  It's much much much better to release another version
    instead, since you don't have to figure out from the bug reports
    that a user really grabbed the first snapshot instead of the
    second when they complain about version "XXX" not working.

====== makerelease -n output showing makerelease documented steps ======

STEP: 1: Setup Steps

  This set of steps will do some preliminary "safety" checks to ensure the
  local environment is ok and setup some important information.

  ===== Entering Step: 1 =====

STEP: 1.1: Setup Checck

  This should show the last version number published in this branch by
  looking at the time line in the README file:

  Commands to execute:

    head -1 README

STEP: 1.2: Pick a Version Number

  Please enter the version number to publish.  Net-SNMP convention dictates
  that this be a version number like 5.4 or 5.4.1.  Pre-releases that occur
  before a branch freezes should be appended with ".preN" like 5.4.1.pre2. 
  Release-candidates should be labeled ".rcN" like 5.4.1.rc1.

  Decide on a value for parameter 'VERSION'

    parameter: VERSION

    prompt:    Enter the new version number:

STEP: 1.3: Defining a second internal version string

  Internal perl code will be executed

STEP: 1.4: Release Parameter Information

  Here is the configured information we'll be using:

  VERSION:		   {VERSION}

  VERSION with dashes:	   {VERSIONDASHES}

  Floating point VERSION:  {VERSIONFLOAT}

  SVN Branch URL:	   {BRANCHPATH}

STEP: 1.5: update

  We need to make sure your code is up to date and matches the latest
  sources in this branch.

  Commands to execute:

    svn update

STEP: 1.6: Check for changes

  This steps looks for outstanding files that have been modified.  There
  should be no outstanding modifications!  If this step finds outstanding
  modified files you need to check them in or revert them before
  continuing!

  Commands to execute:

    svn -u status | egrep '^[^\?]'

  (Leaving Step: 1)

STEP: 2: Source Code Setup

  This set of steps will modify various places within the source code tree
  to bring it up to date with the new version number about to be published.

  ===== Entering Step: 2 =====

STEP: 2.1: Libtool / Library versioning setup

  These steps will modify the various files in the source tree that contain
  the version number, show you the changes that will be made and then check
  in the resulting changes if you approve of them.

  ===== Entering Step: 2.1 =====

STEP: 2.1.1: version:libtoolmanualedit

  You (may) need to edit Makefile.top to update the library version
  numbering (usually just for the first pre-release of a given version). 
  See the comments in RELEASE-INSTRUCTIONS about LIBCURRENT, LIBAGE and
  LIBREVISION.

  This script will commit the file for you after you're done.

STEP: 2.1.2: version:commit

  We'll now commit the Makefile.top file if you've modified it.

  Commands to execute:

    svn commit -m "version update" Makefile.top

  (Leaving Step: 2.1)

STEP: 2.2: Change The Version Number

  These steps will modify the various files in the source tree that contain
  the version number, show you the changes that will be made and then check
  in the resulting changes if you approve of them.

  ===== Entering Step: 2.2 =====

STEP: 2.2.1: Modify the source files

  We will now modify files through the code to replace the version number
  with the newer one.

  Modifying files:

    replacing: 'VERSION = '(.*)'' with: 'VERSION = \'{VERSIONFLOAT}\''


    files:  glob=ARRAY(0x8dc9064)

      perl/SNMP/SNMP.pm

      perl/agent/agent.pm

      perl/agent/Support/Support.pm

      perl/agent/default_store/default_store.pm

      perl/default_store/default_store.pm

      perl/OID/OID.pm

      perl/ASN/ASN.pm

      perl/AnyData_SNMP/Storage.pm

      perl/AnyData_SNMP/Format.pm

      perl/TrapReceiver/TrapReceiver.pm



  Modifying files:

    replacing: 'NetSnmpVersionInfo = "[\d\.]+"' with: 'NetSnmpVersionInfo =
  "{VERSION}"'


    files:  glob=ARRAY(0x8dc8fd4)

      snmplib/snmp_version.c



  Modifying files:

    replacing: 'Version: [\.0-9a-zA-Z]+' with: 'Version: {VERSION}'


    files:  glob=ARRAY(0x8dc8f44)

      README

      FAQ

      dist/net-snmp.spec



  Modifying files:

    replacing: 'VERSION = [\.0-9a-zA-Z]+' with: 'VERSION = {VERSION}'


    files:  glob=ARRAY(0x8dc8ed4)

      dist/Makefile



  Modifying files:

    replacing: 'AC_INIT\(\[Net-SNMP\], \[([^\]]+)\]' with:
  'AC_INIT([Net-SNMP], [{VERSION}]'


    files:  glob=ARRAY(0x8dc8e64)

      configure.in



  Modifying files:

    replacing: 'NetSnmpVersionInfo = "[^"]+"' with: 'NetSnmpVersionInfo =
  "{VERSION}"'


    files:  glob=ARRAY(0x8dc8df4)

      snmplib/snmp_version.c



STEP: 2.2.2: Running autoconf to rebuild configure

  We modified configure.in, so we now need to run autoconf to rebuild
  configure.

  XXX: in the future we should verify the correct autoconf version number

  Commands to execute:

    autoconf

STEP: 2.2.3: Running svn diff to check changes

  Check the following changes for proper version number differences before
  we commit the chances.

  Commands to execute:

    svn diff

STEP: 2.2.4: Running svn commit to commit the changes

  Check the changes in the above diff and then we'll commit the results
  here if they look ok.

  Commands to execute:

    svn commit -m "Version number update"

  (Leaving Step: 2.2)

STEP: 2.3: docs:make

  This step will create manual pages from doxygen instrumented code files.

  Commands to execute:

    make docs

    make mancp

STEP: 2.4: docs:update

  This will run svn status to figure out what files have changed since the
  previous man page generation steps were done.  After this step, we'll
  commit all the modified files.

  You may find additional files (marked with a ?) that should be added to
  the svn repository and you'll need to do this by hand before going on to
  the next step.

  Note: based on a recent net-snmp-admin discussion, we're no longer going
  to be adding the bazillions of man pages that doxygen generates by
  default.  Only important ones should be added.

  Commands to execute:

    svn -u status man

STEP: 2.5: docs:manualaddnewman

  Update man/Makefile.in with details of any new man pages, and run 'svn
  add' on them.

  I'll commit these changes for you after you're done.

STEP: 2.6: docs:commit

  Commands to execute:

    svn commit -m "documentation update" man

  (Leaving Step: 2)

STEP: 3: Testing Steps

  These steps will help you test the source code to ensure it passes some
  simple "it works" tests.

  ===== Entering Step: 3 =====

STEP: 3.1: build:distclean

  First we need to clean the existing build tree and start from scratch.

  Commands to execute:

    make distclean

STEP: 3.2: build:configure

  We need to run configure to set up the build tree.

  Commands to execute:

    ./configure --cache=config.cache --with-defaults
  --with-mib-modules='host examples examples/example testhandler smux Rmon
  disman/event-mib' --with-transports=IPX --enable-ipv6
  --enable-embedded-perl --enable-shared

STEP: 3.3: build:make

  Then we need to build the code

  Commands to execute:

    make

STEP: 3.4: build:test

  Now we run "make test" which should produce a perfect set up test
  results.  If not, this needs to be fixed or at least understood and
  accepted as is for some other reason.

  Commands to execute:

    make test TESTOPTS=-n

STEP: 3.5: code:checkcomments

  This command looks for source code oddities and policy violations.

  Commands to execute:

    make checks

  (Leaving Step: 3)

STEP: 4: Release File Steps

  Certain files in the distribution and built on a per-release basis. 
  These steps will help set up these files.

  ===== Entering Step: 4 =====

STEP: 4.1: code:makedepend

  This step creates Makefile dependencies using the "distdepend" rule in
  the top level Makefile.

  Commands to execute:

    make distdepend

STEP: 4.2: code:commitdepend

  This step commits the dependency changes done in the previous step.

  Commands to execute:

    svn commit -m "make depend" `find . -name Makefile.depend`

STEP: 4.3: changelog:svn2cl

  We need to extract the portions of the change logs committed to the
  repository.

  Commands to execute:

    svn2cl -f ChangeLog.add --break-before-msg --stop-on-copy

    perl dist/changelogfix  < ChangeLog.add > ChangeLog.reallyadd

STEP: 4.4: changelog:manualedit

  You need to manually insert the *relevent* portions of
  'ChangeLog.reallyadd' into the ChangeLog file. I'll commit these changes
  for you after you finish cutting out the proper changes.

STEP: 4.5: changelog:commit

  Commands to execute:

    svn commit -m "version update" ChangeLog

STEP: 4.6: docs:newnews

  Commands to execute:

    perl dist/extractnews -s ----- -e ----- ChangeLog

STEP: 4.7: docs:newnews

  Commands to execute:

    perl dist/extractnews -c CHANGES.new2 -n NEWS.new2 ChangeLog.reallyadd

STEP: 4.8: docs:README

  You need to manually insert the relevent portions of 'CHANGES.new' and
  'NEWS.new' into the CHANGES and NEWS file. (There are alternative
  versions in 'CHANGES.new2' and 'NEWS.new2') You may wish to update the
  README file as well. I'll commit these changes for you afterwards

STEP: 4.9: docs:commit

  Commands to execute:

    svn commit -m "version update" README NEWS CHANGES

STEP: 4.10: release:update

  One more svn update and status to make sure nothing odd exists in your
  source tree.	Please check the results!

  Commands to execute:

    svn -u status

  (Leaving Step: 4)

STEP: 5: Make the Release

  This is it!  After this point it's much harder to turn back.	If
  everything is ok until this point and you're ready to actually stamp the
  release in SVN and make release files, these steps will do that for you.

  ===== Entering Step: 5 =====

STEP: 5.1: release:tag

  This will actually svn copy the current checked out branch to the new tag
  name.  Specifically:

  svn copy {BRANCHPATH} .../tags/Ext-{VERSIONDASHES}

  Commands to execute:

    svn copy -m "{VERSION} release" {BRANCHPATH}
  https://net-snmp.svn.sourceforge.net/svnroot/net-snmp/tags/Ext-{VERSIONDA
  SHES}

STEP: 5.2: release:makedist

  Commands to execute:

    svn export
  https://net-snmp.svn.sourceforge.net/svnroot/net-snmp/tags/Ext-{VERSIONDA
  SHES}/net-snmp net-snmp-{VERSION}

STEP: 5.3: release:removefiles

  Commands to execute:

    net-snmp-{VERSION}/remove-files net-snmp-{VERSION}

STEP: 5.4: release:makedist

  Commands to execute:

    star artype=ustar -c -z -f net-snmp-{VERSION}.tar.gz 
  net-snmp-{VERSION}

STEP: 5.5: release:makezipclean

  Commands to execute:

    rm -f net-snmp-{VERSION}.zip

STEP: 5.6: release:makezip

  Commands to execute:

    zip -r net-snmp-{VERSION}.zip  net-snmp-{VERSION}

STEP: 5.7: release:searching-gpg-keys

  Commands to execute:

    gpg --list-secret-keys net-snmp-admin

STEP: 5.8: release:gpg

  Commands to execute:

    gpg -u 317F8F64 -a --detach-sign net-snmp-{VERSION}.tar.gz

STEP: 5.9: release:gpg

  Commands to execute:

    gpg -u 317F8F64 -a --detach-sign net-snmp-{VERSION}.zip

STEP: 5.10: Release File Test

  We'll also re-build the source and retest a few things to ensure the
  packaged file can actually be built.

  ===== Entering Step: 5.10 =====

STEP: 5.10.1: posttest:untar

  Commands to execute:

    rm -rf net-snmp-{VERSION}

STEP: 5.10.2: posttest:untar

  Commands to execute:

    tar xzf net-snmp-{VERSION}.tar.gz

STEP: 5.10.3: posttest:configure

  Commands to execute:

    cd net-snmp-{VERSION} && ./configure --cache=config.cache
  --with-defaults --with-mib-modules='host examples examples/example	
  testhandler smux Rmon disman/event-mib' --with-transports=IPX
  --enable-ipv6 --enable-embedded-perl --enable-shared

STEP: 5.10.4: posttest:make

  Commands to execute:

    cd net-snmp-{VERSION} && make

STEP: 5.10.5: posttest:test

  Commands to execute:

    cd net-snmp-{VERSION} && make test

  (Leaving Step: 5.10)

  (Leaving Step: 5)

STEP: 6: Release the results

  Now we'll publish the results to the SF server

  ===== Entering Step: 6 =====

STEP: 6.1: rsync the new files

  This will copy the results to the SF uploads directory in your account on
  frs.sourceforge.net

  Commands to execute:

    rsync -v net-snmp-{VERSION}.tar.gz net-snmp-{VERSION}.tar.gz.asc
  net-snmp-{VERSION}.zip net-snmp-{VERSION}.zip.asc
  frs.sourceforge.net:uploads/

STEP: 6.2: Update the SF release web page

  Commands to execute:

    firefox
  'http://sourceforge.net/project/admin/editpackages.php?group_id=12694'

  (Leaving Step: 6)

STEP: 7: 

  Binaries: build rpms, .tar.gzs, etc.

STEP: 8: Advertise it!

  ===== Entering Step: 8 =====

STEP: 8.1: 

  Add a note to the source forge news system:

  http://sourceforge.net/news/submit.php?group_id=12694

  Commands to execute:

    firefox 'http://sourceforge.net/news/submit.php?group_id=12694'

STEP: 8.2: 

  Send an announcement message to one of the following mailing lists based
  on it's type:

  pre:	  net-snmp-coders@lists.sourceforge.net

  rc:	  net-snmp-users@lists.sourceforge.net

  final:  net-snmp-announce@lists.sourceforge.net

STEP: 8.3: 

  Update the topic on the #Net-SNMP channel if this is a trunk based
  release.

STEP: 8.4: 

  Update the freshmeat listing (Wes needs to do this):

  http://freshmeat.net/projects/net-snmp/

  Commands to execute:

    firefox http://freshmeat.net/projects/net-snmp/

  (Leaving Step: 8)

STEP: 9: 

  Advertise: NEWS upload to sf, publish on -announce, freshmeat, and the
  GNU FSF directory (http://directory.fsf.org/project/net-snmp/)... (send
  mail to bug-directory@gnu.org)





====== BEGIN OBSOLETE (pre-makerelease) DOCUMENTATION ======

***************************************************************************
TESTING:

  1) Update the source tree to catch all recent commits,
     and check that all local changes have been committed.

     $ svn -u status
     $ svn    update

  2) Change the libtool version information in Makefile.top.
     See MANUAL - STEP 1 later in these instructions.
     'makerelease' will commit this file automatically.

  3) Configure the suite with as many modules as possible,
     build and test it.  The makerelease script will use
     the options:

      $ ./configure  '--with-mib-modules=host examples examples/example  \
                              testhandler smux Rmon disman/event-mib'    \
                      --with-transports=IPX  --enable-ipv6               \
                      --enable-embedded-perl --enable-shared

     Ideally this should be repeated on as many systems as possible
     (including running "make install").  However the makerelease
     script will only test things on the current box, and will not
     try to install the software.


***************************************************************************
DOCUMENTATION:

  4)  Update the version number in the doxygen.conf file
      (handled automatically by 'makerelease') and generate
      the doxygen extracted manual pages.

        $ make docs
        $ make mancp

     'makerelease' will commit this file automatically.
     Note that any new man pages should be added to Makefile.in.
     This is *NOT* currently handled by the makerelease script.

  5) Check the code for illegal constructs (e.g. C++ style comments
     or GNU make specific constructs in Makefiles):

        $ make checks

  6) Update Makefile dependencies:

        $ make distdepend

     'makerelease' will commit these dependencies automatically.

  7) Update the ChangeLog file with details of all (recent) changes
     to the suite.  See MANUAL - STEP 2 later in these instructions.
     'makerelease' will commit this file automatically.

  8) Update the README, NEWS, and CHANGES files with details of
     significant changes to the suite.  See MANUAL - STEP 3 later
     in these instructions.
     'makerelease' will commit these files automatically.


***************************************************************************
RELEASE:

  9) Make sure all changes are checked in:

       $ svn -u status
       $ svn    update

     [Note that this step is omitted when running "makerelease"]

 10) Change the version number in various files
       (README, FAQ, configure.in, net-snmp.spec and assorted Perl modules).
     'makerelease' will update and commit these files automatically.

 11) Create a tag checkpoint for this release:

       $ svn copy  /trunk                 /tags/Ext-5-x
     or
       $ svn copy  /branches/V5-x-patches /tags/Ext-5-x-y

 12) Construct the source packages:

        $ svn export /tags/Ext-5-x-y/net-snmp net-snmp-5.x.y
        $ net-snmp-5.x.y/remove-files         net-snmp-5.x.y
        $ star artype=ustar -c -z -f net-snmp-5.x.y.tar.gz    net-snmp-5.x.y
        $ rm -f net-snmp-5.x.y.zip"
        $ zip -r net-snmp-5.x.y.zip net-snmp-5.x.y"


 13) Sign (or checksum) the packages:

     Wes/Robert:
        $ gpg -u net-snmp-admin -a --detach-sign net-snmp-5.x.y.tar.gz
        $ gpg -u net-snmp-admin -a --detach-sign net-snmp-5.x.y.zip
     Others:
        $ md5sum net-snmp-5.x.y.tar.gz > net-snmp-5.x.y.tar.gz.md5
        $ md5sum net-snmp-5.x.y.zip    > net-snmp-5.x.y.zip.md5


***************************************************************************
RELEASE TESTING:

 14) Unpack a clean copy of the tarball, configure, build and
     test the release tarball.

 15) Double-check that there are no outstanding changes that have
     been missed from the CVS checkin:

        $ svn status

Note:  This is the last stage that is handled by the "makerelease" script
       Everything following will need to be done manually.

 15) Upload the packages (and signature files) to the SourceForge server:
 
        $ ncftpput upload.sf.net incoming net-snmp-5.x.y.tar.gz
        $ ncftpput upload.sf.net incoming net-snmp-5.x.y.zip
        * SF pages:  "Admin" -> "File Releases"
        * net-snmp:  "Add Release" (or "Edit Release")
        * Create (or choose) an appropriate release name
             e.g.  "5.x.y source code"  (or "5.x.y pre-releases")
        * "Edit This Release"
        * Select the tarball and/or other relevant files

 16) Announce the release on the appropriate list.
     Pre-release announcements (and a call for testing) should be
     sent to net-snmp-coders, release-candidates to net-snmp-users.

     Full releases should be announced on net-snmp-users, and as a
     news item on the project home page - including the NEWS snippet
     of significant changes since the last release.

 17) Update the following htdocs files (in the main SVN trunk):
         htdocs/download.html
         htdocs/dev/schedule.html

     [Make sure you have permissions set up properly on the web
      server so that files created become group-writable!!!]

     That concludes the process for pre-releases and release-candidates.
     For full releases, wait a week to ensure that there are no major
     problems, before continuing with the remaining steps.

        If there are known problems and another release is planned to
     fix them, don't announce the broken version - wait for the updated
     one instead.

 18) Once this week has elapsed, submit an announement of the new
     release to net-snmp-announce.  This message will need to be
     explicitly authorized via MailMan.

     Also update the IRC topic to include mention of this release.

 19) For a release on the most recent development line, start bugging
     Wes to update the freshmeat, Free Software Directory and
     Wikipedia entries.

 20) For a release on the most recent development line, update the
     'htdocs/page-top.html' file (in the main SVN trunk) to reference
     the latest version.

     Update the following files with any changes:

         htdocs/docs/readmefiles/NEWS
         htdocs/docs/readmefiles/CHANGES
         htdocs/docs/readmefiles/README*
         htdocs/COPYING

     [Make sure you have permissions set up properly on the web
      server so that files created become group-writable!!!]
         

 21) For a major new-feature release (i.e. 5.x), create the patches
     branch:

        $ svn copy  /tags/Ext-5-x   /branches/V5-x-patches

     and update the SVN main trunk with a new version number:

        $ local/Version-Munge.pl -v 5.(x+1).dev -M -P -C

     The 1 week delay (and continued code freeze) is to to ensure that
     developer effort is concentrated on immediate problems following
     the release.  Any major problems should hopefully come to light
     during this period, so after a week it should be safe to create
     the patches branch and officially end the code freeze on MAIN.

 22) Update the official patches tracker set:

     - any patches for this new release tarball should be given
       priority 9
     - all patches for the previous release on this line should
       be marked at priority 5
     - all patches for earlier releases on this line should
       be marked at priority 1, and closed

     If a line has been designated closed, then all official
     patches for that line should be marked as closed as well.

 23) Hide the pre-release repository from the File Releases
     admin pages.

 24) Clean up the 'dist' dir of the relevant V5-x-patches branch.
     Only leave the following files:

     changelogfix  cvsshow  cvsup  extractnews  makerelease
     net-snmp.spec  snmpd-init.d  snmptrapd-init.d

     Note that any files removed should also be deleted from
     SVN repository.


***************************************************************************
CREATING BINARY DISTRIBUTIONS

  0) Always REMOVE ALL PREVIOUS INSTALLS FIRST, then do a make install
     from the tar-ball extracted sources and *THEN* rebuild all
     binaries again.  This ensures that everything (especially perl
     modules) are properly linked against the right libraries.

  1) always build releases from a tarball, not from SVN.

  2) Add mib modules that are common.  Basically, add:

       host                      -- where supported.
       disman/event-mib
       smux

  3) use --with-defaults --with-syscontact="Unknown" 
                         --with-syslocation="Unknown"

  4) when running make install, do it like:

     $ make install prefix=/some/path/to/home/ARCH/usr/local \
            exec_prefix=/some/path/to/home/ARCH/usr/local
    
  5) Tar it up:

     $ cd /some/path/to/home/ARCH
     $ tar czf net-snmp-5.0.3-ARCH.tar.gz usr/local

  6) upload and release, like you did for the source code but with a
     different package name for binaries (5.0.3 binaries).

  7) RPMs [do this in main line even if its for a patch branch]:
     $ cd dist
     $ cp ../net-snmp-5.0.8.tar.gz rpm/SOURCES
     $ make RELEASE=1
     
     This should put multiple binary rpm files in:
       dist/rpm/RPMS/i386/
     And one source RPM in:
       dist/rpm/SRPMS/

     *** These files need to be renamed to include the OS version.

         EG: ...i386.rpm needs to become ...fc5.i386.rpm

  8) Remove (or hide) binaries from older releases of the same line,
     where you have submitted a newer binary for the same architecture.
     Once the last binary for a particular release version has been
     removed, hide that repository.
     

***************************************************************************
***************************************************************************
MANUAL - STEP 1

  Changing the libtool version information in Makefile.top.

      - If any interfaces/structures have been removed or changed since the
        last update, increment current (+5), and set age and revision to 0.
        Stop!

      - If any interfaces have been added since the last public release,
        then increment current and age, and set revision to 0.
        Stop!

      - If the source code has changed at all since the last update,
        then increment revision (c:r:a becomes c:r+1:a).

      Note: maintenance releases (eg 5.2.x) should never have changes
            that would require current to be incremented.

  The check-api-changes script in the dist directory will construct a
  diff of all headers, which can be useful for determining if anything
  needs bumping.

     Update these variables now, so that when you run
     make in a second to test things you can spot libtool yelling
     about improper numbering before you make the release and not
     after you've uploaded the tar ball :-/


***************************************************************************
MANUAL - STEP 2

  Changing the libtool version information in Makefile.top.
  Updating the ChangeLog file

      - The ChangeLog entries are extracted (normally automatically)
        using the command:

          $ svn2cl -f ChangeLog.add --break-before-msg --stop-on-copy

        If you don't have svn2cl installed, you can try and find a
        suitable binary package for your architecture, or you can
        get it directly from
              http://ch.tudelft.nl/~arthur/svn2cl
        You may need to rename the script from 'svn2cl.sh' to 'svn2cl'

      - In either case, they are fixed up (automatically) using:

          $ perl dist/changelogfix < ChangeLog.add > ChangeLog.reallyadd
        or
          $ perl dist/changelogfix V5-{N}-patches < ChangeLog.add > ChangeLog.reallyadd

      - The manual processing step is to insert the appropriate portion
        of the file 'ChangeLog.reallyadd' into 'ChangeLog'.  You can
        usually find the point where the previous release started in
        the file by searching for "version tag".

      - Please keep the line of dashes at the top of the file, as this
        makes it easier to copy during the next release.

      - If using emacs, switch from changelog-mode to text-mode.

      - Check in the new ChangeLog:

          $ svn commit -m "update for release X" ChangeLog

        This is done automatically by "makerelease"


***************************************************************************
MANUAL - STEP 3

Updating README, NEWS, and CHANGES files

  [ This information has been moved to:

  http://www.net-snmp.org/wiki/index.php/Commit_message_auto-extraction_formats

  ]

However, leaving some examples here for quick referral:

  SVN commit messages that generate auto-NEWS and auto-CHANGES
  extractions should be formatted like the following examples:

    NEWS: snmpd: I did something really cool to the agent
    CHANGES: snmptrapd: fixed something minor in snmptrapd
    NEWS: perl: PATCH: 123,456: Applied patches 123 and 456 to support perl6
    CHANGES: BUG: 13: Fixed bug 13 & secured the world at large against hackers
    NEWS: perl: PATCH: 123: from Robert: did something
    NEWS: perl: PATCH: 123: from "Robert Story": did something else
