forked from pool/rpmlint
Accepting request 50483 from Base:System
Copy from Base:System/rpmlint based on submit request 50483 from user prusnak OBS-URL: https://build.opensuse.org/request/show/50483 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/rpmlint?expand=0&rev=68
This commit is contained in:
parent
f7d2015dce
commit
4d4e6f73c7
185
CheckGNOMEMacros.py
Normal file
185
CheckGNOMEMacros.py
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
# vim:sw=4:et
|
||||||
|
#############################################################################
|
||||||
|
# File : CheckGNOMEMacros.py
|
||||||
|
# Package : rpmlint
|
||||||
|
# Author : Vincent Untz
|
||||||
|
# Purpose : Check for GNOME related packaging errors
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
import re
|
||||||
|
import string
|
||||||
|
|
||||||
|
import rpm
|
||||||
|
|
||||||
|
from Filter import *
|
||||||
|
import AbstractCheck
|
||||||
|
import Config
|
||||||
|
|
||||||
|
## FIXME
|
||||||
|
# Maybe detect packages installing icons in other themes than hicolor and not
|
||||||
|
# updating the icon cache for those themes?
|
||||||
|
|
||||||
|
_gnome_post_postun_checks = [
|
||||||
|
('glib2-gsettings-schema',
|
||||||
|
re.compile('^/usr/share/glib-2.0/schemas/.+\.gschema.xml$'),
|
||||||
|
'glib2-tools',
|
||||||
|
re.compile('^[^#]*glib-compile-schemas', re.MULTILINE),
|
||||||
|
True),
|
||||||
|
|
||||||
|
('glib2-gio-module',
|
||||||
|
re.compile('^/usr/lib(?:64)?/gio/modules/'),
|
||||||
|
'glib2-tools',
|
||||||
|
re.compile('^[^#]*gio-querymodules', re.MULTILINE),
|
||||||
|
True),
|
||||||
|
|
||||||
|
('gdk-pixbuf-loader',
|
||||||
|
re.compile('^/usr/lib(?:64)?/gdk-pixbuf-2.0/[^/]+/loaders/'),
|
||||||
|
'gdk-pixbuf-query-loaders',
|
||||||
|
re.compile('^[^#]*gdk-pixbuf-query-loaders', re.MULTILINE),
|
||||||
|
True),
|
||||||
|
|
||||||
|
('gtk2-immodule',
|
||||||
|
re.compile('^/usr/lib(?:64)?/gtk-2.0/[^/]+/immodules/'),
|
||||||
|
'gtk2',
|
||||||
|
re.compile('^[^#]*gtk-query-immodules-2.0', re.MULTILINE),
|
||||||
|
True),
|
||||||
|
|
||||||
|
('gtk3-immodule',
|
||||||
|
re.compile('^/usr/lib(?:64)?/gtk-3.0/[^/]+/immodules/'),
|
||||||
|
'gtk3-tools',
|
||||||
|
re.compile('^[^#]*gtk-query-immodules-3.0', re.MULTILINE),
|
||||||
|
True),
|
||||||
|
|
||||||
|
# Not fatal since it would make too many things fail
|
||||||
|
('hicolor-icon-cache',
|
||||||
|
re.compile('^/usr/share/icons/hicolor/'),
|
||||||
|
None,
|
||||||
|
re.compile('^[^#]*gtk-update-icon-cache', re.MULTILINE),
|
||||||
|
False),
|
||||||
|
|
||||||
|
('mime-database',
|
||||||
|
re.compile('^/usr/share/mime/packages/.+\.xml$'),
|
||||||
|
None,
|
||||||
|
re.compile('^[^#]*update-mime-database', re.MULTILINE),
|
||||||
|
True),
|
||||||
|
|
||||||
|
# Not fatal since it would make too many things fail
|
||||||
|
('desktop-database',
|
||||||
|
re.compile('^/usr/share/applications/.+\.desktop$'),
|
||||||
|
None,
|
||||||
|
re.compile('^[^#]*update-desktop-database', re.MULTILINE),
|
||||||
|
False)
|
||||||
|
]
|
||||||
|
|
||||||
|
_gnome_gconf_filename_re = re.compile('^/usr/share/GConf/schemas/.+\.schemas$')
|
||||||
|
_gnome_gconf_sciptlet_re = re.compile('^[^#]*gconftool-2', re.MULTILINE)
|
||||||
|
|
||||||
|
class GNOMECheck(AbstractCheck.AbstractCheck):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
AbstractCheck.AbstractCheck.__init__(self, "CheckGNOMEMacros")
|
||||||
|
|
||||||
|
def check(self, pkg):
|
||||||
|
|
||||||
|
if pkg.isSource():
|
||||||
|
return
|
||||||
|
|
||||||
|
ghosts = pkg.ghostFiles()
|
||||||
|
|
||||||
|
pkg_requires = set(map(lambda x: string.split(x[0],'(')[0], pkg.requires()))
|
||||||
|
postin = pkg[rpm.RPMTAG_POSTIN] or pkg[rpm.RPMTAG_POSTINPROG]
|
||||||
|
postun = pkg[rpm.RPMTAG_POSTUN] or pkg[rpm.RPMTAG_POSTUNPROG]
|
||||||
|
posttrans = pkg[rpm.RPMTAG_POSTTRANS] or pkg[rpm.RPMTAG_POSTTRANSPROG]
|
||||||
|
|
||||||
|
for filename in (x for x in pkg.files() if x not in ghosts):
|
||||||
|
for (name, file_re, required, post_re, fatal) in _gnome_post_postun_checks:
|
||||||
|
if fatal:
|
||||||
|
gnomePrint = printError
|
||||||
|
else:
|
||||||
|
gnomePrint = printWarning
|
||||||
|
|
||||||
|
if file_re.search(filename):
|
||||||
|
if required and required not in pkg_requires:
|
||||||
|
gnomePrint(pkg, 'suse-' + name + '-missing-requires', filename)
|
||||||
|
if not postin or not post_re.search(postin):
|
||||||
|
gnomePrint(pkg, 'suse-' + name + '-missing-postin', filename)
|
||||||
|
if not postun or not post_re.search(postun):
|
||||||
|
gnomePrint(pkg, 'suse-' + name + '-missing-postun', filename)
|
||||||
|
|
||||||
|
if _gnome_gconf_filename_re.search(filename):
|
||||||
|
if not ((postin and _gnome_gconf_sciptlet_re.search(postin)) or
|
||||||
|
(posttrans and _gnome_gconf_sciptlet_re.search(posttrans))):
|
||||||
|
printError(pkg, 'suse-gconf-schema-missing-scriptlets', filename)
|
||||||
|
|
||||||
|
|
||||||
|
check=GNOMECheck()
|
||||||
|
|
||||||
|
if Config.info:
|
||||||
|
addDetails(
|
||||||
|
'suse-glib2-gsettings-schema-missing-requires',
|
||||||
|
'''A GSettings schema is in your package, but there is no dependency for the tool to recompile the schema database. Use %glib2_gsettings_schema_requires.''',
|
||||||
|
|
||||||
|
'suse-glib2-gsettings-schema-missing-postin',
|
||||||
|
'''A GSettings schema is in your package, but the schema database is not recompiled in the %post scriptlet. Use %glib2_gsettings_schema_post.''',
|
||||||
|
|
||||||
|
'suse-glib2-gsettings-schema-missing-postun',
|
||||||
|
'''A GSettings schema is in your package, but the schema database is not recompiled in the %postun scriptlet. Use %glib2_gsettings_schema_postun.''',
|
||||||
|
|
||||||
|
'suse-glib2-gio-module-missing-requires',
|
||||||
|
'''A GIO module is in your package, but there is no dependency for the tool to rebuild the GIO module cache. Use %glib2_gio_module_requires.''',
|
||||||
|
|
||||||
|
'suse-glib2-gio-module-missing-postin',
|
||||||
|
'''A GIO module is in your package, but the GIO module cache is not rebuilt in the %post scriptlet. Use %glib2_gio_module_post.''',
|
||||||
|
|
||||||
|
'suse-glib2-gio-module-missing-postun',
|
||||||
|
'''A GIO module is in your package, but the GIO module cache is not rebuilt in the %postun scriptlet. Use %glib2_gio_module_postun.''',
|
||||||
|
|
||||||
|
'suse-gdk-pixbuf-loader-missing-requires',
|
||||||
|
'''A gdk-pixbuf loader is in your package, but there is no dependency for the tool to rebuild the gdk-pixbuf loader cache. Use %gdk_pixbuf_loader_requires.''',
|
||||||
|
|
||||||
|
'suse-gdk-pixbuf-loader-missing-postin',
|
||||||
|
'''A gdk-pixbuf loader is in your package, but the gdk-pixbuf loader cache is not rebuilt in the %post scriptlet. Use %gdk_pixbuf_loader_post.''',
|
||||||
|
|
||||||
|
'suse-gdk-pixbuf-loader-missing-postun',
|
||||||
|
'''A gdk-pixbuf loader is in your package, but the gdk-pixbuf loader cache is not rebuilt in the %postun scriptlet. Use %gdk_pixbuf_loader_postun.''',
|
||||||
|
|
||||||
|
'suse-gtk2-immodule-missing-requires',
|
||||||
|
'''A GTK+ 2 IM module is in your package, but there is no dependency for the tool to rebuild the GTK+ 2 IM module cache. Use %gtk2_immodule_requires.''',
|
||||||
|
|
||||||
|
'suse-gtk2-immodule-missing-postin',
|
||||||
|
'''A GTK+ 2 IM module is in your package, but the GTK+ 2 IM module cache is not rebuilt in the %post scriptlet. Use %gtk2_immodule_post.''',
|
||||||
|
|
||||||
|
'suse-gtk2-immodule-missing-postun',
|
||||||
|
'''A GTK+ 2 IM module is in your package, but the GTK+ 2 IM module cache is not rebuilt in the %postun scriptlet. Use %gtk2_immodule_postun.''',
|
||||||
|
|
||||||
|
'suse-gtk3-immodule-missing-requires',
|
||||||
|
'''A GTK+ 3 IM module is in your package, but there is no dependency for the tool to rebuild the GTK+ 3 IM module cache. Use %gtk3_immodule_requires.''',
|
||||||
|
|
||||||
|
'suse-gtk3-immodule-missing-postin',
|
||||||
|
'''A GTK+ 3 IM module is in your package, but the GTK+ 3 IM module cache is not rebuilt in the %post scriptlet. Use %gtk3_immodule_post.''',
|
||||||
|
|
||||||
|
'suse-gtk3-immodule-missing-postun',
|
||||||
|
'''A GTK+ 3 IM module is in your package, but the GTK+ 3 IM module cache is not rebuilt in the %postun scriptlet. Use %gtk3_immodule_postun.''',
|
||||||
|
|
||||||
|
'suse-hicolor-icon-cache-missing-postin',
|
||||||
|
'''An icon for the hicolor theme is in your package, but the hicolor icon cache is not rebuilt in the %post scriptlet. Use %icon_theme_cache_post.''',
|
||||||
|
|
||||||
|
'suse-hicolor-icon-cache-missing-postun',
|
||||||
|
'''An icon for the hicolor theme is in your package, but the hicolor icon cache is not rebuilt in the %postun scriptlet. Use %icon_theme_cache_postun.''',
|
||||||
|
|
||||||
|
'suse-mime-database-missing-postin',
|
||||||
|
'''A MIME definition is in your package, but the MIME database is not rebuilt in the %post scriptlet. Use %mime_database_post.''',
|
||||||
|
|
||||||
|
'suse-mime-database-missing-postun',
|
||||||
|
'''A MIME definition is in your package, but the MIME database is not rebuilt in the %postun scriptlet. Use %mime_database_postun.''',
|
||||||
|
|
||||||
|
'suse-desktop-database-missing-postin',
|
||||||
|
'''A desktop file is in your package, but the desktop database is not rebuilt in the %post scriptlet. Use %desktop_database_post.''',
|
||||||
|
|
||||||
|
'suse-desktop-database-missing-postun',
|
||||||
|
'''A desktop file is in your package, but the desktop database is not rebuilt in the %postun scriptlet. Use %desktop_database_postun.''',
|
||||||
|
|
||||||
|
'suse-gconf-schema-missing-scriptlets',
|
||||||
|
'''A GConf schema is in your package, but the GConf configuration is not updated by scriptlets. Please use the gconf RPM macros.'''
|
||||||
|
|
||||||
|
)
|
@ -592,9 +592,9 @@ class LibraryPolicyCheck(AbstractCheck.AbstractCheck):
|
|||||||
# Verify shared lib policy package doesn't have hard dependency on non-lib packages
|
# Verify shared lib policy package doesn't have hard dependency on non-lib packages
|
||||||
if std_lib_package:
|
if std_lib_package:
|
||||||
for dep in pkg.requires():
|
for dep in pkg.requires():
|
||||||
if (dep[0].startswith('rpmlib(')):
|
if (dep[0][0:7] == 'rpmlib('):
|
||||||
continue
|
continue
|
||||||
if (dep[2] & (rpm.RPMSENSE_GREATER | rpm.RPMSENSE_EQUAL)) == rpm.RPMSENSE_EQUAL:
|
if (dep[1] & (rpm.RPMSENSE_GREATER | rpm.RPMSENSE_EQUAL)) == rpm.RPMSENSE_EQUAL:
|
||||||
printWarning(pkg, "shlib-fixed-dependency", Pkg.formatRequire(dep[0], dep[1], dep[2]))
|
printWarning(pkg, "shlib-fixed-dependency", Pkg.formatRequire(dep[0], dep[1], dep[2]))
|
||||||
|
|
||||||
# Verify non-lib stuff does not add dependencies
|
# Verify non-lib stuff does not add dependencies
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
--- Pkg.py
|
--- Pkg.py
|
||||||
+++ Pkg.py
|
+++ Pkg.py
|
||||||
@@ -328,6 +328,10 @@
|
@@ -425,6 +425,10 @@
|
||||||
self._missingok_files = None
|
self._missingok_files = None
|
||||||
self._files = None
|
self._files = None
|
||||||
self._requires = None
|
self._requires = None
|
||||||
@ -11,7 +11,7 @@
|
|||||||
self._req_names = -1
|
self._req_names = -1
|
||||||
|
|
||||||
if header:
|
if header:
|
||||||
@@ -553,6 +557,22 @@
|
@@ -656,6 +660,22 @@
|
||||||
self._gatherDepInfo()
|
self._gatherDepInfo()
|
||||||
return self._requires
|
return self._requires
|
||||||
|
|
||||||
@ -32,31 +32,31 @@
|
|||||||
+ return self._enhances
|
+ return self._enhances
|
||||||
+
|
+
|
||||||
def prereq(self):
|
def prereq(self):
|
||||||
self._gatherDepInfo()
|
"""Get package PreReqs as list of
|
||||||
return self._prereq
|
(name, flags, (epoch, version, release)) tuples."""
|
||||||
@@ -586,7 +606,7 @@
|
@@ -692,7 +712,7 @@
|
||||||
|
|
||||||
# internal function to gather dependency info used by the above ones
|
# internal function to gather dependency info used by the above ones
|
||||||
def _gather_aux(self, header, list, nametag, versiontag, flagstag,
|
def _gather_aux(self, header, list, nametag, flagstag, versiontag,
|
||||||
- prereq = None):
|
- prereq = None):
|
||||||
+ prereq = None, strong_only = False, weak_only = False):
|
+ prereq = None, strong_only = False, weak_only = False):
|
||||||
names = header[nametag]
|
names = header[nametag]
|
||||||
versions = header[versiontag]
|
|
||||||
flags = header[flagstag]
|
flags = header[flagstag]
|
||||||
@@ -596,7 +616,11 @@
|
versions = header[versiontag]
|
||||||
|
@@ -703,7 +723,11 @@
|
||||||
if prereq is not None and flags[loop] & PREREQ_FLAG:
|
if prereq is not None and flags[loop] & PREREQ_FLAG:
|
||||||
prereq.append((names[loop], versions[loop],
|
prereq.append((names[loop], flags[loop] & (~PREREQ_FLAG),
|
||||||
flags[loop] & (~PREREQ_FLAG)))
|
evr))
|
||||||
- else:
|
- else:
|
||||||
+ elif strong_only and flags[loop] & rpm.RPMSENSE_STRONG:
|
+ elif strong_only and flags[loop] & rpm.RPMSENSE_STRONG:
|
||||||
+ list.append((names[loop], versions[loop], flags[loop] & (~rpm.RPMSENSE_STRONG)))
|
+ list.append((names[loop], versions[loop], flags[loop] & (~rpm.RPMSENSE_STRONG)))
|
||||||
+ elif weak_only and not (flags[loop] & rpm.RPMSENSE_STRONG):
|
+ elif weak_only and not (flags[loop] & rpm.RPMSENSE_STRONG):
|
||||||
+ list.append((names[loop], versions[loop], flags[loop]))
|
+ list.append((names[loop], versions[loop], flags[loop]))
|
||||||
+ elif not (weak_only or strong_only):
|
+ elif not (weak_only or strong_only):
|
||||||
list.append((names[loop], versions[loop], flags[loop]))
|
list.append((names[loop], flags[loop], evr))
|
||||||
|
|
||||||
def _gatherDepInfo(self):
|
def _gatherDepInfo(self):
|
||||||
@@ -606,6 +630,10 @@
|
@@ -713,6 +737,10 @@
|
||||||
self._provides = []
|
self._provides = []
|
||||||
self._conflicts = []
|
self._conflicts = []
|
||||||
self._obsoletes = []
|
self._obsoletes = []
|
||||||
@ -67,10 +67,10 @@
|
|||||||
|
|
||||||
self._gather_aux(self.header, self._requires,
|
self._gather_aux(self.header, self._requires,
|
||||||
rpm.RPMTAG_REQUIRENAME,
|
rpm.RPMTAG_REQUIRENAME,
|
||||||
@@ -624,6 +652,27 @@
|
@@ -732,6 +760,27 @@
|
||||||
rpm.RPMTAG_OBSOLETENAME,
|
rpm.RPMTAG_OBSOLETEFLAGS,
|
||||||
rpm.RPMTAG_OBSOLETEVERSION,
|
rpm.RPMTAG_OBSOLETEVERSION)
|
||||||
rpm.RPMTAG_OBSOLETEFLAGS)
|
|
||||||
+ try:
|
+ try:
|
||||||
+ self._gather_aux(self.header, self._recommends,
|
+ self._gather_aux(self.header, self._recommends,
|
||||||
+ rpm.RPMTAG_SUGGESTSNAME,
|
+ rpm.RPMTAG_SUGGESTSNAME,
|
||||||
@ -88,10 +88,10 @@
|
|||||||
+ rpm.RPMTAG_ENHANCESNAME,
|
+ rpm.RPMTAG_ENHANCESNAME,
|
||||||
+ rpm.RPMTAG_ENHANCESVERSION,
|
+ rpm.RPMTAG_ENHANCESVERSION,
|
||||||
+ rpm.RPMTAG_ENHANCESFLAGS, strong_only=True)
|
+ rpm.RPMTAG_ENHANCESFLAGS, strong_only=True)
|
||||||
+
|
|
||||||
+ except:
|
+ except:
|
||||||
+ pass
|
+ pass
|
||||||
+
|
+
|
||||||
|
+
|
||||||
def getInstalledPkgs(name):
|
def getInstalledPkgs(name):
|
||||||
"""Get list of installed package objects by name."""
|
"""Get list of installed package objects by name."""
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ Index: FilesCheck.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- FilesCheck.py.orig
|
--- FilesCheck.py.orig
|
||||||
+++ FilesCheck.py
|
+++ FilesCheck.py
|
||||||
@@ -658,7 +658,7 @@ buildconfig_rpath_regex = re.compile('(?
|
@@ -659,7 +659,7 @@ buildconfig_rpath_regex = re.compile('(?
|
||||||
sofile_regex = re.compile('/lib(64)?/(.+/)?lib[^/]+\.so$')
|
sofile_regex = re.compile('/lib(64)?/(.+/)?lib[^/]+\.so$')
|
||||||
devel_regex = re.compile('(.*)-(debug(info)?|devel|headers|source|static)$')
|
devel_regex = re.compile('(.*)-(debug(info)?|devel|headers|source|static)$')
|
||||||
debuginfo_package_regex = re.compile('-debug(info)?$')
|
debuginfo_package_regex = re.compile('-debug(info)?$')
|
||||||
|
@ -2,7 +2,7 @@ Index: FilesCheck.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- FilesCheck.py.orig
|
--- FilesCheck.py.orig
|
||||||
+++ FilesCheck.py
|
+++ FilesCheck.py
|
||||||
@@ -1617,7 +1617,10 @@ executed.''',
|
@@ -1665,7 +1665,10 @@ executed.''',
|
||||||
executed.''',
|
executed.''',
|
||||||
|
|
||||||
'wrong-script-interpreter',
|
'wrong-script-interpreter',
|
||||||
|
@ -2,7 +2,7 @@ Index: SpecCheck.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- SpecCheck.py.orig
|
--- SpecCheck.py.orig
|
||||||
+++ SpecCheck.py
|
+++ SpecCheck.py
|
||||||
@@ -612,7 +612,7 @@ versions you can ignore this warning.'''
|
@@ -594,7 +594,7 @@ versions you can ignore this warning.'''
|
||||||
|
|
||||||
'hardcoded-path-in-buildroot-tag',
|
'hardcoded-path-in-buildroot-tag',
|
||||||
'''A path is hardcoded in your Buildroot tag. It should be replaced
|
'''A path is hardcoded in your Buildroot tag. It should be replaced
|
||||||
|
@ -1,27 +1,13 @@
|
|||||||
Index: SpecCheck.py
|
--- SpecCheck.py
|
||||||
===================================================================
|
|
||||||
--- SpecCheck.py.orig
|
|
||||||
+++ SpecCheck.py
|
+++ SpecCheck.py
|
||||||
@@ -60,7 +60,10 @@ suse_version_regex = re.compile('%suse_v
|
@@ -223,7 +223,9 @@
|
||||||
section_regexs = dict(
|
|
||||||
([x, re.compile('^%' + x + '(?:\s|$)')]
|
|
||||||
for x in ('build', 'changelog', 'check', 'clean', 'description', 'files',
|
|
||||||
- 'install', 'package', 'prep')))
|
|
||||||
+ 'install', 'package', 'prep',
|
|
||||||
+ 'pre', 'post', 'postun', 'trigger', 'triggerin',
|
|
||||||
+ 'triggerprein', 'triggerun', 'triggerpostun',
|
|
||||||
+ 'pretrans', 'posttrans')))
|
|
||||||
|
|
||||||
# Only check for /lib, /usr/lib, /usr/X11R6/lib
|
|
||||||
# TODO: better handling of X libraries and modules.
|
|
||||||
@@ -265,7 +268,9 @@ class SpecCheck(AbstractCheck.AbstractCh
|
|
||||||
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
- if current_section in ('prep', 'build'):
|
- if current_section in ('prep', 'build') and \
|
||||||
+ if current_section in ('prep', 'build', 'pre', 'post', 'postun',
|
+ if current_section in ('prep', 'build','pre', 'post', 'postun',
|
||||||
+ 'trigger', 'triggerin', 'triggerprein', 'triggerun', 'triggerpostun',
|
+ 'trigger', 'triggerin', 'triggerprein', 'triggerun', 'triggerpostun',
|
||||||
+ 'pretrans', 'posttrans'):
|
+ 'pretrans', 'posttrans') and \
|
||||||
if contains_buildroot(line):
|
contains_buildroot(line):
|
||||||
printWarning(pkg, 'rpm-buildroot-usage',
|
printWarning(pkg, 'rpm-buildroot-usage', '%' + current_section,
|
||||||
'%' + current_section, line[:-1].strip())
|
line[:-1].strip())
|
||||||
|
4
config
4
config
@ -61,8 +61,8 @@ setOption("UseUTF8", 1)
|
|||||||
#setOption("ValidGroups", ("Group1", "Group2"))
|
#setOption("ValidGroups", ("Group1", "Group2"))
|
||||||
#setOption("KernelModuleRPMsOK", 0)
|
#setOption("KernelModuleRPMsOK", 0)
|
||||||
|
|
||||||
setOption('StandardGroups', ('tty', 'antivir', 'dba', 'aegis', 'disk', 'localham', 'casaauth', 'console', 'lp', 'ldap', 'dovecot', 'otrs', 'tss', 'pulse-rt', 'oinstall', 'postgres', 'kmem', 'nagcmd', 'maildrop', 'pegasus', 'ffums', 'intermezzo', 'shadow', 'daemon', 'xok', 'novell_nogroup', 'snort', 'pulse-access', 'powersave', 'www', 'beagleindex', 'pkcs11', 'pulse', 'ifdrwww', 'video', 'ftp', 'jboss', 'icecream', 'memcached', 'public', 'uuidd', 'ntp', 'ntadmin', 'dosemu', 'news', 'haclient', 'sshd', 'games', 'jonas', 'cwbconv', 'named', 'novlxtier', 'pdns', 'mailman', 'festival', 'utmp', 'floppy', 'nobody', 'lighttpd', 'quagga', 'suse-ncc', 'dialout', 'mail', 'cdrom', 'polkituser', 'haldaemon', 'sapdb', 'geronimo', 'sabayon-admin', 'privoxy', 'avahi', 'mdom', 'bin', 'pound', 'distcc', 'nagios', 'tomcat4', 'at', 'trusted', 'uucp', 'zope', 'wheel', 'users', 'messagebus', 'kvm', 'sys', 'vscan', 'man', 'audio', 'nogroup', 'tomcat', 'postfix', 'bigsister', 'modem', 'radiusd'))
|
setOption('StandardGroups', ('tty', 'antivir', 'dba', 'aegis', 'disk', 'localham', 'casaauth', 'console', 'lp', 'ldap', 'dovecot', 'otrs', 'tss', 'pulse-rt', 'oinstall', 'postgres', 'kmem', 'nagcmd', 'maildrop', 'pegasus', 'ffums', 'intermezzo', 'shadow', 'daemon', 'xok', 'novell_nogroup', 'snort', 'pulse-access', 'powersave', 'www', 'beagleindex', 'pkcs11', 'pulse', 'ifdrwww', 'video', 'ftp', 'jboss', 'icecream', 'memcached', 'public', 'uuidd', 'ntp', 'ntadmin', 'dosemu', 'news', 'haclient', 'sshd', 'games', 'jonas', 'cwbconv', 'named', 'novlxtier', 'pdns', 'mailman', 'festival', 'utmp', 'floppy', 'nobody', 'lighttpd', 'quagga', 'suse-ncc', 'dialout', 'mail', 'cdrom', 'polkituser', 'haldaemon', 'sapdb', 'geronimo', 'sabayon-admin', 'privoxy', 'avahi', 'mdom', 'bin', 'pound', 'distcc', 'nagios', 'tomcat4', 'at', 'trusted', 'uucp', 'zope', 'wheel', 'users', 'messagebus', 'kvm', 'sys', 'vscan', 'man', 'audio', 'nogroup', 'tomcat', 'postfix', 'bigsister', 'modem', 'radiusd', 'lxdm'))
|
||||||
setOption('StandardUsers', ('novell_nobody', 'aegis', 'mysql', 'gdm', 'casaauth', 'icecream', 'lp', 'ldap', 'dovecot', 'otrs', 'tss', 'bin', 'fax', 'postgres', 'intermezzo', 'hacluster', 'pegasus', 'ffums', 'radiusd', 'daemon', 'vdr', 'snort', 'amanda', 'bitlbee', 'beagleindex', 'fetchmail', 'pulse', 'mdnsd', 'novlxregd', 'wwwrun', 'gnump3d', 'ftp', 'jboss', 'dvbdaemon', 'irc', 'memcached', 'uuidd', 'ntp', 'jonas', 'news', 'cop', 'sshd', 'novlifdr', 'casaatsd', 'games', 'upsd', 'named', 'pop', 'dhcpd', 'gnats', 'jabber', 'pdns', 'mailman', 'festival', 'cyrus', 'nobody', 'lighttpd', 'quagga', 'mail', 'polkituser', 'haldaemon', 'sapdb', 'geronimo', 'postfix', 'privoxy', 'novlxsrvd', 'avahi', 'mdom', 'root', 'pound', 'squid', 'distcc', 'nagios', 'tomcat4', 'at', 'dpbox', 'partimag', 'uucp', 'zope', 'messagebus', 'wnn', 'asterisk', 'casaatvd', 'vscan', 'man', 'suse-ncc', 'tomcat', 'sabayon-admin', 'bigsister', 'oracle'))
|
setOption('StandardUsers', ('novell_nobody', 'aegis', 'mysql', 'gdm', 'casaauth', 'icecream', 'lp', 'ldap', 'dovecot', 'otrs', 'tss', 'bin', 'fax', 'postgres', 'intermezzo', 'hacluster', 'pegasus', 'ffums', 'radiusd', 'daemon', 'vdr', 'snort', 'amanda', 'bitlbee', 'beagleindex', 'fetchmail', 'pulse', 'mdnsd', 'novlxregd', 'wwwrun', 'gnump3d', 'ftp', 'jboss', 'dvbdaemon', 'irc', 'memcached', 'uuidd', 'ntp', 'jonas', 'news', 'cop', 'sshd', 'novlifdr', 'casaatsd', 'games', 'upsd', 'named', 'pop', 'dhcpd', 'gnats', 'jabber', 'pdns', 'mailman', 'festival', 'cyrus', 'nobody', 'lighttpd', 'quagga', 'mail', 'polkituser', 'haldaemon', 'sapdb', 'geronimo', 'postfix', 'privoxy', 'novlxsrvd', 'avahi', 'mdom', 'root', 'pound', 'squid', 'distcc', 'nagios', 'tomcat4', 'at', 'dpbox', 'partimag', 'uucp', 'zope', 'messagebus', 'wnn', 'asterisk', 'casaatvd', 'vscan', 'man', 'suse-ncc', 'tomcat', 'sabayon-admin', 'bigsister', 'oracle', 'lxdm'))
|
||||||
|
|
||||||
setOption('DanglingSymlinkExceptions',
|
setOption('DanglingSymlinkExceptions',
|
||||||
(['/usr/share/doc/licenses/', 'licenses'],
|
(['/usr/share/doc/licenses/', 'licenses'],
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
# Confusing message. The problem is not that the file does not end
|
# Confusing message. The problem is not that the file does not end
|
||||||
# with ".spec", but that there is a mismatch of specname and pkg name.
|
# with ".spec", but that there is a mismatch of specname and pkg name.
|
||||||
Index: rpmlint-0.95/SpecCheck.py
|
Index: rpmlint-0.99/SpecCheck.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- rpmlint-0.95.orig/SpecCheck.py 2010-07-29 09:29:28.000000000 +0200
|
--- rpmlint-0.99.orig/SpecCheck.py
|
||||||
+++ rpmlint-0.95/SpecCheck.py 2010-07-29 09:44:32.000000000 +0200
|
+++ rpmlint-0.99/SpecCheck.py
|
||||||
@@ -593,8 +593,8 @@ addDetails(
|
@@ -568,8 +568,8 @@ addDetails(
|
||||||
SPEC file to build a valid RPM package.''',
|
SPEC file to build a valid RPM package.''',
|
||||||
|
|
||||||
'invalid-spec-name',
|
'invalid-spec-name',
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
Index: SpecCheck.py
|
|
||||||
===================================================================
|
|
||||||
--- SpecCheck.py.orig
|
|
||||||
+++ SpecCheck.py
|
|
||||||
@@ -117,7 +117,7 @@ def deptokens(line):
|
|
||||||
elif wantmore:
|
|
||||||
tmp += ' ' + tok
|
|
||||||
wantmore = False
|
|
||||||
- elif tok[0] in ('=', '<', '>'):
|
|
||||||
+ elif len(tok) and tok[0] in ('=', '<', '>'):
|
|
||||||
tmp += ' ' + tok
|
|
||||||
wantmore = True
|
|
||||||
else:
|
|
@ -2,7 +2,7 @@ Index: TagsCheck.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- TagsCheck.py.orig
|
--- TagsCheck.py.orig
|
||||||
+++ TagsCheck.py
|
+++ TagsCheck.py
|
||||||
@@ -676,6 +676,9 @@ class TagsCheck(AbstractCheck.AbstractCh
|
@@ -698,6 +698,9 @@ class TagsCheck(AbstractCheck.AbstractCh
|
||||||
if not description:
|
if not description:
|
||||||
printError(pkg, 'no-description-tag')
|
printError(pkg, 'no-description-tag')
|
||||||
else:
|
else:
|
||||||
@ -12,7 +12,7 @@ Index: TagsCheck.py
|
|||||||
if not pkg[rpm.RPMTAG_HEADERI18NTABLE]:
|
if not pkg[rpm.RPMTAG_HEADERI18NTABLE]:
|
||||||
self._unexpanded_macros(pkg, '%description', description)
|
self._unexpanded_macros(pkg, '%description', description)
|
||||||
else:
|
else:
|
||||||
@@ -946,6 +949,10 @@ Name tag.''',
|
@@ -969,6 +972,10 @@ Name tag.''',
|
||||||
'''The major number of the library isn't included in the package's name.
|
'''The major number of the library isn't included in the package's name.
|
||||||
''',
|
''',
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ Index: FilesCheck.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- FilesCheck.py.orig
|
--- FilesCheck.py.orig
|
||||||
+++ FilesCheck.py
|
+++ FilesCheck.py
|
||||||
@@ -813,6 +813,10 @@ class FilesCheck(AbstractCheck.AbstractC
|
@@ -826,6 +826,10 @@ class FilesCheck(AbstractCheck.AbstractC
|
||||||
# Check if the package is a development package
|
# Check if the package is a development package
|
||||||
devel_pkg = devel_regex.search(pkg.name)
|
devel_pkg = devel_regex.search(pkg.name)
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ Index: FilesCheck.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- FilesCheck.py.orig
|
--- FilesCheck.py.orig
|
||||||
+++ FilesCheck.py
|
+++ FilesCheck.py
|
||||||
@@ -652,6 +652,7 @@ bin_regex = re.compile('^(/usr)?/s?bin/'
|
@@ -653,6 +653,7 @@ bin_regex = re.compile('^/(?:usr/(?:s?bi
|
||||||
includefile_regex = re.compile('\.(c|h)(pp|xx)?$', re.IGNORECASE)
|
includefile_regex = re.compile('\.(c|h)(pp|xx)?$', re.IGNORECASE)
|
||||||
develfile_regex = re.compile('\.(a|cmxa?|mli?)$')
|
develfile_regex = re.compile('\.(a|cmxa?|mli?)$')
|
||||||
buildconfigfile_regex = re.compile('(\.pc|/bin/.+-config)$')
|
buildconfigfile_regex = re.compile('(\.pc|/bin/.+-config)$')
|
||||||
@ -10,16 +10,16 @@ Index: FilesCheck.py
|
|||||||
# room for improvement with catching more -R, but also for false positives...
|
# room for improvement with catching more -R, but also for false positives...
|
||||||
buildconfig_rpath_regex = re.compile('(?:-rpath|Wl,-R)\\b')
|
buildconfig_rpath_regex = re.compile('(?:-rpath|Wl,-R)\\b')
|
||||||
sofile_regex = re.compile('/lib(64)?/(.+/)?lib[^/]+\.so$')
|
sofile_regex = re.compile('/lib(64)?/(.+/)?lib[^/]+\.so$')
|
||||||
@@ -1151,7 +1152,7 @@ class FilesCheck(AbstractCheck.AbstractC
|
@@ -1168,7 +1169,7 @@ class FilesCheck(AbstractCheck.AbstractC
|
||||||
includefile_regex.search(f) or \
|
includefile_regex.search(f) or \
|
||||||
develfile_regex.search(f) or \
|
develfile_regex.search(f) or \
|
||||||
logrotate_regex.search(f)
|
logrotate_regex.search(f)
|
||||||
- if nonexec_file:
|
- if nonexec_file:
|
||||||
+ if nonexec_file and not docdir_examples_regex.search(f):
|
+ if nonexec_file and not docdir_examples_regex.search(f):
|
||||||
printWarning(pkg, 'spurious-executable-perm', f)
|
printWarning(pkg, 'spurious-executable-perm', f)
|
||||||
elif f.startswith('/etc/'):
|
elif f.startswith('/etc/') and f not in config_files and \
|
||||||
if f not in config_files and f not in ghost_files:
|
f not in ghost_files:
|
||||||
@@ -1491,7 +1492,10 @@ included in your package.''',
|
@@ -1539,7 +1540,10 @@ included in your package.''',
|
||||||
'spurious-executable-perm',
|
'spurious-executable-perm',
|
||||||
'''The file is installed with executable permissions, but was identified as one
|
'''The file is installed with executable permissions, but was identified as one
|
||||||
that probably should not be executable. Verify if the executable bits are
|
that probably should not be executable. Verify if the executable bits are
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
Index: SpecCheck.py
|
|
||||||
===================================================================
|
|
||||||
--- SpecCheck.py.orig
|
|
||||||
+++ SpecCheck.py
|
|
||||||
@@ -35,7 +35,7 @@ applied_patch_regex = re.compile("^%patc
|
|
||||||
applied_patch_p_regex = re.compile("\s-P\s+(\d+)\\b")
|
|
||||||
source_dir_regex = re.compile("^[^#]*(\$RPM_SOURCE_DIR|%{?_sourcedir}?)")
|
|
||||||
obsolete_tags_regex = re.compile("^(Copyright|Serial)\s*:\s*([^\s]+)")
|
|
||||||
-buildroot_regex = re.compile('Buildroot\s*:\s*([^\s]+)', re.IGNORECASE)
|
|
||||||
+buildroot_regex = re.compile('^\s*Buildroot\s*:\s*([^\s]+)', re.IGNORECASE)
|
|
||||||
prefix_regex = re.compile('^Prefix\s*:\s*([^\s]+)', re.IGNORECASE)
|
|
||||||
packager_regex = re.compile('^Packager\s*:\s*([^\s]+)', re.IGNORECASE)
|
|
||||||
noarch_regex = re.compile('^BuildArch(?:itectures)?\s*:\s*\\bnoarch\\b', re.IGNORECASE)
|
|
@ -1,26 +1,24 @@
|
|||||||
Index: TagsCheck.py
|
--- TagsCheck.py
|
||||||
===================================================================
|
|
||||||
--- TagsCheck.py.orig
|
|
||||||
+++ TagsCheck.py
|
+++ TagsCheck.py
|
||||||
@@ -419,6 +419,7 @@ invalid_version_regex = re.compile('([0-
|
@@ -419,6 +419,7 @@
|
||||||
# () are here for grouping purpose in the regexp
|
# () are here for grouping purpose in the regexp
|
||||||
forbidden_words_regex = re.compile('(' + Config.getOption('ForbiddenWords') + ')', re.IGNORECASE)
|
forbidden_words_regex = re.compile('(' + Config.getOption('ForbiddenWords') + ')', re.IGNORECASE)
|
||||||
valid_buildhost_regex = re.compile(Config.getOption('ValidBuildHost'))
|
valid_buildhost_regex = re.compile(Config.getOption('ValidBuildHost'))
|
||||||
+valid_filedep_regex=re.compile('(?:/s?bin/|^/etc/|^/usr/lib/sendmail$)')
|
+valid_filedep_regex=re.compile('(?:/s?bin/|^/etc/|^/usr/lib/sendmail$)')
|
||||||
epoch_regex = re.compile('^[0-9]+:')
|
|
||||||
use_epoch = Config.getOption('UseEpoch', False)
|
use_epoch = Config.getOption('UseEpoch', False)
|
||||||
use_utf8 = Config.getOption('UseUTF8', Config.USEUTF8_DEFAULT)
|
use_utf8 = Config.getOption('UseUTF8', Config.USEUTF8_DEFAULT)
|
||||||
@@ -580,6 +581,9 @@ class TagsCheck(AbstractCheck.AbstractCh
|
max_line_len = Config.getOption('MaxLineLength', 79)
|
||||||
|
@@ -597,6 +598,9 @@
|
||||||
if d[0].startswith('/usr/local/'):
|
if d[0].startswith('/usr/local/'):
|
||||||
printError(pkg, 'invalid-dependency', d[0])
|
printError(pkg, 'invalid-dependency', d[0])
|
||||||
|
|
||||||
+ if d[0].startswith('/') and not valid_filedep_regex.search(d[0]):
|
+ if d[0].startswith('/') and not valid_filedep_regex.search(d[0]):
|
||||||
+ printWarning(pkg, 'invalid-filepath-dependency', d[0])
|
+ printWarning(pkg, 'invalid-filepath-dependency', d[0])
|
||||||
+
|
+
|
||||||
if not devel_depend and not is_devel and not is_source:
|
if not devel_depend and not is_devel and not is_source and \
|
||||||
if FilesCheck.devel_regex.search(d[0]):
|
FilesCheck.devel_regex.search(d[0]):
|
||||||
printError(pkg, 'devel-dependency', d[0])
|
printError(pkg, 'devel-dependency', d[0])
|
||||||
@@ -1040,6 +1044,12 @@ explicit Requires: tags.''',
|
@@ -1063,6 +1067,12 @@
|
||||||
'''This package provides 2 times the same capacity. It should only provide it
|
'''This package provides 2 times the same capacity. It should only provide it
|
||||||
once.''',
|
once.''',
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
--- Filter.py
|
Index: Filter.py
|
||||||
|
===================================================================
|
||||||
|
--- Filter.py.orig
|
||||||
+++ Filter.py
|
+++ Filter.py
|
||||||
@@ -104,7 +104,7 @@
|
@@ -104,7 +104,7 @@ def printAllReasons():
|
||||||
if len(last_reason):
|
if len(last_reason):
|
||||||
printDescriptions(last_reason)
|
printDescriptions(last_reason)
|
||||||
last_reason = reason
|
last_reason = reason
|
||||||
@ -9,9 +11,11 @@
|
|||||||
if Config.info and len(last_reason):
|
if Config.info and len(last_reason):
|
||||||
printDescriptions(last_reason)
|
printDescriptions(last_reason)
|
||||||
_diagnostic = list()
|
_diagnostic = list()
|
||||||
--- rpmlint.py
|
Index: rpmlint.py
|
||||||
|
===================================================================
|
||||||
|
--- rpmlint.py.orig
|
||||||
+++ rpmlint.py
|
+++ rpmlint.py
|
||||||
@@ -201,7 +201,7 @@
|
@@ -202,7 +202,7 @@ def main():
|
||||||
% (packages_checked, specfiles_checked,
|
% (packages_checked, specfiles_checked,
|
||||||
printed_messages["E"], printed_messages["W"])
|
printed_messages["E"], printed_messages["W"])
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ Index: FilesCheck.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- FilesCheck.py.orig
|
--- FilesCheck.py.orig
|
||||||
+++ FilesCheck.py
|
+++ FilesCheck.py
|
||||||
@@ -830,7 +830,7 @@ class FilesCheck(AbstractCheck.AbstractC
|
@@ -843,7 +843,7 @@ class FilesCheck(AbstractCheck.AbstractC
|
||||||
debuginfo_srcs = False
|
debuginfo_srcs = False
|
||||||
debuginfo_debugs = False
|
debuginfo_debugs = False
|
||||||
|
|
||||||
|
@ -1,19 +1,21 @@
|
|||||||
--- InitScriptCheck.py
|
--- InitScriptCheck.py
|
||||||
+++ InitScriptCheck.py
|
+++ InitScriptCheck.py
|
||||||
@@ -15,6 +15,7 @@
|
@@ -18,7 +18,7 @@
|
||||||
import rpm
|
import AbstractCheck
|
||||||
|
import Config
|
||||||
import Pkg
|
import Pkg
|
||||||
import string
|
-
|
||||||
+import stat
|
+import stat
|
||||||
|
|
||||||
rc_regex=re.compile('^/etc(/rc\.d)?/init\.d/')
|
chkconfig_content_regex = re.compile('^\s*#\s*chkconfig:\s*([-0-9]+)\s+[-0-9]+\s+[-0-9]+')
|
||||||
chkconfig_content_regex=re.compile('^\s*#\s*chkconfig:\s*([-0-9]+)\s+[-0-9]+\s+[-0-9]+')
|
subsys_regex = re.compile('/var/lock/subsys/([^/"\'\n\s;&|]+)', re.MULTILINE)
|
||||||
@@ -40,7 +41,7 @@
|
@@ -50,7 +50,8 @@
|
||||||
|
for fname, pkgfile in pkg.files().items():
|
||||||
|
|
||||||
initscript_list = []
|
if not fname.startswith('/etc/init.d/') and \
|
||||||
for f in pkg.files().keys():
|
- not fname.startswith('/etc/rc.d/init.d/'):
|
||||||
- if rc_regex.search(f):
|
+ not fname.startswith('/etc/rc.d/init.d/') and \
|
||||||
+ if rc_regex.search(f) and stat.S_ISREG(pkg.files()[f][0]):
|
+ stat.S_ISREG(pkgfile.mode):
|
||||||
basename=basename_regex.search(f).group(1)
|
continue
|
||||||
initscript_list.append(basename)
|
|
||||||
if pkg.files()[f][0] & 0500 != 0500:
|
basename = os.path.basename(fname)
|
||||||
|
@ -2,7 +2,7 @@ Index: TagsCheck.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- TagsCheck.py.orig
|
--- TagsCheck.py.orig
|
||||||
+++ TagsCheck.py
|
+++ TagsCheck.py
|
||||||
@@ -686,6 +686,8 @@ class TagsCheck(AbstractCheck.AbstractCh
|
@@ -708,6 +708,8 @@ class TagsCheck(AbstractCheck.AbstractCh
|
||||||
self._unexpanded_macros(pkg, 'Group', group)
|
self._unexpanded_macros(pkg, 'Group', group)
|
||||||
if not group:
|
if not group:
|
||||||
printError(pkg, 'no-group-tag')
|
printError(pkg, 'no-group-tag')
|
||||||
@ -11,7 +11,7 @@ Index: TagsCheck.py
|
|||||||
elif VALID_GROUPS and group not in VALID_GROUPS:
|
elif VALID_GROUPS and group not in VALID_GROUPS:
|
||||||
printWarning(pkg, 'non-standard-group', group)
|
printWarning(pkg, 'non-standard-group', group)
|
||||||
|
|
||||||
@@ -985,6 +987,10 @@ won't fool the specfile parser, and rebu
|
@@ -1008,6 +1010,10 @@ won't fool the specfile parser, and rebu
|
||||||
'''There is no Group tag in your package. You have to specify a valid group
|
'''There is no Group tag in your package. You have to specify a valid group
|
||||||
in your spec file using the Group tag.''',
|
in your spec file using the Group tag.''',
|
||||||
|
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:1b8fdc18e6b98768197b5b9adee1316fa65073ed0372d47191f33636e93dde27
|
|
||||||
size 100631
|
|
3
rpmlint-0.99.tar.bz2
Normal file
3
rpmlint-0.99.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:452c65f114d445051c400d1a57e48061609fe2946dccda6d3ac52ffa425d2808
|
||||||
|
size 123463
|
13
rpmlint-pkg-quoting.diff
Normal file
13
rpmlint-pkg-quoting.diff
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
Index: Pkg.py
|
||||||
|
===================================================================
|
||||||
|
--- Pkg.py.orig
|
||||||
|
+++ Pkg.py
|
||||||
|
@@ -492,7 +492,7 @@ class Pkg:
|
||||||
|
dir = self.dirname)
|
||||||
|
# TODO: better shell escaping or sequence based command invocation
|
||||||
|
command_str = \
|
||||||
|
- 'rpm2cpio "%s" | (cd "%s"; cpio -id); chmod -R +rX "%s"' % \
|
||||||
|
+ "rpm2cpio '%s' | (cd '%s'; cpio -id); chmod -R +rX '%s'" % \
|
||||||
|
(self.filename, self.dirname, self.dirname)
|
||||||
|
cmd = commands.getstatusoutput(command_str)
|
||||||
|
self.extracted = True
|
@ -2,25 +2,25 @@ Index: FilesCheck.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- FilesCheck.py.orig
|
--- FilesCheck.py.orig
|
||||||
+++ FilesCheck.py
|
+++ FilesCheck.py
|
||||||
@@ -175,7 +175,7 @@ compr_regex = re.compile('\.(gz|z|Z|zip|
|
@@ -176,7 +176,7 @@ compr_regex = re.compile('\.(gz|z|Z|zip|
|
||||||
absolute_regex = re.compile('^/([^/]+)')
|
absolute_regex = re.compile('^/([^/]+)')
|
||||||
absolute2_regex = re.compile('^/?([^/]+)')
|
absolute2_regex = re.compile('^/?([^/]+)')
|
||||||
points_regex = re.compile('^\.\./(.*)')
|
points_regex = re.compile('^\.\./(.*)')
|
||||||
-doc_regex = re.compile('^/usr(/share|/X11R6)?/(doc|man|info)/')
|
-doc_regex = re.compile('^/usr(/share|/X11R6)?/(doc|man|info)/')
|
||||||
+doc_regex = re.compile('^/usr(/share|/X11R6)?/(doc|man|info)/|^/opt/kde3/share/doc|^/usr/share/gnome/help')
|
+doc_regex = re.compile('^/usr(/share|/X11R6)?/(doc|man|info)/|^/opt/kde3/share/doc|^/usr/share/gnome/help')
|
||||||
bin_regex = re.compile('^(/usr)?/s?bin/')
|
bin_regex = re.compile('^/(?:usr/(?:s?bin|games)|s?bin)/(.*)')
|
||||||
includefile_regex = re.compile('\.(c|h)(pp|xx)?$', re.IGNORECASE)
|
includefile_regex = re.compile('\.(c|h)(pp|xx)?$', re.IGNORECASE)
|
||||||
develfile_regex = re.compile('\.(a|cmxa?|mli?)$')
|
develfile_regex = re.compile('\.(a|cmxa?|mli?)$')
|
||||||
Index: I18NCheck.py
|
Index: I18NCheck.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- I18NCheck.py.orig
|
--- I18NCheck.py.orig
|
||||||
+++ I18NCheck.py
|
+++ I18NCheck.py
|
||||||
@@ -67,7 +67,7 @@ CORRECT_SUBDIRS = (
|
@@ -31,7 +31,7 @@ INCORRECT_LOCALES = {
|
||||||
)
|
'en_UK': 'en_GB'}
|
||||||
|
|
||||||
package_regex = re.compile('-(' + '|'.join((x[0:2] for x in CORRECT_SUBDIRS)) + ')$')
|
package_regex = re.compile('-(' + '|'.join(LANGUAGES) + ')$')
|
||||||
-locale_regex = re.compile('^(/usr/share/locale/([^/]+))/')
|
-locale_regex = re.compile('^(/usr/share/locale/([^/]+))/')
|
||||||
+locale_regex = re.compile('^(/(usr|opt/kde3|opt/gnome)/share/locale/([^/]+))/')
|
+locale_regex = re.compile('^(/(usr|opt/kde3|opt/gnome)/share/locale/([^/]+))/')
|
||||||
correct_subdir_regex = re.compile('^(([a-z][a-z]([a-z])?(_[A-Z][A-Z])?)([.@].*$)?)$')
|
correct_subdir_regex = re.compile('^(([a-z][a-z]([a-z])?(_[A-Z][A-Z])?)([.@].*$)?)$')
|
||||||
lc_messages_regex = re.compile('/usr/share/locale/([^/]+)/LC_MESSAGES/.*(mo|po)$')
|
lc_messages_regex = re.compile('/usr/share/locale/([^/]+)/LC_MESSAGES/.*(mo|po)$')
|
||||||
man_regex = re.compile('/usr(?:/share)?/man/([^/]+)/man./[^/]+$')
|
man_regex = re.compile('/usr(?:/share)?/man/([^/]+)/man[0-9n][^/]*/[^/]+$')
|
||||||
|
@ -1,3 +1,44 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Oct 12 14:58:55 UTC 2010 - lnussel@suse.de
|
||||||
|
|
||||||
|
- add check for gnome and desktop related macros
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Sun Oct 3 15:28:44 UTC 2010 - andrea@opensuse.org
|
||||||
|
|
||||||
|
- Added lxdm as a valid group and user
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Sep 27 12:07:17 CEST 2010 - dmueller@suse.de
|
||||||
|
|
||||||
|
- update to 0.99:
|
||||||
|
* Add Python 2.7 magic number ( https://bugzilla.redhat.com/623607, Nils Philippsen)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Sep 27 12:05:55 CEST 2010 - dmueller@suse.de
|
||||||
|
|
||||||
|
- update to 0.98:
|
||||||
|
* Pkg.py, test/test.Pkg.py: Fix self-obsoletion bug with Provides
|
||||||
|
containing Epoch.
|
||||||
|
* Pkg.py: Don't stringify None Epoch to 'None' string in
|
||||||
|
compareEVR().
|
||||||
|
* Pkg.py: Sync rangeCompare() with yum 3.2.27.
|
||||||
|
* TagsCheck.py: Reduce some spell check noise.
|
||||||
|
* rpmlint: Fix handling of arguments containing spaces.
|
||||||
|
* DocFilesCheck.py: Bypass doc file check earlier if package has no
|
||||||
|
doc files.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Aug 19 08:27:14 UTC 2010 - dimstar@opensuse.org
|
||||||
|
|
||||||
|
- Add suse-g-ir-chech.diff: *.gir belong in -devel packages.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Sun Aug 8 18:59:08 CEST 2010 - vuntz@opensuse.org
|
||||||
|
|
||||||
|
- Update suse-version.diff: last non-obsolete version of openSUSE
|
||||||
|
is 11.1, and latest valid version of openSUSE is 11.4.
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Thu Jul 29 18:25:47 CEST 2010 - dmueller@suse.de
|
Thu Jul 29 18:25:47 CEST 2010 - dmueller@suse.de
|
||||||
|
|
||||||
|
29
rpmlint.spec
29
rpmlint.spec
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# spec file for package rpmlint (Version 0.95)
|
# spec file for package rpmlint (Version 0.99)
|
||||||
#
|
#
|
||||||
# Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
# Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||||
#
|
#
|
||||||
@ -22,8 +22,8 @@
|
|||||||
Name: rpmlint
|
Name: rpmlint
|
||||||
BuildRequires: rpm-python
|
BuildRequires: rpm-python
|
||||||
Summary: Rpm correctness checker
|
Summary: Rpm correctness checker
|
||||||
Version: 0.95
|
Version: 0.99
|
||||||
Release: 14
|
Release: 1
|
||||||
Source0: %{name}-%{version}.tar.bz2
|
Source0: %{name}-%{version}.tar.bz2
|
||||||
Source1: config
|
Source1: config
|
||||||
Source1001: config.in
|
Source1001: config.in
|
||||||
@ -47,6 +47,7 @@ Source18: CheckDBusPolicy.py
|
|||||||
Source19: CheckAlternativesGhostFiles.py
|
Source19: CheckAlternativesGhostFiles.py
|
||||||
Source20: rpmgroups.config
|
Source20: rpmgroups.config
|
||||||
Source21: BashismsCheck.py
|
Source21: BashismsCheck.py
|
||||||
|
Source22: CheckGNOMEMacros.py
|
||||||
Source100: syntax-validator.py
|
Source100: syntax-validator.py
|
||||||
Url: http://rpmlint.zarb.org/
|
Url: http://rpmlint.zarb.org/
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
@ -72,12 +73,10 @@ Patch11: suse-file-var-run.diff
|
|||||||
Patch12: usr-arch.diff
|
Patch12: usr-arch.diff
|
||||||
Patch13: script-interpreter-only-for-exec-scripts.diff
|
Patch13: script-interpreter-only-for-exec-scripts.diff
|
||||||
Patch14: sourced-dirs.diff
|
Patch14: sourced-dirs.diff
|
||||||
Patch16: dependency-parsing.diff
|
|
||||||
Patch17: docdata-examples.diff
|
Patch17: docdata-examples.diff
|
||||||
Patch18: suse-hide-unstripped-outside-build.diff
|
Patch18: suse-hide-unstripped-outside-build.diff
|
||||||
Patch19: yast-provides.diff
|
Patch19: yast-provides.diff
|
||||||
Patch20: xdg-paths-update.diff
|
Patch20: xdg-paths-update.diff
|
||||||
Patch21: fix-buildroot-test.diff
|
|
||||||
Patch22: better-wrong-script.diff
|
Patch22: better-wrong-script.diff
|
||||||
Patch23: buildroot-doc.diff
|
Patch23: buildroot-doc.diff
|
||||||
# bogus, fails with aaa_base. disabled
|
# bogus, fails with aaa_base. disabled
|
||||||
@ -85,7 +84,6 @@ Patch24: sysv5-init-checks.diff
|
|||||||
Patch26: ignore-non-readable-in-etc.diff
|
Patch26: ignore-non-readable-in-etc.diff
|
||||||
Patch29: rpmgroup-checks.diff
|
Patch29: rpmgroup-checks.diff
|
||||||
Patch30: devel-provide-is-devel-package.diff
|
Patch30: devel-provide-is-devel-package.diff
|
||||||
# what's the reason behind that one?
|
|
||||||
Patch31: only-reg-files-are-scripts.diff
|
Patch31: only-reg-files-are-scripts.diff
|
||||||
Patch33: check-buildroot-during-install.diff
|
Patch33: check-buildroot-during-install.diff
|
||||||
Patch34: verify-buildrequires.diff
|
Patch34: verify-buildrequires.diff
|
||||||
@ -110,13 +108,14 @@ Patch62: no-badness-return.diff
|
|||||||
Patch65: suse-shlib-devel-dependency.diff
|
Patch65: suse-shlib-devel-dependency.diff
|
||||||
Patch67: suse-required-lsb-tags.diff
|
Patch67: suse-required-lsb-tags.diff
|
||||||
Patch68: more-verbose-lsb-check.diff
|
Patch68: more-verbose-lsb-check.diff
|
||||||
Patch69: useless-requires-doc.diff
|
|
||||||
Patch71: suse-binary-info-compile-opts.diff
|
Patch71: suse-binary-info-compile-opts.diff
|
||||||
Patch72: version-control-internal-file.diff
|
Patch72: version-control-internal-file.diff
|
||||||
Patch73: avoid-mismatched-libregex.diff
|
Patch73: avoid-mismatched-libregex.diff
|
||||||
Patch74: filename-non-utf8-exception.diff
|
Patch74: filename-non-utf8-exception.diff
|
||||||
Patch75: stricter-interpreter-check.diff
|
Patch75: stricter-interpreter-check.diff
|
||||||
Patch76: confusing-invalid-spec-name.patch
|
Patch76: confusing-invalid-spec-name.patch
|
||||||
|
Patch77: rpmlint-pkg-quoting.diff
|
||||||
|
Patch78: suse-g-ir-chech.diff
|
||||||
%py_requires
|
%py_requires
|
||||||
|
|
||||||
%description
|
%description
|
||||||
@ -147,12 +146,10 @@ Authors:
|
|||||||
%patch12
|
%patch12
|
||||||
%patch13
|
%patch13
|
||||||
%patch14
|
%patch14
|
||||||
%patch16
|
|
||||||
%patch17
|
%patch17
|
||||||
%patch18
|
#%patch18
|
||||||
%patch19
|
%patch19
|
||||||
%patch20
|
%patch20
|
||||||
%patch21
|
|
||||||
%patch22
|
%patch22
|
||||||
%patch23
|
%patch23
|
||||||
# bogus, fails with aaa_base. disabled
|
# bogus, fails with aaa_base. disabled
|
||||||
@ -160,7 +157,7 @@ Authors:
|
|||||||
#%patch26
|
#%patch26
|
||||||
%patch29
|
%patch29
|
||||||
%patch30
|
%patch30
|
||||||
#%patch31
|
%patch31
|
||||||
# needs rediff
|
# needs rediff
|
||||||
#%patch33
|
#%patch33
|
||||||
#%patch34
|
#%patch34
|
||||||
@ -175,22 +172,23 @@ Authors:
|
|||||||
%patch50
|
%patch50
|
||||||
%patch51
|
%patch51
|
||||||
#%patch52
|
#%patch52
|
||||||
%patch54
|
### rediff!
|
||||||
|
#%patch54
|
||||||
#%patch57
|
#%patch57
|
||||||
%patch58
|
%patch58
|
||||||
#%patch60
|
%patch60
|
||||||
%patch62
|
%patch62
|
||||||
#%patch63
|
|
||||||
%patch65
|
%patch65
|
||||||
#%patch67
|
#%patch67
|
||||||
#%patch68
|
#%patch68
|
||||||
#%patch69
|
|
||||||
#%patch71
|
#%patch71
|
||||||
%patch72
|
%patch72
|
||||||
%patch73
|
%patch73
|
||||||
%patch74
|
%patch74
|
||||||
%patch75
|
%patch75
|
||||||
%patch76 -p1
|
%patch76 -p1
|
||||||
|
%patch77
|
||||||
|
%patch78
|
||||||
cp -p %{SOURCE1} .
|
cp -p %{SOURCE1} .
|
||||||
cp -p %{SOURCE2} .
|
cp -p %{SOURCE2} .
|
||||||
cp -p %{SOURCE3} .
|
cp -p %{SOURCE3} .
|
||||||
@ -211,6 +209,7 @@ cp -p %{SOURCE17} .
|
|||||||
cp -p %{SOURCE18} .
|
cp -p %{SOURCE18} .
|
||||||
cp -p %{SOURCE19} .
|
cp -p %{SOURCE19} .
|
||||||
cp -p %{SOURCE21} .
|
cp -p %{SOURCE21} .
|
||||||
|
cp -p %{SOURCE22} .
|
||||||
|
|
||||||
%build
|
%build
|
||||||
make %{?_smp_mflags}
|
make %{?_smp_mflags}
|
||||||
|
@ -2,7 +2,7 @@ Index: FilesCheck.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- FilesCheck.py.orig
|
--- FilesCheck.py.orig
|
||||||
+++ FilesCheck.py
|
+++ FilesCheck.py
|
||||||
@@ -1292,7 +1292,7 @@ class FilesCheck(AbstractCheck.AbstractC
|
@@ -1225,7 +1225,7 @@ class FilesCheck(AbstractCheck.AbstractC
|
||||||
interpreter = None
|
interpreter = None
|
||||||
if res:
|
if res:
|
||||||
interpreter = res.group(1)
|
interpreter = res.group(1)
|
||||||
|
@ -1,23 +1,23 @@
|
|||||||
--- TagsCheck.py
|
--- TagsCheck.py
|
||||||
+++ TagsCheck.py
|
+++ TagsCheck.py
|
||||||
@@ -680,6 +680,7 @@
|
@@ -801,6 +801,7 @@
|
||||||
|
|
||||||
obs_names = map(lambda x: x[0], pkg.obsoletes())
|
obs_names = [x[0] for x in pkg.obsoletes()]
|
||||||
prov_names = map(lambda x: x[0].split(':/')[0], pkg.provides())
|
prov_names = [x[0].split(':/')[0] for x in pkg.provides()]
|
||||||
+ conf_names = map(lambda x: x[0].split(':/')[0], pkg.conflicts())
|
+ conf_names = map(lambda x: x[0].split(':/')[0], pkg.conflicts())
|
||||||
req_names = map(lambda x: x[0], pkg.requires() + pkg.prereq())
|
|
||||||
|
|
||||||
if pkg.name in obs_names:
|
for o in (x for x in obs_names if x not in prov_names):
|
||||||
@@ -695,6 +696,8 @@
|
printWarning(pkg, 'obsolete-not-provided', o)
|
||||||
|
@@ -812,6 +813,8 @@
|
||||||
# https://bugzilla.redhat.com/460872
|
# https://bugzilla.redhat.com/460872
|
||||||
useless_provides=[]
|
useless_provides = []
|
||||||
for p in prov_names:
|
for p in prov_names:
|
||||||
+ if p in conf_names:
|
+ if p in conf_names:
|
||||||
+ printWarning(pkg, 'conflicts-with-provides', p)
|
+ printWarning(pkg, 'conflicts-with-provides', p)
|
||||||
if prov_names.count(p) != 1:
|
if prov_names.count(p) != 1 and p not in useless_provides:
|
||||||
if p not in useless_provides:
|
|
||||||
useless_provides.append(p)
|
useless_provides.append(p)
|
||||||
@@ -796,6 +799,10 @@
|
for p in useless_provides:
|
||||||
|
@@ -952,6 +955,10 @@
|
||||||
'''There is no Name tag in your package. You have to specify a name using the
|
'''There is no Name tag in your package. You have to specify a name using the
|
||||||
Name tag.''',
|
Name tag.''',
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ Index: FilesCheck.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- FilesCheck.py.orig
|
--- FilesCheck.py.orig
|
||||||
+++ FilesCheck.py
|
+++ FilesCheck.py
|
||||||
@@ -684,7 +684,7 @@ manifest_perl_regex = re.compile('^/usr/
|
@@ -685,7 +685,7 @@ manifest_perl_regex = re.compile('^/usr/
|
||||||
shebang_regex = re.compile('^#!\s*(\S*)')
|
shebang_regex = re.compile('^#!\s*(\S*)')
|
||||||
interpreter_regex = re.compile('^/(usr/)?(s?bin|games|libexec(/.+)?|(lib(64)?|share)/.+)/[^/]+$')
|
interpreter_regex = re.compile('^/(usr/)?(s?bin|games|libexec(/.+)?|(lib(64)?|share)/.+)/[^/]+$')
|
||||||
script_regex = re.compile('^/((usr/)?s?bin|etc/(rc\.d/init\.d|X11/xinit\.d|cron\.(hourly|daily|monthly|weekly)))/')
|
script_regex = re.compile('^/((usr/)?s?bin|etc/(rc\.d/init\.d|X11/xinit\.d|cron\.(hourly|daily|monthly|weekly)))/')
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
--- FilesCheck.py
|
Index: FilesCheck.py
|
||||||
|
===================================================================
|
||||||
|
--- FilesCheck.py.orig
|
||||||
+++ FilesCheck.py
|
+++ FilesCheck.py
|
||||||
@@ -826,7 +826,8 @@
|
@@ -1248,7 +1248,8 @@ class FilesCheck(AbstractCheck.AbstractC
|
||||||
f.endswith('.la')):
|
f.endswith('.la')):
|
||||||
printError(pkg, 'script-without-shebang', f)
|
printError(pkg, 'script-without-shebang', f)
|
||||||
|
|
||||||
|
@ -48,9 +48,9 @@
|
|||||||
if self.non_pic:
|
if self.non_pic:
|
||||||
self.non_pic = 'TEXTREL' in res[1]
|
self.non_pic = 'TEXTREL' in res[1]
|
||||||
|
|
||||||
@@ -259,6 +278,17 @@
|
@@ -270,6 +289,17 @@
|
||||||
bin_info = BinaryInfo(
|
is_shlib = so_regex.search(fname)
|
||||||
pkg, pkgfile.path, fname, is_ar, is_shlib)
|
bin_info = BinaryInfo(pkg, pkgfile.path, fname, is_ar, is_shlib)
|
||||||
|
|
||||||
+ # stripped static library
|
+ # stripped static library
|
||||||
+ if is_ar:
|
+ if is_ar:
|
||||||
@ -63,12 +63,12 @@
|
|||||||
+ os.environ.get('BUILD_DEBUG_FLAGS','').find('-g') != -1):
|
+ os.environ.get('BUILD_DEBUG_FLAGS','').find('-g') != -1):
|
||||||
+ printWarning(pkg, 'static-library-without-debuginfo', fname)
|
+ printWarning(pkg, 'static-library-without-debuginfo', fname)
|
||||||
+
|
+
|
||||||
# so name in library
|
|
||||||
if is_shlib:
|
if is_shlib:
|
||||||
has_lib = True
|
has_lib = True
|
||||||
@@ -294,6 +324,10 @@
|
|
||||||
printError(
|
@@ -319,6 +349,10 @@
|
||||||
pkg, 'shlib-with-non-pic-code', fname)
|
for ec in bin_info.exit_calls:
|
||||||
|
printWarning(pkg, 'shared-lib-calls-exit', fname, ec)
|
||||||
|
|
||||||
+ # gethostbyname ?
|
+ # gethostbyname ?
|
||||||
+ if bin_info.calls_gethostbyname:
|
+ if bin_info.calls_gethostbyname:
|
||||||
@ -77,7 +77,7 @@
|
|||||||
# rpath ?
|
# rpath ?
|
||||||
if bin_info.rpath:
|
if bin_info.rpath:
|
||||||
for p in bin_info.rpath:
|
for p in bin_info.rpath:
|
||||||
@@ -509,6 +543,14 @@
|
@@ -504,6 +538,14 @@
|
||||||
'ldd-failed',
|
'ldd-failed',
|
||||||
'''Executing ldd on this file failed, all checks could not be run.''',
|
'''Executing ldd on this file failed, all checks could not be run.''',
|
||||||
|
|
||||||
@ -92,7 +92,7 @@
|
|||||||
'executable-stack',
|
'executable-stack',
|
||||||
'''The binary declares the stack as executable. Executable stack is usually an
|
'''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
|
error as it is only needed if the code contains GCC trampolines or similar
|
||||||
@@ -521,6 +563,10 @@
|
@@ -516,6 +558,10 @@
|
||||||
make the stack executable. Usual suspects include use of a non-GNU linker or
|
make the stack executable. Usual suspects include use of a non-GNU linker or
|
||||||
an old GNU linker version.''',
|
an old GNU linker version.''',
|
||||||
|
|
||||||
|
@ -9,15 +9,15 @@
|
|||||||
compress_ext = Config.getOption("CompressExtension", "bz2")
|
compress_ext = Config.getOption("CompressExtension", "bz2")
|
||||||
valid_src_perms = Config.getOption("ValidSrcPerms", DEFAULT_VALID_SRC_PERMS)
|
valid_src_perms = Config.getOption("ValidSrcPerms", DEFAULT_VALID_SRC_PERMS)
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@
|
@@ -41,7 +41,7 @@
|
||||||
printError(pkg, 'multiple-specfiles', spec_file, fname)
|
|
||||||
else:
|
else:
|
||||||
spec_file = fname
|
spec_file = fname
|
||||||
- elif source_regex.search(fname) and compress_ext:
|
elif source_regex.search(fname) and compress_ext and \
|
||||||
+ elif source_regex.search(fname) and compress_ext and pkgfile.size > 120*1024:
|
- not fname.endswith(compress_ext):
|
||||||
if not fname.endswith(compress_ext):
|
+ not fname.endswith(compress_ext) and pkgfile.size > 120*1024:
|
||||||
printWarning(pkg, 'source-or-patch-not-compressed',
|
printWarning(pkg, 'source-or-patch-not-compressed',
|
||||||
compress_ext, fname)
|
compress_ext, fname)
|
||||||
|
perm = pkgfile.mode & 07777
|
||||||
@@ -58,8 +58,10 @@
|
@@ -58,8 +58,10 @@
|
||||||
|
|
||||||
'source-or-patch-not-compressed',
|
'source-or-patch-not-compressed',
|
||||||
|
@ -2,7 +2,7 @@ Index: FilesCheck.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- FilesCheck.py.orig
|
--- FilesCheck.py.orig
|
||||||
+++ FilesCheck.py
|
+++ FilesCheck.py
|
||||||
@@ -907,6 +907,16 @@ class FilesCheck(AbstractCheck.AbstractC
|
@@ -928,6 +928,16 @@ class FilesCheck(AbstractCheck.AbstractC
|
||||||
if res.group(1) != pkg.name:
|
if res.group(1) != pkg.name:
|
||||||
printError(pkg, 'incoherent-logrotate-file', f)
|
printError(pkg, 'incoherent-logrotate-file', f)
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ Index: FilesCheck.py
|
|||||||
if link != '':
|
if link != '':
|
||||||
ext = compr_regex.search(link)
|
ext = compr_regex.search(link)
|
||||||
if ext:
|
if ext:
|
||||||
@@ -1677,6 +1687,24 @@ consequences), or other compiler flags w
|
@@ -1725,6 +1735,24 @@ consequences), or other compiler flags w
|
||||||
extraction not working as expected. Verify that the binaries are not
|
extraction not working as expected. Verify that the binaries are not
|
||||||
unexpectedly stripped and that the intended compiler flags are used.''',
|
unexpectedly stripped and that the intended compiler flags are used.''',
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
--- FilesCheck.py
|
Index: FilesCheck.py
|
||||||
|
===================================================================
|
||||||
|
--- FilesCheck.py.orig
|
||||||
+++ FilesCheck.py
|
+++ FilesCheck.py
|
||||||
@@ -392,7 +392,7 @@
|
@@ -885,7 +885,7 @@ class FilesCheck(AbstractCheck.AbstractC
|
||||||
is_kernel_package:
|
is_kernel_package:
|
||||||
printError(pkg, "kernel-modules-not-in-kernel-packages", f)
|
printError(pkg, "kernel-modules-not-in-kernel-packages", f)
|
||||||
|
|
||||||
@ -9,7 +11,7 @@
|
|||||||
printError(pkg, 'dir-or-file-in-tmp', f)
|
printError(pkg, 'dir-or-file-in-tmp', f)
|
||||||
elif f.startswith('/mnt/'):
|
elif f.startswith('/mnt/'):
|
||||||
printError(pkg, 'dir-or-file-in-mnt', f)
|
printError(pkg, 'dir-or-file-in-mnt', f)
|
||||||
@@ -402,6 +402,8 @@
|
@@ -895,6 +895,8 @@ class FilesCheck(AbstractCheck.AbstractC
|
||||||
printError(pkg, 'dir-or-file-in-usr-local', f)
|
printError(pkg, 'dir-or-file-in-usr-local', f)
|
||||||
elif f.startswith('/var/local/'):
|
elif f.startswith('/var/local/'):
|
||||||
printError(pkg, 'dir-or-file-in-var-local', f)
|
printError(pkg, 'dir-or-file-in-var-local', f)
|
||||||
@ -18,7 +20,7 @@
|
|||||||
elif sub_bin_regex.search(f):
|
elif sub_bin_regex.search(f):
|
||||||
printError(pkg, 'subdir-in-bin', f)
|
printError(pkg, 'subdir-in-bin', f)
|
||||||
elif f.startswith('/home/'):
|
elif f.startswith('/home/'):
|
||||||
@@ -945,6 +948,12 @@
|
@@ -1465,6 +1467,12 @@ for packages to install files in this di
|
||||||
'''A file in the package is located in /var/local. It's not permitted
|
'''A file in the package is located in /var/local. It's not permitted
|
||||||
for packages to install files in this directory.''',
|
for packages to install files in this directory.''',
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ Index: FilesCheck.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- FilesCheck.py.orig
|
--- FilesCheck.py.orig
|
||||||
+++ FilesCheck.py
|
+++ FilesCheck.py
|
||||||
@@ -28,65 +28,114 @@ STANDARD_DIRS = (
|
@@ -29,65 +29,114 @@ STANDARD_DIRS = (
|
||||||
'/',
|
'/',
|
||||||
'/bin',
|
'/bin',
|
||||||
'/boot',
|
'/boot',
|
||||||
@ -144,7 +144,7 @@ Index: FilesCheck.py
|
|||||||
'/usr/local/lib',
|
'/usr/local/lib',
|
||||||
'/usr/local/lib64',
|
'/usr/local/lib64',
|
||||||
'/usr/local/man',
|
'/usr/local/man',
|
||||||
@@ -102,24 +151,415 @@ STANDARD_DIRS = (
|
@@ -103,24 +152,415 @@ STANDARD_DIRS = (
|
||||||
'/usr/local/man/mann',
|
'/usr/local/man/mann',
|
||||||
'/usr/local/sbin',
|
'/usr/local/sbin',
|
||||||
'/usr/local/share',
|
'/usr/local/share',
|
||||||
@ -571,7 +571,7 @@ Index: FilesCheck.py
|
|||||||
'/usr/share/man',
|
'/usr/share/man',
|
||||||
'/usr/share/man/man1',
|
'/usr/share/man/man1',
|
||||||
'/usr/share/man/man2',
|
'/usr/share/man/man2',
|
||||||
@@ -131,28 +571,60 @@ STANDARD_DIRS = (
|
@@ -132,28 +572,60 @@ STANDARD_DIRS = (
|
||||||
'/usr/share/man/man8',
|
'/usr/share/man/man8',
|
||||||
'/usr/share/man/man9',
|
'/usr/share/man/man9',
|
||||||
'/usr/share/man/mann',
|
'/usr/share/man/mann',
|
||||||
|
13
suse-g-ir-chech.diff
Normal file
13
suse-g-ir-chech.diff
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
Index: FilesCheck.py
|
||||||
|
===================================================================
|
||||||
|
--- FilesCheck.py.orig
|
||||||
|
+++ FilesCheck.py
|
||||||
|
@@ -651,7 +651,7 @@ points_regex = re.compile('^\.\./(.*)')
|
||||||
|
doc_regex = re.compile('^/usr(/share|/X11R6)?/(doc|man|info)/|^/opt/kde3/share/doc|^/usr/share/gnome/help')
|
||||||
|
bin_regex = re.compile('^/(?:usr/(?:s?bin|games)|s?bin)/(.*)')
|
||||||
|
includefile_regex = re.compile('\.(c|h)(pp|xx)?$', re.IGNORECASE)
|
||||||
|
-develfile_regex = re.compile('\.(a|cmxa?|mli?)$')
|
||||||
|
+develfile_regex = re.compile('\.(a|cmxa?|mli?|gir)$')
|
||||||
|
buildconfigfile_regex = re.compile('(\.pc|/bin/.+-config)$')
|
||||||
|
docdir_examples_regex = re.compile('^/usr/(?:share/doc/packages|lib(?:64))/[^/]+/(?:example|demo|script|contrib)')
|
||||||
|
# room for improvement with catching more -R, but also for false positives...
|
@ -1,6 +1,4 @@
|
|||||||
Index: BinariesCheck.py
|
--- BinariesCheck.py
|
||||||
===================================================================
|
|
||||||
--- BinariesCheck.py.orig
|
|
||||||
+++ BinariesCheck.py
|
+++ BinariesCheck.py
|
||||||
@@ -10,6 +10,7 @@
|
@@ -10,6 +10,7 @@
|
||||||
|
|
||||||
@ -10,18 +8,18 @@ Index: BinariesCheck.py
|
|||||||
|
|
||||||
import rpm
|
import rpm
|
||||||
|
|
||||||
@@ -271,7 +272,9 @@ class BinariesCheck(AbstractCheck.Abstra
|
@@ -283,7 +284,9 @@
|
||||||
|
continue
|
||||||
|
|
||||||
# stripped ?
|
# stripped ?
|
||||||
if not is_ocaml_native and not unstrippable.search(fname):
|
|
||||||
- if 'not stripped' in pkgfile.magic:
|
- if 'not stripped' in pkgfile.magic:
|
||||||
+ if 'not stripped' in pkgfile.magic and \
|
+ if 'not stripped' in pkgfile.magic and \
|
||||||
+ (os.environ.get('BUILD_DIR', None) == None or
|
+ (os.environ.get('BUILD_DIR', None) == None or
|
||||||
+ os.environ.get('BUILD_DEBUG', None) != None):
|
+ os.environ.get('BUILD_DEBUG', None) != None):
|
||||||
printWarning(
|
printWarning(pkg, 'unstripped-binary-or-object', fname)
|
||||||
pkg, 'unstripped-binary-or-object', fname)
|
|
||||||
|
|
||||||
@@ -585,6 +588,12 @@ form, make sure that rpmbuild does not s
|
# inspect binary file
|
||||||
|
@@ -580,6 +583,12 @@
|
||||||
that use prelink, make sure that prelink does not strip it either, usually by
|
that use prelink, make sure that prelink does not strip it either, usually by
|
||||||
placing a blacklist file in /etc/prelink.conf.d. For more information, see
|
placing a blacklist file in /etc/prelink.conf.d. For more information, see
|
||||||
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=256900#49''',
|
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=256900#49''',
|
||||||
|
@ -2,7 +2,7 @@ Index: SpecCheck.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- SpecCheck.py.orig
|
--- SpecCheck.py.orig
|
||||||
+++ SpecCheck.py
|
+++ SpecCheck.py
|
||||||
@@ -444,6 +444,10 @@ class SpecCheck(AbstractCheck.AbstractCh
|
@@ -403,6 +403,10 @@ class SpecCheck(AbstractCheck.AbstractCh
|
||||||
printWarning(pkg, 'comparison-operator-in-deptoken',
|
printWarning(pkg, 'comparison-operator-in-deptoken',
|
||||||
conf)
|
conf)
|
||||||
|
|
||||||
@ -13,7 +13,7 @@ Index: SpecCheck.py
|
|||||||
if current_section == 'changelog':
|
if current_section == 'changelog':
|
||||||
for match in AbstractCheck.macro_regex.findall(line):
|
for match in AbstractCheck.macro_regex.findall(line):
|
||||||
res = re.match('%+', match)
|
res = re.match('%+', match)
|
||||||
@@ -711,6 +715,14 @@ may break short circuit builds.''',
|
@@ -690,6 +694,14 @@ may break short circuit builds.''',
|
||||||
'''Make check or other automated regression test should be run in %check, as
|
'''Make check or other automated regression test should be run in %check, as
|
||||||
they can be disabled with a rpm macro for short circuiting purposes.''',
|
they can be disabled with a rpm macro for short circuiting purposes.''',
|
||||||
|
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
Index: TagsCheck.py
|
--- TagsCheck.py
|
||||||
===================================================================
|
|
||||||
--- TagsCheck.py.orig
|
|
||||||
+++ TagsCheck.py
|
+++ TagsCheck.py
|
||||||
@@ -414,6 +414,7 @@ lib_devel_number_regex = re.compile('^li
|
@@ -414,6 +414,7 @@
|
||||||
invalid_url_regex = re.compile(Config.getOption('InvalidURL'), re.IGNORECASE)
|
invalid_url_regex = re.compile(Config.getOption('InvalidURL'), re.IGNORECASE)
|
||||||
lib_package_regex = re.compile('(?:^(?:compat-)?lib.*?(\.so.*)?|libs?[\d-]*)$', re.IGNORECASE)
|
lib_package_regex = re.compile('(?:^(?:compat-)?lib.*?(\.so.*)?|libs?[\d-]*)$', re.IGNORECASE)
|
||||||
leading_space_regex = re.compile('^\s+')
|
leading_space_regex = re.compile('^\s+')
|
||||||
@ -10,7 +8,7 @@ Index: TagsCheck.py
|
|||||||
license_regex = re.compile('\(([^)]+)\)|\s(?:and|or)\s')
|
license_regex = re.compile('\(([^)]+)\)|\s(?:and|or)\s')
|
||||||
invalid_version_regex = re.compile('([0-9](?:rc|alpha|beta|pre).*)', re.IGNORECASE)
|
invalid_version_regex = re.compile('([0-9](?:rc|alpha|beta|pre).*)', re.IGNORECASE)
|
||||||
# () are here for grouping purpose in the regexp
|
# () are here for grouping purpose in the regexp
|
||||||
@@ -607,10 +608,12 @@ class TagsCheck(AbstractCheck.AbstractCh
|
@@ -623,10 +624,12 @@
|
||||||
base = is_devel.group(1)
|
base = is_devel.group(1)
|
||||||
dep = None
|
dep = None
|
||||||
has_so = False
|
has_so = False
|
||||||
@ -24,7 +22,7 @@ Index: TagsCheck.py
|
|||||||
if has_so:
|
if has_so:
|
||||||
base_or_libs = base + '/' + base + '-libs/lib' + base
|
base_or_libs = base + '/' + base + '-libs/lib' + base
|
||||||
# try to match *%_isa as well (e.g. "(x86-64)", "(x86-32)")
|
# try to match *%_isa as well (e.g. "(x86-64)", "(x86-32)")
|
||||||
@@ -647,6 +650,15 @@ class TagsCheck(AbstractCheck.AbstractCh
|
@@ -663,6 +666,15 @@
|
||||||
if prov not in (x[0] for x in pkg.provides()):
|
if prov not in (x[0] for x in pkg.provides()):
|
||||||
printWarning(pkg, 'no-provides', prov)
|
printWarning(pkg, 'no-provides', prov)
|
||||||
|
|
||||||
@ -38,9 +36,9 @@ Index: TagsCheck.py
|
|||||||
+ printWarning(pkg, 'no-pkg-config-provides')
|
+ printWarning(pkg, 'no-pkg-config-provides')
|
||||||
+
|
+
|
||||||
# List of words to ignore in spell check
|
# List of words to ignore in spell check
|
||||||
ignored_words = [x.split('/')[-1] for x in pkg.files()]
|
ignored_words = set()
|
||||||
|
for pf in pkg.files():
|
||||||
@@ -1059,6 +1071,11 @@ instead or require a file in bin or /etc
|
@@ -1082,6 +1094,11 @@
|
||||||
'no-url-tag',
|
'no-url-tag',
|
||||||
'''The URL tag is missing.''',
|
'''The URL tag is missing.''',
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
--- TagsCheck.py
|
Index: TagsCheck.py
|
||||||
|
===================================================================
|
||||||
|
--- TagsCheck.py.orig
|
||||||
+++ TagsCheck.py
|
+++ TagsCheck.py
|
||||||
@@ -741,14 +741,14 @@
|
@@ -762,14 +762,14 @@ class TagsCheck(AbstractCheck.AbstractCh
|
||||||
if not valid_license:
|
if not valid_license:
|
||||||
self._unexpanded_macros(pkg, 'License', rpm_license)
|
self._unexpanded_macros(pkg, 'License', rpm_license)
|
||||||
|
|
||||||
|
@ -10,20 +10,20 @@ Index: SpecCheck.py
|
|||||||
section_regexs = dict(
|
section_regexs = dict(
|
||||||
([x, re.compile('^%' + x + '(?:\s|$)')]
|
([x, re.compile('^%' + x + '(?:\s|$)')]
|
||||||
for x in ('build', 'changelog', 'check', 'clean', 'description', 'files',
|
for x in ('build', 'changelog', 'check', 'clean', 'description', 'files',
|
||||||
@@ -386,6 +387,12 @@ class SpecCheck(AbstractCheck.AbstractCh
|
@@ -348,6 +349,12 @@ class SpecCheck(AbstractCheck.AbstractCh
|
||||||
if res:
|
if res:
|
||||||
package_noarch[current_package] = True
|
package_noarch[current_package] = True
|
||||||
|
|
||||||
+ res = suse_version_regex.search(line)
|
+ res = suse_version_regex.search(line)
|
||||||
+ if res and int(res.group(1)) > 0 and int(res.group(1)) < 1100:
|
+ if res and int(res.group(1)) > 0 and int(res.group(1)) < 1110:
|
||||||
+ printWarning(pkg, "obsolete-suse-version-check", res.group(1))
|
+ printWarning(pkg, "obsolete-suse-version-check", res.group(1))
|
||||||
+ elif res and int(res.group(1)) > 1120:
|
+ elif res and int(res.group(1)) > 1140:
|
||||||
+ printError(pkg, "invalid-suse-version-check", res.group(1))
|
+ printError(pkg, "invalid-suse-version-check", res.group(1))
|
||||||
+
|
+
|
||||||
res = prereq_regex.search(line)
|
res = prereq_regex.search(line)
|
||||||
if res:
|
if res:
|
||||||
printError(pkg, 'prereq-use', res.group(2))
|
printError(pkg, 'prereq-use', res.group(2))
|
||||||
@@ -749,6 +756,15 @@ set which may result in security issues
|
@@ -731,6 +738,15 @@ set which may result in security issues
|
||||||
depending on the system where the package is built. Add default attributes
|
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.''',
|
using %defattr before it in the %files section, or use per line %attr's.''',
|
||||||
|
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
--- TagsCheck.py
|
|
||||||
+++ TagsCheck.py
|
|
||||||
@@ -933,6 +933,10 @@ explicit Requires: tags.''',
|
|
||||||
'''This package provides 2 times the same capacity. It should only provide it
|
|
||||||
once.''',
|
|
||||||
|
|
||||||
+'useless-explicit-requires',
|
|
||||||
+'''This package requires 2 times the same capacity. It should only require it
|
|
||||||
+once.''',
|
|
||||||
+
|
|
||||||
'unversioned-explicit-self-provides',
|
|
||||||
'''This package provides it's own name explicitely, which might break
|
|
||||||
upgrade path. self-provides are autogenerated. Remove the provide.''',
|
|
@ -1,8 +1,6 @@
|
|||||||
Index: BinariesCheck.py
|
--- BinariesCheck.py
|
||||||
===================================================================
|
|
||||||
--- BinariesCheck.py.orig
|
|
||||||
+++ BinariesCheck.py
|
+++ BinariesCheck.py
|
||||||
@@ -190,6 +190,7 @@ usr_lib_exception_regex = re.compile(Con
|
@@ -195,6 +195,7 @@
|
||||||
srcname_regex = re.compile('(.*?)-[0-9]')
|
srcname_regex = re.compile('(.*?)-[0-9]')
|
||||||
invalid_dir_ref_regex = re.compile('/(home|tmp)(\W|$)')
|
invalid_dir_ref_regex = re.compile('/(home|tmp)(\W|$)')
|
||||||
ocaml_mixed_regex = re.compile('^Caml1999X0\d\d$')
|
ocaml_mixed_regex = re.compile('^Caml1999X0\d\d$')
|
||||||
@ -10,12 +8,12 @@ Index: BinariesCheck.py
|
|||||||
|
|
||||||
def dir_base(path):
|
def dir_base(path):
|
||||||
res = path_regex.search(path)
|
res = path_regex.search(path)
|
||||||
@@ -250,7 +251,7 @@ class BinariesCheck(AbstractCheck.Abstra
|
@@ -267,7 +268,7 @@
|
||||||
fname)
|
# arch dependent packages only from here on
|
||||||
else:
|
|
||||||
# in /usr/share ?
|
# in /usr/share ?
|
||||||
- if fname.startswith('/usr/share/'):
|
- if fname.startswith('/usr/share/'):
|
||||||
+ if fname.startswith('/usr/share/') and not usr_arch_share_regex.search(fname):
|
+ if fname.startswith('/usr/share/') and not usr_arch_share_regex.search(fname):
|
||||||
printError(
|
printError(pkg, 'arch-dependent-file-in-usr-share', fname)
|
||||||
pkg, 'arch-dependent-file-in-usr-share', fname)
|
|
||||||
# in /etc ?
|
# in /etc ?
|
||||||
|
@ -3,7 +3,7 @@ Index: FilesCheck.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- FilesCheck.py.orig
|
--- FilesCheck.py.orig
|
||||||
+++ FilesCheck.py
|
+++ FilesCheck.py
|
||||||
@@ -663,7 +663,7 @@ ldconfig_regex = re.compile('^[^#]*ldcon
|
@@ -664,7 +664,7 @@ ldconfig_regex = re.compile('^[^#]*ldcon
|
||||||
depmod_regex = re.compile('^[^#]*depmod', re.MULTILINE)
|
depmod_regex = re.compile('^[^#]*depmod', re.MULTILINE)
|
||||||
install_info_regex = re.compile('^[^#]*install-info', re.MULTILINE)
|
install_info_regex = re.compile('^[^#]*install-info', re.MULTILINE)
|
||||||
perl_temp_file_regex = re.compile('.*perl.*/(\.packlist|perllocal\.pod)$')
|
perl_temp_file_regex = re.compile('.*perl.*/(\.packlist|perllocal\.pod)$')
|
||||||
|
@ -2,12 +2,12 @@ Index: TagsCheck.py
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- TagsCheck.py.orig
|
--- TagsCheck.py.orig
|
||||||
+++ TagsCheck.py
|
+++ TagsCheck.py
|
||||||
@@ -774,7 +774,7 @@ class TagsCheck(AbstractCheck.AbstractCh
|
@@ -795,7 +795,7 @@ class TagsCheck(AbstractCheck.AbstractCh
|
||||||
printWarning(pkg, 'no-url-tag')
|
printWarning(pkg, 'no-url-tag')
|
||||||
|
|
||||||
obs_names = [x[0] for x in pkg.obsoletes()]
|
obs_names = [x[0] for x in pkg.obsoletes()]
|
||||||
- prov_names = [x[0] for x in pkg.provides()]
|
- prov_names = [x[0] for x in pkg.provides()]
|
||||||
+ prov_names = [x[0].split(':/')[0] for x in pkg.provides()]
|
+ prov_names = [x[0].split(':/')[0] for x in pkg.provides()]
|
||||||
|
|
||||||
for o in obs_names:
|
for o in (x for x in obs_names if x not in prov_names):
|
||||||
if o not in prov_names:
|
printWarning(pkg, 'obsolete-not-provided', o)
|
||||||
|
Loading…
Reference in New Issue
Block a user