Commit Graph

502 Commits

Author SHA1 Message Date
Ghanshyam Mann f75e1056f1 Omnibus PBR CI fixups
These fixes have to go in together as they are not mergeable
individually.

First up remove the TripleO jobs

TripleO is retired so removing its jobs

- https://review.opendev.org/q/topic:%22retire-tripleo%22

Next the train EOL has largely completed and leaves us in an awkward
position for running tempest-full against python2. While branchless
tempest continues to define a tempest-full job this job is no longer
working after devstack's stable/train branch deletion. There are two
reasons for this. The first is checking out correct branches of
openstack software which we can address in a straightforward manner
through zuul branch checkout overrides from stable/train to train-eol.
The other issue is that we previously relied on zuul running the
stable/train version of devstack's base jobs under tempest-full. Now
that the branch is gone we're getting master devstack base jobs which
don't do things like setup virtualenv (needed for python2) or override
the nodeset to ubuntu-bionic.

Instead of trying to continue to make this job work we accept the
decrease in python2 coverage and will rely on python2 unittesting
instead. An alternative would be to set up functional testing with swift
since swift continues to maintain python2 compatibility in its newer
branches.

Finally we update a test case to check for modern pip's normalized
package names (previously installing pkg_b resulted in a normalized name
of pkg-b, but now pkg_b remains pkg_b and we need to check for that
instead). Check for both variations as we want the tests to pass
regardless of pip and setuptools versions used.

Co-Authored-By: Clark Boylan <clark.boylan@gmail.com>
Change-Id: I9d3417d5803b9ba3e4731fdebbd26778031effcd
2024-03-04 09:23:36 -08:00
Stephen Finucane 11151154b9 build: Use kwargs
In case the method signatures ever change. It also keeps us consistent.

Change-Id: I62c171e9e759b963e80236bcf605df58049dea9a
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2023-11-01 12:53:18 -07:00
Stephen Finucane 457a89ffda Add support for PEP-660
As with PEP-517 support, this is simply a shim over the setuptools
implementation added in setuptools v64.0.0 [1].

[1] https://github.com/pypa/setuptools/pull/3488

Change-Id: I32f974db37e364cf634b050b40bf0820dce0a3a3
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2023-11-01 12:53:18 -07:00
Stephen Finucane 6df16432aa Fix PBR integration testing
The openstack installation test is failing because it checks for a file
that doesn't exist. This occurs because Nova no longer uses
sqlalchemy-migrate [1] which means it won't have a 'migrate.cfg' file.
Update references to use 'alembic.ini' instead.

The tempest-full job fails because stable/train is not a valid branch on
some projects like neutron, nova, and placement. We fix this by having
the job checkout train-eol for those projects. We also reduce the
tempest test set to the smoke tests to reduce the possibility for test
failures. We don't actually need to run all tempest tests to have a good
indiciation of whether or not package installation was successful. Smoke
tests should be sufficient for that.

[1] https://github.com/openstack/nova/commit/fd39e4b4b

Change-Id: Idfd234cf4f968d646346a0e2fc0dd1be2332bb52
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
Co-authored-by: Clark Boylan <clark.boylan@gmail.com>
2023-11-01 11:29:38 -07:00
Jay Faulkner d03d617c09 Replace imp with importlib.machinery
The imp was removed in Python 3.12 [1]. This commit replaces
get_suffixes() method call with _SUFFIXES array from
importlib.machinery.

This was imported from https://github.com/openstack/pbr/pull/22
on behalf of the Gentoo maintainer who proposed it.

Co-Authored-By: Petr Vaněk <arkamar@atlas.cz>
Change-Id: Icf00beee255aba3da2b81d9dc5b1f8130bbcd869
2023-06-02 11:46:31 -07:00
Clark Boylan ee04b62de2 Use _ instead of - in setup.cfg directives
Setuptools deprecated -'s at some point and they result in a bunch of
warnings in failed tests. This is distracting and eventually is likely
to create real errors. Go ahead and fix them now.

Change-Id: If3594269495ae1f3cefffd4c4f38d87af5c7fdfe
2023-05-31 13:25:23 -07:00
Clark Boylan 47c5afe79a Remove sphinx doc building integration
Setuptools and sphinx [0] have removed support for building docs through
setup.py. This has broken imports which break our own local doc builds.
Lets just remove it all (including the tests) so that we are compatible
with modern setuptools and sphinx.

An alternative approach would be to do conditional imports and continue
to support this for old setuptools and sphinx. But that feels like a
dead end that will be difficult to test. Probably better to rip this
bandaid off.

[0] https://www.sphinx-doc.org/en/master/changes.html#id7

Change-Id: I65038caceb192f495288414079ca0f07ce6318bb
2023-05-31 13:25:13 -07:00
Clark Boylan 571e14581d Run PBR integration on Ubuntu Focal too
Python 3.10 on Jammy is not compatible with old pip and setuptools due
to collections.abc moves. It is still desireable to test modern PBR
functions against these old library versions because old distro installs
will often use latest PBR. Update our testing to also run PBR
integration testing on Focal selecting appropriate pip and setuptools
versions based on the running python version.

This should help ensure PBR continues to run on old platforms even as we
modernize pip.

Change-Id: Ib53f637d5826bb51a348e3e629fbdbabec2a95e0
2023-01-06 09:34:59 -08:00
Stephen Finucane 61c6a4bcb3 Tie recursion calls to Dist object, not module
In change I1f2b4d34e587389f7e11b99d000e14477cf5091b, we attempted to
resolve an issue whereby using PBR as a PEP-517 backend could result in
recursion. We did this by setting 'dist.pbr' to 'None' but later
discovered this introduced a regression that prevented us from writing
the 'pbr.json' file into generated sdists. The fix for the regression,
change I407ae88ab8de4b61f94034b3d79a2ca7f7d79d16, stopped setting
'dist.pbr' to 'None' and instead set a global flag to indicate whether
we had already been called or not. Unfortunately it seems this fix is
also insufficent. As discussed in tox#2712 [1], tox v4 has implemented
its own implementation of PEP-517 - 'pyproject-api' [2] - and unlike
'build' this implementation optionally allows re-use of the backend
process for multiple PEP-517 commands. tox's 'Pep517VirtualEnvFrontend'
does just this. This means if we run multiple commands that require
generation of a 'Distribution' object - say,
'prepare_metadata_for_build_wheel' followed by 'build_sdist' - anything
but the first step will not result in proper population of said
'Distribution' objects.

The solution to this issue is simple: per $subject, instead of setting
our recursion-detection canary at the module level, set it at the
Distribution level.

[1] https://github.com/tox-dev/tox/issues/2712
[2] github.com/tox-dev/pyproject-api/

Change-Id: I67909d732a74550fbcd7c06a9e2f4ac88c063444
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2023-01-06 13:22:51 +00:00
Stephen Finucane 491ce1ab09 Update tox.ini to work with tox 4
Resolve the following warnings:

  tox.tox_env.errors.Fail: pass_env values cannot contain whitespace,
  use comma to have multiple values in a single line, invalid values
  found 'PBR_INTEGRATION PIPFLAGS PIPVERSION PBRVERSION REPODIR
  WHEELHOUSE PROJECTS'

Also, reduce down the envlist as tox 4 when run in OpenStack CI is
also attempting to validate interpreters utilizing the
--skip-missing-interpreters=false setting [1].

Finally, fix up the integration job so that it passes on Ubuntu 22.04.
This necessitates removing any Python 2-based dependencies used in the
these jobs (since these are no longer available on Ubuntu 22.04) and
removing tests for pip versions that are not compatible with Python 3.10
(the Python version found on Ubuntu 22.04).

[1] https://github.com/tox-dev/tox/issues/2811

Change-Id: Ib4dbe4e09e269219c08a87f6fb64ad9628b5864a
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2023-01-06 13:22:38 +00:00
Zuul 45d4c9f02f Merge "Fix symbol identification in multiline message" 2022-08-05 17:56:35 +00:00
Chris Dohmen 0aecbea81b Fix symbol identification in multiline message
* Fix an issue where a multiline message with leading spaces would cause
  invalid symbol identification.
* Add unit-tests around multiple symbols in a single line

Sem-Ver: bugfix
Change-Id: Id799c2fd368d9df38a5c01fc2071283aecef67c6
2022-08-05 10:08:09 -04:00
Zuul cb2c15ea2b Merge "Replace deprecated readfp method with read_file" 2022-08-03 14:37:16 +00:00
Zuul 553218d8f5 Merge "Use stdlib importlib.metadata where possible" 2022-08-03 12:45:16 +00:00
ljhuang 2290f58eb9 Replace deprecated readfp method with read_file
The readfp method has been deprecated since version 3.2 [1].

[1] https://docs.python.org/3/library/configparser.html?highlight=deprecated#configparser.ConfigParser.readfp

Change-Id: Ib9549509bfcc749740953e3769030d787b2bf251
2022-07-22 17:41:30 +08:00
Chris Dohmen 3793d87deb Allow leading spaces when determining symbols
Update the logic that checks for sem-ver to strip out leading spaces.
This helps solve an issue during automated squashes appending a tab
character to the start of each line in a commit message.

Closes-Bug: #1977479
Change-Id: I6f56500c366fd9610d98507f01e8af21862e4421
2022-06-03 09:21:25 -04:00
Stephen Finucane 6a6546a362 Use stdlib importlib.metadata where possible
The importlib_metadata package isn't guaranteed to be available, but the
stlib version will always be there (at least on Python 3.8 or later).

Change-Id: I532a365aa0f1a3206edf6b01e821bd83ea04ab3c
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2022-05-18 17:41:28 +01:00
Clark Boylan 5c8461013f Use importlib-metadata for runtime package version lookups
We were using pkg_resources for runtime package version lookups but
pkg_resources incurs a pretty significant cost to use it in thise way
(because it scans all installed packages on disk and sorts them).

importlib-metadata is the way of the future (part of stdlib in
python3.8) and is supposed to be significantly more performant. Replace
our use of pkg_resources for runtime version lookups with
importlib-metadata so that we are both quicker and future proof.

Note that this doesn't handle the problem of no pbr deps yet. We will
probably end up needing to vendor importlib-metadata in pbr or something
similar.

Change-Id: Ife68089d997b266adb37f18e226f49bdd67766fc
2022-03-01 11:02:30 +01:00
Jeremy Stanley 949c47c979 Avoid recursive calls into SetupTools entrypoint
Add a check in pbr.core.pbr() to make sure it hasn't already run,
and return immediately if it has. This replaces the earlier attempt
at loop-busting by setting the entrypoint to None in the dist, in
order to support PEP 517 builds without setup_requires.

Also test that pbr.json is now included in the dist tree, in order
to avoid future regressions.

Change-Id: I407ae88ab8de4b61f94034b3d79a2ca7f7d79d16
2022-02-04 23:36:13 +00:00
Ben Greiner 397b6fcdf9 remove explicit mock
The explicit mock package is not required if you can use unittest.mock
from python >= 3.3

Change-Id: I1e3a764b38be66b994d790768bc5eb9be4237444
2022-01-21 10:44:41 +01:00
Jeremy Stanley b6b204e33e Use context blocks for open() calls in packaging
Two unclosed file descriptors in packaging are raising
ResourceWarning on termination in newer Python interpreters. Make
sure they're closed as soon as we're done with them.

Change-Id: I07f500e1157da18de799eb0ff9bf82d3bcb46510
2021-11-19 18:36:32 +00:00
Clark Boylan de0c717b17 Allow PEP517 without setup_requires
When using PBR PEP517 support without setup_requires were were
infinitely recursing because Distribution.finalize_options calls pbr()
and pbr() calls Distribution.finalize_options. With a setup_requires
this doesn't seem to happen because something is resetting dist.pbr's
value from True (callable) to None (not callable) after the initial
pbr() call and before further recursion can occur.

Explicitly enforce this behavior in pbr() via an explicit update of
dist.pbr to None to avoid calling pbr() more than once resulting in the
unwanted loop.

Change-Id: I1f2b4d34e587389f7e11b99d000e14477cf5091b
2021-11-12 09:16:04 -08:00
Clark Boylan d21c2caf1d Clarify the need for setup.py with PEP517
There was a misunderstanding that PBRs PEP517 build hooks meant we no
longer needed a setup.py. But it turns out the setuptools build_meta
hooks that we wrap call out to setup.py. This means PBR will continue to
need to be used in conjunction with a setup.py.

This is better for backward compatibiltiy anyway so not a huge loss.

Document this more properly and update the test to reflect it.

Change-Id: If4320da1e89a5c765e0bfe56b724364f9cba34f3
2021-11-08 08:56:18 -08:00
Monty Taylor 09ee153410 Add a PEP517 interface
pep517 defines a new module method of specifying build backends.
To allow pbr to exist in this world, we should define the interface
that's needed. For this to be used, one will put:

  [build-system]
  requires = ["pbr>=5.7.0", "setuptools>=36.6.0", "wheel"]
  build-backend = "pbr.build"

Into pyproject.toml - and the pep517 interface will be used.

This doesn't really change anything else - it just makes us support this.
So by itself this commit isn't SUPER helpful. But maybe let's take baby
steps with something this prone to strife, yeah?

After this we can start teasing some things apart and doing our
own things directly.

Co-Authored-By: Clark Boylan <clark.boylan@gmail.com>
Change-Id: I293f59b5074a38c78adffe580de2f1533bb01ce7
2021-11-03 10:05:32 -07:00
Clark Boylan 8c0d5c3141 PBR package testing improvements
We simplify virtualenv setup for PBR package installation testing by
switching to a simple file path for the PBR installation rather than a
full url with egg specifier. The egg specifer isn't necessary and
neither is the url and simpler is easier to understand.

We also add the verbose flag to the pip installations of tools into that
virtualenv to better understand problems when they occur.

Finally we add the option to skip writing package files if their
contents are empty. This allows us to ensure that we can omit certain
files which will be useful for the next change.

Change-Id: I1f081d29d62c905c1bb1abee5402b0990c83e948
2021-11-03 10:01:43 -07:00
Stephen Finucane f3b1c7533e Correct comment for 'D1_D2_SETUP_ARGS'
Change Ic7b71f1093671533c9f17fd621e02299bfbd7a6d reversed the order of
this list but didn't update the comment. Do so now.

Change-Id: I36f2dd791297a9e3df4f1e427db5b45017820bbf
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2021-04-23 10:05:50 +01:00
Stephen Finucane 607b4e0547 Reverse ordering of 'D1_D2_SETUP_ARGS'
The previous ordering was confusing and placed new values before old
ones. Switch this order, making it more obvious what we're going *from*
and what we're going *to*. With this reordering, the old name no longer
makes sense so we rename the attribute.

Change-Id: Ic7b71f1093671533c9f17fd621e02299bfbd7a6d
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2021-04-22 10:00:38 +01:00
Stephen Finucane f40c41d28f Add test for cfg -> py transformation
Change-Id: I176dc6a2c6d8f37717e1e17ba41ee72bef9536fb
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2021-04-22 10:00:38 +01:00
Stephen Finucane 16a8553e9f Don't pass empty 'long_description'
Correct a small logic error that would result in us passing an empty
'long_description' value to 'setup' if 'description_file' pointed to a
file that was empty. Fixing this also makes it a little more obvious
that we are only setting values that are present in 'setup.cfg', since
that wasn't totally clear before.

A small, unrelated typo is addressed.

Change-Id: Ib32b5fb5da84215376c8e372470b2ff08eb47908
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2021-04-22 10:00:38 +01:00
Stephen Finucane a96a094c39 Map requires-python to python-requires (attempt 2)
Attempt two at the problem, this time done properly. As discussed in
change I7158e75934535b80eb60d6b4b7dcef08866b5bab, the previous attempt
actually mapped 'python_requires' to 'requires_python' rather than the
other way around. This resolves that.

Change-Id: I415b64d5b51a248d2f45a28234f1635e8b82ffcc
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2021-04-08 15:54:07 +00:00
Zuul 2297988a7f Merge "Prevent test failure due to use of setpref" 2021-04-01 17:27:37 +00:00
Sorin Sbarnea 45e0cc2bbc Prevent test failure due to use of setpref
This fixes a bug that prevented successful test gpg key creation on
some machines.

gpg: invalid item '(setpref)' in preference string

Bug: #1627102
Change-Id: I848e2c0972c3def9e67ff954eb17c560e474e8cf
2021-04-01 09:13:46 +01:00
Stephen Finucane 1d6ae9c59a util: Convert 'D1_D2_SETUP_ARGS' to a list of tuples
Dicts can't have duplicate keys. Lists of tuples can. We're going to
need duplicates.

Change-Id: Id43ba91585160448ad9737ba958ace5163d26f3d
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2021-03-15 17:25:01 +00:00
Stephen Finucane 5195593256 Revert "Map requires-python to python-requires"
This reverts commit d5da2121f8. This was
done incorrectly. The 'D1_D2_SETUP_ARGS' dictionary modified here is a
mapping of distutils (and by extension, setuptools) supported options to
their legacy distutils2 equivalents, and is used to transform the latter
to the former. For example, consider the following entry:

  "long_description": ("metadata", "description"),

This will transform an entry like so in a 'setup.cfg' file:

  [metadata]
  description = ...

Into the following equivalent call to setuptools' 'setup' function:

  setup(
      ...,
      long_description='...',
      ...
  )

By that measure, the entry added in this change, namely:

  "requires_python": ("metadata", "python_requires"),

Will result in a 'requires_python' argument being added to the 'setup'
call. That's not what we want. Rather, we likely want to transform a
'[metadata] requires_python' entry to a 'python_requires' argument to
'setup'.

The change is reverted here in expectation of a forthcoming proper fix.

Change-Id: I7158e75934535b80eb60d6b4b7dcef08866b5bab
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2021-03-15 17:18:07 +00:00
Hervé Beraud 8e47cad901 Dropping lower constraints testing
We facing errors related to the new pip resolver, this
topic was discussed on the ML and QA team proposed to
to test lower-constraints [1].

I propose to drop this test because the complexity and recurring pain needed
to maintain that now exceeds the benefits provided by this mechanismes.

Replace assertTrue by assertIn to fix with the latest flake8 version.
Add six in the documentation requirements to fix the build.
Fix the conflict status with hacking.

[1] http://lists.openstack.org/pipermail/openstack-discuss/2020-December/019390.html

Change-Id: I580da15fefd6ad352e69749b77cc4664aef84f9c
2021-03-09 12:25:45 +01:00
Zuul 5150198c29 Merge "Remove use_2to3 backward compat for Setuptools" 2020-10-19 01:20:09 +00:00
Jeremy Stanley 242f7bd1b6 Remove use_2to3 backward compat for Setuptools
Odds are this was never used by any PBR-based projects, but was
included from the beginning to support a feature of Setuptools for a
utility which has been long since discouraged. As of Setuptools
46.2.0 and Python 3.9 it's generating deprecation warnings, and is
slated for removal from the Python 3.10 standard library.

https://bugs.python.org/issue40360
https://github.com/pypa/setuptools/issues/2086

Change-Id: I6972984f29413d2534d802b142fa9323a7e4a4a3
2020-09-19 14:07:01 +00:00
Jeremy Stanley 013ca172c9 More easy_install.ScriptWriter.get_header()
Setuptools 12.0 deprecated easy_install.get_script_header() when it
was released five years ago, and if called with PYTHONWARNINGS=error
raises a deprecation exception. Switch to the preferred class
method, but keep the original call as a fallback since it won't work
on older Setuptools versions (such as the 3.3 shipped with Ubuntu
Trusty). This continues 9a219f9a4f to
remove a second call for the same deprecated function.

Change-Id: I365075c2cff88283f92298ce2f5e53d263dc7f4b
2020-09-19 13:47:41 +00:00
Zuul 16f19608c4 Merge "trivial: Improve logging of run commands" 2020-08-28 10:24:42 +00:00
Jeremy Stanley e52e608e35 Remove bdist_wininst support
Odds are this was never used, but as of Python 3.8 and Setuptools
47.2 it's deprecated in favor of just using wheels for Windows
platform packaging anyway.

https://discuss.python.org/t/deprecate-bdist-wininst/
https://discuss.python.org/t/remove-distutils-bdist-wininst-command/

Change-Id: I3840d9fccb1f87be5c2c03470e156559c01b7cd6
2020-08-27 17:01:31 +00:00
Zuul 312a550c3d Merge "Use easy_install.ScriptWriter.get_header()" 2020-08-27 11:29:44 +00:00
Antoine Musso 07b6ac85e6 Update some url to use opendev.org
The git web URL is now: https://opendev.org/openstack/pbr

Also stop linking README.rst to no more existing history/changelog
documentation page (removed by 96b84a9014).

Change-Id: I56b0e2b86a7fc66c5ae25e06175033a885f500f6
2020-08-06 15:09:50 +02:00
Zuul a8834fbde8 Merge "Update python requires packaging metadata for package" 2020-08-06 13:06:11 +00:00
Jeremy Stanley 9a219f9a4f Use easy_install.ScriptWriter.get_header()
Setuptools 12.0 deprecated easy_install.get_script_header() when it
was released five years ago, and if called with PYTHONWARNINGS=error
raises a deprecation exception. Switch to the preferred class
method, but keep the original call as a fallback since it won't work
on older Setuptools versions (such as the 3.3 shipped with Ubuntu
Trusty).

Change-Id: I2ba68a47dd3f309e356a6e88bf890ac2f80d99a0
2020-08-06 08:32:13 +00:00
Matthew Treinish 39fe3495d2 Update python requires packaging metadata for package
The metadata field, 'python-requires' was introduced in PEP440 and
appears to have superseded 'requires-python'. [1] The metadata that pbr
uses for itself and it's test package was using the old incorrect field,
this commit updates it to be the proper metadata to show a working
example. To a certain extent it probably doesn't matter because it's very
unlikely someone will try to install pbr with python 2.5, but it's more
about making sure that pbr itself is leading by example and that it's own
config actually works.

[1] https://github.com/mtreinish/stestr/issues/292

Change-Id: I5eb14d490a3731b6b95d7a1137c33ec2d73f193f
2020-08-06 08:28:11 +00:00
Stephen Finucane d8f740c6a8 trivial: Improve logging of run commands
Change-Id: I5ee1f506a162692fe2882651f7ab68afb441aacf
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2020-08-06 08:27:41 +00:00
Monty Taylor d5da2121f8 Map requires-python to python-requires
Apparently requires-python is the old value and isn't valid
anymore. What people mean is python-requires. Of course, people
are still using the old value. Fix it for them.

Change-Id: Id49cf641f2eddac17f1b21b186aa3a150bd863f9
2020-08-06 08:26:54 +00:00
Clark Boylan 206b795517 Update hacking
This allows us to run tox -epep8 on newer python versions. Fix the
issues newer hacking calls out. They were complaints about indentation
and ambigious l value variable names.

Change-Id: I9552fba791bdf54649fbe25fc26bffdf8186ff0a
2020-08-05 15:01:21 -07:00
Stephen Finucane 73c11c6267 Add support for virtualenv 20.x
virtualenv is undergoing a rewrite and has changed how the programmatic
API works [1]. Switch to the "new way".

While we're here, we also need to get Python 2.7 tests passing again.
That requires dropping support for upper-constraints and using our own,
limited local constraints based on supported Python versions. We also
need to migrate integration tests since those run with Python 3 now.
Update the scenarios for pip/setuptools in integration testing
similarly. Finally clean up the installation of all devstack repos as
requirements are managed different now. Instead of worrying about
syncing them we use constraints.

[1] https://github.com/pypa/virtualenv/issues/1585#issuecomment-585228492

Change-Id: I493e88985d2c4d09612fea4d20d8ffa20043a0cb
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
Depends-On: https://review.opendev.org/739014
2020-08-05 15:01:15 -07:00
Stephen Finucane dfe67959e6 trivial: Use 'open' context manager
It's a little nicer to look at.

Change-Id: If5bc9b7e3927fe3203ba9adadaa1185c4a1cc7ed
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2019-08-27 16:57:23 +01:00