From 78c6f234abbee700b41a119541d8f0bc9bef3a6a Mon Sep 17 00:00:00 2001 From: Ryan Lerch Date: Thu, 10 Oct 2019 13:13:29 +1000 Subject: [PATCH] Add changelog to update notes for automatic updates move changelog generation from mail.py to util.py then, Add changelog to update notes for automatic updates Fixes: #3192 Signed-off-by: Ryan Lerch --- bodhi/server/consumers/automatic_updates.py | 15 +++++++-- bodhi/server/mail.py | 24 +++----------- bodhi/server/util.py | 30 ++++++++++++++++++ .../consumers/test_automatic_updates.py | 31 +++++++++++++++++++ 4 files changed, 79 insertions(+), 21 deletions(-) diff --git a/bodhi/server/consumers/automatic_updates.py b/bodhi/server/consumers/automatic_updates.py index d53b4ce7a4..c9ecc0b611 100644 --- a/bodhi/server/consumers/automatic_updates.py +++ b/bodhi/server/consumers/automatic_updates.py @@ -30,7 +30,7 @@ from bodhi.server.config import config from bodhi.server.models import Build, ContentType, Package, Release from bodhi.server.models import Update, UpdateStatus, UpdateType, User -from bodhi.server.util import transactional_session_maker +from bodhi.server.util import generate_changelog, transactional_session_maker log = logging.getLogger('bodhi') @@ -139,10 +139,21 @@ def __call__(self, message: fedora_messaging.api.Message) -> None: dbsession.add(user) log.debug(f"Creating new update for {bnvr}.") + changelog = generate_changelog(build) + if changelog: + notes = f"""Automatic update for {bnvr}. + +##### **Changelog** + +``` +{changelog} +```""" + else: + notes = f"Automatic update for {bnvr}." update = Update( release=rel, builds=[build], - notes=f"Automatic update for {bnvr}.", + notes=notes, type=UpdateType.unspecified, stable_karma=3, unstable_karma=-3, diff --git a/bodhi/server/mail.py b/bodhi/server/mail.py index acbd869543..48c97f3c72 100644 --- a/bodhi/server/mail.py +++ b/bodhi/server/mail.py @@ -24,7 +24,7 @@ from bodhi.server import log from bodhi.server.config import config -from bodhi.server.util import get_rpm_header, get_absolute_path +from bodhi.server.util import get_rpm_header, get_absolute_path, generate_changelog if typing.TYPE_CHECKING: # pragma: no cover from bodhi.server.models import Update # noqa: 401 @@ -332,26 +332,12 @@ def get_template(update: 'Update', use_template: str = 'fedora_errata_template') i += 1 info['references'] += line - # Find the most recent update for this package, other than this one - try: - lastpkg = build.get_latest() - except AttributeError: - # Not all build types have the get_latest() method, such as ModuleBuilds. - lastpkg = None - - # Grab the RPM header of the previous update, and generate a ChangeLog + # generate a ChangeLog info['changelog'] = "" - if lastpkg: - oldh = get_rpm_header(lastpkg) - oldtime = oldh['changelogtime'] - text = oldh['changelogtext'] - del oldh - if not text: - oldtime = 0 - elif isinstance(oldtime, list): - oldtime = oldtime[0] + changelog = generate_changelog(build) + if changelog is not None: info['changelog'] = "ChangeLog:\n\n%s%s" % \ - (build.get_changelog(oldtime), line) + (changelog, line) templates.append((info['subject'], use_template % info)) diff --git a/bodhi/server/util.py b/bodhi/server/util.py index 34f7218596..a02617f108 100644 --- a/bodhi/server/util.py +++ b/bodhi/server/util.py @@ -103,6 +103,36 @@ def get_rpm_header(nvr, tries=0): raise ValueError("No rpm headers found in koji for %r" % nvr) +def generate_changelog(build) -> typing.Optional[str]: + """ + Generate a changelog for a given build. + + Args: + build: the build to create a changelog for. + Returns: + a changelog of changes between the given build, and the previous one. + or returns None if the build type doesn't have the get_latest() method. + """ + # Find the most recent update for this package, other than this one + try: + lastpkg = build.get_latest() + except AttributeError: + # Not all build types have the get_latest() method, such as ModuleBuilds. + return None + + # Grab the RPM header of the previous update, and generate a ChangeLog + oldh = get_rpm_header(lastpkg) + oldtime = oldh['changelogtime'] + text = oldh['changelogtext'] + + if not text: + oldtime = 0 + elif isinstance(oldtime, list): + oldtime = oldtime[0] + + return build.get_changelog(oldtime) + + def build_evr(build): """ Return a tuple of strings of the given build's epoch, version, and release. diff --git a/bodhi/tests/server/consumers/test_automatic_updates.py b/bodhi/tests/server/consumers/test_automatic_updates.py index 78bfa801f8..54ce4bfc3a 100644 --- a/bodhi/tests/server/consumers/test_automatic_updates.py +++ b/bodhi/tests/server/consumers/test_automatic_updates.py @@ -92,6 +92,37 @@ def test_consume(self, caplog): assert not any(r.levelno >= logging.WARNING for r in caplog.records) + @pytest.mark.parametrize('changelog', (True, None, "")) + @mock.patch('bodhi.server.consumers.automatic_updates.generate_changelog') + def test_changelog(self, mock_generate_changelog, changelog): + """Assert that update notes contain the changelog if it exists.""" + if changelog: + # fill the changelog here rather than in the decorator + changelog = ('* Sat Aug 3 2013 Fedora Releng - 2\n' + '- Added a free money feature.\n* Tue Jun 11 2013 Randy ' + ' - 2.0.1-2\n- Make users ☺\n') + + mock_generate_changelog.return_value = changelog + + # process the message + self.handler(self.sample_message) + + # check if the update exists... + update = self.db.query(Update).filter( + Update.builds.any(Build.nvr == self.sample_nvr) + ).first() + + if changelog: + assert update.notes == f"""Automatic update for colord-1.3.4-1.fc26. + +##### **Changelog** + +``` +{changelog} +```""" + else: # no changelog + assert update.notes == "Automatic update for colord-1.3.4-1.fc26." + def test_consume_with_orphan_build(self, caplog): """ Assert existing builds without an update can be handled.