diff --git a/docs/schema-upgrade-1.28-1.29.sql b/docs/schema-upgrade-1.28-1.29.sql
new file mode 100644
index 00000000..10fe8a19
--- /dev/null
+++ b/docs/schema-upgrade-1.28-1.29.sql
@@ -0,0 +1,5 @@
+-- upgrade script to migrate the Koji database schema
+-- from version 1.28 to 1.29
+
+
+-- This version introduced no changes in db schema
diff --git a/docs/source/migrations/migrating_to_1.29.rst b/docs/source/migrations/migrating_to_1.29.rst
new file mode 100644
index 00000000..a3858b26
--- /dev/null
+++ b/docs/source/migrations/migrating_to_1.29.rst
@@ -0,0 +1,17 @@
+Migrating to Koji 1.29
+======================
+
+You should consider the following changes when migrating to 1.28:
+
+DB Updates
+----------
+
+There is no schema change this time.
+
+As in previous releases, we provide a migration script which is no-op in this case.
+
+Other changes
+-------------
+
+There are numerous other changes in 1.29 that should not have a direct impact on migration. For
+details see: :doc:`../release_notes/release_notes_1.29`
diff --git a/docs/source/migrations/migrations.rst b/docs/source/migrations/migrations.rst
index 88f8d49e..4c36ce3f 100644
--- a/docs/source/migrations/migrations.rst
+++ b/docs/source/migrations/migrations.rst
@@ -5,6 +5,7 @@ Migrations
.. toctree::
:maxdepth: 1
+ migrating_to_1.29
migrating_to_1.28
migrating_to_1.27
migrating_to_1.26
diff --git a/docs/source/release_notes/release_notes.rst b/docs/source/release_notes/release_notes.rst
index ae0969f4..68b3e1ba 100644
--- a/docs/source/release_notes/release_notes.rst
+++ b/docs/source/release_notes/release_notes.rst
@@ -5,6 +5,7 @@ Release Notes
.. toctree::
:maxdepth: 1
+ release_notes_1.29
release_notes_1.28.1
release_notes_1.28
release_notes_1.27.1
diff --git a/docs/source/release_notes/release_notes_1.29.rst b/docs/source/release_notes/release_notes_1.29.rst
new file mode 100644
index 00000000..6d99f5c2
--- /dev/null
+++ b/docs/source/release_notes/release_notes_1.29.rst
@@ -0,0 +1,237 @@
+
+Koji 1.29.0 Release notes
+=========================
+
+All changes can be found in `the roadmap `_.
+Most important changes are listed here.
+
+
+Migrating from Koji 1.28/1.28.1
+-------------------------------
+
+For details on migrating see :doc:`../migrations/migrating_to_1.29`
+
+
+Security Fixes
+--------------
+
+None
+
+
+Client Changes
+--------------
+**Retry gssapi_login if it makes sense**
+
+| PR: https://pagure.io/koji/pull-request/3248
+
+Only place in CLI where we did not retried when server was inaccessible was
+rewriteen to retry in some cases when there is an expecetation that it could
+work.
+
+**Fix more users in userinfo**
+
+| PR: https://pagure.io/koji/pull-request/3325
+
+Userinfo regressions - it now correctly list information for all users specified
+on command line.
+
+**Download output for all task types in download-task**
+
+| PR: https://pagure.io/koji/pull-request/3343
+
+Some types of output were not reachable via CLI (but via web yes). E.g. scratch
+image builds. All content now should be downloadble via CLI (see ``-all`` and
+older ``--logs`` options). Also new ``--dirperarch`` option is there now to
+handle same-named artifacts/logs for different archs.
+
+**Allow untag-build for blocked packages**
+
+| PR: https://pagure.io/koji/pull-request/3255
+
+When package is blocked in the tag but there was already some build for that
+package, CLI refused to untag it. It is now fixed.
+
+API Changes
+-----------
+**Remove taskReport API call**
+
+| PR: https://pagure.io/koji/pull-request/3237
+
+**Add strict option to getRPMHeaders**
+
+| PR: https://pagure.io/koji/pull-request/3256
+
+Similarly to other stricts it will raise an error if rpm doesn't exist. Empty
+dictionary was returned instead which was indistunguishable with missing
+requested key in existing RPM. This behaviour is still available with
+``strict=False``.
+
+**Add extra of builds to listTagged call result**
+
+| PR: https://pagure.io/koji/pull-request/3282
+
+Pattern of ``listTagged`` followed by multicall of ``getBuild`` is used often,
+so we decided to put missing info (``extra`` field) directly into ``listTagged``
+so only one call is required now.
+
+**Add as_string option to showOpts for raw string or dict output**
+
+| PR: https://pagure.io/koji/pull-request/3313
+| PR: https://pagure.io/koji/pull-request/3349
+
+Usable for koji administration - additional format for getting current
+configuration in machine-readable format. ``as_string=True`` reflects old
+behaviour.
+
+Builder Changes
+---------------
+**Check ccache size before trying to use it**
+
+| PR: https://pagure.io/koji/pull-request/3234
+
+Machine restart could cause failing authentication for the builder as ccache
+file is not properly deleted.
+
+**call git rev-parse before chowning source directory**
+
+| PR: https://pagure.io/koji/pull-request/3355
+
+Newer git (2.35.2) fixed long-standing git security issue but we needed to adapt
+our code as a result.
+
+System Changes
+--------------
+**Remove koji.listFaults**
+
+| PR: https://pagure.io/koji/pull-request/3238
+
+This method was not used anywhere in koji code and could complicate future
+exception redesign, so we've removed it.
+
+**Add log file for match_rpm warnings in cg_import**
+
+| PR: https://pagure.io/koji/pull-request/3257
+
+CG import was writing errors to hub logs when rpm were not found in koji. As it
+could be a problem in some workflows, we've added more visibility by uploading
+separate log to the imported build which lists these errors.
+
+**Return 400 codes when client fails to send a full request**
+
+| PR: https://pagure.io/koji/pull-request/3269
+
+Changing to errcode instead of exception will allow client to retry it. So,
+another type of network problems can be handled more transparently.
+
+**Weak dep on httpd.service for kojid/ra - koji**
+
+| PR: https://pagure.io/koji/pull-request/3277
+
+In case more services are running on same node (e.g. hub + kojira) this change
+will trigger ``kojid``/``kojira`` after hub is running resulting in no initial
+errors due to inaccessible hub.
+
+**Log content-length when we get an error reading request**
+
+| PR: https://pagure.io/koji/pull-request/3289
+
+Additional logging information for unstable networks.
+
+**Hub, plugins and tools inputs validation**
+
+| PR: https://pagure.io/koji/pull-request/3318
+
+Internal changes improving security via better input handling.
+
+**Add admin check when priority has negative value in wrapperRPM**
+
+| PR: https://pagure.io/koji/pull-request/3321
+| PR: https://pagure.io/koji/pull-request/3347
+
+It was a bug present in the code, where ``wrapperRPM`` s could have been set to
+negative priority even by their owners. Negative priorities are reserved just
+for admins.
+
+**Permit forcing releasever/arch within mock per tag**
+
+| PR: https://pagure.io/koji/pull-request/3358
+
+Mock's ``forcearch`` and ``relver`` options are now accesible via tag extras.
+
+Web
+---
+**Add free task for admin**
+
+| PR: https://pagure.io/koji/pull-request/3272
+
+In addition to cancelling task, admin now has also "free" button available.
+
+**Add blocked option to packages page**
+
+| PR: https://pagure.io/koji/pull-request/3334
+| PR: https://pagure.io/koji/pull-request/3329
+
+New filter to see blocked packages in webui.
+
+**Display load/capacity at hosts page**
+
+| PR: https://pagure.io/koji/pull-request/3346
+
+It is sometimes useful to see these values there.
+
+Kojira
+------
+**Use PrivateTmp for kojid/kojira**
+
+| PR: https://pagure.io/koji/pull-request/3276
+
+More safe/secure handling of tempdirs.
+
+Plugins
+-------
+**Adding Driver Update Disk building support**
+
+| PR: https://pagure.io/koji/pull-request/3217
+
+Previously Driver Update Disks were done by custom scripts or by `ddiskit
+`_. Now it can be done
+in koji, so it benefits from auditability, etc.
+
+**koji-sidetag-cleanup: delete inactive tags**
+
+| PR: https://pagure.io/koji/pull-request/3294
+
+New cleanup option allow to delete sidetags which are no longer active (no new
+builds are tagged there).
+
+**Add tag2distrepo plugin to hub**
+
+| PR: https://pagure.io/koji/pull-request/3326
+
+Plugin will trigger ``distrepo`` tasks for configured tags when a new build
+arrives.
+
+**Fix age to max_age in protonmsg**
+
+| PR: https://pagure.io/koji/pull-request/3344
+
+Incoherent naming in documentation and code is now unified.
+
+
+Documentation
+-------------
+**Clarify rpm imports**
+
+| PR: https://pagure.io/koji/pull-request/3301
+
+**Better description for kiwi channel requirements**
+
+| PR: https://pagure.io/koji/pull-request/3331
+
+**Winbuild documentation updates**
+
+| PR: https://pagure.io/koji/pull-request/3333
+
+**Document "list-signed" requires filesystem access**
+
+| PR: https://pagure.io/koji/pull-request/3342
diff --git a/koji.spec b/koji.spec
index 10d63c73..051aa206 100644
--- a/koji.spec
+++ b/koji.spec
@@ -83,7 +83,7 @@
%define release %{baserelease}
%endif
Name: koji
-Version: 1.28.1
+Version: 1.29.0
Release: %{release}%{?dist}
License: LGPLv2 and GPLv2+
# the included arch lib from yum's rpmUtils is GPLv2+
@@ -644,6 +644,57 @@ rm -rf $RPM_BUILD_ROOT
%endif
%changelog
+* Thu May 12 2022 Tomas Kopecek - 1.29.0-1
+- PR#3349: Py3 re pattern fix
+- PR#3338: Add header separaton to list-hosts and list-channels
+- PR#3336: Fix list-permissions ordering and header
+- PR#3325: cli: fix more users in userinfo
+- PR#3355: call git rev-parse before chowning source directory
+- PR#3353: Fix wrapper-rpm unit test
+- PR#3326: Add tag2distrepo plugin to hub
+- PR#3321: Add admin check when priority has negative value in wrapperRPM
+- PR#3347: Fix input validation
+- PR#3282: Add extra of builds to listTagged call result
+- PR#3344: Fix age to max_age in protonmsg
+- PR#3289: log content-length when we get an error reading request
+- PR#3334: Add blocked option to packages page
+- PR#3346: www: display load/capacity at hosts page
+- PR#3278: Download-logs with nvr without task ID downloads a logs
+- PR#3313: Add as_string option to showOpts for raw string or dict output
+- PR#3217: Adding Driver Update Disk building support
+- PR#3318: Hub, plugins and tools inputs validation
+- PR#3256: add strict option to getRPMHeaders
+- PR#3342: cli: document "list-signed" requires filesystem access
+- PR#3257: Add log file for match_rpm warnings in cg_import
+- PR#3276: Use PrivateTmp for kojid/kojira
+- PR#3333: doc: winbuild documentation updates
+- PR#3329: Fix number of packages without blocked
+- PR#3331: doc: better description for kiwi channel requirements
+- PR#3279: Skip activate_session when logged
+- PR#3272: Webui: add free task for admin
+- PR#3301: doc: clarify rpm imports
+- PR#3306: Koji 1.28.1 release notes
+- PR#3309: cli: rename "args" var for list-tags command
+- PR#3248: Retry gssapi_login if it makes sense
+- PR#3303: www: fix attribute test
+- PR#3292: docs: Task flow diagram
+- PR#3290: web: encode filename as UTF-8
+- PR#3259: kojira: don't call listTags more than once
+- PR#3262: Fix parsing of URLs with port numbers
+- PR#3298: Use buildins.type when option is called type in readTaggedRPMS
+- PR#3300: Same format output for list-builroot with verbose for py3/py2
+- PR#3297: doc: fix readTaggedRPMs rpmsigs option description
+- PR#3234: Check ccache size before trying to use it
+- PR#3270: Increase CLI test cases
+- PR#3208: hub: improve inheritance priority collision error message
+- PR#3269: return 400 codes when client fails to send a full request
+- PR#3265: Set dst permissions same as src permissions
+- PR#3255: allow untag-build for blocked packages
+- PR#3252: Fix tag and target shows as string, not as dict to string
+- PR#3238: Remove koji.listFaults
+- PR#3237: Remove taskReport API call
+
+
* Mon Mar 28 2022 Tomas Kopecek - 1.28.0-1
- PR#3263: Fix syntax error
- PR#3303: www: fix attribute test
@@ -659,7 +710,7 @@ rm -rf $RPM_BUILD_ROOT
- PR#3265: Set dst permissions same as src permissions
- PR#3252: Fix tag and target shows as string, not as dict to string
-* Wed Feb 2 2022 Tomas Kopecek - 1.28.0-1
+* Wed Feb 2 2022 Tomas Kopecek - 1.27.0-1
- PR#3028: Add limits on name values
- PR#3105: Deprecated --paths option in list-buildroot
- PR#3108: Remove rename-channel CLI and use editChannel in renameChannel
diff --git a/koji/_version.py b/koji/_version.py
index fb6a97f7..8d7483b2 100644
--- a/koji/_version.py
+++ b/koji/_version.py
@@ -1,2 +1,2 @@
-__version_info__ = (1, 28, 1)
+__version_info__ = (1, 29, 0)
__version__ = '.'.join([str(x) for x in __version_info__])