diff --git a/0001-Python-3-compatibility-tweaks.patch b/0001-Python-3-compatibility-tweaks.patch deleted file mode 100644 index 4951d74..0000000 --- a/0001-Python-3-compatibility-tweaks.patch +++ /dev/null @@ -1,909 +0,0 @@ -From 54235cd38e08c8a93de74e7884eea746ae002b2e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ville=20Skytt=C3=A4?= -Date: Thu, 12 Sep 2013 21:27:55 +0300 -Subject: [PATCH 1/3] Python 3 compatibility tweaks. - -(cherry picked from commit cc6369dbafb27568802b8f0a60518a69d6738e3b) ---- - AbstractCheck.py | 4 +++- - Filter.py | 2 +- - Pkg.py | 37 ++++++++++++++++++++----------------- - PostCheck.py | 3 +-- - rpmdiff | 8 ++++---- - rpmlint | 40 +++++++++++++++++++++++----------------- - 6 files changed, 52 insertions(+), 42 deletions(-) - -Index: rpmlint-1.5/AbstractCheck.py -=================================================================== ---- rpmlint-1.5.orig/AbstractCheck.py -+++ rpmlint-1.5/AbstractCheck.py -@@ -9,7 +9,11 @@ - - import re - import socket --import urllib2 -+import sys -+try: -+ import urllib2 -+except: -+ import urllib.request as urllib2 - - from Filter import addDetails, printInfo, printWarning - import Config -@@ -61,7 +65,8 @@ class AbstractCheck: - opener.addheaders = [('User-Agent', - 'rpmlint/%s' % Config.__version__)] - res = opener.open(_HeadRequest(url)) -- except Exception, e: -+ except Exception: -+ e = sys.exc_info()[1] - errstr = str(e) or repr(e) or type(e) - printWarning(pkg, 'invalid-url', '%s:' % tag, url, errstr) - info = None -Index: rpmlint-1.5/Filter.py -=================================================================== ---- rpmlint-1.5.orig/Filter.py -+++ rpmlint-1.5/Filter.py -@@ -123,7 +123,7 @@ def printAllReasons(): - _details = {} - - def addDetails(*details): -- for idx in range(len(details)/2): -+ for idx in range(int(len(details)/2)): - if not details[idx*2] in _details: - _details[details[idx*2]] = details[idx*2+1] - -Index: rpmlint-1.5/Pkg.py -=================================================================== ---- rpmlint-1.5.orig/Pkg.py -+++ rpmlint-1.5/Pkg.py -@@ -8,14 +8,15 @@ - # the rpm file or by accessing the files contained inside. - ############################################################################# - --import commands - import os - import re - import subprocess - import sys - import tempfile --import types --import urlparse -+try: -+ from urlparse import urljoin -+except: -+ from urllib.parse import urljoin - - try: - import magic -@@ -73,18 +74,18 @@ def substitute_shell_vars(val, script): - else: - return val - --def getstatusoutput(cmd, stdoutonly = False): -+def getstatusoutput(cmd, stdoutonly = False, shell = False): - '''A version of commands.getstatusoutput() which can take cmd as a - sequence, thus making it potentially more secure.''' - if stdoutonly: -- proc = subprocess.Popen(cmd, stdin=subprocess.PIPE, -+ proc = subprocess.Popen(cmd, shell=shell, stdin=subprocess.PIPE, - stdout=subprocess.PIPE, close_fds=True) - else: -- proc = subprocess.Popen(cmd, stdin=subprocess.PIPE, -+ proc = subprocess.Popen(cmd, shell=shell, stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, close_fds=True) - proc.stdin.close() -- text = proc.stdout.read() -+ text = proc.stdout.read().decode() - sts = proc.wait() - if sts is None: - sts = 0 -@@ -192,7 +193,9 @@ def get_default_valid_rpmgroups(filename - return groups - - # from yum 3.2.27, rpmUtils.miscutils, with rpmlint modifications --def compareEVR((e1, v1, r1), (e2, v2, r2)): -+def compareEVR(evr1, evr2): -+ (e1, v1, r1) = evr1 -+ (e2, v2, r2) = evr2 - # return 1: a is newer than b - # 0: a and b are the same version - # -1: b is newer than a -@@ -441,13 +444,13 @@ class Pkg: - os.close(fd) - self.is_source = not self.header[rpm.RPMTAG_SOURCERPM] - -- self.name = self.header[rpm.RPMTAG_NAME] -+ self.name = self.header[rpm.RPMTAG_NAME].decode() - if self.isNoSource(): - self.arch = 'nosrc' - elif self.isSource(): - self.arch = 'src' - else: -- self.arch = self.header[rpm.RPMTAG_ARCH] -+ self.arch = self.header.format("%{ARCH}") - - # Return true if the package is a source package - def isSource(self): -@@ -488,7 +491,7 @@ class Pkg: - command_str = \ - 'rpm2cpio "%s" | (cd "%s"; cpio -id); chmod -R +rX "%s"' % \ - (self.filename, self.dirname, self.dirname) -- cmd = commands.getstatusoutput(command_str) -+ cmd = getstatusoutput(command_str, shell=True) - self.extracted = True - return cmd - -@@ -507,14 +510,16 @@ class Pkg: - in_file = None - try: - try: -- in_file = open(self.dirName() + '/' + filename) -+ in_file = open(os.path.join( -+ self.dirName() or '/', filename.lstrip('/'))) - for line in in_file: - lineno += 1 - if regex.search(line): - ret.append(str(lineno)) - break -- except Exception, e: -- Filter.printWarning(self, 'read-error', filename, e) -+ except Exception: -+ Filter.printWarning(self, 'read-error', filename, -+ sys.exc_info()[1]) - finally: - if in_file: - in_file.close() -@@ -525,7 +530,7 @@ class Pkg: - # LANGUAGE trumps other env vars per GNU gettext docs, see also #166 - orig = os.environ.get('LANGUAGE') - os.environ['LANGUAGE'] = lang -- ret = self[tag] -+ ret = self[tag].decode() - if orig is not None: - os.environ['LANGUAGE'] = orig - return ret -@@ -590,17 +595,17 @@ class Pkg: - modes = self.header[rpm.RPMTAG_FILEMODES] - users = self.header[rpm.RPMTAG_FILEUSERNAME] - groups = self.header[rpm.RPMTAG_FILEGROUPNAME] -- links = self.header[rpm.RPMTAG_FILELINKTOS] -+ links = [x.decode() for x in self.header[rpm.RPMTAG_FILELINKTOS]] - sizes = self.header[rpm.RPMTAG_FILESIZES] - md5s = self.header[rpm.RPMTAG_FILEMD5S] - mtimes = self.header[rpm.RPMTAG_FILEMTIMES] - rdevs = self.header[rpm.RPMTAG_FILERDEVS] - langs = self.header[rpm.RPMTAG_FILELANGS] - inodes = self.header[rpm.RPMTAG_FILEINODES] -- requires = self.header[rpm.RPMTAG_FILEREQUIRE] -- provides = self.header[rpm.RPMTAG_FILEPROVIDE] -- files = self.header[rpm.RPMTAG_FILENAMES] -- magics = self.header[rpm.RPMTAG_FILECLASS] -+ requires = [x.decode() for x in self.header[rpm.RPMTAG_FILEREQUIRE]] -+ provides = [x.decode() for x in self.header[rpm.RPMTAG_FILEPROVIDE]] -+ files = [x.decode() for x in self.header[rpm.RPMTAG_FILENAMES]] -+ magics = [x.decode() for x in self.header[rpm.RPMTAG_FILECLASS]] - try: # rpm >= 4.7.0 - filecaps = self.header[rpm.RPMTAG_FILECAPS] - except: -@@ -608,16 +613,14 @@ class Pkg: - - # rpm-python < 4.6 does not return a list for this (or FILEDEVICES, - # FWIW) for packages containing exactly one file -- if not isinstance(inodes, types.ListType): -+ if not isinstance(inodes, list): - inodes = [inodes] - - if files: - for idx in range(0, len(files)): - pkgfile = PkgFile(files[idx]) -- # Do not use os.path.join here, pkgfile.name can start with a -- # / which would result in self.dirName being ignored -- pkgfile.path = os.path.normpath( -- self.dirName() + '/' + pkgfile.name) -+ pkgfile.path = os.path.normpath(os.path.join( -+ self.dirName() or '/', pkgfile.name.lstrip('/'))) - pkgfile.flags = flags[idx] - pkgfile.mode = modes[idx] - pkgfile.user = users[idx] -@@ -652,7 +655,7 @@ class Pkg: - PkgFile if it is found in this package, None if not.""" - result = pkgfile - while result and result.linkto: -- linkpath = urlparse.urljoin(result.name, result.linkto) -+ linkpath = urljoin(result.name, result.linkto) - linkpath = safe_normpath(linkpath) - result = self.files().get(linkpath) - return result -@@ -713,12 +716,12 @@ class Pkg: - - if versions: - for loop in range(len(versions)): -- evr = stringToVersion(versions[loop]) -+ name = names[loop].decode() -+ evr = stringToVersion(versions[loop].decode()) - if prereq is not None and flags[loop] & PREREQ_FLAG: -- prereq.append((names[loop], flags[loop] & (~PREREQ_FLAG), -- evr)) -+ prereq.append((name, flags[loop] & (~PREREQ_FLAG), evr)) - else: -- list.append((names[loop], flags[loop], evr)) -+ list.append((name, flags[loop], evr)) - - def _gatherDepInfo(self): - if self._requires is None: -Index: rpmlint-1.5/PostCheck.py -=================================================================== ---- rpmlint-1.5.orig/PostCheck.py -+++ rpmlint-1.5/PostCheck.py -@@ -10,7 +10,6 @@ - - import os - import re --import types - - import rpm - -@@ -107,7 +106,7 @@ class PostCheck(AbstractCheck.AbstractCh - for tag in script_tags: - script = pkg[tag[0]] - -- if not isinstance(script, types.ListType): -+ if not isinstance(script, list): - prog = pkg.scriptprog(tag[1]) - if prog: - prog = prog.split()[0] -Index: rpmlint-1.5/rpmdiff -=================================================================== ---- rpmlint-1.5.orig/rpmdiff -+++ rpmlint-1.5/rpmdiff -@@ -82,8 +82,8 @@ class Rpmdiff: - try: - old = self.__load_pkg(old).header - new = self.__load_pkg(new).header -- except KeyError, e: -- Pkg.warn(str(e)) -+ except KeyError: -+ Pkg.warn(str(sys.exc_info()[1])) - sys.exit(2) - - # Compare single tags -@@ -107,8 +107,8 @@ class Rpmdiff: - - old_files_dict = self.__fileIteratorToDict(old.fiFromHeader()) - new_files_dict = self.__fileIteratorToDict(new.fiFromHeader()) -- files = list(set(itertools.chain(old_files_dict.iterkeys(), -- new_files_dict.iterkeys()))) -+ files = list(set(itertools.chain(iter(old_files_dict), -+ iter(new_files_dict)))) - files.sort() - - for f in files: -@@ -205,16 +205,20 @@ class Rpmdiff: - if not isinstance(newflags, list): newflags = [ newflags ] - - o = zip(old[name], oldflags, old[name[:-1]+'VERSION']) -+ if not isinstance(o, list): -+ o = list(o) - n = zip(new[name], newflags, new[name[:-1]+'VERSION']) -+ if not isinstance(n, list): -+ n = list(n) - - # filter self provides, TODO: self %name(%_isa) as well - if name == 'PROVIDES': - oldE = old['epoch'] is not None and str(old['epoch'])+":" or "" -- oldNV = (old['name'], rpm.RPMSENSE_EQUAL, -- "%s%s-%s" % (oldE, old['version'], old['release'])) -+ oldV = "%s%s" % (oldE, old.format("%{VERSION}-%{RELEASE}")) -+ oldNV = (old['name'], rpm.RPMSENSE_EQUAL, oldV.encode()) - newE = new['epoch'] is not None and str(new['epoch'])+":" or "" -- newNV = (new['name'], rpm.RPMSENSE_EQUAL, -- "%s%s-%s" % (newE, new['version'], new['release'])) -+ newV = "%s%s" % (newE, new.format("%{VERSION}-%{RELEASE}")) -+ newNV = (new['name'], rpm.RPMSENSE_EQUAL, newV.encode()) - o = [entry for entry in o if entry != oldNV] - n = [entry for entry in n if entry != newNV] - -@@ -224,16 +228,16 @@ class Rpmdiff: - if namestr == 'REQUIRES': - namestr = self.req2str(oldentry[1]) - self.__add(self.DEPFORMAT, -- (self.REMOVED, namestr, oldentry[0], -- self.sense2str(oldentry[1]), oldentry[2])) -+ (self.REMOVED, namestr, oldentry[0].decode(), -+ self.sense2str(oldentry[1]), oldentry[2].decode())) - for newentry in n: - if not newentry in o: - namestr = name - if namestr == 'REQUIRES': - namestr = self.req2str(newentry[1]) - self.__add(self.DEPFORMAT, -- (self.ADDED, namestr, newentry[0], -- self.sense2str(newentry[1]), newentry[2])) -+ (self.ADDED, namestr, newentry[0].decode(), -+ self.sense2str(newentry[1]), newentry[2].decode())) - - def __fileIteratorToDict(self, fi): - result = {} -@@ -258,8 +262,8 @@ def main(): - try: - opts, args = getopt.getopt(sys.argv[1:], - "hti:", ["help", "ignore-times", "ignore="]) -- except getopt.GetoptError, e: -- Pkg.warn("Error: %s" % e) -+ except getopt.GetoptError: -+ Pkg.warn("Error: %s" % sys.exc_info()[1]) - _usage() - - for option, argument in opts: -Index: rpmlint-1.5/rpmlint -=================================================================== ---- rpmlint-1.5.orig/rpmlint -+++ rpmlint-1.5/rpmlint -@@ -157,10 +157,11 @@ def main(): - Pkg.warn( - '(none): E: interrupted, exiting while reading %s' % arg) - sys.exit(2) -- except Exception, e: -+ except Exception: - if isfile: - arg = os.path.abspath(arg) -- Pkg.warn('(none): E: error while reading %s: %s' % (arg, e)) -+ Pkg.warn('(none): E: error while reading %s: %s' % -+ (arg, sys.exc_info()[1])) - pkgs = [] - continue - -@@ -192,13 +193,15 @@ def main(): - Pkg.warn('(none): E: interrupted, exiting while ' + - 'reading %s' % fname) - sys.exit(2) -- except Exception, e: -+ except Exception: - Pkg.warn( -- '(none): E: while reading %s: %s' % (fname, e)) -+ '(none): E: while reading %s: %s' % -+ (fname, sys.exc_info()[1])) - continue -- except Exception, e: -+ except Exception: - Pkg.warn( -- '(none): E: error while reading dir %s: %s' % (dname, e)) -+ '(none): E: error while reading dir %s: %s' % -+ (dname, sys.exc_info()[1])) - continue - - if printAllReasons(): -@@ -207,9 +210,9 @@ def main(): - sys.exit(66) - - finally: -- print "%d packages and %d specfiles checked; %d errors, %d warnings." \ -+ print("%d packages and %d specfiles checked; %d errors, %d warnings." \ - % (packages_checked, specfiles_checked, -- printed_messages["E"], printed_messages["W"]) -+ printed_messages["E"], printed_messages["W"])) - - if printed_messages["E"] > 0: - sys.exit(64) -@@ -255,8 +258,8 @@ try: - 'option=', - 'rawout=', - ]) --except getopt.GetoptError, e: -- Pkg.warn("%s: %s" % (sys.argv[0], e)) -+except getopt.GetoptError: -+ Pkg.warn("%s: %s" % (sys.argv[0], sys.exc_info()[1])) - usage(sys.argv[0]) - sys.exit(1) - -@@ -290,11 +293,12 @@ else: - - for f in configs: - try: -- execfile(f) -+ exec(compile(open(f).read(), f, 'exec')) - except IOError: - pass -- except Exception, E: -- Pkg.warn('(none): W: error loading %s, skipping: %s' % (f, E)) -+ except Exception: -+ Pkg.warn('(none): W: error loading %s, skipping: %s' % -+ (f, sys.exc_info()[1])) - # pychecker fix - del f - -@@ -340,11 +344,13 @@ for o in opt: - - # load user config file - try: -- execfile(os.path.expanduser(conf_file)) -+ expconf = os.path.expanduser(conf_file) -+ exec(compile(open(expconf).read(), expconf, 'exec')) - except IOError: - pass --except Exception,E: -- Pkg.warn('(none): W: error loading %s, skipping: %s' % (conf_file, E)) -+except Exception: -+ Pkg.warn('(none): W: error loading %s, skipping: %s' % -+ (conf_file, sys.exc_info()[1])) - - # apply config overrides - for key, value in config_overrides.items(): -@@ -361,7 +367,7 @@ if info_error: - for c in Config.allChecks(): - loadCheck(c) - for e in sorted(info_error): -- print "%s:" % e -+ print("%s:" % e) - printDescriptions(e) - sys.exit(0) - -Index: rpmlint-1.5/BinariesCheck.py -=================================================================== ---- rpmlint-1.5.orig/BinariesCheck.py -+++ rpmlint-1.5/BinariesCheck.py -@@ -10,6 +10,7 @@ - import re - import stat - import os -+import sys - - import rpm - -@@ -195,10 +196,11 @@ class BinaryInfo: - - fobj = None - try: -- fobj = open(path) -+ fobj = open(path, 'rb') - fobj.seek(-12, 2) # 2 == os.SEEK_END, for python 2.4 compat (#172) -- self.tail = fobj.read() -- except Exception, e: -+ self.tail = fobj.read().decode() -+ except Exception: -+ e = sys.exc_info()[1] - printWarning(pkg, 'binaryinfo-tail-failed %s: %s' % (file, e)) - if fobj: - fobj.close() -@@ -291,9 +293,11 @@ class BinariesCheck(AbstractCheck.Abstra - has_usr_lib_file = False - - multi_pkg = False -- res = srcname_regex.search(pkg[rpm.RPMTAG_SOURCERPM] or '') -- if res: -- multi_pkg = (pkg.name != res.group(1)) -+ srpm = pkg[rpm.RPMTAG_SOURCERPM] -+ if srpm: -+ res = srcname_regex.search(srpm.decode()) -+ if res: -+ multi_pkg = (pkg.name != res.group(1)) - - for fname, pkgfile in files.items(): - -Index: rpmlint-1.5/DocFilesCheck.py -=================================================================== ---- rpmlint-1.5.orig/DocFilesCheck.py -+++ rpmlint-1.5/DocFilesCheck.py -@@ -43,7 +43,9 @@ class DocFilesCheck(AbstractCheck.Abstra - core_reqs[dep.N()] = [] - - # register things which are provided by the package -- for i in pkg.header[rpm.RPMTAG_PROVIDES] + files.keys(): -+ for i in pkg.header[rpm.RPMTAG_PROVIDES]: -+ core_reqs[i.decode()] = [] -+ for i in files: - core_reqs[i] = [] - - for i in files: -Index: rpmlint-1.5/FilesCheck.py -=================================================================== ---- rpmlint-1.5.orig/FilesCheck.py -+++ rpmlint-1.5/FilesCheck.py -@@ -9,16 +9,16 @@ - ############################################################################# - - from datetime import datetime --import commands - import os - import re - import stat - import string -+import sys - - import rpm - - from Filter import addDetails, printError, printWarning --from Pkg import catcmd, is_utf8, is_utf8_str -+from Pkg import catcmd, getstatusoutput, is_utf8, is_utf8_str - import AbstractCheck - import Config - -@@ -674,7 +674,7 @@ scalable_icon_regex = re.compile(r'^/usr - - # loosely inspired from Python Cookbook - # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/173220 --text_characters = "".join(map(chr, range(32, 127)) + list("\n\r\t\b")) -+text_characters = "".join(map(chr, range(32, 127))) + "\n\r\t\b" - _null_trans = string.maketrans("", "") - - def peek(filename, pkg, length=1024): -@@ -686,7 +686,8 @@ def peek(filename, pkg, length=1024): - fobj = open(filename, 'rb') - chunk = fobj.read(length) - fobj.close() -- except IOError, e: # eg. https://bugzilla.redhat.com/209876 -+ except IOError: # eg. https://bugzilla.redhat.com/209876 -+ e = sys.exc_info()[1] - printWarning(pkg, 'read-error', e) - if fobj: - fobj.close() -@@ -910,7 +911,8 @@ class FilesCheck(AbstractCheck.AbstractC - printError(pkg, 'compressed-symlink-with-wrong-ext', - f, link) - -- perm = mode & 07777 -+ perm = mode & int("7777", 8) -+ mode_is_exec = mode & int("111", 8) - - if log_regex.search(f): - log_file = f -@@ -935,17 +937,17 @@ class FilesCheck(AbstractCheck.AbstractC - pkg[rpm.RPMTAG_GROUP]))): - printError(pkg, 'setgid-binary', f, group, - oct(perm)) -- if mode & 0777 != 0755: -+ if mode & int("777", 8) != int("755", 8): - printError(pkg, 'non-standard-executable-perm', f, - oct(perm)) - - # Prefetch scriptlets, strip quotes from them (#169) -- postin = pkg[rpm.RPMTAG_POSTIN] or \ -- pkg.scriptprog(rpm.RPMTAG_POSTINPROG) -+ postin = (pkg[rpm.RPMTAG_POSTIN] or \ -+ pkg.scriptprog(rpm.RPMTAG_POSTINPROG)).decode() - if postin: - postin = quotes_regex.sub('', postin) -- postun = pkg[rpm.RPMTAG_POSTUN] or \ -- pkg.scriptprog(rpm.RPMTAG_POSTUNPROG) -+ postun = (pkg[rpm.RPMTAG_POSTUN] or \ -+ pkg.scriptprog(rpm.RPMTAG_POSTUNPROG)).decode() - if postun: - postun = quotes_regex.sub('', postun) - -@@ -1049,7 +1051,7 @@ class FilesCheck(AbstractCheck.AbstractC - - res = bin_regex.search(f) - if res: -- if mode & 0111 == 0: -+ if not mode_is_exec: - printWarning(pkg, 'non-executable-in-bin', f, oct(perm)) - else: - exe = res.group(1) -@@ -1060,7 +1062,8 @@ class FilesCheck(AbstractCheck.AbstractC - (includefile_regex.search(f) or \ - develfile_regex.search(f) or is_buildconfig): - printWarning(pkg, 'devel-file-in-non-devel-package', f) -- if mode & 0444 != 0444 and perm & 07000 == 0: -+ if mode & int("444", 8) != int("444", 8) and \ -+ perm & int("7000", 8) == 0: - ok_nonreadable = False - for regex in non_readable_regexs: - if regex.search(f): -@@ -1072,7 +1075,7 @@ class FilesCheck(AbstractCheck.AbstractC - f not in ghost_files: - printError(pkg, 'zero-length', f) - -- if mode & 0002 != 0: -+ if mode & stat.S_IWOTH: - printError(pkg, 'world-writable', f, oct(perm)) - - if not perl_dep_error: -@@ -1144,10 +1147,10 @@ class FilesCheck(AbstractCheck.AbstractC - printWarning(pkg, 'python-bytecode-without-source', f) - - # normal executable check -- if mode & stat.S_IXUSR and perm != 0755: -+ if mode & stat.S_IXUSR and perm != int("755", 8): - printError(pkg, 'non-standard-executable-perm', - f, oct(perm)) -- if mode & 0111 != 0: -+ if mode_is_exec: - if f in config_files: - printError(pkg, 'executable-marked-as-config-file', f) - if not nonexec_file: -@@ -1179,11 +1182,12 @@ class FilesCheck(AbstractCheck.AbstractC - man_basenames.add(res.group(1)) - if use_utf8 and chunk: - # TODO: better shell escaping or seq based invocation -- cmd = commands.getstatusoutput( -+ cmd = getstatusoutput( - 'env LC_ALL=C %s "%s" | gtbl | ' - 'env LC_ALL=en_US.UTF-8 groff -mtty-char -Tutf8 ' - '-P-c -mandoc -w%s >/dev/null' % -- (catcmd(f), pkgfile.path, man_warn_category)) -+ (catcmd(f), pkgfile.path, man_warn_category), -+ shell=True) - for line in cmd[1].split("\n"): - res = man_warn_regex.search(line) - if not res or man_nowarn_regex.search(line): -@@ -1213,12 +1217,11 @@ class FilesCheck(AbstractCheck.AbstractC - printError(pkg, - 'sourced-script-with-shebang', f, - interpreter) -- if mode & 0111 != 0: -+ if mode_is_exec: - printError(pkg, 'executable-sourced-script', - f, oct(perm)) - # ...but executed ones should -- elif interpreter or mode & 0111 != 0 or \ -- script_regex.search(f): -+ elif interpreter or mode_is_exec or script_regex.search(f): - if interpreter: - if mode & 0111 != 0 and not interpreter_regex.search(interpreter): - printError(pkg, 'wrong-script-interpreter', -@@ -1228,7 +1231,7 @@ class FilesCheck(AbstractCheck.AbstractC - f.endswith('.la')): - printError(pkg, 'script-without-shebang', f) - -- if mode & 0111 == 0 and not is_doc: -+ if not mode_is_exec and not is_doc: - printError(pkg, 'non-executable-script', f, - oct(perm), interpreter) - if '\r' in chunk: -@@ -1256,9 +1259,9 @@ class FilesCheck(AbstractCheck.AbstractC - - # normal dir check - elif stat.S_ISDIR(mode): -- if mode & 01002 == 2: # world writable without sticky bit -+ if mode & int("1002", 8) == 2: # world writable w/o sticky bit - printError(pkg, 'world-writable', f, oct(perm)) -- if perm != 0755: -+ if perm != int("755", 8): - printError(pkg, 'non-standard-dir-perm', f, oct(perm)) - if pkg.name not in filesys_packages and f in STANDARD_DIRS: - printError(pkg, 'standard-dir-owned-by-package', f) -@@ -1368,7 +1371,7 @@ class FilesCheck(AbstractCheck.AbstractC - if stat.S_ISLNK(mode): - printError(pkg, 'symlink-crontab-file', f) - -- if mode & 0111: -+ if mode_is_exec: - printError(pkg, 'executable-crontab-file', f) - - if stat.S_IWGRP & mode or stat.S_IWOTH & mode: -Index: rpmlint-1.5/I18NCheck.py -=================================================================== ---- rpmlint-1.5.orig/I18NCheck.py -+++ rpmlint-1.5/I18NCheck.py -@@ -79,7 +79,7 @@ class I18NCheck(AbstractCheck.AbstractCh - if pkg.isSource(): - return - -- files = pkg.files().keys() -+ files = list(pkg.files().keys()) - files.sort() - locales = [] # list of locales for this packages - webapp = False -Index: rpmlint-1.5/InitScriptCheck.py -=================================================================== ---- rpmlint-1.5.orig/InitScriptCheck.py -+++ rpmlint-1.5/InitScriptCheck.py -@@ -10,6 +10,7 @@ - - import os - import re -+import sys - - import rpm - -@@ -54,7 +55,7 @@ class InitScriptCheck(AbstractCheck.Abst - - basename = os.path.basename(fname) - initscript_list.append(basename) -- if pkgfile.mode & 0500 != 0500: -+ if pkgfile.mode & int("500", 8) != int("500", 8): - printError(pkg, 'init-script-non-executable', fname) - - if "." in basename: -@@ -87,7 +88,8 @@ class InitScriptCheck(AbstractCheck.Abst - content = None - try: - content = Pkg.readlines(pkgfile.path) -- except Exception, e: -+ except Exception: -+ e = sys.exc_info()[1] - printWarning(pkg, 'read-error', e) - continue - content_str = "".join(content) -Index: rpmlint-1.5/LSBCheck.py -=================================================================== ---- rpmlint-1.5.orig/LSBCheck.py -+++ rpmlint-1.5/LSBCheck.py -@@ -31,12 +31,16 @@ class LSBCheck(AbstractCheck.AbstractChe - printError(pkg, 'non-lsb-compliant-package-name', name) - - version = pkg[rpm.RPMTAG_VERSION] -- if version and not version_regex.search(version): -- printError(pkg, 'non-lsb-compliant-version', version) -+ if version: -+ version = version.decode() -+ if not version_regex.search(version): -+ printError(pkg, 'non-lsb-compliant-version', version) - - release = pkg[rpm.RPMTAG_RELEASE] -- if release and not version_regex.search(release): -- printError(pkg, 'non-lsb-compliant-release', release) -+ if release: -+ release = release.decode() -+ if not version_regex.search(release): -+ printError(pkg, 'non-lsb-compliant-release', release) - - # Create an object to enable the auto registration of the test - check = LSBCheck() -Index: rpmlint-1.5/MenuCheck.py -=================================================================== ---- rpmlint-1.5.orig/MenuCheck.py -+++ rpmlint-1.5/MenuCheck.py -@@ -178,9 +178,9 @@ class MenuCheck(AbstractCheck.AbstractCh - else: - if basename != pkg.name: - printWarning(pkg, 'non-coherent-menu-filename', fname) -- if mode & 0444 != 0444: -+ if mode & int("444", 8) != int("444", 8): - printError(pkg, 'non-readable-menu-file', fname) -- if mode & 0111 != 0: -+ if mode & int("111", 8): - printError(pkg, 'executable-menu-file', fname) - menus.append(fname) - else: -Index: rpmlint-1.5/MenuXDGCheck.py -=================================================================== ---- rpmlint-1.5.orig/MenuXDGCheck.py -+++ rpmlint-1.5/MenuXDGCheck.py -@@ -9,7 +9,10 @@ - from Filter import addDetails, printError, printWarning - from Pkg import getstatusoutput, is_utf8 - import AbstractCheck --from ConfigParser import RawConfigParser -+try: -+ from ConfigParser import RawConfigParser -+except: -+ from configparser import RawConfigParser - import os - - STANDARD_BIN_DIRS = ['/bin/','/sbin/','/usr/bin/','/usr/sbin/'] -Index: rpmlint-1.5/SourceCheck.py -=================================================================== ---- rpmlint-1.5.orig/SourceCheck.py -+++ rpmlint-1.5/SourceCheck.py -@@ -14,7 +14,7 @@ import AbstractCheck - import Config - - --DEFAULT_VALID_SRC_PERMS = (0644, 0755) -+DEFAULT_VALID_SRC_PERMS = (int("644", 8), int("755", 8)) - - source_regex = re.compile('\\.(tar|patch|tgz|diff)$') - compress_ext = Config.getOption("CompressExtension", "bz2") -@@ -43,7 +43,7 @@ class SourceCheck(AbstractCheck.Abstract - not fname.endswith(compress_ext): - printWarning(pkg, 'source-or-patch-not-compressed', - compress_ext, fname) -- perm = pkgfile.mode & 07777 -+ perm = pkgfile.mode & int("7777", 8) - if perm not in valid_src_perms: - printWarning(pkg, 'strange-permission', fname, oct(perm)) - -Index: rpmlint-1.5/TagsCheck.py -=================================================================== ---- rpmlint-1.5.orig/TagsCheck.py -+++ rpmlint-1.5/TagsCheck.py -@@ -534,7 +534,7 @@ class TagsCheck(AbstractCheck.AbstractCh - def _unexpanded_macros(self, pkg, tagname, value, is_url=False): - if not value: - return -- for match in AbstractCheck.macro_regex.findall(str(value)): -+ for match in AbstractCheck.macro_regex.findall(value): - # Do not warn about %XX URL escapes - if is_url and re.match('^%[0-9A-F][0-9A-F]$', match, re.I): - continue -@@ -543,28 +543,33 @@ class TagsCheck(AbstractCheck.AbstractCh - def check(self, pkg): - - packager = pkg[rpm.RPMTAG_PACKAGER] -- self._unexpanded_macros(pkg, 'Packager', packager) -- if not packager: -+ if packager: -+ packager = packager.decode() -+ self._unexpanded_macros(pkg, 'Packager', packager) -+ if Config.getOption('Packager') and \ -+ not packager_regex.search(packager): -+ printWarning(pkg, 'invalid-packager', packager) -+ else: - printError(pkg, 'no-packager-tag') -- elif Config.getOption('Packager') and \ -- not packager_regex.search(packager): -- printWarning(pkg, 'invalid-packager', packager) - - version = pkg[rpm.RPMTAG_VERSION] -- self._unexpanded_macros(pkg, 'Version', version) -- if not version: -- printError(pkg, 'no-version-tag') -- else: -+ if version: -+ version = version.decode() -+ self._unexpanded_macros(pkg, 'Version', version) - res = invalid_version_regex.search(version) - if res: - printError(pkg, 'invalid-version', version) -+ else: -+ printError(pkg, 'no-version-tag') - - release = pkg[rpm.RPMTAG_RELEASE] -- self._unexpanded_macros(pkg, 'Release', release) -- if not release: -+ if release: -+ release = release.decode() -+ self._unexpanded_macros(pkg, 'Release', release) -+ if release_ext and not extension_regex.search(release): -+ printWarning(pkg, 'not-standard-release-extension', release) -+ else: - printError(pkg, 'no-release-tag') -- elif release_ext and not extension_regex.search(release): -- printWarning(pkg, 'not-standard-release-extension', release) - - epoch = pkg[rpm.RPMTAG_EPOCH] - if epoch is None: -@@ -592,7 +597,7 @@ class TagsCheck(AbstractCheck.AbstractCh - is_devel = FilesCheck.devel_regex.search(name) - is_source = pkg.isSource() - for d in deps: -- value = apply(Pkg.formatRequire, d) -+ value = Pkg.formatRequire(*d) - if use_epoch and d[1] and d[2][0] is None and \ - not d[0].startswith('rpmlib('): - printWarning(pkg, 'no-epoch-in-dependency', value) -@@ -687,25 +692,31 @@ class TagsCheck(AbstractCheck.AbstractCh - ignored_words.update((x[0] for x in pkg.conflicts())) - ignored_words.update((x[0] for x in pkg.obsoletes())) - -+ langs = pkg[rpm.RPMTAG_HEADERI18NTABLE] -+ if langs: -+ langs = [x.decode() for x in langs] -+ - summary = pkg[rpm.RPMTAG_SUMMARY] -- if not summary: -- printError(pkg, 'no-summary-tag') -- else: -- if not pkg[rpm.RPMTAG_HEADERI18NTABLE]: -+ if summary: -+ summary = summary.decode() -+ if not langs: - self._unexpanded_macros(pkg, 'Summary', summary) - else: -- for lang in pkg[rpm.RPMTAG_HEADERI18NTABLE]: -+ for lang in langs: - self.check_summary(pkg, lang, ignored_words) -+ else: -+ printError(pkg, 'no-summary-tag') - - description = pkg[rpm.RPMTAG_DESCRIPTION] -- if not description: -- printError(pkg, 'no-description-tag') -- else: -- if not pkg[rpm.RPMTAG_HEADERI18NTABLE]: -+ if description: -+ description = description.decode() -+ if not langs: - self._unexpanded_macros(pkg, '%description', description) - else: -- for lang in pkg[rpm.RPMTAG_HEADERI18NTABLE]: -+ for lang in langs: - self.check_description(pkg, lang, ignored_words) -+ else: -+ printError(pkg, 'no-description-tag') - - group = pkg[rpm.RPMTAG_GROUP] - self._unexpanded_macros(pkg, 'Group', group) diff --git a/0001-Set-Python-3.4-magic-number-to-3310.patch b/0001-Set-Python-3.4-magic-number-to-3310.patch deleted file mode 100644 index fb946f0..0000000 --- a/0001-Set-Python-3.4-magic-number-to-3310.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 0929683e2544813d65ef85ae49b52ccdc6662746 Mon Sep 17 00:00:00 2001 -From: Sascha Peilicke -Date: Tue, 1 Apr 2014 12:47:30 +0200 -Subject: [PATCH] Set Python-3.4 magic number to 3310 - -This is the final magic number of the 3.4 release. ---- - FilesCheck.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -Index: rpmlint-1.5/FilesCheck.py -=================================================================== ---- rpmlint-1.5.orig/FilesCheck.py -+++ rpmlint-1.5/FilesCheck.py -@@ -741,7 +741,7 @@ _python_magic_values = { - '3.1': 3150, - '3.2': 3180, - '3.3': 3230, -- '3.4': 3260, -+ '3.4': 3310, - } - - def get_expected_pyc_magic(path): diff --git a/rpmlint-fix-unexpanded-macros-for-array-values.patch b/rpmlint-fix-unexpanded-macros-for-array-values.patch deleted file mode 100644 index 36c6696..0000000 --- a/rpmlint-fix-unexpanded-macros-for-array-values.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 092a54ca23367c845f796f753fa8ff43746b844a Mon Sep 17 00:00:00 2001 -From: Alberto Planas -Date: Thu, 27 Feb 2014 16:35:13 +0100 -Subject: [PATCH] Fix _unexpanded_macros for array values - ---- - TagsCheck.py | 17 ++++++++++++----- - 1 file changed, 12 insertions(+), 5 deletions(-) - -Index: rpmlint-1.5/TagsCheck.py -=================================================================== ---- rpmlint-1.5.orig/TagsCheck.py -+++ rpmlint-1.5/TagsCheck.py -@@ -524,13 +524,20 @@ class TagsCheck(AbstractCheck.AbstractCh - AbstractCheck.AbstractCheck.__init__(self, 'TagsCheck') - - def _unexpanded_macros(self, pkg, tagname, value, is_url=False): -+ def _check_value(value): -+ for match in AbstractCheck.macro_regex.findall(value): -+ # Do not warn about %XX URL escapes -+ if is_url and re.match('^%[0-9A-F][0-9A-F]$', match, re.I): -+ continue -+ printWarning(pkg, 'unexpanded-macro', tagname, match) -+ - if not value: - return -- for match in AbstractCheck.macro_regex.findall(value): -- # Do not warn about %XX URL escapes -- if is_url and re.match('^%[0-9A-F][0-9A-F]$', match, re.I): -- continue -- printWarning(pkg, 'unexpanded-macro', tagname, match) -+ if isinstance(value, list): -+ for single_value in value: -+ _check_value(single_value) -+ else: -+ _check_value(value) - - def check(self, pkg): - diff --git a/suse-changelog.patch b/suse-changelog.patch deleted file mode 100644 index d1ac396..0000000 --- a/suse-changelog.patch +++ /dev/null @@ -1,15 +0,0 @@ -Index: TagsCheck.py -=================================================================== ---- TagsCheck.py.orig -+++ TagsCheck.py -@@ -1032,8 +1032,8 @@ Development/''', - "%s".''' % '", "'.join(VALID_GROUPS), - - 'no-changelogname-tag', --'''There is no %changelog tag in your spec file. To insert it, just insert a --'%changelog' in your spec file and rebuild it.''', -+'''There is no changelog. Please insert a '%changelog' section heading in your -+spec file and prepare your changes file using e.g. the 'osc vc' command.''', - - 'no-version-in-last-changelog', - '''The latest changelog entry doesn't contain a version. Please insert the