changeset 6794:81d961ca11cd

merge heads
author John Rouillard <rouilj@ieee.org>
date Thu, 14 Jul 2022 15:42:31 -0400
parents dee99f8a386f (current diff) 77aef1b67fdc (diff)
children 1e3ce9adc96a
files website/www/index.txt
diffstat 38 files changed, 267 insertions(+), 175 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Thu Jul 14 15:31:05 2022 -0400
+++ b/.hgtags	Thu Jul 14 15:42:31 2022 -0400
@@ -136,3 +136,8 @@
 013a2e3da452a5dcc05e15f4a03667a8d4bc0870 2.1.0b1
 cbc18a8bc61f120fc27df2a90d7c922b12bf9014 2.1.0
 b3ba03d2b214ce598d3a181f3b43b46c3406713f 2.2.0b1
+c90104abe508e3886917243e4acd069c8ef7a1a4 2.2.0
+c90104abe508e3886917243e4acd069c8ef7a1a4 2.2.0
+0000000000000000000000000000000000000000 2.2.0
+0000000000000000000000000000000000000000 2.2.0
+239d9542b02062c56f88fd1de8b87c4d88d700ad 2.2.0
--- a/CHANGES.txt	Thu Jul 14 15:31:05 2022 -0400
+++ b/CHANGES.txt	Thu Jul 14 15:42:31 2022 -0400
@@ -12,7 +12,7 @@
 Roundup 2.0 supports Python 3.4 and later. Roundup 2.1.0 supports
 python 3.6 or newer (3.4/3.5 might work, but they are not tested).
 
-2022-yy-zz 2.2.0
+2022-07-13 2.2.0
 
 Fixed:
 
--- a/RELEASE.txt	Thu Jul 14 15:31:05 2022 -0400
+++ b/RELEASE.txt	Thu Jul 14 15:42:31 2022 -0400
@@ -26,7 +26,7 @@
         python2 -m pytest test/
 
 3.  Update version in:
-      CHANGES.txt
+      CHANGES.txt (set date for version as well) 
       roundup/__init__.py
       website/www/index.txt
       website/www/conf.py  (also update copyright)
@@ -84,7 +84,7 @@
     (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
-    exectuable scripts properly and update these directions to test.
+    executable scripts properly and update these directions to test.
 
        python2 setup.py bdist_wheel; python3 setup.py bdist_wheel
 
@@ -123,11 +123,12 @@
     with all available Python versions.
 11a. (TBD how to test wheel binary distribution before uploading.)
 
-12. Assuming all is well tag the release in the version-control
+12. Assuming all is well commit and tag the release in the version-control
     system.
-      a) hg tag 1.6.0  # use right version. Should create/commit a changeset
-      b) hg push       # update main repo
-      c) hg sum        # verify that the tag shows up
+      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
@@ -168,6 +169,7 @@
     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
@@ -175,16 +177,18 @@
       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).
-16. Send doc/announcement.txt to python-announce@python.org,
+
+15. Send doc/announcement.txt to python-announce@python.org,
     roundup-users@lists.sourceforge.net,
     roundup-devel@lists.sourceforge.net, and lwn@lwn.net.
-16b. Update entry on https://freshcode.club/projects/roundup-tracker
-16c. Update entries for fossies by emailing announcement to
+15b. Update entry on https://freshcode.club/projects/roundup-tracker
+15c. Update entries for fossies by emailing announcement to
      announce@fossies.org
-16d. Update entry on https://directory.fsf.org/wiki/Roundup.
-17. Change the release version on the GitHub section at
+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
-17b. Update release info on wikipedia:
+16b. Update release info on wikipedia:
      https://en.wikipedia.org/wiki/Roundup_(issue_tracker)
 
      https://en.wikipedia.org/wiki/Comparison_of_issue-tracking_systems
--- a/doc/acknowledgements.txt	Thu Jul 14 15:31:05 2022 -0400
+++ b/doc/acknowledgements.txt	Thu Jul 14 15:42:31 2022 -0400
@@ -13,8 +13,8 @@
 2.2
 ---
 
-2.2.0b1
-~~~~~~~
+2.2.0
+~~~~~
 
 Maintainer:  John Rouillard, Ralf Schlatterbeck
 
@@ -22,7 +22,7 @@
 
 Developer activity by changesets::
 
-  rouilj@ieee.org         224  ************************************************
+  rouilj@ieee.org         291 ************************************************
   rsc@runtux.com           11 **
   aburke                    1
   cmeerw@cmeerw.org         1
@@ -30,11 +30,11 @@
 
 Other contributers
 
-Marcus Priesch
-John Kristensen (jerrykan)
-Ashely Burke
-Nagy Gabor
-Norbert Schlemmer
+Marcus Priesch,
+John Kristensen (jerrykan),
+Ashely Burke,
+Nagy Gabor,
+Norbert Schlemmer,
 Thomas Arendsen Hein
 
 2.1
@@ -113,7 +113,7 @@
 
 Chau Nguyen,
 Andreas (anrounham14),
-Robert Klonner
+Robert Klonner,
 Garth Jensen
 
 1.6
--- a/doc/admin_guide.txt	Thu Jul 14 15:31:05 2022 -0400
+++ b/doc/admin_guide.txt	Thu Jul 14 15:42:31 2022 -0400
@@ -1,5 +1,5 @@
 .. meta::
-    :description language=en:
+    :description:
         How to administer, backup, upgrade a Roundup installation.
         System and user security, configuring web compression,
         documentation on using roundup-server and running
@@ -556,8 +556,10 @@
 Software Upgrade
 ----------------
 
-Always make a backup of your tracker before upgrading software. Steps you may
-take:
+.. _make a backup: #tracker-backup
+
+Always `make a backup`_ of your tracker before upgrading software.
+Steps you may take:
 
 1. Install pytest and ensure that the unit tests run on your system
    (using your preferred python version)::
@@ -576,11 +578,11 @@
 
     python setup.py install
 
-6. Follow the steps in the `upgrading documentation`_ for the new version of
-   the software in the copied.
+6. Follow the steps in the `upgrading documentation`_ for all the
+   version between your original version and th new version.
 
-   Usually you will be asked to run `roundup_admin migrate` on your tracker
-   before you allow users to start accessing the tracker.
+   Usually you should run `roundup_admin -i <tracker_home> migrate`
+   on your tracker(s) before you allow users to start accessing the tracker.
 
    It's safe to run this even if it's not required, so just get into the
    habit.
@@ -591,7 +593,6 @@
 
     python setup.py install
 
-
 .. index:: database; convert from one database backend to another
    single: roundup-admin; import and export
 
--- a/doc/announcement.txt	Thu Jul 14 15:31:05 2022 -0400
+++ b/doc/announcement.txt	Thu Jul 14 15:42:31 2022 -0400
@@ -1,78 +1,68 @@
-I'm proud to release version 2.2.0b1 of the Roundup issue tracker.
-This release is a bugfix and minor feature
+I'm proud to release version 2.2.0 of the Roundup issue
+tracker.  This release is a bugfix and minor feature
 release, so make sure to read `docs/upgrading.txt
-<https://www.roundup-tracker.org/docs/upgrading.html>`_ to bring your
-tracker up to date.
+<https://www.roundup-tracker.org/docs/upgrading.html>`_ to
+bring your tracker up to date.
 
-The changes, as usual, include some new features and many bug fixes.
+The changes, as usual, include some new features and many
+bug fixes.
 
-Note that you should run ``roundup-admin ... migrate`` to update the
-database schema version. Do this before you use the web, command-line
-or mail interface and before any users access the tracker.  
+Note that you should run ``roundup-admin ... migrate`` to
+update the database schema version. Do this before you use
+the web, command-line or mail interface and before any users
+access the tracker.
 
-You can download it with:
+You can download it with::
 
    pip download roundup
 
-then unpack and test/install the tarball.
+then unpack and test/install the tarball. Also::
+
+   pip install roundup
+
+(preferably in a virtual environment) can be used.
 
 Among the notable improvements from the 2.1.0 release are:
 
-- Roundup supports dynamic and static compression of http
-  responses.
+- Dynamic and static compression of http responses. This
+  improves performance when a front end web server isn't
+  serving compressed assets.
+  
+- REST interface supports CORS allowing Roundup to be used
+  by third party web sites. Can specify origins allowed to
+  use the REST interface. OpenAPI (SWagger) docs can be
+  added. Error handling/reporting improved.
 
-- Better support for range headers and HTTP 1.1 in
-  roundup-server.
+- Dockerfile to build a containerized Roundup instance.  A
+  docker-compose configuration to deploy a a mysql based
+  tracker is also supplied.
 
 - New full text search methods. SQLite FTS and PostgreSQL
   full text search are supported. These allow search
-  expressions in addition to simple word based
-  searches.
-
-- Word size for Roundup's full text search increased to 50.
-
-- CORS support for the REST interface allowing Roundup to
-  be used by third party services. Includes ability to
-  list valid Origins in CSRF checks.
-
-- Dockerfile support. Docker-compose for a mysql based
-  tracker.
+  expressions in addition to simple word based searches.
 
 - Secret values in config.ini can be stored in external
   files. This allows config.ini to be stored in a VCS
   without exposing secrets.
 
-- Improvements to REST: fix crashes, support JWT in url,
-  dynamic endpoint list, OpenAPI (Swagger) doc can be specified,
-  allowed methods reported on error.
+- Translation object added to internal database handle. This
+  allows auditors and extensions to provide efficient
+  translations.
 
-- Define default cache times for js and css assets.
+- MySQL database creation uses COLLATE utf8_general_ci
 
-- Login with empty passwords is disabled by default.
-
-- ETag value changes depending on content-encoding.
+- Wsgi startup improvements (must be enabled by setting
+  feature flag).
 
 - Fix crash when importing legacy Roundup tracker with long
   integers.
 
-- Workaround lock contention by adding jitter to access of
-  one time key and sessions anydbm databases.
-
-- Fixes for deprecated calls/libraries in newer Pythons:
-  distutils, crypt, socket.sslserver....
-
-- Additional strings marked for translation.
-
-- Multiple crash fixes.
-
-- Improvements to tracker templates.
-
-- Translation object added to internal database
-  handle. This allows auditors and extensions to
-  provide efficient translations.
+- Fix issues with Roundup unable to find supporting files
+  when installed via pip. Removed additional references to
+  distfiles module.
 
 The file CHANGES.txt has a detailed list of feature additions and
-bug fixes (50) for each release. The most recent changes from
+bug fixes (57) for each release. The most recent changes from
 there are at the end of this announcement. Also see the
 information in doc/upgrading.txt.
 
@@ -88,9 +78,10 @@
 all the "Software Upgrade" guidelines given in the doc/upgrading.txt
 documentation.
 
-Note that you should run ``roundup-admin ... migrate`` to update the
-database schema version. Do this before you use the web, command-line
-or mail interface and before any users access the tracker.  
+Note that you should run ``roundup-admin ... migrate`` for
+all your trackers to update the database schema version. Do
+this before you use the web, command-line or mail interface
+and before any users access the tracker.
 
 Roundup requires Python 2 newer than version 2.7.2 or Python 3 newer
 than or equal to version 3.6 for correct operation. (Python
@@ -150,9 +141,10 @@
 Recent Changes
 ==============
 
-From 2.1.0 to 2.2.0b1.
+From 2.1.0 to 2.2.0.
 
 Fixed:
+------
 
 - issue2551161 - Fix ResourceWarnings when running with -W default.
   Cleaned up leaking file descriptors from zopetal pre-compile, python
@@ -174,6 +166,8 @@
   length. All other paths with a . in then will be passed through
   without change. This allows items like a JWT to be passed as a path
   element. (John Rouillard)
+- issue2550995 - KeyError classic during roundup-admin install. Add
+  paths to search for locale and template files.
 - issue2551167 - pip install in containerized environments puts
   template and locale files under site-packages where roundup can't find
   them. Change code to find them under site-packages.
@@ -239,9 +233,21 @@
 - issue2551207 - Fix sorting by order attribute if order attributes can
   be None. Add a test.
 - issue2551203 fix CORS requests by providing proper headers and allowing
-  unauthenticted CORS preflight requests.
+  unauthenticted CORS preflight requests. (Marcus Priesch and John
+  Rouillard)
+- issue2551206 - removed some windows installer references that were missed.
+- document use of jinja2 templating as optional in config.ini
+  file. Report if available or not. (John Rouillard)
+- make setup.py install the Zope and wsgi.py frontends under
+  share/frontends. This matches the install of the cgi-bin/roundup.cgi
+  frontend. (John Rouillard)
+- prevent submit button from showing up when using _generic.item.html
+  if the user doesn't have edit permissions. (John Rouillard)
+- issue2551216 - create new mysql databases using COLLATE
+  utf8_general_ci to prevent crashes in test suite. (John Rouillard)
 
 Features:
+---------
 
 - issue2551147 - Enable compression of http responses in roundup.
   Allow roundup to return gzip, (br or zstd with added modules)
@@ -306,3 +312,6 @@
   i18n object is now also correctly set for the mail interface:
   previously the 'language' setting in the [mailgw] section seems to
   have been ignored. Thanks to Marcus Priesch for the patch.
+- issue2551212 - speed up wsgi interface by caching the tracker
+  instance. Hidden behind a feature flag. See upgrading.txt for
+  details. (Marcus Priesch with feature flag by John Rouillard)
--- a/doc/customizing.txt	Thu Jul 14 15:31:05 2022 -0400
+++ b/doc/customizing.txt	Thu Jul 14 15:42:31 2022 -0400
@@ -1,5 +1,5 @@
 .. meta::
-    :description language=en:
+    :description:
         How to customize and extend the Roundup Issue
         Tracker. Includes many cookbook and how-to
         examples. Reference for the design and internals
--- a/doc/features.txt	Thu Jul 14 15:31:05 2022 -0400
+++ b/doc/features.txt	Thu Jul 14 15:42:31 2022 -0400
@@ -1,5 +1,5 @@
 .. meta::
-    :description language=en:
+    :description:
         Features of using the Roundup Issue Tracker. Describes
         all access methods, configuration and workflow capabilities.
 	Links to detailed documentation.
--- a/doc/glossary.txt	Thu Jul 14 15:31:05 2022 -0400
+++ b/doc/glossary.txt	Thu Jul 14 15:42:31 2022 -0400
@@ -1,5 +1,5 @@
 .. meta::
-    :description language=en:
+    :description:
         Definitions of terms used in the Roundup Issue Tracker
 	documentation.
 
--- a/doc/html_extra/spec.html	Thu Jul 14 15:31:05 2022 -0400
+++ b/doc/html_extra/spec.html	Thu Jul 14 15:42:31 2022 -0400
@@ -1,5 +1,7 @@
 <html>
 <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1">
 <title>Software Carpentry Track: Roundup</title>
 </head>
 <body bgcolor=white>
--- a/doc/index.txt	Thu Jul 14 15:31:05 2022 -0400
+++ b/doc/index.txt	Thu Jul 14 15:42:31 2022 -0400
@@ -1,5 +1,5 @@
 .. meta::
-    :description language=en:
+    :description:
         Table of contents for documentation on the Roundup Issue Tracker.
 
 =======================================================
--- a/doc/installation.txt	Thu Jul 14 15:31:05 2022 -0400
+++ b/doc/installation.txt	Thu Jul 14 15:42:31 2022 -0400
@@ -1,5 +1,5 @@
 .. meta::
-    :description language=en:
+    :description:
         Everything about installing the Roundup issue tracker web and
 	mail interfaces and configuring a tracker. How to download and
 	demonstrate Roundup using using command line or
--- a/doc/overview.txt	Thu Jul 14 15:31:05 2022 -0400
+++ b/doc/overview.txt	Thu Jul 14 15:42:31 2022 -0400
@@ -1,5 +1,5 @@
 .. meta::
-    :description language=en:
+    :description:
         Original proposal for the Roundup Issue Tracker. The problem
         it solves, and guiding principles. Presents the
         components of Roundup and how they interact.
--- a/doc/rest.txt	Thu Jul 14 15:31:05 2022 -0400
+++ b/doc/rest.txt	Thu Jul 14 15:42:31 2022 -0400
@@ -1,5 +1,5 @@
 .. meta::
-    :description language=en:
+    :description:
         Documentation on the RESTful interface to the Roundup Issue
 	Tracker.
 
--- a/doc/upgrading.txt	Thu Jul 14 15:31:05 2022 -0400
+++ b/doc/upgrading.txt	Thu Jul 14 15:42:31 2022 -0400
@@ -1,5 +1,5 @@
 .. meta::
-    :description language=en:
+    :description:
         Critical documentation on how to upgrade the Roundup Issue
 	Tracker. Actions that must or can be taken when upgrading from
 	one version to another are documented here.
@@ -12,7 +12,7 @@
 
 Please read each section carefully and edit your tracker home files
 accordingly. Note that there is information about upgrade procedures in the
-`administration guide`_.
+`administration guide`_ in the `Software Upgrade`_ section.
 
 If a specific version transition isn't mentioned here (eg. 0.6.7 to 0.6.8)
 then you don't need to do anything. If you're upgrading from 0.5.6 to
@@ -30,7 +30,7 @@
 .. contents::
    :local:
 
-.. index:: Upgrading; 2.0.0 to 2.1.0
+.. index:: Upgrading; 2.1.0 to 2.2.0
 
 Migrating from 2.1.0 to 2.2.0
 =============================
@@ -61,8 +61,8 @@
   2. Some databases that include native full-text search (native-fts
      indexer) searching are now supported.
 
-You should run the ``roundup-admin migrate`` command for your
-tracker once you've installed the latest codebase.
+You should run the ``roundup-admin -i <tracker_home> migrate`` command
+for all your trackers once you've installed the latest codebase.
 
 Do this before you use the web, command-line or mail interface
 and before any users access the tracker.
@@ -72,9 +72,9 @@
 "No migration action required" (if you have run it, or have used
 another interface to the tracker, or are using anydbm).
 
-See `below for directions on enabling native-fts`_.
-
-.. _below for directions on enabling native-fts: \
+See `below if you want to enable native-fts searching`_.
+
+.. _below if you want to enable native-fts searching: \
     #enhanced-full-text-search-optional
 
 The increase in indexed word length also affects whoosh and xapian
@@ -248,6 +248,8 @@
   {% endif %}
 
 
+.. index:: Upgrading; 2.0.0 to 2.1.0
+
 Migrating from 2.0.0 to 2.1.0
 =============================
 
@@ -3464,3 +3466,4 @@
 .. _PostgreSQL's full text search: https://www.postgresql.org/docs/current/textsearch.html
 .. _`administration guide notes on native-fts`: admin_guide.html#configuring-native-fts-full-text-search
 .. _Configuring Compression: admin_guide.html#configuring-compression
+.. _Software Upgrade: admin_guide.html#software-upgrade
--- a/doc/user_guide.txt	Thu Jul 14 15:31:05 2022 -0400
+++ b/doc/user_guide.txt	Thu Jul 14 15:42:31 2022 -0400
@@ -1,5 +1,5 @@
 .. meta::
-    :description language=en:
+    :description:
         Describes how to interact with and use a tracker with the
         Roundup Issue Tracker.
 
--- a/doc/xmlrpc.txt	Thu Jul 14 15:31:05 2022 -0400
+++ b/doc/xmlrpc.txt	Thu Jul 14 15:42:31 2022 -0400
@@ -1,5 +1,5 @@
 .. meta::
-    :description language=en:
+    :description:
         Documentation on the XMLRPC interface to the Roundup Issue
 	Tracker. Includes sample clients.
 
--- a/frontends/wsgi.py	Thu Jul 14 15:31:05 2022 -0400
+++ b/frontends/wsgi.py	Thu Jul 14 15:42:31 2022 -0400
@@ -18,4 +18,5 @@
 feature_flags =  { "cache_tracker": "" }
 
 # Definition signature for app: app(environ, start_response):
+# If using apache mod_wsgi change app to application.
 app =  RequestDispatcher(tracker_home, feature_flags=feature_flags)
--- a/locale/de.po	Thu Jul 14 15:31:05 2022 -0400
+++ b/locale/de.po	Thu Jul 14 15:42:31 2022 -0400
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: Roundup 1.5.0\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2022-06-30 16:36-0400\n"
+"POT-Creation-Date: 2022-07-12 19:10-0400\n"
 "PO-Revision-Date: 2016-04-11 09:13+0200\n"
 "Last-Translator: Tobias Herp <tobias.herp@gmx.de>\n"
 "Language-Team: German Translators <roundup-devel@lists.sourceforge.net>\n"
@@ -3574,8 +3574,8 @@
 msgid "Edit Items"
 msgstr "Einträge bearbeiten"
 
-#: ../share/roundup/templates/classic/html/_generic.item.html:51
-#: ../share/roundup/templates/minimal/html/_generic.item.html:51
+#: ../share/roundup/templates/classic/html/_generic.item.html:52
+#: ../share/roundup/templates/minimal/html/_generic.item.html:52
 msgid ""
 "Showing 10 items. <a href=\"\">Show all history</a> (warning: this could be "
 "VERY long)"
--- a/locale/en.po	Thu Jul 14 15:31:05 2022 -0400
+++ b/locale/en.po	Thu Jul 14 15:42:31 2022 -0400
@@ -11,7 +11,7 @@
 msgstr ""
 "Project-Id-Version: Roundup 0.7.0\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2022-06-30 16:36-0400\n"
+"POT-Creation-Date: 2022-07-12 19:10-0400\n"
 "PO-Revision-Date: 2004-11-20 13:47+0200\n"
 "Language-Team: English\n"
 "Language: \n"
@@ -2835,8 +2835,8 @@
 msgid "Edit Items"
 msgstr ""
 
-#: ../share/roundup/templates/classic/html/_generic.item.html:51
-#: ../share/roundup/templates/minimal/html/_generic.item.html:51
+#: ../share/roundup/templates/classic/html/_generic.item.html:52
+#: ../share/roundup/templates/minimal/html/_generic.item.html:52
 msgid ""
 "Showing 10 items. <a href=\"\">Show all history</a> (warning: this could be "
 "VERY long)"
--- a/locale/es.po	Thu Jul 14 15:31:05 2022 -0400
+++ b/locale/es.po	Thu Jul 14 15:42:31 2022 -0400
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: Roundup 1.3.3\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2022-06-30 16:36-0400\n"
+"POT-Creation-Date: 2022-07-12 19:10-0400\n"
 "PO-Revision-Date: 2013-10-31 10:45+0100\n"
 "Last-Translator: Ramiro Morales <rm0@gmx.net>\n"
 "Language-Team: Spanish Translators <roundup-devel@lists.sourceforge.net>\n"
@@ -3606,8 +3606,8 @@
 msgid "Edit Items"
 msgstr "Editar Items"
 
-#: ../share/roundup/templates/classic/html/_generic.item.html:51
-#: ../share/roundup/templates/minimal/html/_generic.item.html:51
+#: ../share/roundup/templates/classic/html/_generic.item.html:52
+#: ../share/roundup/templates/minimal/html/_generic.item.html:52
 msgid ""
 "Showing 10 items. <a href=\"\">Show all history</a> (warning: this could be "
 "VERY long)"
--- a/locale/fr.po	Thu Jul 14 15:31:05 2022 -0400
+++ b/locale/fr.po	Thu Jul 14 15:42:31 2022 -0400
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: Roundup 1.4.6\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2022-06-30 16:36-0400\n"
+"POT-Creation-Date: 2022-07-12 19:10-0400\n"
 "PO-Revision-Date: 2013-10-31 12:19+0100\n"
 "Last-Translator: Stephane Raimbault <stephane.raimbault@gmail.com>\n"
 "Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
@@ -3630,8 +3630,8 @@
 msgid "Edit Items"
 msgstr "Modifier des &eacute;l&eacute;ments"
 
-#: ../share/roundup/templates/classic/html/_generic.item.html:51
-#: ../share/roundup/templates/minimal/html/_generic.item.html:51
+#: ../share/roundup/templates/classic/html/_generic.item.html:52
+#: ../share/roundup/templates/minimal/html/_generic.item.html:52
 msgid ""
 "Showing 10 items. <a href=\"\">Show all history</a> (warning: this could be "
 "VERY long)"
--- a/locale/hu.po	Thu Jul 14 15:31:05 2022 -0400
+++ b/locale/hu.po	Thu Jul 14 15:42:31 2022 -0400
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: Roundup 1.3.3\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2022-06-30 16:36-0400\n"
+"POT-Creation-Date: 2022-07-12 19:10-0400\n"
 "PO-Revision-Date: 2013-10-31 12:19+0100\n"
 "Last-Translator: kilo aka Gabor Kmetyko <kg_kilo@freemail.hu>\n"
 "Language-Team: Hungarian\n"
@@ -3073,8 +3073,8 @@
 msgid "Edit Items"
 msgstr "Elemek szerkesztése"
 
-#: ../share/roundup/templates/classic/html/_generic.item.html:51
-#: ../share/roundup/templates/minimal/html/_generic.item.html:51
+#: ../share/roundup/templates/classic/html/_generic.item.html:52
+#: ../share/roundup/templates/minimal/html/_generic.item.html:52
 msgid ""
 "Showing 10 items. <a href=\"\">Show all history</a> (warning: this could be "
 "VERY long)"
--- a/locale/it.po	Thu Jul 14 15:31:05 2022 -0400
+++ b/locale/it.po	Thu Jul 14 15:42:31 2022 -0400
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: roundup cvs\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2022-06-30 16:36-0400\n"
+"POT-Creation-Date: 2022-07-12 19:10-0400\n"
 "PO-Revision-Date: 2013-10-31 12:20+0100\n"
 "Last-Translator: Marco Ghidinelli <marco.ghidinelli@ing.unibs.it>\n"
 "Language-Team: italian <it@li.org>\n"
@@ -3026,8 +3026,8 @@
 msgid "Edit Items"
 msgstr "Modifica L'Oggetto"
 
-#: ../share/roundup/templates/classic/html/_generic.item.html:51
-#: ../share/roundup/templates/minimal/html/_generic.item.html:51
+#: ../share/roundup/templates/classic/html/_generic.item.html:52
+#: ../share/roundup/templates/minimal/html/_generic.item.html:52
 msgid ""
 "Showing 10 items. <a href=\"\">Show all history</a> (warning: this could be "
 "VERY long)"
--- a/locale/ja.po	Thu Jul 14 15:31:05 2022 -0400
+++ b/locale/ja.po	Thu Jul 14 15:42:31 2022 -0400
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: Roundup 1.4.8\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2022-06-30 16:36-0400\n"
+"POT-Creation-Date: 2022-07-12 19:10-0400\n"
 "PO-Revision-Date: 2013-10-31 12:20+0100\n"
 "Last-Translator: Yasushi Iwata <iwata@know-net.co.jp>\n"
 "Language-Team: Yasushi Iwata <iwata@know-net.co.jp>\n"
@@ -2865,8 +2865,8 @@
 msgid "Edit Items"
 msgstr "アイテムの編集"
 
-#: ../share/roundup/templates/classic/html/_generic.item.html:51
-#: ../share/roundup/templates/minimal/html/_generic.item.html:51
+#: ../share/roundup/templates/classic/html/_generic.item.html:52
+#: ../share/roundup/templates/minimal/html/_generic.item.html:52
 msgid ""
 "Showing 10 items. <a href=\"\">Show all history</a> (warning: this could be "
 "VERY long)"
--- a/locale/lt.po	Thu Jul 14 15:31:05 2022 -0400
+++ b/locale/lt.po	Thu Jul 14 15:42:31 2022 -0400
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: roundup-1.1.2\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2022-06-30 16:36-0400\n"
+"POT-Creation-Date: 2022-07-12 19:10-0400\n"
 "PO-Revision-Date: 2013-10-31 12:21+0100\n"
 "Last-Translator: Nerijus Baliunas <nerijus@users.sourceforge.net>\n"
 "Language-Team: \n"
@@ -3518,8 +3518,8 @@
 msgid "Edit Items"
 msgstr "Redaguoti elementus"
 
-#: ../share/roundup/templates/classic/html/_generic.item.html:51
-#: ../share/roundup/templates/minimal/html/_generic.item.html:51
+#: ../share/roundup/templates/classic/html/_generic.item.html:52
+#: ../share/roundup/templates/minimal/html/_generic.item.html:52
 msgid ""
 "Showing 10 items. <a href=\"\">Show all history</a> (warning: this could be "
 "VERY long)"
--- a/locale/nb.po	Thu Jul 14 15:31:05 2022 -0400
+++ b/locale/nb.po	Thu Jul 14 15:42:31 2022 -0400
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2022-06-30 16:36-0400\n"
+"POT-Creation-Date: 2022-07-12 19:10-0400\n"
 "PO-Revision-Date: 2013-10-31 12:21+0100\n"
 "Last-Translator: Christian Aastorp <christian.aastorp@gmail.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -3514,8 +3514,8 @@
 msgid "Edit Items"
 msgstr "Rediger saker"
 
-#: ../share/roundup/templates/classic/html/_generic.item.html:51
-#: ../share/roundup/templates/minimal/html/_generic.item.html:51
+#: ../share/roundup/templates/classic/html/_generic.item.html:52
+#: ../share/roundup/templates/minimal/html/_generic.item.html:52
 msgid ""
 "Showing 10 items. <a href=\"\">Show all history</a> (warning: this could be "
 "VERY long)"
--- a/locale/roundup.pot	Thu Jul 14 15:31:05 2022 -0400
+++ b/locale/roundup.pot	Thu Jul 14 15:42:31 2022 -0400
@@ -6,9 +6,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: Roundup 2.2.0b1\n"
+"Project-Id-Version: Roundup 2.2.0\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2022-06-30 16:36-0400\n"
+"POT-Creation-Date: 2022-07-12 19:10-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -2824,8 +2824,8 @@
 msgid "Edit Items"
 msgstr ""
 
-#: ../share/roundup/templates/classic/html/_generic.item.html:51
-#: ../share/roundup/templates/minimal/html/_generic.item.html:51
+#: ../share/roundup/templates/classic/html/_generic.item.html:52
+#: ../share/roundup/templates/minimal/html/_generic.item.html:52
 msgid ""
 "Showing 10 items. <a href=\"\">Show all history</a> (warning: this could be "
 "VERY long)"
--- a/locale/ru.po	Thu Jul 14 15:31:05 2022 -0400
+++ b/locale/ru.po	Thu Jul 14 15:42:31 2022 -0400
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: Roundup 1.3.2\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2022-06-30 16:36-0400\n"
+"POT-Creation-Date: 2022-07-12 19:10-0400\n"
 "PO-Revision-Date: 2013-10-31 12:21+0100\n"
 "Last-Translator: alexander smishlajev <alex@tycobka.lv>\n"
 "Language-Team: Russian\n"
@@ -3559,8 +3559,8 @@
 msgid "Edit Items"
 msgstr ""
 
-#: ../share/roundup/templates/classic/html/_generic.item.html:51
-#: ../share/roundup/templates/minimal/html/_generic.item.html:51
+#: ../share/roundup/templates/classic/html/_generic.item.html:52
+#: ../share/roundup/templates/minimal/html/_generic.item.html:52
 msgid ""
 "Showing 10 items. <a href=\"\">Show all history</a> (warning: this could be "
 "VERY long)"
--- a/locale/zh_CN.po	Thu Jul 14 15:31:05 2022 -0400
+++ b/locale/zh_CN.po	Thu Jul 14 15:42:31 2022 -0400
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: 0.8.3\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2022-06-30 16:36-0400\n"
+"POT-Creation-Date: 2022-07-12 19:10-0400\n"
 "PO-Revision-Date: 2013-10-31 12:22+0100\n"
 "Last-Translator: Cheer Xiao <xiaqqaix@gmail.com>\n"
 "Language-Team: Chinese Simplified <limodou@gmail.com>\n"
@@ -3279,8 +3279,8 @@
 msgid "Edit Items"
 msgstr "编辑项目"
 
-#: ../share/roundup/templates/classic/html/_generic.item.html:51
-#: ../share/roundup/templates/minimal/html/_generic.item.html:51
+#: ../share/roundup/templates/classic/html/_generic.item.html:52
+#: ../share/roundup/templates/minimal/html/_generic.item.html:52
 msgid ""
 "Showing 10 items. <a href=\"\">Show all history</a> (warning: this could be "
 "VERY long)"
--- a/locale/zh_TW.po	Thu Jul 14 15:31:05 2022 -0400
+++ b/locale/zh_TW.po	Thu Jul 14 15:42:31 2022 -0400
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: 0.8.3\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2022-06-30 16:36-0400\n"
+"POT-Creation-Date: 2022-07-12 19:10-0400\n"
 "PO-Revision-Date: 2013-10-31 12:23+0100\n"
 "Last-Translator: Fred Lin <gasolin@gmail>\n"
 "Language-Team: Chinese Traditional <gasolin@gmail.com>\n"
@@ -3287,8 +3287,8 @@
 msgid "Edit Items"
 msgstr "編輯項目"
 
-#: ../share/roundup/templates/classic/html/_generic.item.html:51
-#: ../share/roundup/templates/minimal/html/_generic.item.html:51
+#: ../share/roundup/templates/classic/html/_generic.item.html:52
+#: ../share/roundup/templates/minimal/html/_generic.item.html:52
 msgid ""
 "Showing 10 items. <a href=\"\">Show all history</a> (warning: this could be "
 "VERY long)"
--- a/roundup/__init__.py	Thu Jul 14 15:31:05 2022 -0400
+++ b/roundup/__init__.py	Thu Jul 14 15:42:31 2022 -0400
@@ -67,6 +67,6 @@
 '''
 __docformat__ = 'restructuredtext'
 
-__version__ = '2.2.0b1'
+__version__ = '2.2.0'
 
 # vim: set filetype=python ts=4 sw=4 et si
--- a/setup.py	Thu Jul 14 15:31:05 2022 -0400
+++ b/setup.py	Thu Jul 14 15:42:31 2022 -0400
@@ -198,8 +198,8 @@
           long_description_content_type='text/x-rst',
           url='https://www.roundup-tracker.org',
           download_url='https://pypi.org/project/roundup',
-          classifiers=[#'Development Status :: 5 - Production/Stable',
-                       'Development Status :: 4 - Beta',
+          classifiers=['Development Status :: 5 - Production/Stable',
+                       #'Development Status :: 4 - Beta',
                        #'Development Status :: 3 - Alpha',
                        'Environment :: Console',
                        'Environment :: Web Environment',
@@ -210,7 +210,7 @@
                        'Intended Audience :: System Administrators',
                        'License :: OSI Approved',
                        'License :: OSI Approved :: MIT License',
-                       'License :: OSI Approved :: Zope Public License'
+                       'License :: OSI Approved :: Zope Public License',
                        'Operating System :: MacOS :: MacOS X',
                        'Operating System :: Microsoft :: Windows',
                        'Operating System :: POSIX',
Binary file website/www/_static/favicon.ico has changed
--- a/website/www/_static/style.css	Thu Jul 14 15:31:05 2022 -0400
+++ b/website/www/_static/style.css	Thu Jul 14 15:42:31 2022 -0400
@@ -161,3 +161,25 @@
 }
 /* set background when using borland pygments style */
 div.highlight pre { background: lightyellow;}
+
+#skiplink { display: block;
+                   margin-block-start: 1em;
+                   margin-inline-start: 1em;}
+#skiplink a {
+  /* force stuff for screenreader off screen */
+  position:absolute;
+  left:-10000px;
+  top:auto;
+  width:1px;
+  height:1px;
+  overflow:hidden;
+  padding: 0 0.75em;
+  font-weight: bold;
+}
+#skiplink a:focus { position: static;
+                    width: auto;
+                    height: auto; }
+
+/* remove solid black border when focus is around the main section
+   due to activation of skip-link. Page jumps there, that's enough. */
+#main:focus-visible {outline: none;}
--- a/website/www/_templates/layout.html	Thu Jul 14 15:31:05 2022 -0400
+++ b/website/www/_templates/layout.html	Thu Jul 14 15:42:31 2022 -0400
@@ -3,8 +3,10 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1">
-    <meta name="Description"
-	  content="Documentation on the Roundup issue tracker, version {{ release|e }}.">
+    {%- if 'name="description"' not in metatags %}
+      <meta name="description"
+        content="Page {{ pagename }} in documentation on the Roundup issue tracker, version {{ release|e }}.">
+    {%- endif %}
     {{ metatags }}
     {%- if builder != 'htmlhelp' %}
       {%- set titlesuffix = docstitle|e %}
@@ -30,6 +32,12 @@
           FILE_SUFFIX: '{{ file_suffix }}'
       };
     </script>
+    {%- if pagename == 'search' %}
+    {%- for scriptfile in script_files %}
+    <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
+    {%- endfor %}
+    <script type="text/javascript">$('#searchbox').show(0);</script>
+    {%- endif %}
     {%- if pageurl %}
     <link rel="canonical" href="{{ pageurl|e }}" />
     {%- endif %}
@@ -62,15 +70,15 @@
     <link rel="prev" title="{{ prev.title|striptags }}" href="{{ prev.link|e }}" />
     {%- endif %}
 {%- endblock %}
-{%- block extrahead %} {% endblock %}
   </head>
   <body>
+    <div id="skiplink"><a href="#main">Skip to main content</a></div>
     <div class="header"><h1>Roundup</h1>
       {%- if pagename != "search" %}
         <div id="searchbox" style="display: none">
           <form class="search" action="{{ pathto('search') }}" method="get">
             <input type="text" aria-label="Enter search terms"
-		   name="q" size="18" />
+		   name="q" size="18" autocomplete="on" />
             <input type="submit" value="{{ _('Search') }}" />
             <input type="hidden" name="check_keywords" value="yes" />
             <input type="hidden" name="area" value="default" />
@@ -79,9 +87,11 @@
       {%- endif %}
     </div>
     <div class="navigation">
+      <nav>
       <div class="menu">
        {{ toctree() }}
       </div>
+      </nav>
     </div>
     <div class="content">
 	<div id="subnav">
@@ -96,7 +106,9 @@
         <a title="{{ _('Index') }}" href="{{ pathto('genindex') }}">
 	  Index</a>
 	</div>
+	<main id="main" tabindex="-1">
        {% block body %} {% endblock %}
+	</main>
     </div>
 {%- block footer %}
     <div class="footer">
@@ -114,7 +126,7 @@
       {%- if last_updated %}
         {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
       {%- endif %}
-      <span>Hosted by <a href="https://sourceforge.net"><img src="https://sflogo.sourceforge.net/sflogo.php?group_id=31577&amp;type=1" width="88" height="31" border="0" alt="SourceForge.net Logo" /></a></span>
+      <span>Hosted by <a href="https://sourceforge.net"><img src="https://sflogo.sourceforge.net/sflogo.php?group_id=31577&amp;type=1" width="88" height="31" alt="SourceForge.net Logo" /></a></span>
       </div>
     </div>
 {%- endblock %}
@@ -131,9 +143,13 @@
 	    integrity="sha384-QGgNMMRFTi8ul5kHJ+vXysPe8gySvSA/Y3rpXZiRLzKPIw8CWY+a3ObKmQsyDr+a"
             async="" src="{{ pathto('_static/goatcounter_count.v3.js', 1) }}">
     </script>
+    {%- if pagename != 'search' %}
     {%- for scriptfile in script_files %}
     <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
     {%- endfor %}
     <script type="text/javascript">$('#searchbox').show(0);</script>
+    {%- endif %}
+    {%- block extrahead %} {% endblock %}
+
   </body>
 </html>
--- a/website/www/conf.py	Thu Jul 14 15:31:05 2022 -0400
+++ b/website/www/conf.py	Thu Jul 14 15:42:31 2022 -0400
@@ -57,7 +57,7 @@
 # The short X.Y version.
 version = '2.2'
 # The full version, including alpha/beta/rc tags.
-release = '2.2.0b1'
+release = '2.2.0'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
@@ -121,7 +121,7 @@
 # The name of an image file (within the static path) to use as favicon of the
 # docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
 # pixels large.
-#html_favicon = None
+html_favicon = '_static/favicon.ico'
 
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
@@ -141,8 +141,8 @@
 # taken as relative to the configuration directory. They are copied to
 # the output directory. They will overwrite any existing file of the
 # same name.
-# warning about it nt being in TOC tree causes build to fail with -W.
-# so install robots.txt via Makefile
+# Warns that robots.txt is not in TOC tree. Causes build to fail with
+# sphinx-build -W. So install robots.txt via Makefile.
 # html_extra_path = ['robots.txt']
 
 # Custom sidebar templates, maps document names to template names.
@@ -171,7 +171,7 @@
 # If true, an OpenSearch description file will be output, and all pages will
 # contain a <link> tag referring to it.  The value of this option must be the
 # base URL from which the finished HTML is served.
-#html_use_opensearch = ''
+html_use_opensearch = 'https://www.roundup-tracker.org'
 
 # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
 #html_file_suffix = ''
--- a/website/www/index.txt	Thu Jul 14 15:31:05 2022 -0400
+++ b/website/www/index.txt	Thu Jul 14 15:42:31 2022 -0400
@@ -18,38 +18,67 @@
 
 .. raw:: html
 
+   <div class="release_info note">
    <div class="release_info note">Download:
-   <a href="https://pypi.org/project/roundup/#files/">latest</a></div>
+   <a
+      href="https://pypi.org/project/roundup/#files">Download:
+     <img style="vertical-align: text-top"
+     src="https://badge.fury.io/py/roundup.svg?color=lightblue"
+      alt="PyPI version" height="18"></a>
+   <!--  <img src="https://shields.io/pypi/pyversions/roundup"> -->
+   <a style="display:block; margin-block-start: 1em; text-align:
+   center;" href="https://pypistats.org/packages/roundup" alt="">
+   <img
+   src="https://img.shields.io/badge/dynamic/json?color=blue&label=downloads%2Fmonth&cacheSeconds=86400&query=data.last_month&url=https%3A%2F%2Fpypistats.org%2Fapi%2Fpackages%2Froundup%2Frecent"
+   alt=""></a>
+   </div>
 
 Roundup is a simple-to-use and -install issue-tracking system with
 command-line, web, REST, XML-RPC and e-mail interfaces.  It is based
 on the winning design from Ka-Ping Yee in the Software Carpentry
 "Track" design competition.
 
-The current stable version of Roundup is 2.1.0. It is a bug fix
-and minor feature release for the major 2.0.0 release which
-added:
+The current stable version of Roundup is 2.2.0. It is a bug fix
+and feature release for the 2.1.0 release 
+
+Some improvements from the 2.1.0 release are:
+
+    * Roundup supports dynamic and static compression of http
+      responses. This improves performance when a front end web
+      server isn't serving compressed assets.
 
-   * Python 2 and Python 3 support
-   * a new REST interface
-   * updates to jinja2 templates including security improvements
+    * REST interface: supports CORS allowing Roundup to be
+      used by third party web sites. Origins allowed to use
+      REST can be specified. OpenAPI (Swagger) docs can be
+      added. Error handling/reporting improved.
 
-Fixes and features in the 2.1.0 release include:
+    * Dockerfile support. Docker-compose for a mysql based
+      tracker.
+
+    * New full text search methods. SQLite FTS and PostgreSQL
+      full text search are supported. These allow search
+      expressions in addition to simple word based searches.
 
-   * Installation uses setuptools and not distutils.
-   * Mysql backend now uses an index to make sure that key values are
-     not duplicated when two roundup processes run in parallel.
-   * Postgres back end now uses a server side cursor, so large queries
-     won't consume huge amounts of memory.
-   * Security fixes for jQuery, markdown handling,
-   * Valid class names are documented and enforced. All class names now
-     match ``[A-z][A-z0-9_]+[A-z_]``.
-   * Fixes/improvements to jinja2 templates
-   * Fixes for python3 compatibility.
-   * Fix sorting of multilinks in templating code.
-   * Password reset documented in user guide.
+    * Secret values in config.ini can be stored in external
+      files. This allows config.ini to be stored in a VCS
+      without exposing secrets.
+
+    * Translation object added to internal database handle. This
+      allows auditors and extensions to provide efficient
+      translations.
+
+    * MySQL database creation uses COLLATE utf8_general_ci
 
-More info on the 58 changes can be found in the `change note`_.
+    * Wsgi startup improvements (must be enabled by setting
+      feature flag).
+
+    * Fix crash when importing legacy Roundup tracker with long
+      integers.
+
+    * Fix issues with Roundup unable to find supporting files
+      when installed via pip.
+
+More info on the 57 changes can be found in the `change note`_.
 
 For more information on Roundup see the :doc:`design overview
 <docs/design>`, and all the other :doc:`documentation <docs>`. Roundup

Roundup Issue Tracker: http://roundup-tracker.org/