849a195bd3
Implement XFAIL handling for ignoring known problems so that
we can make the job voting until the remaining issues are sorted
out.
(XFAIL list reduced to what matters in stable/newton)
Change-Id: Ia2cf2c440a72e6365a9ff08086704dc535bbc072
(cherry picked from commit d59c8ece29
)
84 lines
2.8 KiB
Python
84 lines
2.8 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
"""Apply validation rules to the various requirements lists.
|
|
|
|
"""
|
|
|
|
from __future__ import print_function
|
|
|
|
import argparse
|
|
import sys
|
|
import traceback
|
|
|
|
import pkg_resources
|
|
|
|
from openstack_requirements import requirement
|
|
|
|
|
|
def read_requirements_file(filename):
|
|
with open(filename, 'rt') as f:
|
|
body = f.read()
|
|
return requirement.parse(body)
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument(
|
|
'upper_constraints',
|
|
default='upper-constraints.txt',
|
|
help='path to the upper-constraints.txt file')
|
|
parser.add_argument(
|
|
'uc_xfails',
|
|
default='upper-constraints-xfails.txt',
|
|
help='Path to the upper-constraints-xfails.txt file',
|
|
)
|
|
args = parser.parse_args()
|
|
|
|
error_count = 0
|
|
|
|
print('\nChecking %s' % args.upper_constraints)
|
|
upper_constraints = read_requirements_file(args.upper_constraints)
|
|
xfails = read_requirements_file(args.uc_xfails)
|
|
for name, spec_list in upper_constraints.items():
|
|
try:
|
|
if name:
|
|
pyver = "python_version=='%s.%s'" % (sys.version_info[0],
|
|
sys.version_info[1])
|
|
for req, original_line in spec_list:
|
|
if req.markers in ["", pyver]:
|
|
pkg_resources.require(name)
|
|
except pkg_resources.ContextualVersionConflict as e:
|
|
|
|
if e.dist.key in xfails:
|
|
xfail_requirement = xfails[e.dist.key][0][0]
|
|
xfail_blacklists = set(xfail_requirement.markers.split(','))
|
|
conflict = e.dist.as_requirement()
|
|
conflict_specifiers = ''.join(conflict.specs[0])
|
|
|
|
if (e.required_by.issubset(xfail_blacklists) and
|
|
xfail_requirement.package == conflict.name and
|
|
conflict_specifiers == xfail_requirement.specifiers):
|
|
|
|
print ('XFAIL while checking conflicts '
|
|
'for %s: %s conflicts with %s' %
|
|
(name, e.dist, str(e.req)))
|
|
continue
|
|
|
|
print('Checking conflicts for %s:\n'
|
|
'ContextualVersionConflict: %s' % (name, str(e)))
|
|
|
|
traceback.print_exc(file=sys.stdout)
|
|
error_count += 1
|
|
|
|
return 1 if error_count else 0
|