# How to release GRASS GIS binaries and source code
*Note: Some steps in this text are to be done by the development coordinator
(currently Markus Neteler, PSC Chair) due to needed logins.*
## HOWTO create a release
### Preparations
Check examples if still compiling
```bash
( cd doc/raster/r.example/ ; make clean ; make )
( cd doc/vector/v.example/ ; make clean ; make )
```
### Fix typos in source code with
```bash
tools/fix_typos.sh
```
### i18N: sync from Transifex
See
Exception Latvian as Latvian is directly edited in git and then sync'ed from
master .po files
```bash
cd locale
sh ~/software/grass_addons_git/tools/transifex_merge.sh
make
make verify
# ... then fix .po files as needed.
#
# requires https://trac.osgeo.org/grass/ticket/3539
## after that push fixes to transifex:
#cd locale/transifex/
#tx --debug push -t
```
### Update of configure base files
*Only allowed in RC cycle, not for final release!*
Check that autoconf scripts are up-to-date:
```bash
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
git diff config.guess config.sub
autoconf-2.13
```
Now check if configure still works.
If yes, submit to git:
```bash
git add config.guess config.sub configure
git checkout -b config_sub_update_r78
git commit -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
git push origin config_sub_update_r78
# open PR and merge
```
### Cleanup leftover rubbish files
```bash
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 '*.swp' | 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
find . -name '__pycache__' | xargs rm -r
rm -f lib/python/ctypes/ctypesgencore/parser/lextab.py
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 *
```
Double check:
```bash
git status
```
### Create release branch (only if not yet existing)
.. see section below at end of file.
### Update VERSION file to release version number
Directly edit VERSION file in GH interface:
Example:
```bash
7
8
1RC1
2019
```
~~Update OSGeo4W setup.hint file~~
~~no longer needed~~
~~vim mswindows/osgeo4w/setup_x86.hint.tmpl~~
~~vim mswindows/osgeo4w/setup_x86_64.hint.tmpl~~
### Create release tag
(see )
Preparation:
### Changelog and tagging etc
```bash
# update from GH
# assumptions:
# - own fork as "origin"
# - remote repo as "upstream"
git fetch --all --prune && git checkout releasebranch_7_8 && \
git merge upstream/releasebranch_7_8 && git push origin releasebranch_7_8
# create version env var for convenience:
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
# RELEASETAG variable not really needed any more:
TODAY=`date +"%Y%m%d"`
RELEASETAG=release_${TODAY}_grass_${MAJOR}_${MINOR}_${RELEASE}
echo $RELEASETAG
```
### Tag release (on GitHub)
```bash
echo "$VERSION"
```
To be done in GH interface:
Tag version | target (examples):
7.8.1RC1 | releasebranch_7_8
Add release desciption (re-use existing texts as possible, from
)
If RC, then check
[x] This is a pre-release
### Packaging of source code tarball
```bash
# fetch tarball from GitHub
wget https://github.com/OSGeo/grass/archive/${VERSION}.tar.gz -O grass-${VERSION}.tar.gz
md5sum grass-${VERSION}.tar.gz > grass-${VERSION}.md5sum
```
Create Changelog file on release branch:
```bash
python tools/gitlog2changelog.py
mv ChangeLog ChangeLog_$VERSION
head ChangeLog_$VERSION
gzip ChangeLog_$VERSION
```
### Reset include/VERSION file to git version
Directly edit VERSION file in GH interface:
Example:
```bash
7
8
1dev
2019
```
Commit as "back to dev"
Reset local copy to GH:
```bash
# update from GH
# assumptions:
# - own fork as "origin"
# - remote repo as "upstream"
git fetch --all --prune && git checkout releasebranch_7_8 && \
git merge upstream/releasebranch_7_8 && git push origin releasebranch_7_8
```
### Upload source code tarball to OSGeo servers
Note: grasslxd only reachable via jumphost - https://wiki.osgeo.org/wiki/SAC_Service_Status#GRASS_GIS_server
```bash
# Store the source tarball (twice) in (use scp -p FILES grass:):
SERVER1=grasslxd
SERVER1DIR=/var/www/code_and_data/grass$MAJOR$MINOR/source/
SERVER2=upload.osgeo.org
SERVER2DIR=/osgeo/download/grass/grass$MAJOR$MINOR/source/
echo $SERVER1:$SERVER1DIR
echo $SERVER2:$SERVER2DIR
# upload 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 at full release!
# generate link to "latest" source code
ssh neteler@$SERVER1 "cd $SERVER1DIR ; rm -f grass-$MAJOR.$MINOR-latest.tar.gz"
ssh neteler@$SERVER1 "cd $SERVER1DIR ; ln -s grass-$VERSION.tar.gz grass-$MAJOR.$MINOR-latest.tar.gz"
ssh neteler@$SERVER1 "cd $SERVER1DIR ; rm -f grass-$MAJOR.$MINOR-latest.md5sum"
ssh neteler@$SERVER1 "cd $SERVER1DIR ; ln -s grass-$VERSION.tar.gz grass-$MAJOR.$MINOR-latest.md5sum"
# verify
echo "https://$SERVER1/grass$MAJOR$MINOR/source/"
# update winGRASS related files: Update the winGRASS version
vim grass-addons/tools/wingrass-packager/grass_packager_release.bat
vim grass-addons/tools/wingrass-packager/grass_addons.sh
vim grass-addons/tools/wingrass-packager/grass_copy_wwwroot.sh
vim grass-addons/tools/wingrass-packager/cronjob.sh # major/minor release only
# update addons - major/minor release only
vim grass-addons/tools/addons/grass-addons-publish.sh
vim grass-addons/tools/addons/grass-addons-build.sh
vim grass-addons/tools/addons/grass-addons.sh
```
Release is done.
### Advertise new release
#### Update CMS web site to show new version
- News section
-
-
-
-
TODO: git tags
- (add tag): echo $RELEASETAG
#### Write announcement and publish it
To easily generate the entries for the trac Wiki release pages, use a `git log` approach:
- List of latest changes (example, get from GitHub release page)
- https://github.com/OSGeo/grass/compare/releasebranch_7_8@%7B05-05-20%7D...releasebranch_7_8@%7B09-26-20%7D
- identify start and end commit hash
- extract entries from oneline git log and prepare for trac Wiki copy-paste:
```
#START=76d5988
#END=8a81328
##git log --oneline | sed -n "+^$START+,+^$END+p;+^$END+q"
# verify
git log --oneline | sed -n '/^76d5988/,/^8a81328/p;/^8a81328/q' | tac
# prepare for trac Wiki release page
git log --oneline | sed -n '/^76d5988/,/^8a81328/p;/^8a81328/q' | cut -d' ' -f2- | sed 's+^+ * G78:+g' | sort -u
```
- store entries in trac, by section:
-
- <- add content
of major changes only
- update version in
- ~~store in Web as announces/announce_grass$MAJOR$MINOR$RELEASE.html <- how?
with protected PHP upload page?~~ (dropped since CMS)
#### Only in case of new major release
- update cronjob '[cron_grass_HEAD_src_snapshot.sh](https://github.com/OSGeo/grass-addons/tree/master/tools/cronjobs_osgeo_lxd)' on grass.osgeo.org to next
but one release tag for the differences
- wiki updates, only when new major release:
- {{cmd|xxxx}} macro:
- update last version on main page
- trac updates, only when new major release:
- Set "complete" flag in -->
Edit Milestone
- also: Retarget associated open tickets to milestone 7.8.x
- Batch modify tickets, set to next milestone (update this query
accordingly: two entries to change):
-
- 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:
#### WinGRASS notes
- Update grass_packager_release.bat, eg.
```
set MAJOR=7
set MINOR=8
set PATCH=0RC1
```
- Update addons (grass_addons.sh) rules, eg.
```
compile $GIT_PATH/grass7 $GISBASE_PATH/grass780RC1 $ADDON_PATH/grass780RC1/addons
```
- Modify grass_copy_wwwroot.sh accordingly, eg.
```
copy_addon 781RC1 7.8.1RC1
```
#### Launchpad notes
- Create milestone and release:
- Upload tarball for created release
- Update daily recipe contents:
#### Packaging notes
-
-
-
#### Marketing - tell others about release
- Notify all packagers (MN has email list)
- If release candidate:
-
-
- 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:
- |
- |
- |
- DebianGIS: - send only small note
- FreeGIS:
- Geowanking:
- OSGeo.org:
Via Email:
- info@osgeo.org
- (franz-josef.behr@gismngt.de)
- mfeilner@linuxnewmedia.de
- info@harzer.de
- editor-geo@geoconnexion.com
Via Web:
-
- (submit news, MN)
-
- (MN) -->
Press releases
- (News -> Submit Press Release)
-
- (MN)
- (MN) -> Share your
news with the EO community
- (update, MN)
- See also:
- ... anywhere else? Please add here.