diff --git a/rpmlint/checks/CheckForXinetd.py b/rpmlint/checks/CheckForXinetd.py index 5203276f..2fd933f4 100644 --- a/rpmlint/checks/CheckForXinetd.py +++ b/rpmlint/checks/CheckForXinetd.py @@ -6,6 +6,6 @@ class CheckForXinetd(AbstractCheck): if pkg.is_source: return - for req in pkg.requires() + pkg.prereq(): + for req in pkg.requires + pkg.prereq: if req[0] == 'xinetd': self.output.add_info('E', pkg, 'obsolete-xinetd-requirement') diff --git a/rpmlint/checks/FilesCheck.py b/rpmlint/checks/FilesCheck.py index 5ebb2efd..41992594 100644 --- a/rpmlint/checks/FilesCheck.py +++ b/rpmlint/checks/FilesCheck.py @@ -441,7 +441,7 @@ class FilesCheck(AbstractCheck): devel_pkg = devel_regex.search(pkg.name) if not devel_pkg: - for p in pkg.provides(): + for p in pkg.provides: if devel_regex.search(p[0]): devel_pkg = True break @@ -559,7 +559,7 @@ class FilesCheck(AbstractCheck): if res.group(1) != pkg.name: self.output.add_info('E', pkg, 'incoherent-logrotate-file', f) - deps = [x[0] for x in pkg.requires() + pkg.recommends() + pkg.suggests()] + deps = [x[0] for x in pkg.requires + pkg.recommends + pkg.suggests] if res and not ('logrotate' in deps) and pkg.name != 'logrotate': self.output.add_info('E', pkg, 'missing-dependency-to-logrotate', 'for logrotate script', f) if f.startswith('/etc/cron.') \ diff --git a/rpmlint/checks/I18NCheck.py b/rpmlint/checks/I18NCheck.py index c4db83fe..12d2a6e8 100644 --- a/rpmlint/checks/I18NCheck.py +++ b/rpmlint/checks/I18NCheck.py @@ -142,7 +142,7 @@ class I18NCheck(AbstractCheck): if res: locales = 'locales-' + res.group(1) if locales != name: - if locales not in (x[0] for x in pkg.requires()): + if locales not in (x[0] for x in pkg.requires): self.output.add_info('E', pkg, 'no-dependency-on', locales) diff --git a/rpmlint/checks/PostCheck.py b/rpmlint/checks/PostCheck.py index 43c39bb5..449d2c14 100644 --- a/rpmlint/checks/PostCheck.py +++ b/rpmlint/checks/PostCheck.py @@ -116,7 +116,7 @@ class PostCheck(AbstractCheck): self.output.error_details.update(post_details_dict) def check_binary(self, pkg): - prereq = [x[0] for x in pkg.prereq()] + prereq = [x[0] for x in pkg.prereq] for tag in Pkg.SCRIPT_TAGS: script = pkg[tag[0]] diff --git a/rpmlint/checks/SysVInitOnSystemdCheck.py b/rpmlint/checks/SysVInitOnSystemdCheck.py index 65895a24..5cada5dc 100644 --- a/rpmlint/checks/SysVInitOnSystemdCheck.py +++ b/rpmlint/checks/SysVInitOnSystemdCheck.py @@ -16,7 +16,7 @@ class SysVInitOnSystemdCheck(AbstractCheck): self._find_services_and_scripts(pkg) - for req in pkg.requires() + pkg.prereq(): + for req in pkg.requires + pkg.prereq: if req[0] == 'insserv': self.output.add_info('E', pkg, 'obsolete-insserv-requirement') diff --git a/rpmlint/checks/TagsCheck.py b/rpmlint/checks/TagsCheck.py index 2e6dcb37..86869f76 100644 --- a/rpmlint/checks/TagsCheck.py +++ b/rpmlint/checks/TagsCheck.py @@ -138,7 +138,7 @@ class TagsCheck(AbstractCheck): Pkg.formatRequire(*x)) name = pkg.name - deps = pkg.requires() + pkg.prereq() + deps = pkg.requires + pkg.prereq devel_depend = False is_devel = FilesCheck.devel_regex.search(name) is_source = pkg.is_source @@ -217,12 +217,12 @@ class TagsCheck(AbstractCheck): else: prov = res.group(1) + '-devel' - if prov not in (x[0] for x in pkg.provides()): + if prov not in (x[0] for x in pkg.provides): self.output.add_info('W', pkg, 'no-provides', prov) if has_pc: found_pkg_config_dep = False - for p in (x[0] for x in pkg.provides()): + for p in (x[0] for x in pkg.provides): if p.startswith('pkgconfig('): found_pkg_config_dep = True break @@ -233,10 +233,10 @@ class TagsCheck(AbstractCheck): ignored_words = set() for pf in pkg.files: ignored_words.update(pf.split('/')) - ignored_words.update((x[0] for x in pkg.provides())) - ignored_words.update((x[0] for x in pkg.requires())) - ignored_words.update((x[0] for x in pkg.conflicts())) - ignored_words.update((x[0] for x in pkg.obsoletes())) + ignored_words.update((x[0] for x in pkg.provides)) + ignored_words.update((x[0] for x in pkg.requires)) + ignored_words.update((x[0] for x in pkg.conflicts)) + ignored_words.update((x[0] for x in pkg.obsoletes)) langs = pkg[rpm.RPMTAG_HEADERI18NTABLE] @@ -379,12 +379,12 @@ class TagsCheck(AbstractCheck): elif tag == 'URL': self.output.add_info('W', pkg, 'no-url-tag') - obs_names = [x[0] for x in pkg.obsoletes()] - prov_names = [x[0] for x in pkg.provides()] + obs_names = [x[0] for x in pkg.obsoletes] + prov_names = [x[0] for x in pkg.provides] for o in (x for x in obs_names if x not in prov_names): self.output.add_info('W', pkg, 'obsolete-not-provided', o) - for o in pkg.obsoletes(): + for o in pkg.obsoletes: value = Pkg.formatRequire(*o) self._unexpanded_macros(pkg, 'Obsoletes %s' % (value,), value) @@ -400,13 +400,13 @@ class TagsCheck(AbstractCheck): self.output.add_info('E', pkg, 'useless-provides', p) for tagname, items in ( - ('Provides', pkg.provides()), - ('Conflicts', pkg.conflicts()), - ('Obsoletes', pkg.obsoletes()), - ('Supplements', pkg.supplements()), - ('Suggests', pkg.suggests()), - ('Enhances', pkg.enhances()), - ('Recommends', pkg.recommends())): + ('Provides', pkg.provides), + ('Conflicts', pkg.conflicts), + ('Obsoletes', pkg.obsoletes), + ('Supplements', pkg.supplements), + ('Suggests', pkg.suggests), + ('Enhances', pkg.enhances), + ('Recommends', pkg.recommends)): for p in items: e = Pkg.has_forbidden_controlchars(p) if e: @@ -417,7 +417,7 @@ class TagsCheck(AbstractCheck): value = Pkg.formatRequire(*p) self._unexpanded_macros(pkg, '%s %s' % (tagname, value), value) - for p in (pkg.requires()): + for p in (pkg.requires): e = Pkg.has_forbidden_controlchars(p) if e: self.output.add_info('E', @@ -425,9 +425,9 @@ class TagsCheck(AbstractCheck): 'forbidden-controlchar-found', 'Requires: %s' % e) - obss = pkg.obsoletes() + obss = pkg.obsoletes if obss: - provs = pkg.provides() + provs = pkg.provides for prov in provs: for obs in obss: if Pkg.rangeCompare(obs, prov): diff --git a/rpmlint/pkg.py b/rpmlint/pkg.py index a4b6d829..83ba80cf 100644 --- a/rpmlint/pkg.py +++ b/rpmlint/pkg.py @@ -378,7 +378,7 @@ class Pkg(AbstractPkg): self.extracted = extracted self.dirname = self.dir_name(dirname) self.current_linenum = None - self._requires = None + self._req_names = -1 if header: @@ -397,6 +397,11 @@ class Pkg(AbstractPkg): self.is_source = not self.header[rpm.RPMTAG_SOURCERPM] self.name = self[rpm.RPMTAG_NAME] + + (self.requires, self.prereq, self.provides, self.conflicts, + self.obsoletes, self.recommends, self.suggests, self.enhances, + self.supplements) = self._gatherDepInfo() + self.files = self._gatherFilesInfo() self.config_files = [x.name for x in self.files.values() if x.is_config] self.doc_files = [x.name for x in self.files.values() if x.is_doc] @@ -592,40 +597,15 @@ class Pkg(AbstractPkg): result = self.files.get(linkpath) return result - # API to access dependency information - def obsoletes(self): - """ - Get package Obsoletes as list of - (name, flags, (epoch, version, release)) tuples. - """ - self._gatherDepInfo() - return self._obsoletes - - def requires(self): - """ - Get package Requires as list of - (name, flags, (epoch, version, release)) tuples. - """ - self._gatherDepInfo() - return self._requires - - def prereq(self): - """ - Get package PreReqs as list of - (name, flags, (epoch, version, release)) tuples. - """ - self._gatherDepInfo() - return self._prereq - def req_names(self): if self._req_names == -1: - self._req_names = [x[0] for x in self.requires() + self.prereq()] + self._req_names = [x[0] for x in self.requires + self.prereq] return self._req_names def check_versioned_dep(self, name, version): # try to match name%_isa as well (e.g. 'foo(x86-64)', 'foo(x86-32)') name_re = re.compile(r'^%s(\(\w+-\d+\))?$' % re.escape(name)) - for d in self.requires() + self.prereq(): + for d in self.requires + self.prereq: if name_re.match(d[0]): if d[1] & rpm.RPMSENSE_EQUAL != rpm.RPMSENSE_EQUAL \ or d[2][1] != version: @@ -633,54 +613,6 @@ class Pkg(AbstractPkg): return True return False - def conflicts(self): - """ - Get package Conflicts as list of - (name, flags, (epoch, version, release)) tuples. - """ - self._gatherDepInfo() - return self._conflicts - - def provides(self): - """ - Get package Provides as list of - (name, flags, (epoch, version, release)) tuples. - """ - self._gatherDepInfo() - return self._provides - - def recommends(self): - """ - Get package Recommends as list of - (name, flags, (epoch, version, release)) tuples. - """ - self._gatherDepInfo() - return self._recommends - - def suggests(self): - """ - Get package Suggests as list of - (name, flags, (epoch, version, release)) tuples. - """ - self._gatherDepInfo() - return self._suggests - - def enhances(self): - """ - Get package Enhances as list of - (name, flags, (epoch, version, release)) tuples. - """ - self._gatherDepInfo() - return self._enhances - - def supplements(self): - """ - Get package Supplements as list of - (name, flags, (epoch, version, release)) tuples. - """ - self._gatherDepInfo() - return self._supplements - # internal function to gather dependency info used by the above ones def _gather_aux(self, header, xs, nametag, flagstag, versiontag, prereq=None): @@ -696,56 +628,55 @@ class Pkg(AbstractPkg): prereq.append((name, flags[loop] & (~PREREQ_FLAG), evr)) else: xs.append((name, flags[loop], evr)) + return xs, prereq def _gatherDepInfo(self): - if self._requires is None: - self._requires = [] - self._prereq = [] - self._provides = [] - self._conflicts = [] - self._obsoletes = [] - self._recommends = [] - self._suggests = [] - self._enhances = [] - self._supplements = [] + _requires = [] + _prereq = [] + _provides = [] + _conflicts = [] + _obsoletes = [] + _recommends = [] + _suggests = [] + _enhances = [] + _supplements = [] - self._gather_aux(self.header, self._requires, - rpm.RPMTAG_REQUIRENAME, - rpm.RPMTAG_REQUIREFLAGS, - rpm.RPMTAG_REQUIREVERSION, - self._prereq) - self._gather_aux(self.header, self._conflicts, - rpm.RPMTAG_CONFLICTNAME, - rpm.RPMTAG_CONFLICTFLAGS, - rpm.RPMTAG_CONFLICTVERSION) - self._gather_aux(self.header, self._provides, - rpm.RPMTAG_PROVIDENAME, - rpm.RPMTAG_PROVIDEFLAGS, - rpm.RPMTAG_PROVIDEVERSION) - self._gather_aux(self.header, self._obsoletes, - rpm.RPMTAG_OBSOLETENAME, - rpm.RPMTAG_OBSOLETEFLAGS, - rpm.RPMTAG_OBSOLETEVERSION) - if hasattr(rpm, 'RPMTAG_RECOMMENDNAME'): # rpm >= 4.12 - self._gather_aux(self.header, self._recommends, - rpm.RPMTAG_RECOMMENDNAME, - rpm.RPMTAG_RECOMMENDFLAGS, - rpm.RPMTAG_RECOMMENDVERSION) - if hasattr(rpm, 'RPMTAG_SUGGESTNAME'): # rpm >= 4.12 - self._gather_aux(self.header, self._suggests, - rpm.RPMTAG_SUGGESTNAME, - rpm.RPMTAG_SUGGESTFLAGS, - rpm.RPMTAG_SUGGESTVERSION) - if hasattr(rpm, 'RPMTAG_ENHANCENAME'): # rpm >= 4.12 - self._gather_aux(self.header, self._enhances, - rpm.RPMTAG_ENHANCENAME, - rpm.RPMTAG_ENHANCEFLAGS, - rpm.RPMTAG_ENHANCEVERSION) - if hasattr(rpm, 'RPMTAG_SUPPLEMENTNAME'): # rpm >= 4.12 - self._gather_aux(self.header, self._supplements, - rpm.RPMTAG_SUPPLEMENTNAME, - rpm.RPMTAG_SUPPLEMENTFLAGS, - rpm.RPMTAG_SUPPLEMENTVERSION) + _requires, _prereq = self._gather_aux(self.header, _requires, + rpm.RPMTAG_REQUIRENAME, + rpm.RPMTAG_REQUIREFLAGS, + rpm.RPMTAG_REQUIREVERSION, + _prereq) + _conflits, _ = self._gather_aux(self.header, _conflicts, + rpm.RPMTAG_CONFLICTNAME, + rpm.RPMTAG_CONFLICTFLAGS, + rpm.RPMTAG_CONFLICTVERSION) + _provides, _ = self._gather_aux(self.header, _provides, + rpm.RPMTAG_PROVIDENAME, + rpm.RPMTAG_PROVIDEFLAGS, + rpm.RPMTAG_PROVIDEVERSION) + _obsoletes, _ = self._gather_aux(self.header, _obsoletes, + rpm.RPMTAG_OBSOLETENAME, + rpm.RPMTAG_OBSOLETEFLAGS, + rpm.RPMTAG_OBSOLETEVERSION) + _recommends, _ = self._gather_aux(self.header, _recommends, + rpm.RPMTAG_RECOMMENDNAME, + rpm.RPMTAG_RECOMMENDFLAGS, + rpm.RPMTAG_RECOMMENDVERSION) + _suggests, _ = self._gather_aux(self.header, _suggests, + rpm.RPMTAG_SUGGESTNAME, + rpm.RPMTAG_SUGGESTFLAGS, + rpm.RPMTAG_SUGGESTVERSION) + _enhances, _ = self._gather_aux(self.header, _enhances, + rpm.RPMTAG_ENHANCENAME, + rpm.RPMTAG_ENHANCEFLAGS, + rpm.RPMTAG_ENHANCEVERSION) + _supplements, _ = self._gather_aux(self.header, _supplements, + rpm.RPMTAG_SUPPLEMENTNAME, + rpm.RPMTAG_SUPPLEMENTFLAGS, + rpm.RPMTAG_SUPPLEMENTVERSION) + + return (_requires, _prereq, _provides, _conflicts, _obsoletes, _recommends, + _suggests, _enhances, _supplements) def scriptprog(self, which): """