How to release GRASS GIS binaries and source code

$Date: 2017-11-12 20:51:43 +0100 (Sun, 12 Nov 2017) $

Note: This text contains *some* rules only applicable to the
      development coordinator (currently Markus Neteler, PSC Chair).


###########################################
Contents
  (A) HOWTO create a release
  (B) HOWTO create a branch

###########################################
(A) HOWTO create a release

1. Local work (done by release coordinator)

   - svn up
   - svn status --no-ignore
   - check if
        ( cd doc/raster/r.example/ ; make clean ; make )
        ( cd doc/vector/v.example/ ; make clean ; make )
      still compile; fix otherwise

   - fix typos with tools/fix_typos.sh
 
   - Check that autoconf scripts are up-to-date (to do only in RC cycle!):

      rm -f config.guess config.sub
      wget http://git.savannah.gnu.org/cgit/config.git/plain/config.guess
      wget http://git.savannah.gnu.org/cgit/config.git/plain/config.sub
      svn diff config.guess config.sub
      autoconf-2.13
      # check and submit to SVN:
      svn ci -m"config.guess + config.sub: updated from http://git.savannah.gnu.org/cgit/config.git/plain/" config.guess config.sub configure
      # test by running ./configure 

   - make distclean

   - cleanup rubbish:
       rm -f locale/templates/*.pot
       rm -f locale/po/messages.mo
       rm -f demolocation/PERMANENT/.bash*
       find . -name '*~'     | xargs rm
       find . -name '*.bak'  | xargs rm
       find . -name '.#*'    | xargs rm
       find . -name '*.orig' | xargs rm
       find . -name '*.rej'  | xargs rm
       find . -name '*.o'    | xargs rm
       find . -name '*.pyc'  | xargs rm
       find . -name 'OBJ.*'  | xargs rm -r
       rm -f gui/wxpython/menustrings.py gui/wxpython/build_ext.pyc gui/wxpython/xml/menudata.xml gui/wxpython/xml/module_tree_menudata.xml
       chmod -R a+r *

       svn status

   - Create release branch (only if not yet existing)

   - Update VERSION file to release version:
      vim include/VERSION

#example:
7
4
0RC1
2017
      rm -f include/VERSION~

    - Update OSGeo4W setup.hint file
       - for RC candidates use 'test' keyword
       - for final version use 'curr' keyword

      vim mswindows/osgeo4w/setup.hint.tmpl

     #version:
     MAJOR=`cat include/VERSION | head -1 | tail -1`
     MINOR=`cat include/VERSION | head -2 | tail -1`
     RELEASE=`cat include/VERSION | head -3 | tail -1`
     VERSION=${MAJOR}.${MINOR}.${RELEASE}
     echo $VERSION

     svn ci -m"GRASS GIS $VERSION" include/VERSION mswindows/osgeo4w/setup.hint.tmpl
     svn up

 o Create Changelog file on release branch:
     # http://ch.tudelft.nl/~arthur/svn2cl/
     svn2cl
     mv ChangeLog ChangeLog_$VERSION
     head ChangeLog_$VERSION
     gzip ChangeLog_$VERSION

 o   Tag release (http://trac.osgeo.org/grass/browser/grass/tags):
     http://svnbook.red-bean.com/en/1.4/svn.branchmerge.tags.html

          TODAY=`date +"%Y%m%d"`
          RELEASETAG=release_${TODAY}_grass_${MAJOR}_${MINOR}_${RELEASE}
          echo $RELEASETAG

          URL=https://svn.osgeo.org/grass
          svn copy $URL/grass/branches/releasebranch_7_4 \
	       $URL/grass/tags/$RELEASETAG \
	       -m "Tagging release grass_${MAJOR}_${MINOR}_${RELEASE}"
      
      
 o create source package (in the source directory):
     echo grass-${VERSION}

     mkdir grass-${VERSION}
     mv * grass-${VERSION}/
     # do not include the debian control files:
     mv grass-${VERSION}/debian .
     # create the package:
     tar cvfzh grass-${VERSION}.tar.gz grass-${VERSION}/* --exclude=.svn
     # restore src code location:
     mv ./grass-${VERSION}/* .
     rmdir ./grass-${VERSION}
     # Calculating MD5 sum:
     md5sum grass-${VERSION}.tar.gz > grass-${VERSION}.md5sum

 o reset include/VERSION file to SVN version:
    vim include/VERSION

#example
7
4
0svn
2017

    rm -f include/VERSION~
    svn ci -m"back to SVN" include/VERSION


 o Store the source tarball (twice) in (use scp -p FILES grass:):
    SERVER1=grass.osgeo.org
    SERVER1DIR=/var/www/grass/grass-cms/grass$MAJOR$MINOR/source/
    SERVER2=upload.osgeo.org
    SERVER2DIR=/osgeo/download/grass/grass$MAJOR$MINOR/source/
    echo $SERVER1:$SERVER1DIR
    echo $SERVER2:$SERVER2DIR

   # copy along with associated files:
     scp -p grass-$VERSION.* AUTHORS COPYING ChangeLog_$VERSION.gz \
         INSTALL REQUIREMENTS.html SUBMITTING neteler@$SERVER1:$SERVER1DIR
     scp -p grass-$VERSION.* AUTHORS COPYING ChangeLog_$VERSION.gz \
         INSTALL REQUIREMENTS.html SUBMITTING neteler@$SERVER2:$SERVER2DIR

   # Only full release: generate link to "latest" source code
     ssh neteler@$SERVER1 rm -f $SERVER1DIR/grass-$MAJOR.$MINOR-latest.tar.gz
     ssh neteler@$SERVER1 "cd $SERVER1DIR ; ln -s grass-$VERSION.tar.gz $SERVER1DIR/grass-$MAJOR.$MINOR-latest.tar.gz"

 o update winGRASS related files
    - Update the winGRASS version
      grass-addons/tools/wingrass-packager/grass_packager_release.bat
      grass-addons/tools/wingrass-packager/grass_addons.sh
      grass-addons/tools/wingrass-packager/grass_copy_wwwroot.sh

 o update web site to new version: CMS
    - News section
    - https://grass.osgeo.org/download/software/
    - https://grass.osgeo.org/download/software/sources/
    - https://grass.osgeo.org/download/software/linux/
    - https://grass.osgeo.org/home/history/releases/
    - https://grass.osgeo.org/development/svn/svn-tags/ (add tag): echo $RELEASETAG

     write announcement
      - store in trac:
           http://trac.osgeo.org/grass/wiki/Release/7.XX.YY-News
           https://trac.osgeo.org/grass/wiki/Grass7/NewFeatures74  <- major changes only
      - update version in https://grasswiki.osgeo.org/wiki/GRASS-Wiki
      - store in Web as announces/announce_grass$MAJOR$MINOR$RELEASE.html <- how? with protected PHP upload page?

     full release:
      - update trac 
         - milesstone/add next: https://trac.osgeo.org/grass/admin/ticket/milestones
         - add released version: https://trac.osgeo.org/grass/admin/ticket/versions
      

 o upload user HTML manual in case of *final release* from compiled English
   version at (warning: needs stuff to be compiled).
      - download new source code package, compile with most settings
      -  cd dist.$ARCH/docs/html
         echo www/grass$MAJOR$MINOR/manuals/
         scp -r * neteler@grass.osgeo.org:/osgeo/grass/grass-cms/grass$MAJOR$MINOR/manuals/
         scp -r * neteler@upload.osgeo.org:/osgeo/download/grass/grass$MAJOR$MINOR/manuals/

 o stable release: update cronjob 'cron_grass_HEAD_src_snapshot.sh' on grass.osgeo.org to next but one
                   release tag for the differences

 o Trac updates:
      - Add new release to https://trac.osgeo.org/grass/admin/ticket/versions
      - Set "complete" flag in https://trac.osgeo.org/grass/milestone/7.4.x --> Edit Milestone
      - Batch modify tickets, set to next milestone (update this query accordingly: two entries to change)
        https://trac.osgeo.org/grass/query?status=assigned&status=new&status=reopened&milestone=7.4.0&milestone=7.4.1&group=status&col=id&col=summary&col=owner&col=type&col=priority&col=component&col=version&order=priority
        - Set max items to 1000, then select all shown tickets via Status: assigned/new/reopened sections
        - Scroll down to "Batch modify": under the "Comment" section, add Field "Milestone" and set to next version
        - then use "Change ticket" button, done.
      - Only in case of new release branch being created:
         Add Wiki Macro definitions for manual pages G7X:modulename
         - Edit: https://trac.osgeo.org/grass/wiki/InterMapTxt


 o WinGRASS notes:

   Update grass_packager_release.bat, eg.

     set MAJOR=7
     set MINOR=4
     set PATCH=0RC1

   Update addons (grass_addons.sh) rules, eg.

     compile $SVN_PATH/grass7 $GISBASE_PATH/grass740RC1   $ADDON_PATH/grass740RC1/addons

   Modify grass_copy_wwwroot.sh accordingly, eg.

     copy_addon 740RC1 7.4.0RC1

 o Launchpad notes:

   Create milestone and release: https://launchpad.net/grass/+series

   Upload tarball for created release

   Update daily recipe contents: https://code.launchpad.net/~grass/+recipe/grass-trunk

 o Packaging notes:
   https://trac.osgeo.org/grass/wiki/BuildHints
   - https://trac.osgeo.org/grass/wiki/DebianUbuntuPackaging
   - https://trac.osgeo.org/grass/wiki/CompileOnWindows


2. Tell others about it:

 * Notify all packagers (MN has email list)

 * If release candidate:
    - <grass-announce@lists.osgeo.org>
    - <grass-dev@lists.osgeo.org>

 * If official release:
   - publish related announcement press release at:
   
   Our GRASS web site: /announces/
                       Note: DON'T use relative links there

   Our main mailing lists:
                       http://lists.osgeo.org/mailman/listinfo/grass-announce
                         <grass-announce@lists.osgeo.org>
                       http://lists.osgeo.org/mailman/listinfo/grass-dev
                         <grass-dev@lists.osgeo.org>
                       http://lists.osgeo.org/mailman/listinfo/grassuser
                         <grass-user@lists.osgeo.org>

   DebianGIS:          <debian-gis@lists.debian.org>
   FreeGIS:            <freegis-list@intevation.de>
   Geowanking:         <geowanking@geowanking.org>
   OSGeo.org:          <news_item@osgeo.org>

 Email:
   info@osgeo.org
   http://www.gis-news.de/  (franz-josef.behr@gismngt.de)
   http://spatialnews.geocomm.com/submitnews.html (not free any more, convince editor@geocomm.com)
   redazione@geoforus.it
   mfeilner@linuxnewmedia.de
   info@harzer.de
   pr@geocomm.com
   editor-geo@geoconnexion.com

 Web:
   https://plus.google.com/u/0/communities/111147786674687562495 (G+ GRASS GIS community)
   http://linuxtoday.com/contribute.php3
   https://joinup.ec.europa.eu/software/grassgis/home (submit news, MN)
   http://www.macnn.com/contact/newstips/1
   http://www10.giscafe.com/submit_material/submit_options.php#Press (MN)   --> Press releases
   http://www.directionsmag.com/pressreleases/ (News -> Submit Press Release)
   http://directory.fsf.org/wiki/GRASS_%28Geographic_Resources_Analysis_Support_System%29
   https://www.linux-apps.com/p/1128004/edit/ (MN)
   https://news.eoportal.org/web/eoportal/share-your-news (MN)
            -> Share your news with the EO community
   https://www.heise.de/download/product/grass-gis-7105 (update, MN)

   See also: https://grass.osgeo.org/wiki/Contact_Databases
   ... anywhere else? Please add here.

###########################################
(B) HOWTO create a branch

1. see SVN book:
   http://svnbook.red-bean.com/en/1.1/ch04s07.html

   GRASS 7.4 release branch:
          BRANCH=releasebranch_7_4
          URL=https://svn.osgeo.org/grass
          svn copy $URL/grass/trunk \
                   $URL/grass/branches/$BRANCH \
                   -m "Release branch for GRASS 7.4.x"


   Switching current local copy to above development branch:
   (http://svnbook.red-bean.com/en/1.1/ch04s05.html)
           cd /path/to/your/local/copy/trunk
           svn switch https://svn.osgeo.org/grass/grass/branches/releasebranch_7_4 .

----------
Example: GRASS GIS 7.4 release branch creation

svn copy https://svn.osgeo.org/grass/grass/trunk/ \
    https://svn.osgeo.org/grass/grass/branches/releasebranch_7_4 \
    -m "Release branch for GRASS GIS 7.4.x"

