SHA256
1
0
forked from pool/rpmlint
OBS User unknown 2008-06-25 17:08:32 +00:00 committed by Git OBS Bridge
parent e8698f6643
commit ca5eacfc5f
17 changed files with 156 additions and 425 deletions

View File

@ -1,84 +1,14 @@
--- Config.py
+++ Config.py
@@ -126,6 +126,17 @@
else:
_filters_re = None
+_scoring={}
+
+def setBadness(s, score):
+ _scoring[s] = score
+ setOption('UseBadness', True)
+
+def badness(s):
+ if _scoring.has_key(s):
+ return _scoring[s]
+ return 0
+
_non_named_group_re = re.compile('[^\\](\()[^:]')
def isFiltered(s):
global _filters
--- Filter.py
+++ Filter.py
@@ -11,19 +11,27 @@
import Config
import Testing
+_badness_score = 0
+_diagnostic = list()
+
def printInfo(pkg, reason, *details):
- if _print("I", pkg, reason, details) and Config.info:
- printDescriptions(reason)
+ _print("I", pkg, reason, details)
def printWarning(pkg, reason, *details):
- if _print("W", pkg, reason, details) and Config.info:
- printDescriptions(reason)
+ _print("W", pkg, reason, details)
def printError(pkg, reason, *details):
- if _print("E", pkg, reason, details) and Config.info:
- printDescriptions(reason)
+ _print("E", pkg, reason, details)
def _print(type, pkg, reason, details):
+ global _badness_score, _diagnostic
+
+ badness = Config.badness(reason)
+ if Config.getOption('UseBadness'):
+ type = "W"
+ if badness:
+ type = "E"
+
ln = ""
if pkg.current_linenum is not None:
ln = "%s:" % pkg.current_linenum
@@ -31,14 +39,16 @@
if pkg.arch is not None:
arch = ".%s" % pkg.arch
s = "%s%s:%s %s: %s" % (pkg.name, arch, ln, type, reason)
+ if badness:
+ s = s + " (Badness: %d)" % badness
for d in details:
s = s + " %s" % d
if Testing.isTest():
Testing.addOutput(s)
else:
if not Config.isFiltered(s):
- sys.stdout.write(s)
- sys.stdout.write("\n")
+ _diagnostic.append(s + "\n")
+ _badness_score += badness
return 1
return 0
@@ -52,12 +62,56 @@
@@ -74,26 +74,28 @@
except KeyError:
pass
+def _diag_compare(x,y):
+
def _diag_compare(x,y):
- where_a = x.split()[1]
- level_a = x.split()[2]
+ where_a = x.split()[2]
+ level_a = x.split()[1]
+
@ -87,69 +17,28 @@
+
+ if (level_b > level_a):
+ return 1
+
- where_b = y.split()[1]
- level_b = y.split()[2]
+ if (level_b < level_a):
+ return -1
+
- if level_b > level_a:
+ if (where_b < where_a):
+ return 1
return 1
- elif level_b == level_a:
- if where_b > where_b:
- return 1
- elif where_b == where_a:
- return 0
- else:
- return -1
- else:
+
+ if (where_b > where_a):
+ return -1
+
return -1
+ return 0
+
+def printAllReasons():
+ global _badness_score, _diagnostic
+ _diagnostic.sort(_diag_compare)
+ last_reason=''
+ for diag in _diagnostic:
+ if Config.info:
+ reason = diag.split()[2]
+ if reason != last_reason:
+ if len(last_reason):
+ printDescriptions(last_reason)
+ last_reason=reason
+ sys.stdout.write(diag)
+ if Config.info and len(last_reason):
+ printDescriptions(last_reason)
+ _diagnostic = list()
+ return _badness_score > 1000
+
_details={}
def addDetails(*details):
for idx in range(len(details)/2):
_details[details[idx*2]]=details[idx*2+1]
+def BadnessScore():
+ global _badness_score
+
+ return _badness_score
+
# Filter.py ends here
# Local variables:
--- README
+++ README
@@ -79,6 +79,7 @@
FilesCheck.py
SystemLibPaths list of strings ('/lib', '/usr/lib', '/usr/X11R6/lib')
UseBzip2 boolean 1
+UseBadness boolean 0
UseDefaultRunlevels boolean 1
UseEpoch boolean 0
UseIndexedJars boolean 1
--- rpmlint.py
+++ rpmlint.py
@@ -146,6 +146,10 @@
sys.stderr.write('Interrupted, exiting while scanning all packages\n')
sys.exit(2)
+ if printAllReasons():
+ sys.stdout.write('RPMLINT: E: BADNESS is %d - threshold exceeded. aborting the build.\n' % BadnessScore() )
+ sys.exit(1)
+
finally:
pkg and pkg.cleanup()
def printAllReasons():
threshold = badnessThreshold()

View File

@ -1,19 +0,0 @@
---
BinariesCheck.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Index: BinariesCheck.py
===================================================================
--- BinariesCheck.py.orig
+++ BinariesCheck.py
@@ -26,8 +26,8 @@ class BinaryInfo:
needed_regex=re.compile('\s+\(NEEDED\).*\[(\S+)\]')
rpath_regex=re.compile('\s+\(RPATH\).*\[(\S+)\]')
soname_regex=re.compile('\s+\(SONAME\).*\[(\S+)\]')
- comment_regex=re.compile('^\s+\[\d+\]\s+\.comment\s+')
- pic_regex=re.compile('^\s+\[\d+\]\s+\.rela?\.(data|text)')
+ comment_regex=re.compile('^\s+\[\s*\d+\]\s+\.comment\s+')
+ pic_regex=re.compile('^\s+\[\s*\d+\]\s+\.rela?\.(data|text)')
non_pic_regex=re.compile('TEXTREL', re.MULTILINE)
undef_regex=re.compile('^undefined symbol:\s+(\S+)')
unused_regex=re.compile('^\s+(\S+)')

14
fix-tabs-indenting.diff Normal file
View File

@ -0,0 +1,14 @@
--- SpecCheck.py
+++ SpecCheck.py
@@ -342,9 +342,9 @@ class SpecCheck(AbstractCheck.AbstractCh
(ifarch_regex.search(line) or if_regex.search(line) or
endif_regex.search(line)):
if defattr_regex.search(line):
- files_has_defattr = 1;
+ files_has_defattr = 1;
elif not (files_has_defattr or attr_regex.search(line)):
- printError(pkg, 'files-attr-not-set')
+ printError(pkg, 'files-attr-not-set')
# TODO: check scriptlets for these too
if current_section == 'files' and noarch:

View File

@ -1,94 +0,0 @@
--- PostCheck.py
+++ PostCheck.py
@@ -33,7 +33,7 @@
# shells that grok the -n switch for debugging
syntaxcheck_shells = ('/bin/sh', '/bin/bash')
-percent_regex = re.compile('%{?\w{3,}', re.MULTILINE)
+percent_regex = re.compile('^[^#]*%{?\w{3,}', re.MULTILINE)
bracket_regex=re.compile('^[^#]*if.*[^ :\]]\]', re.MULTILINE)
home_regex=re.compile('[^a-zA-Z]+~/|\${?HOME(\W|$)', re.MULTILINE)
dangerous_command_regex=re.compile("(^|[;\|`]|&&|$\()\s*(?:\S*/s?bin/)?(cp|mv|ln|tar|rpm|chmod|chown|rm|cpio|install|perl|userdel|groupdel)\s", re.MULTILINE)
@@ -44,14 +44,49 @@
menu_regex=re.compile('^/usr/lib/menu/|^/etc/menu-methods/|^/usr/share/applications/')
bogus_var_regex=re.compile('(\${?RPM_BUILD_(ROOT|DIR)}?)')
+# [foo, (bar, baz)]:
+# if a script contains foo then the rpm must prerequire bar or contain baz
prereq_assoc = (
# ['chkconfig', ('chkconfig', '/sbin/chkconfig')],
['chkfontpath', ('chkfontpath', '/usr/sbin/chkfontpath')],
['rpm-helper', ('rpm-helper',)],
+ ['cp', ('coreutils', '/bin/cp')],
+ ['ln', ('coreutils', '/bin/ln')],
+ ['mv', ('coreutils', '/bin/mv')],
+ ['rm', ('coreutils', '/bin/rm')],
+ ['rmdir', ('coreutils', '/bin/rmdir')],
+ ['cat', ('coreutils', '/bin/cat')],
+ ['cut', ('coreutils', '/usr/bin/cut')],
+ ['uname', ('coreutils', '/bin/uname')],
+ ['md5sum', ('coreutils', '/usr/bin/md5sum')],
+ ['pear', ('php5-pear', '/usr/bin/pear')],
+ ['update-alternatives', ('update-alternatives', '/usr/sbin/update-alternatives')],
+ ['a2enmod', ('apache2', '/usr/sbin/a2enmod')],
+
+ ['sed', ('sed', '/bin/sed')],
+ ['awk', ('gawk', '/usr/bin/awk')],
+ ['gawk', ('gawk', '/usr/bin/gawk')],
+ ['grep', ('grep', '/usr/bin/grep')],
+ ['useradd', ('pwdutils', '/usr/sbin/useradd')],
+ ['groupadd', ('pwdutils', '/usr/sbin/groupadd')],
+ ['chkstat', ('permissions', '/usr/bin/chkstat')],
+ ['diff', ('diffutils', '/usr/bin/diff')],
+ ['cmp', ('diffutils', '/usr/bin/cmp')],
+ ['patch', ('patch', '/usr/bin/patch')],
+ ['fillup', ('fillup', '/bin/fillup')],
+ ['tar', ('tar', '/bin/tar')],
+ ['cpio', ('cpio', '/bin/cpio')],
+ ['odbcinst', ('unixODBC', '/usr/bin/odbcinst')],
+ ['install-info', ('info', '/sbin/install-info')],
+ ['gpg', ('gpg2', '/usr/bin/gpg')],
+ ['nm', ('binutils', '/usr/bin/nm')],
+ ['edit-xml-catalog', ('awk', '/usr/bin/awk')],
+ ['usermod', ('pwdutils', '/usr/sbin/usermod')],
)
+# \b is word boundary
for p in prereq_assoc:
- p[0] = re.compile('^[^#]+' + p[0], re.MULTILINE)
+ p[0] = re.compile('^[^#]+\\b(' + p[0] + ')\\b', re.MULTILINE)
# pychecker fix
del p
@@ -163,15 +196,17 @@
printError(pkg, 'update-menus-without-menu-file-in-' + tag[2])
if tmp_regex.search(script):
printError(pkg, 'use-tmp-in-' + tag[2])
+
for c in prereq_assoc:
- if c[0].search(script):
+ res = c[0].search(script)
+ if res:
found=0
for p in c[1]:
if p in prereq or p in files:
found=1
break
if not found:
- printError(pkg, 'no-prereq-on', c[1][0])
+ printError(pkg, 'no-prereq-on', c[1][0], 'or', c[1][1], 'for', res.group(1))
if prog in syntaxcheck_shells:
if incorrect_shell_script(prog, script):
@@ -230,6 +265,11 @@
policy type was found in the scriptlet. These types are subject to change
on a policy version upgrade. Use the restorecon command which queries the
currently loaded policy for the correct type instead.''',
+
+'no-prereq-on',
+'''Your rpm post/postun scripts contain a call to a command that is missing
+from the rpm prereq list. This might cause the package to fail during
+installation due to the required program not being available yet.'''
)
# PostCheck.py ends here

View File

@ -1,24 +0,0 @@
--- NamingPolicyCheck.py
+++ NamingPolicyCheck.py
@@ -85,14 +85,14 @@ check=NamingPolicyCheck()
# if somone as a elegant solution, I will be happy to implement and test it.
-check.add_check('xmms', '^xmms-', '^/usr/lib/xmms/')
-check.add_check('python', '^python-', '^/usr/lib/python[1-9](-[1-9])?')
-check.add_check('perl5', '^perl-', '^/usr/lib/perl5/vendor_perl')
-check.add_check('apache2', '^apache2-mod_', '^/usr/lib/apache2-')
+check.add_check('xmms', '^xmms-', '^/usr/lib(64)?/xmms/')
+check.add_check('python', '^python-', '^/usr/lib(64)?/python[1-9](-[1-9])?')
+check.add_check('perl5', '^perl-', '^/usr/lib(64)?/perl5/vendor_perl')
+check.add_check('apache2', '^apache2-mod_', '^/usr/lib(64)?/apache2-')
check.add_check('fortune', '^fortune-', '^/usr/share/games/fortunes/')
-check.add_check('php', '^php-', '/usr/lib/php/extensions/')
-check.add_check('ruby', '^ruby-', '/usr/lib/ruby/[1-9](-[1-9])?/')
-check.add_check('ocaml', '^ocaml-', '/usr/lib/ocaml/')
+check.add_check('php', '^php-', '/usr/lib(64)?/php/extensions/')
+check.add_check('ruby', '^ruby-', '/usr/lib(64)?/ruby/[1-9](-[1-9])?/')
+check.add_check('ocaml', '^ocaml-', '/usr/lib(64)?/ocaml/')
# these exception should be added
# apache2 => apache2-devel

52
no-badness-return.diff Normal file
View File

@ -0,0 +1,52 @@
Index: Filter.py
===================================================================
--- Filter.py (Revision 1434)
+++ Filter.py (Arbeitskopie)
@@ -96,10 +96,6 @@ def _diag_compare(x,y):
def printAllReasons():
- threshold = badnessThreshold()
- if threshold < 0:
- return 0
-
global _badness_score, _diagnostic
_diagnostic.sort(_diag_compare)
last_reason=''
@@ -114,8 +110,6 @@ def printAllReasons():
if Config.info and len(last_reason):
printDescriptions(last_reason)
_diagnostic = list()
- return _badness_score > threshold
-
_details={}
Index: rpmlint.py
===================================================================
--- rpmlint.py (Revision 1434)
+++ rpmlint.py (Arbeitskopie)
@@ -155,9 +155,7 @@ def main():
sys.stderr.write('Interrupted, exiting while scanning all packages\n')
sys.exit(2)
- if printAllReasons():
- sys.stderr.write('rpmlint: E: badness %d exceeds threshold %d, aborting.\n' % (badnessScore(), badnessThreshold()))
- sys.exit(66)
+ printAllReasons()
finally:
pkg and pkg.cleanup()
@@ -165,6 +163,12 @@ def main():
% (packages_checked, specfiles_checked,
printed_messages["E"], printed_messages["W"])
+ if (badnessThreshold() >= 0):
+ if badnessScore() >= badnessThreshold():
+ sys.stderr.write('rpmlint: E: badness %d exceeds threshold %d, aborting.\n' % (badnessScore(), badnessThreshold()))
+ sys.exit(66)
+ sys.exit(0)
+
if printed_messages["E"] > 0:
sys.exit(64)
elif printed_messages["W"] > 0:

View File

@ -1,11 +0,0 @@
--- FilesCheck.py
+++ FilesCheck.py
@@ -824,7 +824,7 @@ class FilesCheck(AbstractCheck.AbstractCheck):
printError(pkg, 'version-control-internal-file', f)
elif f.endswith('/.htaccess'):
printError(pkg, 'htaccess-file', f)
- elif hidden_file_regex.search(f):
+ elif hidden_file_regex.search(f) and not f.startswith("/etc/skel/"):
printWarning(pkg, 'hidden-file-or-dir', f)
elif manifest_perl_regex.search(f):
printWarning(pkg, 'manifest-in-perl-module', f)

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:fc9168bb9d950d9ee7282c71a683693156b3f7c697598309b0a9bf978e8e367b
size 79182

3
rpmlint-0.83.tar.bz2 Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a4bb8e93c14e86c7d0d2774bcb9147f5de54e117dd573e989f45a927feffd29d
size 81991

View File

@ -1,3 +1,10 @@
-------------------------------------------------------------------
Mon Jun 23 00:43:46 CEST 2008 - dmueller@suse.de
- update to 0.83:
* removed upstreamed patches
* a couple of new checks, bugfixes
-------------------------------------------------------------------
Wed Jun 18 14:33:09 CEST 2008 - dmueller@suse.de

View File

@ -1,5 +1,5 @@
#
# spec file for package rpmlint (Version 0.82)
# spec file for package rpmlint (Version 0.83)
#
# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@ -14,8 +14,8 @@
Name: rpmlint
BuildRequires: rpm-python
Summary: Rpm correctness checker
Version: 0.82
Release: 57
Version: 0.83
Release: 1
Source0: %{name}-%{version}.tar.bz2
Source1: config
Source1001: config.in
@ -47,6 +47,7 @@ Patch4: invalid-filerequires.diff
Patch5: suse-bzip-bigger-than-100k.diff
Patch6: suse-filesystem.diff
Patch7: suse-checks.diff
Patch8: suse-debuginfo.diff
Patch9: no-doc-for-lib.diff
Patch10: add-scoring-support.diff
Patch11: suse-spec-bzip2.diff
@ -63,7 +64,6 @@ Patch21: fix-buildroot-test.diff
Patch22: better-wrong-script.diff
Patch23: buildroot-doc.diff
Patch24: sysv5-init-checks.diff
Patch25: suse-devel-dependencies.diff
Patch26: ignore-non-readable-in-etc.diff
Patch27: detailed-desktop-file-check.diff
Patch29: rpmgroup-checks.diff
@ -72,7 +72,6 @@ Patch31: only-reg-files-are-scripts.diff
Patch33: check-buildroot-during-install.diff
Patch34: verify-buildrequires.diff
Patch35: fix-versioned-prereq.diff
Patch36: improve-postdep-check.diff
Patch37: buildroot-in-scripts.diff
Patch38: fix-patch-detection.diff
Patch39: libtool-wrapper-check.diff
@ -80,19 +79,16 @@ Patch41: perl-versioned-rpath-deps.diff
Patch42: check-cron-dependency.diff
Patch46: locale-support.diff
Patch47: noarch-lib64.diff
Patch48: try-harder-with-spec-name.diff
Patch49: stricter-tags-check.diff
Patch50: suse-no-run-ldconfig.diff
Patch51: description-check.diff
Patch52: suppress-for-perl-python.diff
Patch53: no-dot-in-skel.diff
Patch54: locale-update.diff
Patch55: suse-debuginfo.diff
Patch56: fix-BinariesCheck-regex.diff
Patch57: suse-mono-deps-checks.diff
Patch58: add-weak-dependencies.diff
Patch59: naming-policy-lib64.diff
Patch60: selfconflicts-provide.diff
Patch61: fix-tabs-indenting.diff
Patch62: no-badness-return.diff
%py_requires
%description
@ -116,6 +112,7 @@ Authors:
%patch5
%patch6
%patch7
%patch8
%patch9
%patch10
%patch11
@ -132,7 +129,6 @@ Authors:
%patch22
%patch23
%patch24
%patch25
%patch26
%patch27
%patch29
@ -141,7 +137,6 @@ Authors:
%patch33
%patch34
%patch35
%patch36
%patch37
%patch38
%patch39
@ -149,19 +144,16 @@ Authors:
%patch42
%patch46
%patch47
%patch48
%patch49
%patch50
%patch51
%patch52
%patch53
%patch54
%patch55
%patch56
%patch57
%patch58
%patch59
%patch60
%patch61
%patch62
cp -p %{SOURCE1} .
cp -p %{SOURCE2} .
cp -p %{SOURCE3} .
@ -200,6 +192,10 @@ rm -rf $RPM_BUILD_ROOT
/usr/share/man/man1/rpmlint.1.gz
%changelog
* Mon Jun 23 2008 dmueller@suse.de
- update to 0.83:
* removed upstreamed patches
* a couple of new checks, bugfixes
* Wed Jun 18 2008 dmueller@suse.de
- fix exception in tags check (bnc#399655)
- add a warning for self-conflicts

View File

@ -40,7 +40,7 @@
+ useless_reqs.add(r)
+ else:
+ if r[0] != '/':
+ printWarning(pkg, 'useless-explicit-requires', r[0])
+ printWarning(pkg, 'useless-explicit-requires', r)
for p in pkg.provides():
- if string.find(p[1], '%') != -1:
+ if string.find(p[1], '%') != -1 or string.find(p[0], '%') != -1:

View File

@ -1,17 +1,6 @@
From: Jan Blunck <jblunck@suse.de>
Subject: Add checks for static libraries missing symtab and debuginfo
Static libraries without a symbol table are not linkable. Binaries linking
against static libraries without debuginfo are not debuggable.
---
BinariesCheck.py | 31 +++++++++++++++++++++++++++++--
1 file changed, 29 insertions(+), 2 deletions(-)
Index: BinariesCheck.py
===================================================================
--- BinariesCheck.py.orig
--- BinariesCheck.py
+++ BinariesCheck.py
@@ -32,6 +32,8 @@ class BinaryInfo:
@@ -34,6 +34,8 @@
undef_regex=re.compile('^undefined symbol:\s+(\S+)')
unused_regex=re.compile('^\s+(\S+)')
debug_file_regex=re.compile('\.debug$')
@ -20,55 +9,34 @@ Index: BinariesCheck.py
def __init__(self, pkg, path, file, is_ar):
self.had_error=0
@@ -42,6 +44,8 @@ class BinaryInfo:
self.comment=0
self.soname=0
@@ -46,6 +48,8 @@
self.non_pic=1
self.stack = 0
self.exec_stack = 0
+ self.debuginfo=0
+ self.symtab=0
is_debug=BinaryInfo.debug_file_regex.search(path)
@@ -65,6 +69,10 @@ class BinaryInfo:
r=BinaryInfo.soname_regex.search(l)
if r:
self.soname=r.group(1)
+ if BinaryInfo.debuginfo_regex.search(l):
+ self.debuginfo=1
+ if BinaryInfo.symtab_regex.search(l):
+ self.symtab=1
@@ -87,6 +91,14 @@
self.exec_stack = 1
continue
+ if BinaryInfo.debuginfo_regex.search(l):
+ self.debuginfo=1
+ continue
+
+ if BinaryInfo.symtab_regex.search(l):
+ self.symtab=1
+ continue
+
if self.non_pic:
self.non_pic=BinaryInfo.non_pic_regex.search(res[1])
else:
@@ -114,6 +122,7 @@ shared_object_regex=re.compile('shared o
executable_regex=re.compile('executable')
libc_regex=re.compile('libc\.')
ldso_soname_regex=re.compile('^ld(-linux(-(ia|x86_)64))?\.so')
+ar_regex=re.compile('\.a$')
so_regex=re.compile('/lib(64)?/[^/]+\.so(\.[0-9]+)*$')
validso_regex=re.compile('(\.so\.\d+(\.\d+)*|\d\.so)$')
sparc_regex=re.compile('SPARC32PLUS|SPARC V9|UltraSPARC')
@@ -171,7 +180,7 @@ class BinariesCheck(AbstractCheck.Abstra
for i in info:
is_elf = string.find(i[1], 'ELF') != -1
- is_ar = string.find(i[1], 'current ar archive') != -1
+ is_ar = ar_regex.search(i[0])
is_ocaml_native = string.find(i[1], 'Objective caml native') != -1
is_shell = string.find(i[1], "shell script") != -1
is_binary = is_elf or is_ar or is_ocaml_native
@@ -196,13 +205,23 @@ class BinariesCheck(AbstractCheck.Abstra
# stripped ?
if not unstrippable.search(i[0]) and not is_ocaml_native:
- if not_stripped.search(i[1]) and \
+ if not is_ar and not_stripped.search(i[1]) and \
(os.environ.get('BUILD_IS_RUNNING', None) == None or \
os.environ.get('BUILD_DEBUG_FLAGS','').find('-g') != -1):
printWarning(pkg, 'unstripped-binary-or-object', i[0])
@@ -216,6 +228,17 @@
# inspect binary file
bin_info=BinaryInfo(pkg, pkg.dirName()+i[0], i[0], is_ar)
+ # stripped static library
+ if is_ar:
+ if bin_info.had_error:
@ -79,14 +47,14 @@ Index: BinariesCheck.py
+ (os.environ.get('BUILD_IS_RUNNING', None) == None or \
+ os.environ.get('BUILD_DEBUG_FLAGS','').find('-g') != -1):
+ printWarning(pkg, 'static-library-without-debuginfo', i[0])
+
# so name in library
if so_regex.search(i[0]):
@@ -441,6 +460,14 @@ with the intended shared libraries only.
has_lib.append(i[0])
@@ -430,6 +453,14 @@
'ldd-failed',
'''Executing ldd on this file failed, all checks could not be run.''',
+
+'static-library-without-symtab',
+'''The static library doesn't contain any symbols and therefore can't be linked
+against. This may indicated that it was strip.''',
@ -94,6 +62,7 @@ Index: BinariesCheck.py
+'static-library-without-debuginfo',
+'''The static library doesn't contain any debuginfo. Binaries linking against
+this static library can't be properly debugged.''',
)
# BinariesCheck.py ends here
+
'executable-stack',
'''The binary declares the stack as executable. Executable stack is usually an
error as it is only needed if the code contains GCC trampolines or similar

View File

@ -1,11 +0,0 @@
--- TagsCheck.py
+++ TagsCheck.py
@@ -515,7 +515,7 @@
break
if has_so:
for d in deps:
- if d[0] == base:
+ if d[0].startswith(base):
dep=d
break
if not dep:

View File

@ -1,30 +1,32 @@
--- SpecCheck.py
+++ SpecCheck.py
@@ -47,6 +47,7 @@
buildprereq_regex = re.compile('^BuildPreReq:\s*(.+?)\s*$', re.IGNORECASE)
use_utf8 = Config.getOption('UseUTF8', Config.USEUTF8_DEFAULT)
macro_regex = re.compile('(%+)[{(]?(\w+)')
@@ -52,6 +52,7 @@
comment_or_empty_regex = re.compile('^\s*(#|$)')
defattr_regex = re.compile('^\s*%defattr\\b')
attr_regex = re.compile('^\s*%attr\\b')
+suse_version_regex = re.compile('%suse_version\s*[<>=]+\s*(\d+)')
# Only check for /lib, /usr/lib, /usr/X11R6/lib
# TODO: better handling of X libraries and modules.
@@ -287,6 +288,12 @@
@@ -306,7 +307,13 @@
if lib_package_regex.search(line):
lib = 1
- res = prereq_regex.search(line)
+ res = suse_version_regex.search(line)
+ if res and int(res.group(1)) > 0 and int(res.group(1)) < 1010:
+ if res and int(res.group(1)) > 0 and int(res.group(1)) < 1020:
+ printWarning(pkg, "obsolete-suse-version-check", res.group(1))
+ elif res and int(res.group(1)) > 1100:
+ printError(pkg, "invalid-suse-version-check", res.group(1))
+
res = prereq_regex.search(line)
+ eres = prereq_regex.search(line)
if res:
printWarning(pkg, 'prereq-use', res.group(2))
@@ -514,6 +521,15 @@
problems, restrict future package/provides naming, and may match something it
was originally not inteded to match -- make the Obsoletes versioned if
possible.''',
@@ -568,6 +575,16 @@
set which may result in security issues in the resulting binary package
depending on the system where the package is built. Add default attributes
using %defattr before it in the %files section, or use per line %attr's.''',
+
+'obsolete-suse-version-check',
+'''The specfile contains a comparison of %suse_version against a suse release
@ -34,6 +36,7 @@
+'invalid-suse-version-check',
+'''The specfile contains a comparison of %suse_version against a suse release
+that does not exist. Please double check.'''
+
)
# SpecCheck.py ends here

View File

@ -6,5 +6,6 @@ import sys
for filename in sys.argv[1:]:
try:
compile(open(filename).read(), filename, 'exec')
except:
except Exception, e:
print e
exit(1)

View File

@ -1,41 +0,0 @@
--- SpecCheck.py
+++ SpecCheck.py
@@ -169,18 +169,22 @@
# lookup spec file
files = pkg.files()
- for f in files.keys():
- if f.endswith('.spec'):
- self._spec_file = pkg.dirName() + "/" + f
- break
+ if (pkg.name + ".spec") in files.keys():
+ self._spec_file = pkg.name + ".spec"
+ else:
+ for f in files.keys():
+ if f.endswith('.spec'):
+ self._spec_file = f
+ break
+
if not self._spec_file:
printError(pkg, "no-spec-file")
else:
- if f != pkg.name + ".spec":
- printError(pkg, "invalid-spec-name", f)
+ if self._spec_file != pkg.name + ".spec":
+ printError(pkg, "invalid-spec-name", self._spec_file)
# check content of spec file
- spec_lines = Pkg.readlines(self._spec_file)
+ spec_lines = Pkg.readlines(pkg.dirName() + "/" + self._spec_file)
self.check_spec(pkg, spec_lines)
def check_spec(self, pkg, spec_lines):
@@ -219,7 +223,7 @@
}
if self._spec_file:
- if use_utf8 and not Pkg.is_utf8(self._spec_file):
+ if use_utf8 and not Pkg.is_utf8(pkg.dirName() + "/" + self._spec_file):
printError(pkg, "non-utf8-spec-file", self._spec_file)
# gather info from spec lines