changeset 7530:ed2bc951277b

Updates for 2.3.0 release.
author John Rouillard <rouilj@ieee.org>
date Wed, 12 Jul 2023 22:59:49 -0400
parents 05448536f154
children 913a73b9fab5
files CHANGES.txt RELEASE.txt doc/acknowledgements.txt doc/announcement.txt doc/security.txt locale/de.po locale/en.po locale/es.po locale/fr.po locale/hu.po locale/it.po locale/ja.po locale/lt.po locale/nb.po locale/roundup.pot locale/ru.po locale/zh_CN.po locale/zh_TW.po roundup/__init__.py scripts/Docker/Dockerfile setup.py website/www/index.txt website/www/signatures/roundup-2.3.0.tar.gz.asc
diffstat 23 files changed, 181 insertions(+), 157 deletions(-) [+]
line wrap: on
line diff
--- a/CHANGES.txt	Tue Jul 11 00:38:22 2023 -0400
+++ b/CHANGES.txt	Wed Jul 12 22:59:49 2023 -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).
 
-2023-xx-yy 2.3.0
+2023-07-13 2.3.0
 
 Fixed:
 
--- a/RELEASE.txt	Tue Jul 11 00:38:22 2023 -0400
+++ b/RELEASE.txt	Wed Jul 12 22:59:49 2023 -0400
@@ -103,7 +103,7 @@
     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 ; \
+      hg status --rev 2.2.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
 
@@ -114,7 +114,7 @@
     (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 ; \
+      hg status --rev 2.2.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
 
@@ -141,7 +141,7 @@
 
      Move file to website/www/signature directory
 
-       mv <filename>.tar.gz.asc ../webite/www/signature/.
+       mv <filename>.tar.gz.asc ../webite/www/signatures/.
        hg add ../website/www/signature/<filename>.tar.gz.asc
        # commiting the file will be done in step 12
        cd ..
--- a/doc/acknowledgements.txt	Tue Jul 11 00:38:22 2023 -0400
+++ b/doc/acknowledgements.txt	Wed Jul 12 22:59:49 2023 -0400
@@ -28,7 +28,7 @@
 
 Developer activity by changesets::
 
-  rouilj@ieee.org    636 *****************************************************
+  rouilj@ieee.org    722 ****************************************************
   rsc@runtux.com      14 *
 
 Other contributers
--- a/doc/announcement.txt	Tue Jul 11 00:38:22 2023 -0400
+++ b/doc/announcement.txt	Wed Jul 12 22:59:49 2023 -0400
@@ -1,5 +1,5 @@
-I'm proud to release version 2.3.0b2 of the Roundup issue
-tracker.  This release is a bugfix and minor feature
+I'm proud to release version 2.3.0 of the Roundup issue
+tracker.  This release is a bugfix and 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.
@@ -24,10 +24,11 @@
 
 Among the notable improvements from the 2.2.0 release are:
 
-* Dockerfile demo mode implemented.
+* Dockerfile demo mode implemented. This allows quick evaluation as
+  well as the ability to spin up a configured tracker to customise.
 
 * SQLite backends can use WAL mode to reduce blocking between readers
-  and writers.
+  and writers improving concurrent use.
 
 * Redis can be used for session database with SQLite and dbm
   backends. Provides a major performance improvement.
@@ -38,13 +39,13 @@
 * Postgres full text index can now be enabled.
 
 * Modifications to in-reply-to threading when there are multiple
-  matches.
+  matches resulting in more predictable handling of messages.
 
 * Many updates to documentation to make it scannable, useful and
   work on mobile.
 
 * Admin documentation includes a section on setting up Content
-  Security Policy (CSP)
+  Security Policy (CSP) to better secure your Roundup trackers.
 
 * REST now allows rate limiting headers to be accessed by client
   JavaScript.
@@ -52,7 +53,8 @@
 * Default number of rounds for PBKDF2 updated to 2M to account for
   improvements in password crackers and CPU power.
 
-* Support PBKDF2 with SHA512 for password storage
+* Support PBKDF2 with SHA512 for password storage to improve
+  resistance to password crackers.
 
 * Deprecate SSHA password hash function.
 
@@ -60,13 +62,14 @@
   incurred by reindexing.
 
 * roundup-admin can list available templates and their installed
-  locations.
+  locations. This is useful when installing via pip or in a docker
+  container as supporting files are not stored in the usual locations
+  like /usr/share/roundup.
 
-* Crash fixes in detector handling, configuration handling, fix for
-  sorting of multilinks.
+* Crash fixes in detector handling
 
 The file CHANGES.txt has a detailed list of feature additions and
-bug fixes (52) for each release. The most recent changes from
+bug fixes (53) for each release. The most recent changes from
 there are at the end of this announcement. Also see the
 information in doc/upgrading.txt.
 
@@ -148,7 +151,7 @@
 Recent Changes
 ==============
 
-From 2.2.0 to 2.3.0b2
+From 2.2.0 to 2.3.0
 
 Fixed:
 ------
@@ -207,7 +210,7 @@
   'Access-Control-Allow-Credentials' when not matching '*'. Fixes
   security issue with rest when using '*'.  (John Rouillard)
 - issue2551263: In REST response expose rate limiting, sunset, allow
-  HTTP headers to calling javascript.  (John Rouillard)
+  HTTP headers to calling JavaScript.  (John Rouillard)
 - issue2551257: When downloading an attached (user supplied file),
   make sure that an 'X-Content-Type-Options: nosniff' header is sent.
   (John Rouillard)
@@ -298,3 +301,6 @@
   reindex the first 1000 issues while reporting any missing issues
   in the range. Also completion progress is reported when indexing a
   specific class.
+- doc updates: add explanation for SQL code in 1.3.3->1.4.0 upgrade.
+  document schema table in rdbms backends and how to dump/extract
+  version from them. (John Rouillard)
--- a/doc/security.txt	Tue Jul 11 00:38:22 2023 -0400
+++ b/doc/security.txt	Wed Jul 12 22:59:49 2023 -0400
@@ -102,6 +102,7 @@
 
 .. rst-class:: multicol
 
+* `2.3.0 <../signatures/roundup-2.3.0.tar.gz.asc>`_
 * `2.3.0b2 <../signatures/roundup-2.3.0b2.tar.gz.asc>`_
 * `2.2.0 <../signatures/roundup-2.2.0.tar.gz.asc>`_
 * `2.1.0 <../signatures/roundup-2.1.0.tar.gz.asc>`_
--- a/locale/de.po	Tue Jul 11 00:38:22 2023 -0400
+++ b/locale/de.po	Wed Jul 12 22:59:49 2023 -0400
@@ -5,9 +5,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Roundup 2.3.0b2\n"
+"Project-Id-Version: Roundup 2.3.0\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2023-05-29 20:29-0400\n"
+"POT-Creation-Date: 2023-07-12 22:51-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"
@@ -2520,38 +2520,38 @@
 "property %(property)s: %(value)r is an invalid date interval (%(errormsg)s)"
 msgstr "Eigenschaft %s: %r ist kein gültiges Datumsintervall (%s)"
 
-#: ../roundup/hyperdb.py:429
+#: ../roundup/hyperdb.py:434
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a number"
 msgstr "Eigenschaft %s: %r ist keine Zahl"
 
-#: ../roundup/hyperdb.py:443
+#: ../roundup/hyperdb.py:448
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not an integer"
 msgstr "Eigenschaft %s: %r ist keine Zahl"
 
-#: ../roundup/hyperdb.py:465
+#: ../roundup/hyperdb.py:470
 #, python-format
 msgid "\"%s\" not a node designator"
 msgstr "\"%s\" ist kein gültiger Bezeichner"
 
-#: ../roundup/hyperdb.py:1494 ../roundup/hyperdb.py:1502
-#: ../roundup/hyperdb.py:1494:1502
+#: ../roundup/hyperdb.py:1499 ../roundup/hyperdb.py:1507
+#: ../roundup/hyperdb.py:1499:1507
 #, python-format
 msgid "Not a property name: %s"
 msgstr "Keine Eigenschaft: %s"
 
-#: ../roundup/hyperdb.py:1979
+#: ../roundup/hyperdb.py:1984
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a %(classname)s."
 msgstr "Der Wert \"%(value)s\" ist nicht in der Liste für \"%(propname)s\""
 
-#: ../roundup/hyperdb.py:1985
+#: ../roundup/hyperdb.py:1990
 #, python-format
 msgid "you may only enter ID values for property %s"
 msgstr "Sie können für die Eigenschaft %s  nur IDs eingeben"
 
-#: ../roundup/hyperdb.py:2020
+#: ../roundup/hyperdb.py:2025
 #, fuzzy, python-format
 msgid "%(property)r is not a property of %(classname)s"
 msgstr "%r ist keine Eigenschaft von %s"
--- a/locale/en.po	Tue Jul 11 00:38:22 2023 -0400
+++ b/locale/en.po	Wed Jul 12 22:59:49 2023 -0400
@@ -9,9 +9,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Roundup 2.3.0b2\n"
+"Project-Id-Version: Roundup 2.3.0\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2023-05-29 20:29-0400\n"
+"POT-Creation-Date: 2023-07-12 22:51-0400\n"
 "PO-Revision-Date: 2004-11-20 13:47+0200\n"
 "Last-Translator: Not applicable\n"
 "Language-Team: English\n"
@@ -2042,38 +2042,38 @@
 "property %(property)s: %(value)r is an invalid date interval (%(errormsg)s)"
 msgstr ""
 
-#: ../roundup/hyperdb.py:429
+#: ../roundup/hyperdb.py:434
 #, python-format
 msgid "property %(property)s: %(value)r is not a number"
 msgstr ""
 
-#: ../roundup/hyperdb.py:443
+#: ../roundup/hyperdb.py:448
 #, python-format
 msgid "property %(property)s: %(value)r is not an integer"
 msgstr ""
 
-#: ../roundup/hyperdb.py:465
+#: ../roundup/hyperdb.py:470
 #, python-format
 msgid "\"%s\" not a node designator"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1494 ../roundup/hyperdb.py:1502
-#: ../roundup/hyperdb.py:1494:1502
+#: ../roundup/hyperdb.py:1499 ../roundup/hyperdb.py:1507
+#: ../roundup/hyperdb.py:1499:1507
 #, python-format
 msgid "Not a property name: %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1979
+#: ../roundup/hyperdb.py:1984
 #, python-format
 msgid "property %(property)s: %(value)r is not a %(classname)s."
 msgstr ""
 
-#: ../roundup/hyperdb.py:1985
+#: ../roundup/hyperdb.py:1990
 #, python-format
 msgid "you may only enter ID values for property %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:2020
+#: ../roundup/hyperdb.py:2025
 #, python-format
 msgid "%(property)r is not a property of %(classname)s"
 msgstr ""
--- a/locale/es.po	Tue Jul 11 00:38:22 2023 -0400
+++ b/locale/es.po	Wed Jul 12 22:59:49 2023 -0400
@@ -5,9 +5,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Roundup 2.3.0b2\n"
+"Project-Id-Version: Roundup 2.3.0\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2023-05-29 20:29-0400\n"
+"POT-Creation-Date: 2023-07-12 22:51-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"
@@ -2539,44 +2539,44 @@
 "property %(property)s: %(value)r is an invalid date interval (%(errormsg)s)"
 msgstr ""
 
-#: ../roundup/hyperdb.py:429
+#: ../roundup/hyperdb.py:434
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a number"
 msgstr ""
 "propiedad \"%(propname)s\": \"%(value)s\" no se encuentra en este momento en "
 "la lista"
 
-#: ../roundup/hyperdb.py:443
+#: ../roundup/hyperdb.py:448
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not an integer"
 msgstr ""
 "propiedad \"%(propname)s\": \"%(value)s\" no se encuentra en este momento en "
 "la lista"
 
-#: ../roundup/hyperdb.py:465
+#: ../roundup/hyperdb.py:470
 #, python-format
 msgid "\"%s\" not a node designator"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1494 ../roundup/hyperdb.py:1502
-#: ../roundup/hyperdb.py:1494:1502
+#: ../roundup/hyperdb.py:1499 ../roundup/hyperdb.py:1507
+#: ../roundup/hyperdb.py:1499:1507
 #, python-format
 msgid "Not a property name: %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1979
+#: ../roundup/hyperdb.py:1984
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a %(classname)s."
 msgstr ""
 "propiedad \"%(propname)s\": \"%(value)s\" no se encuentra en este momento en "
 "la lista"
 
-#: ../roundup/hyperdb.py:1985
+#: ../roundup/hyperdb.py:1990
 #, python-format
 msgid "you may only enter ID values for property %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:2020
+#: ../roundup/hyperdb.py:2025
 #, python-format
 msgid "%(property)r is not a property of %(classname)s"
 msgstr ""
--- a/locale/fr.po	Tue Jul 11 00:38:22 2023 -0400
+++ b/locale/fr.po	Wed Jul 12 22:59:49 2023 -0400
@@ -8,9 +8,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Roundup 2.3.0b2\n"
+"Project-Id-Version: Roundup 2.3.0\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2023-05-29 20:29-0400\n"
+"POT-Creation-Date: 2023-07-12 22:51-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"
@@ -2565,44 +2565,44 @@
 "property %(property)s: %(value)r is an invalid date interval (%(errormsg)s)"
 msgstr ""
 
-#: ../roundup/hyperdb.py:429
+#: ../roundup/hyperdb.py:434
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a number"
 msgstr ""
 "proprit %(propname)s: %(value)s n'est pas actuellement dans la "
 "liste"
 
-#: ../roundup/hyperdb.py:443
+#: ../roundup/hyperdb.py:448
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not an integer"
 msgstr ""
 "proprit %(propname)s: %(value)s n'est pas actuellement dans la "
 "liste"
 
-#: ../roundup/hyperdb.py:465
+#: ../roundup/hyperdb.py:470
 #, python-format
 msgid "\"%s\" not a node designator"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1494 ../roundup/hyperdb.py:1502
-#: ../roundup/hyperdb.py:1494:1502
+#: ../roundup/hyperdb.py:1499 ../roundup/hyperdb.py:1507
+#: ../roundup/hyperdb.py:1499:1507
 #, python-format
 msgid "Not a property name: %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1979
+#: ../roundup/hyperdb.py:1984
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a %(classname)s."
 msgstr ""
 "proprit %(propname)s: %(value)s n'est pas actuellement dans la "
 "liste"
 
-#: ../roundup/hyperdb.py:1985
+#: ../roundup/hyperdb.py:1990
 #, python-format
 msgid "you may only enter ID values for property %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:2020
+#: ../roundup/hyperdb.py:2025
 #, python-format
 msgid "%(property)r is not a property of %(classname)s"
 msgstr ""
--- a/locale/hu.po	Tue Jul 11 00:38:22 2023 -0400
+++ b/locale/hu.po	Wed Jul 12 22:59:49 2023 -0400
@@ -6,9 +6,9 @@
 # kilo aka Gabor Kmetyko <kg_kilo@freemail.hu>, 2007.
 msgid ""
 msgstr ""
-"Project-Id-Version: Roundup 2.3.0b2\n"
+"Project-Id-Version: Roundup 2.3.0\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2023-05-29 20:29-0400\n"
+"POT-Creation-Date: 2023-07-12 22:51-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"
@@ -2205,39 +2205,39 @@
 "property %(property)s: %(value)r is an invalid date interval (%(errormsg)s)"
 msgstr ""
 
-#: ../roundup/hyperdb.py:429
+#: ../roundup/hyperdb.py:434
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a number"
 msgstr "\"%(propname)s\" tulajdonság: \"%(value)s\" jelenleg nincs a listában"
 
-#: ../roundup/hyperdb.py:443
+#: ../roundup/hyperdb.py:448
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not an integer"
 msgstr "\"%(propname)s\" tulajdonság: \"%(value)s\" jelenleg nincs a listában"
 
-#: ../roundup/hyperdb.py:465
+#: ../roundup/hyperdb.py:470
 #, python-format
 msgid "\"%s\" not a node designator"
 msgstr ""
 
 # ../roundup/hyperdb.py:949:957
-#: ../roundup/hyperdb.py:1494 ../roundup/hyperdb.py:1502
-#: ../roundup/hyperdb.py:1494:1502
+#: ../roundup/hyperdb.py:1499 ../roundup/hyperdb.py:1507
+#: ../roundup/hyperdb.py:1499:1507
 #, python-format
 msgid "Not a property name: %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1979
+#: ../roundup/hyperdb.py:1984
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a %(classname)s."
 msgstr "\"%(propname)s\" tulajdonság: \"%(value)s\" jelenleg nincs a listában"
 
-#: ../roundup/hyperdb.py:1985
+#: ../roundup/hyperdb.py:1990
 #, python-format
 msgid "you may only enter ID values for property %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:2020
+#: ../roundup/hyperdb.py:2025
 #, python-format
 msgid "%(property)r is not a property of %(classname)s"
 msgstr ""
--- a/locale/it.po	Tue Jul 11 00:38:22 2023 -0400
+++ b/locale/it.po	Wed Jul 12 22:59:49 2023 -0400
@@ -5,9 +5,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Roundup 2.3.0b2\n"
+"Project-Id-Version: Roundup 2.3.0\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2023-05-29 20:29-0400\n"
+"POT-Creation-Date: 2023-07-12 22:51-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"
@@ -2131,41 +2131,41 @@
 "property %(property)s: %(value)r is an invalid date interval (%(errormsg)s)"
 msgstr ""
 
-#: ../roundup/hyperdb.py:429
+#: ../roundup/hyperdb.py:434
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a number"
 msgstr ""
 "la proprietà \"%(propname)s\": \"%(value)s\" non è al momento nella lista"
 
-#: ../roundup/hyperdb.py:443
+#: ../roundup/hyperdb.py:448
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not an integer"
 msgstr ""
 "la proprietà \"%(propname)s\": \"%(value)s\" non è al momento nella lista"
 
-#: ../roundup/hyperdb.py:465
+#: ../roundup/hyperdb.py:470
 #, python-format
 msgid "\"%s\" not a node designator"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1494 ../roundup/hyperdb.py:1502
-#: ../roundup/hyperdb.py:1494:1502
+#: ../roundup/hyperdb.py:1499 ../roundup/hyperdb.py:1507
+#: ../roundup/hyperdb.py:1499:1507
 #, python-format
 msgid "Not a property name: %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1979
+#: ../roundup/hyperdb.py:1984
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a %(classname)s."
 msgstr ""
 "la proprietà \"%(propname)s\": \"%(value)s\" non è al momento nella lista"
 
-#: ../roundup/hyperdb.py:1985
+#: ../roundup/hyperdb.py:1990
 #, python-format
 msgid "you may only enter ID values for property %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:2020
+#: ../roundup/hyperdb.py:2025
 #, python-format
 msgid "%(property)r is not a property of %(classname)s"
 msgstr ""
--- a/locale/ja.po	Tue Jul 11 00:38:22 2023 -0400
+++ b/locale/ja.po	Wed Jul 12 22:59:49 2023 -0400
@@ -5,9 +5,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Roundup 2.3.0b2\n"
+"Project-Id-Version: Roundup 2.3.0\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2023-05-29 20:29-0400\n"
+"POT-Creation-Date: 2023-07-12 22:51-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"
@@ -2054,38 +2054,38 @@
 "property %(property)s: %(value)r is an invalid date interval (%(errormsg)s)"
 msgstr ""
 
-#: ../roundup/hyperdb.py:429
+#: ../roundup/hyperdb.py:434
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a number"
 msgstr "プロパティ \"%(propname)s\": \"%(value)s\" がリストの中にありません"
 
-#: ../roundup/hyperdb.py:443
+#: ../roundup/hyperdb.py:448
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not an integer"
 msgstr "プロパティ \"%(propname)s\": \"%(value)s\" がリストの中にありません"
 
-#: ../roundup/hyperdb.py:465
+#: ../roundup/hyperdb.py:470
 #, python-format
 msgid "\"%s\" not a node designator"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1494 ../roundup/hyperdb.py:1502
-#: ../roundup/hyperdb.py:1494:1502
+#: ../roundup/hyperdb.py:1499 ../roundup/hyperdb.py:1507
+#: ../roundup/hyperdb.py:1499:1507
 #, python-format
 msgid "Not a property name: %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1979
+#: ../roundup/hyperdb.py:1984
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a %(classname)s."
 msgstr "プロパティ \"%(propname)s\": \"%(value)s\" がリストの中にありません"
 
-#: ../roundup/hyperdb.py:1985
+#: ../roundup/hyperdb.py:1990
 #, python-format
 msgid "you may only enter ID values for property %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:2020
+#: ../roundup/hyperdb.py:2025
 #, python-format
 msgid "%(property)r is not a property of %(classname)s"
 msgstr ""
--- a/locale/lt.po	Tue Jul 11 00:38:22 2023 -0400
+++ b/locale/lt.po	Wed Jul 12 22:59:49 2023 -0400
@@ -5,9 +5,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Roundup 2.3.0b2\n"
+"Project-Id-Version: Roundup 2.3.0\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2023-05-29 20:29-0400\n"
+"POT-Creation-Date: 2023-07-12 22:51-0400\n"
 "PO-Revision-Date: 2013-10-31 12:21+0100\n"
 "Last-Translator: Nerijus Baliunas <nerijus@users.sourceforge.net>\n"
 "Language-Team: \n"
@@ -2497,38 +2497,38 @@
 "property %(property)s: %(value)r is an invalid date interval (%(errormsg)s)"
 msgstr ""
 
-#: ../roundup/hyperdb.py:429
+#: ../roundup/hyperdb.py:434
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a number"
 msgstr "parinkties \"%(propname)s\": \"%(value)s\" nėra sąraše"
 
-#: ../roundup/hyperdb.py:443
+#: ../roundup/hyperdb.py:448
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not an integer"
 msgstr "parinkties \"%(propname)s\": \"%(value)s\" nėra sąraše"
 
-#: ../roundup/hyperdb.py:465
+#: ../roundup/hyperdb.py:470
 #, python-format
 msgid "\"%s\" not a node designator"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1494 ../roundup/hyperdb.py:1502
-#: ../roundup/hyperdb.py:1494:1502
+#: ../roundup/hyperdb.py:1499 ../roundup/hyperdb.py:1507
+#: ../roundup/hyperdb.py:1499:1507
 #, python-format
 msgid "Not a property name: %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1979
+#: ../roundup/hyperdb.py:1984
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a %(classname)s."
 msgstr "parinkties \"%(propname)s\": \"%(value)s\" nėra sąraše"
 
-#: ../roundup/hyperdb.py:1985
+#: ../roundup/hyperdb.py:1990
 #, python-format
 msgid "you may only enter ID values for property %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:2020
+#: ../roundup/hyperdb.py:2025
 #, python-format
 msgid "%(property)r is not a property of %(classname)s"
 msgstr ""
--- a/locale/nb.po	Tue Jul 11 00:38:22 2023 -0400
+++ b/locale/nb.po	Wed Jul 12 22:59:49 2023 -0400
@@ -5,9 +5,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Roundup 2.3.0b2\n"
+"Project-Id-Version: Roundup 2.3.0\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2023-05-29 20:29-0400\n"
+"POT-Creation-Date: 2023-07-12 22:51-0400\n"
 "PO-Revision-Date: 2013-10-31 12:21+0100\n"
 "Last-Translator: Christian Aastorp <christian.aastorp@gmail.com>\n"
 "Language-Team: Norwegian Bokmal <LL@li.org>\n"
@@ -2466,38 +2466,38 @@
 "property %(property)s: %(value)r is an invalid date interval (%(errormsg)s)"
 msgstr "egenskap %s: %r er et ugyldig datointervalll (%s)"
 
-#: ../roundup/hyperdb.py:429
+#: ../roundup/hyperdb.py:434
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a number"
 msgstr "egenskap %s: %r er ikke et nummer"
 
-#: ../roundup/hyperdb.py:443
+#: ../roundup/hyperdb.py:448
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not an integer"
 msgstr "egenskap %s: %r er ikke et nummer"
 
-#: ../roundup/hyperdb.py:465
+#: ../roundup/hyperdb.py:470
 #, python-format
 msgid "\"%s\" not a node designator"
 msgstr "\"%s\" ikke en node-benevnelse"
 
-#: ../roundup/hyperdb.py:1494 ../roundup/hyperdb.py:1502
-#: ../roundup/hyperdb.py:1494:1502
+#: ../roundup/hyperdb.py:1499 ../roundup/hyperdb.py:1507
+#: ../roundup/hyperdb.py:1499:1507
 #, python-format
 msgid "Not a property name: %s"
 msgstr "Ikke et navn på egenskap: %s"
 
-#: ../roundup/hyperdb.py:1979
+#: ../roundup/hyperdb.py:1984
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a %(classname)s."
 msgstr "egenskapen \"%(propname)s\": \"%(value)s\" er ikke i listen nå"
 
-#: ../roundup/hyperdb.py:1985
+#: ../roundup/hyperdb.py:1990
 #, python-format
 msgid "you may only enter ID values for property %s"
 msgstr "du kan bare oppgi ID-verdier for egenskap %s"
 
-#: ../roundup/hyperdb.py:2020
+#: ../roundup/hyperdb.py:2025
 #, fuzzy, python-format
 msgid "%(property)r is not a property of %(classname)s"
 msgstr "%r er ikke en egenskap ved %s"
--- a/locale/roundup.pot	Tue Jul 11 00:38:22 2023 -0400
+++ b/locale/roundup.pot	Wed Jul 12 22:59:49 2023 -0400
@@ -6,9 +6,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: Roundup 2.3.0b2\n"
+"Project-Id-Version: Roundup 2.3.0\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2023-05-31 19:36-0400\n"
+"POT-Creation-Date: 2023-07-12 22:51-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"
@@ -2029,38 +2029,38 @@
 "property %(property)s: %(value)r is an invalid date interval (%(errormsg)s)"
 msgstr ""
 
-#: ../roundup/hyperdb.py:429
+#: ../roundup/hyperdb.py:434
 #, python-format
 msgid "property %(property)s: %(value)r is not a number"
 msgstr ""
 
-#: ../roundup/hyperdb.py:443
+#: ../roundup/hyperdb.py:448
 #, python-format
 msgid "property %(property)s: %(value)r is not an integer"
 msgstr ""
 
-#: ../roundup/hyperdb.py:465
+#: ../roundup/hyperdb.py:470
 #, python-format
 msgid "\"%s\" not a node designator"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1494 ../roundup/hyperdb.py:1502
-#: ../roundup/hyperdb.py:1494:1502
+#: ../roundup/hyperdb.py:1499 ../roundup/hyperdb.py:1507
+#: ../roundup/hyperdb.py:1499:1507
 #, python-format
 msgid "Not a property name: %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1979
+#: ../roundup/hyperdb.py:1984
 #, python-format
 msgid "property %(property)s: %(value)r is not a %(classname)s."
 msgstr ""
 
-#: ../roundup/hyperdb.py:1985
+#: ../roundup/hyperdb.py:1990
 #, python-format
 msgid "you may only enter ID values for property %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:2020
+#: ../roundup/hyperdb.py:2025
 #, python-format
 msgid "%(property)r is not a property of %(classname)s"
 msgstr ""
--- a/locale/ru.po	Tue Jul 11 00:38:22 2023 -0400
+++ b/locale/ru.po	Wed Jul 12 22:59:49 2023 -0400
@@ -5,9 +5,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Roundup 2.3.0b2\n"
+"Project-Id-Version: Roundup 2.3.0\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2023-05-29 20:29-0400\n"
+"POT-Creation-Date: 2023-07-12 22:51-0400\n"
 "PO-Revision-Date: 2013-10-31 12:21+0100\n"
 "Last-Translator: alexander smishlajev <alex@tycobka.lv>\n"
 "Language-Team: Russian\n"
@@ -2506,38 +2506,38 @@
 "property %(property)s: %(value)r is an invalid date interval (%(errormsg)s)"
 msgstr ""
 
-#: ../roundup/hyperdb.py:429
+#: ../roundup/hyperdb.py:434
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a number"
 msgstr " \"%(propname)s\":  \"%(value)s\"   "
 
-#: ../roundup/hyperdb.py:443
+#: ../roundup/hyperdb.py:448
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not an integer"
 msgstr " \"%(propname)s\":  \"%(value)s\"   "
 
-#: ../roundup/hyperdb.py:465
+#: ../roundup/hyperdb.py:470
 #, python-format
 msgid "\"%s\" not a node designator"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1494 ../roundup/hyperdb.py:1502
-#: ../roundup/hyperdb.py:1494:1502
+#: ../roundup/hyperdb.py:1499 ../roundup/hyperdb.py:1507
+#: ../roundup/hyperdb.py:1499:1507
 #, python-format
 msgid "Not a property name: %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1979
+#: ../roundup/hyperdb.py:1984
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a %(classname)s."
 msgstr " \"%(propname)s\":  \"%(value)s\"   "
 
-#: ../roundup/hyperdb.py:1985
+#: ../roundup/hyperdb.py:1990
 #, python-format
 msgid "you may only enter ID values for property %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:2020
+#: ../roundup/hyperdb.py:2025
 #, python-format
 msgid "%(property)r is not a property of %(classname)s"
 msgstr ""
--- a/locale/zh_CN.po	Tue Jul 11 00:38:22 2023 -0400
+++ b/locale/zh_CN.po	Wed Jul 12 22:59:49 2023 -0400
@@ -6,9 +6,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Roundup 2.3.0b2\n"
+"Project-Id-Version: Roundup 2.3.0\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2023-05-29 20:29-0400\n"
+"POT-Creation-Date: 2023-07-12 22:51-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"
@@ -2370,38 +2370,38 @@
 "property %(property)s: %(value)r is an invalid date interval (%(errormsg)s)"
 msgstr ""
 
-#: ../roundup/hyperdb.py:429
+#: ../roundup/hyperdb.py:434
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a number"
 msgstr "属性 \"%(propname)s\": \"%(value)s\" 当前不在列表中"
 
-#: ../roundup/hyperdb.py:443
+#: ../roundup/hyperdb.py:448
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not an integer"
 msgstr "属性 \"%(propname)s\": \"%(value)s\" 当前不在列表中"
 
-#: ../roundup/hyperdb.py:465
+#: ../roundup/hyperdb.py:470
 #, python-format
 msgid "\"%s\" not a node designator"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1494 ../roundup/hyperdb.py:1502
-#: ../roundup/hyperdb.py:1494:1502
+#: ../roundup/hyperdb.py:1499 ../roundup/hyperdb.py:1507
+#: ../roundup/hyperdb.py:1499:1507
 #, python-format
 msgid "Not a property name: %s"
 msgstr "不是属性名: %s"
 
-#: ../roundup/hyperdb.py:1979
+#: ../roundup/hyperdb.py:1984
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a %(classname)s."
 msgstr "属性 \"%(propname)s\": \"%(value)s\" 当前不在列表中"
 
-#: ../roundup/hyperdb.py:1985
+#: ../roundup/hyperdb.py:1990
 #, python-format
 msgid "you may only enter ID values for property %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:2020
+#: ../roundup/hyperdb.py:2025
 #, python-format
 msgid "%(property)r is not a property of %(classname)s"
 msgstr ""
--- a/locale/zh_TW.po	Tue Jul 11 00:38:22 2023 -0400
+++ b/locale/zh_TW.po	Wed Jul 12 22:59:49 2023 -0400
@@ -5,9 +5,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Roundup 2.3.0b2\n"
+"Project-Id-Version: Roundup 2.3.0\n"
 "Report-Msgid-Bugs-To: roundup-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2023-05-29 20:29-0400\n"
+"POT-Creation-Date: 2023-07-12 22:51-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"
@@ -2372,38 +2372,38 @@
 "property %(property)s: %(value)r is an invalid date interval (%(errormsg)s)"
 msgstr ""
 
-#: ../roundup/hyperdb.py:429
+#: ../roundup/hyperdb.py:434
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a number"
 msgstr "屬性 \"%(propname)s\": \"%(value)s\" 當前不在列表中"
 
-#: ../roundup/hyperdb.py:443
+#: ../roundup/hyperdb.py:448
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not an integer"
 msgstr "屬性 \"%(propname)s\": \"%(value)s\" 當前不在列表中"
 
-#: ../roundup/hyperdb.py:465
+#: ../roundup/hyperdb.py:470
 #, python-format
 msgid "\"%s\" not a node designator"
 msgstr ""
 
-#: ../roundup/hyperdb.py:1494 ../roundup/hyperdb.py:1502
-#: ../roundup/hyperdb.py:1494:1502
+#: ../roundup/hyperdb.py:1499 ../roundup/hyperdb.py:1507
+#: ../roundup/hyperdb.py:1499:1507
 #, fuzzy, python-format
 msgid "Not a property name: %s"
 msgstr "不是日期格式:%s"
 
-#: ../roundup/hyperdb.py:1979
+#: ../roundup/hyperdb.py:1984
 #, fuzzy, python-format
 msgid "property %(property)s: %(value)r is not a %(classname)s."
 msgstr "屬性 \"%(propname)s\": \"%(value)s\" 當前不在列表中"
 
-#: ../roundup/hyperdb.py:1985
+#: ../roundup/hyperdb.py:1990
 #, python-format
 msgid "you may only enter ID values for property %s"
 msgstr ""
 
-#: ../roundup/hyperdb.py:2020
+#: ../roundup/hyperdb.py:2025
 #, python-format
 msgid "%(property)r is not a property of %(classname)s"
 msgstr ""
--- a/roundup/__init__.py	Tue Jul 11 00:38:22 2023 -0400
+++ b/roundup/__init__.py	Wed Jul 12 22:59:49 2023 -0400
@@ -67,6 +67,6 @@
 '''
 __docformat__ = 'restructuredtext'
 
-__version__ = '2.3.0b2'
+__version__ = '2.3.0'
 
 # vim: set filetype=python ts=4 sw=4 et si
--- a/scripts/Docker/Dockerfile	Tue Jul 11 00:38:22 2023 -0400
+++ b/scripts/Docker/Dockerfile	Wed Jul 12 22:59:49 2023 -0400
@@ -200,7 +200,7 @@
 LABEL "org.opencontainers.image.vendor"="Roundup Issue Tracker Team" \
       "org.opencontainers.image.title"="Roundup Issue Tracker" \
       "org.opencontainers.image.description"="Roundup Issue Tracker with multi-backend support installed via $source with python version $pythonversion" \
-      "org.opencontainers.image.version"="2.2.0" \
+      "org.opencontainers.image.version"="2.3.0" \
       "org.opencontainers.image.authors"="roundup-devel@lists.sourceforge.net" \
       "org.opencontainers.image.licenses"="MIT AND ZPL-2.0 AND Python-2.0" \
       "org.opencontainers.image.documentation"="https://www.roundup-tracker.org/docs/installation.html" \
--- a/setup.py	Tue Jul 11 00:38:22 2023 -0400
+++ b/setup.py	Wed Jul 12 22:59:49 2023 -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',
--- a/website/www/index.txt	Tue Jul 11 00:38:22 2023 -0400
+++ b/website/www/index.txt	Wed Jul 12 22:59:49 2023 -0400
@@ -77,8 +77,8 @@
 It is designed to be customised so you can "track your issues your
 way".
 
-The current stable version of Roundup is 2.3.0b2. It is a bug fix and
-feature release for the 2.2.0 release.
+The current stable version of Roundup is 2.3.0. It fixes bugs and
+and adds features compared to the 2.2.0 release.
 
 It runs with Python 2.7.12+ or 3.6+.
 
@@ -110,7 +110,7 @@
 * Postgres full text index can now be enabled.
 
 * Modifications to in-reply-to threading when there are multiple
-  matches results in more predictable handling of messages.
+  matches resulting in more predictable handling of messages.
 
 * Many updates to documentation to make it scannable, useful and
   work on mobile.
@@ -137,9 +137,10 @@
   container as supporting files are not stored in the usual locations
   like /usr/share/roundup.
 
-* Crash fixes in detector handling and configuration handling. 
+* Crash fixes in detector handling, configuration handling, fix for
+  sorting of multilinks.
 
-More info on the 51 changes can be found in the `change notes`_.
+More info on the 53 changes can be found in the `change notes`_.
 
 Roundup Use Cases
 =================
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/website/www/signatures/roundup-2.3.0.tar.gz.asc	Wed Jul 12 22:59:49 2023 -0400
@@ -0,0 +1,16 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAABCgAdFiEEQR41S10a8mEl1iEiHy3Qy3VqdtgFAmSvZ/oACgkQHy3Qy3Vq
+dtiO0xAAwvXEHRrpxH1MnkADBoNOXsNa+LVDA33x4+VFs1f7rstvkcnrT+YkD1bS
+UdCPfhc3pTLwylxW/FJOqJP5GF6LYh/aXZpyHgOYi1FVvROio24rs/2mq1/8hM08
+VQQgmr3+SY97Wp8M7ysYbUhzRln75A1uZuXWCbXqTFpNwJEMwhxR1nthyrVJxP4X
+SCKXJqM1CQLXfozpQ45s82VNlHXWsypko24rG1zXr31OoSQtFwTx9hfabmZlu17x
+bVgdECLoMfBqy8on+SxX++33ndq56XLSO7tiYUC1IsgR3UJrOQFzbYzTvSZ1zQpz
+1N8hUEQg/VFWTdLaHCkM3GioGR1PkJuP+mm5xMpb4wLAvV6nkvMLrf1DS1Vofx4A
+E50TOzh9RFqCrW8+ghCTcuIrq6cx+Uj90QY6ktbJZySG31lsd6HjtVbNcs12ZnAt
+uA2ZJ0KFsd1k8nNgc5CnPGCnosp9LZBerL53xIr+aGO8T7AA0es/4n3mG5szFA2E
+/4c87SOIssERgseKnzyDoIMHnlKLvaLfR5QWs6zcs04opBZ2NMCPb8t7Ddo695iH
+QQidFzRhoXGLDrbN1MeZroFCvlfDXI2eR/bWnszPOox0354FlDU4LmuPLkqZEGgJ
+wu2i5Ogmgqpiji0NPqUtllPIokkOBbznjhAbrPHMN5+y94U3pR0=
+=luer
+-----END PGP SIGNATURE-----

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