2009-05-05

This text summarizes some points to pay attention to when a new release
of sane-backends is planned.

Timetable (approximate periods):

Day  0: Announcement of upcoming release on sane-devel including timetable
Day 14: Feature freeze (only bugfixes + documentation updates)
Day 28: Code freeze (only fixes for bugs that can destroy hardware, can cause 
        compilation problems or render a backend completely unusable, and
        documentation updates are allowed)
Day 35: Release

Before the release:

* set :new :yes on any new backend .desc files, by looking for added files:

  cd backend
  ls | while read aa; do git log --follow --diff-filter=A --find-renames=40% --format="%ai  $aa" "$aa"; done > foo.log

  Then inspect foo.log for any files added since the last release.
* Make sure that config.guess and config.sub are up-to-date (get them from
  savannah.gnu.org/projects/config) (git clone is easiest)
* configure.ac: remove 'git' from textual version number, and increment it
* run autoreconf --force but do *NOT* use the --install option as it will
  overwrite our custom ltmain.sh
* ChangeLog: generate from git log, something like:
  git log RELEASE_1_0_25..HEAD > ChangeLog
* NEWS: update and enter date of release, etc
  Get list of heavily change backends via: git diff --stat RELEASE_1_0_25
  Get other things by reading ChangeLog
* sane-backends.lsm: update
* git commit -a
* tag git with release tag; e.g.: 'git tag -a RELEASE_1_0_15'
* probably DONT want to git push here, because alioth will rebuild it's local
  checkout needlessly

Making the release:

* make tar.gz, sane-backends-x.y.z.lsm, and .md5sum with "make sane-backends"
* unpack tar.gz in temporary directory
* make diff from last release by unpacking it also in temporary directory
  and running e.g. 
  diff -uNr sane-backends-1.0.23 sane-backends-1.0.24  > sane-backends-1.0.23-1.0.24.diff
* check that the diff applies cleanly to the old version
* gzip the diff
* install devel headers required to build optional backends (1284,gphoto,etc)
* check that the new version .tar.gz can be compiled
* upload the .tar.gz, tar.gz.md5 and .diff.gz to the FTP/HTTP servers
  (at the moment: alioth.debian.org, ftp files are in
  /srv/alioth.debian.org/chroot/ftproot/pub/sane/ )
  In the alioth web interface, you should upload the smallest file first,
  since you don't get error messages until after an upload completes,
  and you might need to change something.
  You can add the larger files afterwards. You may have to split larger
  files.

Announcing the release:

* checkout the sane/website.git module and:
* copy sane-backends.html to sane-backends-"old-version".html
* update sane-supported-devices.html with link to above "old" file
* rebuild sane-backends.html and sane-mfgs.html (make -C doc html-pages)
* use man2html from http://hydra.nac.uci.edu/indiv/ehood/man2html.html
  to rebuild html man pages (make -C doc html-man) (no other version works)
* add md5 sum to sane-md5sums.txt
* check and update platforms page (sane-support.html)
* add announcement to index.html
* git commit -a && git push
* check that website was updated automatically. if not, see:
  /home/groups/sane/bin/update-htdocs.sh
* rebuild descriptions.db (make -C doc descriptions.db)
* scp doc/descriptions.db to alioth:
  /home/groups/sane/search/release
* write announcements sane-devel, maybe others (e.g. freshmeat),
  include the md5 hash

After the release:

#### consider not adding old changelogs to release package
* move ChangeLog to ChangeLogs/ChangeLog-"version"
* start a new ChangeLog, with the following message:

This file is automatically generated at release time using git commit messages.

For the latest changes please refer to the output of `git log` or see:
https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi?p=sane/sane-backends.git;a=log

* configure.ac: bump textual version & add 'git' suffix
* configure: regenerate with autoconf
* remove the ':new' tag from any new backends .desc files
* git add new files and commit
* git push && git push --tags (one of these might give an error 'remote: fatal: bad object 0000000000000000000000000000000000000000', try the other one)
