Make it build

This commit is contained in:
Miro Hrončok 2019-05-01 00:51:37 +02:00
parent b129e361c8
commit 0070702fc8
10 changed files with 84 additions and 332 deletions

View File

@ -1,18 +0,0 @@
diff -up rpmlint-rpmlint-1.10/rpmdiff.py3 rpmlint-rpmlint-1.10/rpmdiff
--- rpmlint-rpmlint-1.10/rpmdiff.py3 2018-10-05 15:30:14.361433625 -0400
+++ rpmlint-rpmlint-1.10/rpmdiff 2018-10-05 15:31:01.096404906 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/python -tt
+#!/usr/bin/python3 -tt
# -*- coding: utf-8 -*-
#
# Copyright (C) 2006 Mandriva; 2009 Red Hat, Inc.; 2009 Ville Skyttä
diff -up rpmlint-rpmlint-1.10/rpmlint.py3 rpmlint-rpmlint-1.10/rpmlint
--- rpmlint-rpmlint-1.10/rpmlint.py3 2018-10-05 15:31:13.647128639 -0400
+++ rpmlint-rpmlint-1.10/rpmlint 2018-10-05 15:31:18.967011541 -0400
@@ -1,4 +1,4 @@
-#!/usr/bin/python -ttOu
+#!/usr/bin/python3 -ttOu
# -*- coding: utf-8 -*-
#############################################################################
# File : rpmlint

View File

@ -0,0 +1,34 @@
From 8fd904b53c028dded0b308ee95f1a5ff998584fd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
Date: Thu, 4 Jul 2019 00:31:49 +0200
Subject: [PATCH] Ugly workaround for RPM 4.14 vs 4.15 python3 bindings
incompatibility
Fixes https://github.com/rpm-software-management/rpmlint/issues/202
---
Pkg.py | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/Pkg.py b/Pkg.py
index 8d01f301..1b257716 100644
--- a/Pkg.py
+++ b/Pkg.py
@@ -143,8 +143,17 @@ def is_utf8(fname):
def is_utf8_bytestr(s):
+ """Returns True whether the given text is UTF-8.
+ Due to changes in rpm, needs to handle both bytes and unicode."""
try:
- s.decode('UTF-8')
+ if hasattr(s, 'decode'):
+ s.decode('utf-8')
+ elif hasattr(s, 'encode'):
+ s.encode('utf-8')
+ else:
+ unexpected = type(s).__name__
+ raise TypeError(
+ 'Expected str/unicode/bytes, not {}'.format(unexpected))
except UnicodeError:
return False
return True

View File

@ -1,33 +0,0 @@
diff -up rpmlint-rpmlint-1.9/BinariesCheck.py.buildid rpmlint-rpmlint-1.9/BinariesCheck.py
--- rpmlint-rpmlint-1.9/BinariesCheck.py.buildid 2017-07-17 09:45:17.415365410 -0400
+++ rpmlint-rpmlint-1.9/BinariesCheck.py 2017-07-17 09:45:28.719085854 -0400
@@ -294,7 +294,7 @@ usr_lib_regex = re.compile('^/usr/lib(64
bin_regex = re.compile('^(/usr(/X11R6)?)?/s?bin/')
soversion_regex = re.compile('.*?([0-9][.0-9]*)\\.so|.*\\.so\\.([0-9][.0-9]*).*')
reference_regex = re.compile('\.la$|^/usr/lib(64)?/pkgconfig/')
-usr_lib_exception_regex = re.compile(Config.getOption('UsrLibBinaryException', '^/usr/lib(64)?/(perl|python|ruby|menu|pkgconfig|ocaml|lib[^/]+\.(so|l?a)$|bonobo/servers/)'))
+usr_lib_exception_regex = re.compile(Config.getOption('UsrLibBinaryException', r'^/usr/lib(64)?/(perl|python|ruby|menu|pkgconfig|ocaml|lib[^/]+\.(so|l?a)$|bonobo/servers/|\.build-id)'))
srcname_regex = re.compile('(.*?)-[0-9]')
invalid_dir_ref_regex = re.compile('/(home|tmp)(\W|$)')
ocaml_mixed_regex = re.compile('^Caml1999X0\d\d$')
diff -up rpmlint-rpmlint-1.9/FilesCheck.py.buildid rpmlint-rpmlint-1.9/FilesCheck.py
--- rpmlint-rpmlint-1.9/FilesCheck.py.buildid 2017-07-17 09:45:37.733862908 -0400
+++ rpmlint-rpmlint-1.9/FilesCheck.py 2017-07-17 09:46:33.053494782 -0400
@@ -505,7 +505,7 @@ class FilesCheck(AbstractCheck.AbstractC
printError(pkg, 'version-control-internal-file', f)
elif f.endswith('/.htaccess'):
printError(pkg, 'htaccess-file', f)
- elif hidden_file_regex.search(f) and not f.startswith("/etc/skel/"):
+ elif hidden_file_regex.search(f) and not f.startswith("/etc/skel/") and not f.endswith("/.build-id"):
printWarning(pkg, 'hidden-file-or-dir', f)
elif manifest_perl_regex.search(f):
printWarning(pkg, 'manifest-in-perl-module', f)
@@ -879,7 +879,7 @@ class FilesCheck(AbstractCheck.AbstractC
printError(pkg, 'non-standard-dir-perm', f, "%o" % perm)
if pkg.name not in filesys_packages and f in STANDARD_DIRS:
printError(pkg, 'standard-dir-owned-by-package', f)
- if hidden_file_regex.search(f):
+ if hidden_file_regex.search(f) and not f.endswith("/.build-id"):
printWarning(pkg, 'hidden-file-or-dir', f)
# symbolic link check

View File

@ -1,55 +0,0 @@
diff -up rpmlint-rpmlint-1.9/SpecCheck.py.fixuep rpmlint-rpmlint-1.9/SpecCheck.py
--- rpmlint-rpmlint-1.9/SpecCheck.py.fixuep 2017-02-08 16:54:24.055208215 -0500
+++ rpmlint-rpmlint-1.9/SpecCheck.py 2017-02-08 16:56:05.012862286 -0500
@@ -404,8 +404,9 @@ class SpecCheck(AbstractCheck.AbstractCh
if res:
provs = Pkg.parse_deps(res.group(1))
for prov in unversioned(provs):
- printWarning(pkg, 'unversioned-explicit-provides',
- prov)
+ if not prov.startswith('/'):
+ printWarning(pkg, 'unversioned-explicit-provides',
+ prov)
if compop_regex.search(prov):
printWarning(pkg,
'comparison-operator-in-deptoken',
@@ -415,8 +416,9 @@ class SpecCheck(AbstractCheck.AbstractCh
if res:
obses = Pkg.parse_deps(res.group(1))
for obs in unversioned(obses):
- printWarning(pkg, 'unversioned-explicit-obsoletes',
- obs)
+ if not obs.startswith('/'):
+ printWarning(pkg, 'unversioned-explicit-obsoletes',
+ obs)
if compop_regex.search(obs):
printWarning(pkg,
'comparison-operator-in-deptoken',
diff -up rpmlint-rpmlint-1.9/test/spec/SpecCheck.spec.fixuep rpmlint-rpmlint-1.9/test/spec/SpecCheck.spec
--- rpmlint-rpmlint-1.9/test/spec/SpecCheck.spec.fixuep 2017-02-08 16:56:28.492316699 -0500
+++ rpmlint-rpmlint-1.9/test/spec/SpecCheck.spec 2017-02-08 16:56:57.105651818 -0500
@@ -17,6 +17,8 @@ BuildRoot: %{_tmppath}/%{name}-%{ve
Provides: unversioned-provides, versioned-provides = 1.0
Obsoletes: versioned-obsoletes < 2.0
Obsoletes: unversioned-obsoletes
+Obsoletes: /usr/bin/unversioned-but-filename
+Provides: /sbin/another-unversioned-but-filename
%description
SpecCheck test.
diff -up rpmlint-rpmlint-1.9/test/test.SpecCheck.py.fixuep rpmlint-rpmlint-1.9/test/test.SpecCheck.py
--- rpmlint-rpmlint-1.9/test/test.SpecCheck.py.fixuep 2017-02-08 16:57:15.938214210 -0500
+++ rpmlint-rpmlint-1.9/test/test.SpecCheck.py 2017-02-08 16:57:54.448319360 -0500
@@ -25,10 +25,12 @@ class TestSpecCheck(unittest.TestCase):
in out)
self.assertTrue("unversioned-explicit-provides versioned-provides"
not in out)
+ self.assertTrue("unversioned-explicit-provides /" not in out)
self.assertTrue("unversioned-explicit-obsoletes unversioned-obsoletes"
in out)
self.assertTrue("unversioned-explicit-obsoletes versioned-obsoletes"
not in out)
+ self.assertTrue("unversioned-explicit-obsoletes /" not in out)
self.assertTrue("setup-not-quiet" in out)
if __name__ == '__main__':

View File

@ -1,13 +0,0 @@
diff --git a/FilesCheck.py b/FilesCheck.py
index 112a9ec..b3465ca 100644
--- a/FilesCheck.py
+++ b/FilesCheck.py
@@ -323,7 +323,7 @@ _python_magic_values = {
'3.2': 3180,
'3.3': 3230,
'3.4': 3310,
- '3.5': 3350,
+ '3.5': 3351, # 3350 for < 3.5.2
'3.6': 3379,
}

View File

@ -1,11 +0,0 @@
--- rpmlint-rpmlint-1.9/FilesCheck.py 2016-12-29 22:16:24.738320169 -0800
+++ rpmlint-rpmlint-1.9/FilesCheck.py.new 2016-12-29 22:16:51.109411602 -0800
@@ -324,7 +324,7 @@
'3.3': 3230,
'3.4': 3310,
'3.5': 3350,
- '3.6': 3361,
+ '3.6': 3379,
}

View File

@ -1,45 +0,0 @@
From 4875475c43098e37a4d5d4e2ee2f9dfea643cc78 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta@iki.fi>
Date: Fri, 7 Apr 2017 09:26:35 +0300
Subject: [PATCH] Pkg.b2s: Pass through str as-is on Python 3
Things change, and we may start getting str where we previously got
bytes, such as what has apparently now happened with some versions of
the return value of magic.descriptor(fd) in Fedora Rawhide.
https://bugzilla.redhat.com/show_bug.cgi?id=1439941
---
Pkg.py | 4 ++--
test/test.Pkg.py | 4 ++++
2 files changed, 6 insertions(+), 2 deletions(-)
Index: rpmlint-rpmlint-1.9/Pkg.py
===================================================================
--- rpmlint-rpmlint-1.9.orig/Pkg.py
+++ rpmlint-rpmlint-1.9/Pkg.py
@@ -41,8 +41,8 @@ if sys.version_info[0] > 2:
unicode = str
def b2s(b):
- if b is None:
- return None
+ if b is None or isinstance(b, str):
+ return b
if isinstance(b, (list, tuple)):
return [b2s(x) for x in b]
return b.decode(errors='replace')
Index: rpmlint-rpmlint-1.9/test/test.Pkg.py
===================================================================
--- rpmlint-rpmlint-1.9.orig/test/test.Pkg.py
+++ rpmlint-rpmlint-1.9/test/test.Pkg.py
@@ -30,5 +30,10 @@ class TestPkg(unittest.TestCase):
):
self.assertFalse(Pkg.rangeCompare(req, prov))
+ def test_b2s(self):
+ for thing in ("foo", ["foo"]):
+ self.assertEqual(thing, Pkg.b2s(thing))
+
+
if __name__ == '__main__':
unittest.main()

View File

@ -1,25 +0,0 @@
From 73d62d4421a06a3282c1a71625b070e3ca58b624 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta@iki.fi>
Date: Fri, 7 Apr 2017 09:55:15 +0300
Subject: [PATCH] Pkg.b2s: Add some more test cases
---
test/test.Pkg.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
Index: rpmlint-rpmlint-1.9/test/test.Pkg.py
===================================================================
--- rpmlint-rpmlint-1.9.orig/test/test.Pkg.py
+++ rpmlint-rpmlint-1.9/test/test.Pkg.py
@@ -31,8 +31,10 @@ class TestPkg(unittest.TestCase):
self.assertFalse(Pkg.rangeCompare(req, prov))
def test_b2s(self):
- for thing in ("foo", ["foo"]):
+ for thing in ("foo", ["foo"], None, []):
self.assertEqual(thing, Pkg.b2s(thing))
+ self.assertEqual("foo", Pkg.b2s(b"foo"))
+ self.assertEqual(["foo"], Pkg.b2s([b"foo"]))
if __name__ == '__main__':

View File

@ -1,102 +0,0 @@
diff -up rpmlint-rpmlint-1.9/FilesCheck.py.unicodefix rpmlint-rpmlint-1.9/FilesCheck.py
--- rpmlint-rpmlint-1.9/FilesCheck.py.unicodefix 2016-07-08 10:45:32.988796231 -0400
+++ rpmlint-rpmlint-1.9/FilesCheck.py 2016-07-08 10:47:07.520138612 -0400
@@ -572,8 +572,14 @@ class FilesCheck(AbstractCheck.AbstractC
chunk = None
istext = False
- if os.access(pkgfile.path, os.R_OK):
- (chunk, istext) = peek(pkgfile.path, pkg)
+ res = None
+ try:
+ res = os.access(pkgfile.path, os.R_OK)
+ except UnicodeError as e: # e.g. non-ASCII, C locale, python 3
+ printWarning(pkg, 'inaccessible-filename', f, e)
+ else:
+ if res:
+ (chunk, istext) = peek(pkgfile.path, pkg)
(interpreter, interpreter_args) = script_interpreter(chunk)
@@ -1304,6 +1310,11 @@ it in the rpm header indicates that it i
but it actually is not in the filesystem. Because of this, some checks will
be skipped.''',
+'inaccessible-filename',
+'''An error occurred while trying to access this file due to some characters
+in its name. Because of this, some checks will be skipped. Access could work
+with some other locale settings.''',
+
'executable-crontab-file',
'''This crontab file has executable bit set, which is refused by newer version
of cron''',
diff -up rpmlint-rpmlint-1.9/Filter.py.unicodefix rpmlint-rpmlint-1.9/Filter.py
--- rpmlint-rpmlint-1.9/Filter.py.unicodefix 2016-07-08 10:43:35.135616091 -0400
+++ rpmlint-rpmlint-1.9/Filter.py 2016-07-08 10:45:25.885845645 -0400
@@ -9,6 +9,7 @@
from __future__ import print_function
+import codecs
import locale
import sys
import textwrap
@@ -25,17 +26,20 @@ _diagnostic = list()
_badness_score = 0
printed_messages = {"I": 0, "W": 0, "E": 0}
-__stdout = sys.stdout
__preferred_encoding = locale.getpreferredencoding()
if sys.version_info[0] < 3:
- import codecs
__stdout = codecs.getwriter(__preferred_encoding)(sys.stdout, 'replace')
+ def __print(s):
+ if isinstance(s, str):
+ s = s.decode(__preferred_encoding, 'replace')
+ print(s, file=__stdout)
+else:
+ __stdout = codecs.getwriter(__preferred_encoding)(
+ sys.stdout.buffer, 'replace')
-def __print(s):
- if isinstance(s, str) and hasattr(s, 'decode'):
- s = s.decode(__preferred_encoding, 'replace')
- print(s, file=__stdout)
+ def __print(s):
+ print(s, file=__stdout)
def printInfo(pkg, reason, *details):
diff -up rpmlint-rpmlint-1.9/Makefile.unicodefix rpmlint-rpmlint-1.9/Makefile
--- rpmlint-rpmlint-1.9/Makefile.unicodefix 2016-07-08 10:47:23.748025724 -0400
+++ rpmlint-rpmlint-1.9/Makefile 2016-07-08 10:47:38.945919999 -0400
@@ -22,10 +22,6 @@ PYTHON = /usr/bin/python
# update this variable to create a new release
VERSION := 1.9
-# for the [A-Z]* part
-LC_ALL:=C
-export LC_ALL
-
all: __version__.py __isocodes__.py
clean:
diff -up rpmlint-rpmlint-1.9/test.sh.unicodefix rpmlint-rpmlint-1.9/test.sh
--- rpmlint-rpmlint-1.9/test.sh.unicodefix 2016-07-08 10:47:52.116828374 -0400
+++ rpmlint-rpmlint-1.9/test.sh 2016-07-08 10:48:34.045536691 -0400
@@ -18,9 +18,14 @@ for i in $TESTPATH/test.*.py; do
done
echo "Check that rpmlint executes with no unexpected errors"
+echo "...in default locale"
$PYTHON ./rpmlint -C $(pwd) test/*/*.rpm test/spec/*.spec >/dev/null
rc=$?
test $rc -eq 0 -o $rc -eq 64 || exit $rc
+echo "...in the C locale"
+LC_ALL=C $PYTHON ./rpmlint -C $(pwd) test/*/*.rpm test/spec/*.spec >/dev/null
+rc=$?
+test $rc -eq 0 -o $rc -eq 64 || exit $rc
echo "$PYTEST tests"
$PYTEST -v || exit $?

View File

@ -9,42 +9,43 @@
%if %{with python3} %if %{with python3}
%global python %{__python3} %global python %{__python3}
%global pytest %(ls -1 %{_bindir}/py.test-3* | tail -n 1) %global pytest pytest-3
# for the time being, flake8 is broken
# https://bugzilla.redhat.com/show_bug.cgi?id=1582075
# so we fake it
#global flake8 python3-flake8
%global flake8 true
%else %else
%global python %{__python} %global python %{__python2}
%global pytest py.test %global pytest py.test
%global flake8 flake8
%endif %endif
# linitng is flaky, so we fake it
%global flake8 true
Name: rpmlint Name: rpmlint
Version: 1.11 Version: 1.11
Release: 1%{?dist} Release: 1%{?dist}
Summary: Tool for checking common errors in RPM packages Summary: Tool for checking common errors in RPM packages
License: GPLv2 License: GPLv2
URL: https://github.com/rpm-software-management/rpmlint URL: https://github.com/rpm-software-management/rpmlint
Source0: https://github.com/rpm-software-management/rpmlint/archive/rpmlint-%{version}.tar.gz Source0: %{url}/archive/rpmlint-%{version}.tar.gz
Source1: %{name}.config Source1: %{name}.config
Source3: %{name}-etc.config Source3: %{name}-etc.config
# https://github.com/rpm-software-management/rpmlint/pull/199
Patch199: rpmlint-1.10-suppress-locale-error.patch
# https://github.com/rpm-software-management/rpmlint/pull/212
Patch212: rpmlint-1.11-rpm4.15.patch
BuildArch: noarch BuildArch: noarch
%if %{with python3} %if %{with python3}
BuildRequires: python3-devel BuildRequires: python3-devel
BuildRequires: rpm-python3 >= 4.4.2.2 BuildRequires: python3-rpm >= 4.4.2.2
BuildRequires: python3-pytest BuildRequires: python3-pytest
#BuildRequires: python3-flake8-import-order #BuildRequires: python3-flake8-import-order
Requires: python3 Requires: python3
Requires: rpm-python3 >= 4.4.2.2 Requires: python3-rpm >= 4.4.2.2
Patch5: rpmlint-1.10-force-python3.patch
Patch6: rpmlint-1.10-suppress-locale-error.patch
%else %else
BuildRequires: python >= 2.6 BuildRequires: python >= 2.6
BuildRequires: rpm-python >= 4.4.2.2 BuildRequires: rpm-python >= 4.4.2.2
BuildRequires: pytest BuildRequires: pytest
BuildRequires: python2-flake8-import-order #BuildRequires: python2-flake8-import-order
Requires: python >= 2.6 Requires: python >= 2.6
Requires: rpm-python >= 4.4.2.2 Requires: rpm-python >= 4.4.2.2
%endif %endif
@ -53,38 +54,49 @@ BuildRequires: sed >= 3.95
# no bash-completion for RHEL # no bash-completion for RHEL
BuildRequires: bash-completion BuildRequires: bash-completion
%endif %endif
Requires: perl-interpreter
%if ! 0%{?rhel}
# python-magic and python-enchant are actually optional dependencies, but # python-magic and python-enchant are actually optional dependencies, but
# they bring quite desirable features. They're not available in RHEL/EPEL 5 # they bring quite desirable features.
# as of 2010-06-23 though.
%if %{with python3} %if %{with python3}
Requires: python3-magic Requires: python3-magic
BuildRequires: python3-magic
Requires: python3-enchant Requires: python3-enchant
%else %else
Requires: python-magic %if 0%{?rhel} == 7
# RHEL 6 has 5.04
Requires: python-magic > 5.05
BuildRequires: python-magic > 5.05
Requires: python-enchant Requires: python-enchant
%endif %endif
%endif %endif
Requires: cpio Requires: /usr/bin/appstream-util
Requires: binutils Requires: /usr/bin/cpio
Requires: desktop-file-utils Requires: /usr/bin/bzip2
Requires: gzip Requires: /usr/bin/desktop-file-validate
Requires: bzip2 BuildRequires: /usr/bin/desktop-file-validate
Requires: xz Requires: /usr/bin/groff
# Needed for man page check in FilesCheck.py Requires: /usr/bin/gtbl
Requires: %{_bindir}/groff Requires: /usr/bin/man
Requires: /usr/bin/perl
BuildRequires: /usr/bin/perl
Requires: /usr/bin/readelf
Requires: /usr/bin/xz
%description %description
rpmlint is a tool for checking common errors in RPM packages. Binary rpmlint is a tool for checking common errors in RPM packages. Binary
and source packages as well as spec files can be checked. and source packages as well as spec files can be checked.
%prep %prep
%setup -q -n %{name}-%{name}-%{version} %setup -q -n %{name}-%{name}-%{version}
%if %{with python3} %if %{with python3}
%patch5 -p1 %patch199 -p1
%patch6 -p1 %patch212 -p1
%if 0%{?fedora} >= 31
# TODO, take upstream (RPM 4.15 related)
sed -i "s/'wb'/'w'/" PostCheck.py
%endif
%endif %endif
sed -i -e /MenuCheck/d Config.py sed -i -e /MenuCheck/d Config.py
cp -p config config.example cp -p config config.example
@ -107,6 +119,14 @@ rm -rf %{buildroot}%{_sysconfdir}/bash_completion.d/
%check %check
%if 0%{?rhel} == 6
# EPEL6 pytest doesn't support -k, so we sed the test names to skip them
# TestPythonBytecodeMtime.test_pyc_mtime/magic_from_chunk has 2.6 incompatible code
sed -i 's/test_pyc_m/xxx_pyc_m/' test/test_files.py
# TestSourceCheck.test_inconsistent_file_extension only works with magic >= 5.05
sed -i 's/test_inconsistent_file_extension/xxx_inconsistent_file_extension/' test/test_sources.py
%endif
make check PYTHON=%{python} PYTEST=%{pytest} FLAKE8=%{flake8} make check PYTHON=%{python} PYTEST=%{pytest} FLAKE8=%{flake8}