Building Releases
=================

Roundup is a pure Python application with no binary components. This file
describes how to build a source release. To find out how to install
Roundup, read the doc/installation.txt file.

Roundup release checklist:

1.  Regenerate locale/roundup.pot.  See "Extracting Translatable
    Messages" in doc/developers.txt.  This is best done some time in
    advance of the release to allow for translators to update their
    translations. Merge into .po files by running 'make *.po'
    in the locale directory. Run:

       cd locale
       make template
       make *.po
       cd ..

2.  Run unit tests! They should pass successfully. Install pytest
    using pip2/pip3 for python2 and python3. Then invoke pytest
    using both python versions from the top of the roundup tree:

        python3 -m pytest test/
        python2 -m pytest test/

3.  Update version in:
      CHANGES.txt (set date for version as well) 
      roundup/__init__.py
      website/www/index.txt
      website/www/conf.py  (also update copyright)
3a. Update license end date in COPYING.txt
3b. Update doc/acknowledgements.txt (add section for
    release, churn contributers etc.). (Use hg churn -c -r ####..####)

4.  Update documentation
      doc/announcement.txt
      doc/upgrading.txt
4a. cd to website/www and run 'make linkcheck'. See output in
    _tmp/linkcheck/output.txt
       fix broken references in docs
       verify redirects are correct

5.  Update setup.py info if needed (contacts, classifiers, etc.). When
    releasing check that Development Status matches release: stable,
    beta alpha etc.

    Check that metadata is valid and long descriptions is proper reST:

      python3 setup.py check --restructuredtext --metadata --strict
   
6.  Clean out all *.orig, *.rej, .#* files from the source.

      find . -name '*.orig' -exec rm {} \;
      find . -name '*.rej' -exec rm {} \;
      find . -name '.#*' -exec rm {} \;

6a. Rebuild .mo translation files in distribution

      cd locale
      make
      cd ..

7.  Remove previous build files

      python3 setup.py clean --all
      rm -rf build/share  # deletes locale .mo files

    Build including new .mo files built in 6a.

      python3 setup.py build

    (sdist generation will fail if this isn't done)

8.  Rebuild documentation in "share/doc/roundup/html"

      python3 setup.py build_doc

9.  Generate source distribution:

      python3 setup.py sdist

    (if you find sdist a little verbose, add "--quiet" to the end of the
     command)
9a. 2021/04/17 skip this for now. Need to make sure that whl installs
    executable scripts properly and update these directions to test.

       python2 setup.py bdist_wheel; python3 setup.py bdist_wheel

    to create binary distributions in wheel format. (egg format is
    deprecated.)

10. Check the roundup.egg-info/SOURCES.txt to make sure that any new files are
    included.  (use hg status --rev <last release or tag>:tip to list changed
    added and removed files. Last release e.g. 1.5.1 where tip is what would
    become 1.6) E.G.
      
      hg status --rev 2.0.0:tip | sed -ne 's/^A //p' | while read i ; \
      do echo $i; grep "$i" roundup.egg-info/SOURCES.txt; done | \
      uniq -c | sort -rn

    Anything with a count of 1 is not in the manifest.
    If there are missing files that should be in the manifest,
    edit MANIFEST.in to include them. For format docs see
    https://packaging.python.org/guides/using-manifest-in/#using-manifest-in
    (Note: files under website/ shouldn't be in the manifest.)
10a: Check for removed files still in manifest:

      hg status --rev 2.0.0:tip | sed -ne 's/^R //p' | while read i ; \
      do echo $i; grep "$i" roundup.egg-info/SOURCES.txt; done | \
      uniq -c | sort -n

    any file with a count of 2 or more needs to be removed from
    MANIFEST.in and possibly cleaned out of the build tree.
10b: if you added/removed files rebuild starting at step 6a.

11. Unpack the new tarball created in dist/roundup-<version>.tar.gz
    file in /tmp then
      a) run tests using installed pytest run under python2 and
         python3. (python2 -m pytest test/; python3 -m pytest test/)
      b) demo.py
    with all available Python versions.
11a. (TBD how to test wheel binary distribution before uploading.)

12. Assuming all is well commit and tag the release in the version-control
    system.
      a) hg commit ... # commit any edits from steps 1-5
      b) hg tag 2.1.0  # use right version. Should create/commit a changeset
      c) hg push       # update main repo
      d) hg sum        # verify that the tag shows up

13. Upload source distribution to PyPI - requires you sign up for a
    pypi account and be added as a maintainer to roundup. Ask existing
    maintainer for access. You can do this two ways:

      python3 setup.py sdist upload --repository pypi --sign

    which rebuilds the source distribution tarball and uploads it.
    This means that you have uploaded something tha is not tested. It
    should be the same as the tarball you tested but....

    Another way to do this is to use twine (pip install twine).
    You need to sign the tarball. This can be done with:

      cd dist
      gpg --detach-sign --armor -u 1F2DD0CB756A76D8 <filename>.tgz
      
    you should be prompted to use the roundup release key. If not you
    can add  --local=roundup-devel@lists.sourceforge.net.
    This will create a file by the name <filename>.tgz.asc. Then
    use twine to upload *both* the asc and distibution tarball
    at the same time. E.G.:x

       twine upload --repository pypi <filename>.tar.gz <filename>.tar.gz.asc

    (If you upload the .asc file separately from the distibution file
    it gets a different path and is not able to be located in the pypi
    interface. The asc file is downloaded using the tarball path and
    add `asc'.)

    The distribution file should appear on
    https://pypi.python.org/pypi/roundup in no time. If you are using
    python older than 2.7.13 you need a .pypirc shown below since the
    URL has changed. If using 2.7.13 or newer, you can remove the
    "--repository pypi" option and use 'setup.py sdist upload...'.

    You can also use twine to upload the .whl (wheel) format
    distributions (if created). Follow the directions for generating
    the gpg asc files and upload the .whl distribution and .whl.asc
    signature files together.

14. Refresh website.
      website/README.txt
      https://www.roundup-tracker.org/ should state that the stable
      version is the one that you released.
      https://www.roundup-tracker.org/docs.html should also match the
      released version (or at least the major non pre-release
      1.x/2.x version).

15. Send doc/announcement.txt to python-announce@python.org,
    roundup-users@lists.sourceforge.net,
    roundup-devel@lists.sourceforge.net, and lwn@lwn.net.
15b. Update entry on https://freshcode.club/projects/roundup-tracker
15c. Update entries for fossies by emailing announcement to
     announce@fossies.org
15d. Update entry on https://directory.fsf.org/wiki/Roundup.

16. Change the release version on the GitHub section at
    https://wiki.roundup-tracker.org/CiTestingEnvironment
16b. Update release info on wikipedia:
     https://en.wikipedia.org/wiki/Roundup_(issue_tracker)

     https://en.wikipedia.org/wiki/Comparison_of_issue-tracking_systems


-------------

If you get errors on the upload operation, you may need the following
~/.pypirc file as well

========
[distutils]
index-servers =
    test
    pypi

[pypi]
repository: https://upload.pypi.org/legacy/
username: <your username on pypi.org here>
password: <your password here>

[test]
repository: https://test.pypi.org/legacy/
username: <your username on test.pypi.org here>
password: <your password here>
========
