checklist for doing a release:

1. Check weewx.conf for local changes.  In particular, check to make sure:
     1. WEEWX_ROOT points to /home/weewx
     2. debug=0 in weewx.conf
2. Make sure the version is correct
     1. modify pyproject.toml
     2. make version
3. Make sure all changes have been logged
     1. docs/changes.md
     2. docs/upgrading.htm
     3. make deb-changelog
     4. make redhat-changelog
     5. make suse-changelog
4. Build the documentation (may emit bogus warnings about dead links)
     1. make build-docs
5. Create the packages
     1. make pypi-package
     2. make debian-package
     3. make redhat-package
     4. make suse-packages
6. Sanity check on production machine
     1. unpack the tarball, install, run
7. Commit and tag:
     1. git commit -m "Version 1.3.1"
     1. git tag -a v1.3.1 -m "v1.3.1"
8. Upload wheel to pypi.org
     1. make upload-pypi
9. Upload to weewx.com
     1. make upload-src
     2. make upload-debian
     3. make upload-redhat
     4. make upload-suse
     6. make upload-docs
10. Update the deb repository
     1. make pull-apt-repo
     2. make update-apt-repo
     3. make push-apt-repo
11. Update the redhat repository
     1. make pull-yum-repo
     2. make update-yum-repo
     3. make push-yum-repo
12. Update the suse repository
     1. make pull-suse-repo
     2. make update-suse-repo
     3. make push-suse-repo
13. Reshuffle files on the server
     1. make release
     2. make release-apt-repo
     3. make release-yum-repo
     4. make release-suse-repo
14. Announce the release to the weewx user's group.


pre-requisites ----------------------------------------------------------------

Building the documentation requires mkdocs, which is installed using pip.
Signing packages requires gpg and local copy of authorized private+public keys.
Verifying the packages requires rpmlint/lintian.
The debian repo management requires aptly.
The redhat repo management requires createrepo.
The suse repo management requires createrepo.

To build the docs:
  pip3 install --user mkdocs
  pip3 install --user mkdocs-material

To build pypi package install the following (see the pypi section):
  pip3 install --user poetry

To build debian package install the following (use 'apt-get install'):
  git
  rsync
  gpg
  debhelper
  lintian

To build redhat package install the following (use 'yum install'):
  git
  rsync
  gnupg
  rpm-build
  rpm-sign
  rpmlint

To build suse package install the following (use 'zypper install'):
  git
  rsync
  rpm-build
  rpmlint
  createrepo_c


howto -------------------------------------------------------------------------

how to update the version number:
  Change the version number in pyproject.toml
  make version                  # this propagates the version number everywhere
  git commit -a -m "bump to version x.y.z"

how to build wheel and source tarball:
  make pypi-package

how to build debian package:
  make deb-changelog
  emacs pkg/debian/changelog    # add package-specific changes, if any
  git commit -m "update deb changelog" pkg/debian/changelog
  make debian-package

how to build redhat package:
  make redhat-changelog
  emacs pkg/changelog.el       # add package-specific changes, if any
  git commit -m "update redhat changelog" pkg/changelog.el
  make redhat-package

how to build redhat package:
  make suse-changelog
  emacs pkg/changelog.suse     # add any package-specific changes, if any
  git commit -m "update suse changelog" pkg/changelog.suse
  make suse-package

to build redhat packages with custom rpm revision:
  make redhat-changelog RPMREVISION=2
  make redhat-packages RPMREVISION=2
  make pull-yum-repo
  make update-yum-repo RPMREVISION=2
  make push-yum-repo
  ssh weewx.com rsync -arv /var/www/html/yum-test/ /var/www/html/yum
suse also uses RPMREVISION, but debian uses DEBREVISION.  this is useful when
there is a change to asset(s) in the packaging, but not part of weewx itself.

to display debconf variables:
  sudo debconf-show weewx

to manually purge debconf variables:
  echo PURGE | sudo debconf-communicate weewx

to sign rpm packages you need .rpmmacros in your home directory:
~/.rpmmacros
  %_gpg_name  YOUR_NAME_HERE

to generate gpg key used for signing packages:
  gpg --gen-key
  gpg --list-keys

to export the text version of a public key:
  gpg --export -a "YOUR_NAME_HERE" > username.gpg.key

Install using pip
  make pypi-package
  pip install dist/weewx-x.y.z-py3-none-any.whl
  weectl station create

debian install/remove:
  apt-get install weewx         # install with apt
  apt-get remove weewx          # remove with apt
  apt-get purge weewx           # purge removes /etc/weewx and debconf settings
  dpkg -i weewx_x.y.z-r.deb     # install
  (apt-get install weewx)       # finish install if dependencies failed
  dpkg -r weewx                 # remove
  dpkg -P weewx                 # purge

redhat install/remove:
  yum install weewx-x.y.z-r.rpm [--nogpgcheck]    # install with yum
  yum remove weewx                                # remove with yum
  rpm -i weewx-x.y.z-r.rpm                        # install with rpm directly
  rpm -e weewx                                    # remove with rpm

suse install/remove:
  zypper install weewx-x.y.z-r.rpm [--nogpgcheck] # install with zypper
  zypper remove weewx                             # remove with zypper
  rpm -i weewx-x.y.z-r.rpm                        # install with rpm directly
  rpm -e weewx                                    # remove with rpm


howto: build the documents --------------------------------------------------

Prerequisites:
    - Python 3.7 or greater, with pip installed
    - Install mkdocs:
        python3 -m pip install mkdocs
    - Install the theme "material" for mkdocs:
        python3 -m pip install mkdocs-material

Steps:
    - make build-docs


howto: build and publish wheels to pypi.org -----------------------------------

Prerequisites:
    - Python 3.7 or greater, with pip installed
    - Install mkdocs:
        python3 -m pip install mkdocs
    - Install the theme "material" for mkdocs:
        python3 -m pip install mkdocs-material
    - Install poetry:
        curl -sSL https://install.python-poetry.org | python3 -
    - Get an API token from pypi.org
        See https://pypi.org/manage/account/token/
    - Tell poetry to use it:
        poetry config pypi-token.pypi pypi-substitute-your-pypi-key

Steps:
    - Build the docs (may emit bogus warnings about dead links):
        make build-docs
    - Build the wheel
        make pypi-packages
    - Publish to pypi.org
        make upload-pypi


howto: deb repository ---------------------------------------------------------

aptly has two different mechanisms for doing a 'publish': switch or update.
we use snapshots, and publish using 'publish switch', rather than publishing
using a simple 'publish update'.

there are two apt repositories: python2 and python3

to do apt repo updates you must first install aptly:
  https://www.aptly.info/download/
for example, on debian:
  echo "deb http://repo.aptly.info/ squeeze main" | sudo tee /etc/apt/sources.list.d/aptly.list
  wget -qO - https://www.aptly.info/pubkey.txt | sudo apt-key add -
  sudo apt-get update
  sudo apt-get install aptly

create local debian repo using aptly:
  aptly repo create -distribution=squeeze -component=main -architectures=all python2-weewx
  aptly repo create -distribution=buster -component=main -architectures=all python3-weewx

put a bunch of deb files into an empty apt repo:
  for f in `ls distdir`; do aptly repo add python2-weewx distdir/$f; done

create a snapshot:
  aptly snapshot create python-weewx-x.y.z-n from repo python2-weewx
  aptly snapshot create python3-weewx-x.y.z-n from repo python3-weewx

publish using snapshot:
  aptly publish -architectures=all snapshot python-weewx-x.y.z-n python2
  aptly publish -architectures=all snapshot python3-weewx-x.y.z-n python3

update using 'publish switch':
  aptly repo add python2-weewx dist/python-weewx_x.y.z-n_all.deb
  aptly snapshot create python-weewx-x.y.z-n from repo python2-weewx
  aptly publish switch squeeze python2 python-weewx-x.y.z-n

  aptly repo add python3-weewx dist/python3-weewx_x.y.z-n_all.deb
  aptly snapshot create python3-weewx-x.y.z-n from repo python3-weewx
  aptly publish switch buster python3 python3-weewx-x.y.z-n

update using 'publish update':
  aptly publish repo -architectures=all python2-weewx squeeze
  aptly repo add python2-weewx dist/squeeze/python-weewx_x.y.z-n_all.deb
  aptly publish update squeeze python2

  aptly publish repo -architectures=all python3-weewx buster
  aptly repo add python3-weewx dist/buster/python3-weewx_x.y.z-n_all.deb
  aptly publish update buster python3

clone the published apt repo to local space:
  mkdir -p ~/.aptly
  rsync -arv USER@weewx.com:/var/www/html/aptly-test/ ~/.aptly

synchronize local aptly changes with the published apt repo:
  rsync -arv ~/.aptly/ USER@weewx.com:/var/www/html/aptly-test

switch from testing to production (this is done at weewx.com):
  rsync -arv /var/www/html/aptly-test/ /var/www/html/aptly

for clients to use an apt repo at weewx.com:
  curl -s http://weewx.com/keys.html | sudo apt-key add -
  echo "deb [arch=all] http://weewx.com/apt/ squeeze main" | sudo tee /etc/apt/sources.list.d/weewx.list
  echo "deb [arch=all] http://weewx.com/apt/ buster main" | sudo tee /etc/apt/sources.list.d/python3-weewx.list


howto: yum repository ---------------------------------------------------------

create yum repo:
  mkdir -p ~/.yum/weewx/{el7,el8}/RPMS

update local yum repo with latest rpm:
  cp *.el7.rpm ~/.yum/weewx/el7/RPMS
  createrepo -o ~/.yum/weewx/el7 ~/.yum/weewx/el7
  cp *.el8.rpm ~/yum/weewx/el8/RPMS
  createrepo -o ~/.yum/weewx/el8 ~/.yum/weewx/el8

clone the published yum repo to local space:
  mkdir -p ~/.yum
  rsync -arv USER@weewx.com:/var/www/html/yum-test/ ~/.yum

synchronize local yum changes with published yum repo:
  rsync -arv ~/.yum/ USER@weewx.com:/var/www/html/yum-test

switch from testing to production (this is done at weewx.com):
  rsync -arv /var/www/html/yum-test/ /var/www/html/yum


notes -------------------------------------------------------------------------

there are multiple changelogs:
  docs/changes.md - definitive changelog for the application
  pkg/debian/changelog - changes to the debian packaging
  pkg/changelog.el - changes to the redhat packaging
  pkg/changelog.suse - changes to the suse packaging

when signing, gpg info must match the name and email in the latest package
changelog entry.

the debian changelog *must* have a version number that matches the app version.
the redhat package will build if the version numbers do not match.  use the
rpm-changelog and deb-changelog targets to ensure that changelog versions match
the application version for a release.

there are many ways to build a debian package.  first tried dpkg (uses DEBIAN
dir and is fairly low-level) but that does not create changes and source diffs.
then dried dpkg-buildpackage (uses debian dir and is higher level) but misses
the config and templates.  ended up using dpkg-buildpackage with some manual
(scripted) file manipulation.

both debian and redhat deprecate the use of '/usr/bin/env python' as the
shebang - they want a very tight binding to the operating system python as the
shebang.  in fact, since late 2019 redhat build tools see any shebang other
than a tight coupling to the operating system's python as an error and refuse
to accept it.  however, the bsd platforms prefer this as the shebang, and the
other approach fails on bsd.  macos uses something else.

since weewx5 supports any python 3.7+. older weewx supports python 2.7 and any
python 3.5+, weewx does not have to be tightly coupled to any specific python
installation on the system.

so the source code should use the '/usr/bin/env python' shebang.  on platforms
that refuse to accept this, the package builder will replace this with
whatever that platform will accept.  for pip installs, pip does the shebang
mangling and sets entry points that are appropriate for its configuration.
for everything else, using the env in shebang and making the entry points
executable enables either 'python foo.py' or 'foo.py' invocation.

the /etc/default/weewx plus shell stubs in /usr/bin/wee* is used in deb/rpm
and non-linux installations to provide python flexibility, so that users can
use a single weewx installation to experiment with different python versions.
this is particularly helpful when running weewx directly from source in a git
clone, it also works in the deb/rpm installs where the python is managed
separately from the system's python, as well as the non-linux, non-pip
installations.


unit tests --------------------------------------------------------------------

prerequisites:

python 3.7
python-usb
pyephem

to set up mysql server with user and permissions for testing:

make test-setup

to run all unit tests:

make test
(note: do not run this as root)

to clean up after running tests:

make test-clean

guidelines:

unit tests should put transient files in /var/tmp/weewx_test


testing -----------------------------------------------------------------------

what to test when creating debian and redhat packages:
  install, upgrade, remove, purge
  install, modify files, remove
  install previous release, modify files, upgrade, remove

Using pip:

- new install to user space
  make pypi-packages
  pip install dist/weewx-x.y.z-py3-none-any.whl --user
  weectl station create

- upgrade user data
  modify ~/weewx-data/weewx.conf
  weectl station upgrade

- new install using pip to /opt/weewx
  make pypi-packages
  sudo pip install dist/weewx-x.y.z-py3-none-any.whl
  sudo weectl station create /opt/weewx/weewx.conf

- upgrade using setup.py to /opt/weewx
  setup.py install home=/opt/weewx
  modify /opt/weewx/weewx.conf
  setup.py install home=/opt/weewx

on centos and suse:

- new install using rpm
  rpm -i weewx_x.y.z.rpm

- upgrade using rpm
  rpm -i weewx_r.s.t.rpm
  rpm -U weewx_x.y.z.rpm

- upgrade using rpm with extensions installed
  rpm -i weewx_r.s.t.rpm
  wee_extension --install cmon
  rpm -U weewx_x.y.z.rpm

debian:

- new install usinb dpkg
  dpkg -i weewx_x.y.z.deb

- upgrade using dpkg take maintainer's version of weewx.conf
  dpkg -i weewx_r.s.t.deb
  modify /etc/weewx/weewx.conf
  dpkg -i weewx_x.y.z.deb

- upgrade using dpkg use old version of weewx.conf
  dpkg -i weewx_r.s.t.deb
  modify /etc/weewx/weewx.conf
  dpkg -i weewx_x.y.z.deb

- reconfigure using dpkg
  dpkg-reconfigure weewx

all platforms:

- installation and removal of extensions
  weectl extension install https://github.com/matthewwall/weewx-cmon/archive/master.zip
  weectl extension install ~/weewx-data/examples/pmon
  weectl extension uninstall cmon
  weectl extension uninstall pmon

- reconfigure
  weectl station reconfigure
  weectl station reconfigure --driver=weewx.drivers.vantage --no-prompt
