Fix more complicated requirement expressions by adding parenthesis

Puts bounded requirements into parenthesis

Fixes: https://github.com/rpm-software-management/rpm/issues/995
Upstream: https://github.com/rpm-software-management/rpm/pull/996

For this input: pyparsing>=2.0.1,!=2.0.4,!=2.1.2,!=2.1.6

Instead of (invalid):
(python3.8dist(pyparsing) >= 2.0.1 with
 python3.8dist(pyparsing) < 2.1.2 or python3.8dist(pyparsing) >= 2.1.2.0 with
 python3.8dist(pyparsing) < 2.1.6 or python3.8dist(pyparsing) >= 2.1.6.0 with
 python3.8dist(pyparsing) < 2.0.4 or python3.8dist(pyparsing) >= 2.0.4.0)

Produces (valid):
(python3.8dist(pyparsing) >= 2.0.1 with
 (python3.8dist(pyparsing) < 2.1.2 or python3.8dist(pyparsing) >= 2.1.2.0) with
 (python3.8dist(pyparsing) < 2.0.4 or python3.8dist(pyparsing) >= 2.0.4.0) with
 (python3.8dist(pyparsing) < 2.1.6 or python3.8dist(pyparsing) >= 2.1.6.0))

For this input: babel>=1.3,!=2.0

Instead of (invalid):
(python3.8dist(babel) >= 1.3 with
 python3.8dist(babel) < 2 or python3.8dist(babel) >= 2.0)

Produces (valid):
(python3.8dist(babel) >= 1.3 with
 (python3.8dist(babel) < 2 or python3.8dist(babel) >= 2.0))

For this input: pbr!=2.1.0,>=2.0.0

Instead of (invalid):
(python3.8dist(pbr) >= 2 with
 python3.8dist(pbr) < 2.1 or python3.8dist(pbr) >= 2.1.0)

Produces (valid):
(python3.8dist(pbr) >= 2 with
 (python3.8dist(pbr) < 2.1 or python3.8dist(pbr) >= 2.1.0))
This commit is contained in:
Miro Hrončok 2020-01-03 11:00:19 +01:00
parent ca811dbf35
commit 724a52a5f2
2 changed files with 7 additions and 4 deletions

View File

@ -5,7 +5,7 @@
Name: python-rpm-generators Name: python-rpm-generators
Summary: Dependency generators for Python RPMs Summary: Dependency generators for Python RPMs
Version: 10 Version: 10
Release: 1%{?dist} Release: 2%{?dist}
# Originally all those files were part of RPM, so license is kept here # Originally all those files were part of RPM, so license is kept here
License: GPLv2+ License: GPLv2+
@ -49,6 +49,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} pythondeps.sh pythondistdeps.py
%{_rpmconfigdir}/pythondistdeps.py %{_rpmconfigdir}/pythondistdeps.py
%changelog %changelog
* Fri Jan 03 2020 Miro Hrončok <mhroncok@redhat.com> - 10-2
- Fix more complicated requirement expressions by adding parenthesis
* Wed Jan 01 2020 Miro Hrončok <mhroncok@redhat.com> - 10-1 * Wed Jan 01 2020 Miro Hrončok <mhroncok@redhat.com> - 10-1
- Handle version ending with ".*" (#1758141) - Handle version ending with ".*" (#1758141)
- Handle compatible-release operator "~=" (#1758141) - Handle compatible-release operator "~=" (#1758141)

View File

@ -253,7 +253,7 @@ for name in names:
spec_list = [] spec_list = []
for spec in py_deps[name]: for spec in py_deps[name]:
if spec[0] == '!=': if spec[0] == '!=':
spec_list.append('{n} < {v} or {n} >= {v}.0'.format(n=name, v=spec[1])) spec_list.append('({n} < {v} or {n} >= {v}.0)'.format(n=name, v=spec[1]))
elif spec[0] == '~=': elif spec[0] == '~=':
# Parse the current version # Parse the current version
next_ver = parse_version(spec[1]).base_version.split('.') next_ver = parse_version(spec[1]).base_version.split('.')
@ -262,7 +262,7 @@ for name in names:
# Increment the minor version # Increment the minor version
next_ver[-1] = str(int(next_ver[-1]) + 1) next_ver[-1] = str(int(next_ver[-1]) + 1)
next_ver = '.'.join(next_ver) next_ver = '.'.join(next_ver)
spec_list.append('{n} >= {v} with {n} < {vnext}'.format(n=name, v=spec[1], vnext=next_ver)) spec_list.append('({n} >= {v} with {n} < {vnext})'.format(n=name, v=spec[1], vnext=next_ver))
elif spec[0] == '==' and spec[1].endswith('.*'): elif spec[0] == '==' and spec[1].endswith('.*'):
# Parse the current version # Parse the current version
next_ver = parse_version(spec[1]).base_version.split('.') next_ver = parse_version(spec[1]).base_version.split('.')
@ -272,7 +272,7 @@ for name in names:
# Increment the minor version # Increment the minor version
next_ver[-1] = str(int(next_ver[-1]) + 1) next_ver[-1] = str(int(next_ver[-1]) + 1)
next_ver = '.'.join(next_ver) next_ver = '.'.join(next_ver)
spec_list.append('{n} >= {v} with {n} < {vnext}'.format(n=name, v=spec[1], vnext=next_ver)) spec_list.append('({n} >= {v} with {n} < {vnext})'.format(n=name, v=spec[1], vnext=next_ver))
else: else:
spec_list.append('{} {} {}'.format(name, spec[0], spec[1])) spec_list.append('{} {} {}'.format(name, spec[0], spec[1]))
if len(spec_list) == 1: if len(spec_list) == 1: