RPMLINT(1)

πŸ“¦ version 1.11, in centos-stream 9

πŸ’… rpmlint(1) β€” the manual, but make it make sense ✨

okay bestie, sit down, grab a boba πŸ§‹, because we're about to talk about rpmlint β€” the User Commands girlie who checks common problems in rpm packages. yes, that rpmlint. she's iconic, she's thorough, and she's about to be your new best friend (if she isn't already πŸ’–).


🌸 NAME 🌸

rpmlint β€” check common problems in rpm packages. that's it, that's the vibe check πŸ‘‘


πŸ¦‹ SYNOPSIS πŸ¦‹

rpmlint [OPTION]... [FILE|PACKAGE]...

✨ DESCRIPTION ✨

so rpmlint is a tool for checking common errors in rpm packages. literally her whole job. she can be used to test individual packages and spec files before uploading, or to check an entire distribution 🌈. by default all applicable checks are processed, but if you're feeling picky you can run specific checks by using command line parameters. main character energy fr.

FILE can be a rpm package file, a spec file, or a directory. in case of a directory, it is recursively searched for rpm and spec files to check (she goes digging, no cap πŸ”). and the special value - results in standard input being read and treated as (single) spec file content. cute, right?

PACKAGE is the name of an installed package or a glob(7) pattern to match installed packages β€” unless a file by that name exists. like, if there's an actual file with that name, that wins. respect the filesystem 🫢.


πŸ’… OPTIONS πŸ’…

  • -i, --info β€” display explanations for reported messages. she's not just gonna tell you something's wrong, she'll explain why πŸ’€
  • -I, --explain=messageid β€” display explanations for the specified message identifiers and exit. this option may be given multiple times πŸ‘‘
  • -c, --check=check β€” run only the specified check. this option may be given multiple times to specify multiple checks to run. check is the name of the Python module (as it would be given to Python's import statement) containing the check. so like, only the checks you actually want. choose your fighter πŸ₯Š
  • -a, --all β€” check all installed packages. every single one. no skips πŸ™ˆ
  • -C, --checkdir=dir β€” insert dir to the front of the list of paths to load checks from, unless it is already in the list. the default list of check dirs typically contains only /usr/share/rpmlint. directories in the check dirs list are also inserted to the front of the list of paths to load Python modules from when the check process begins 🐍
  • -h, --help β€” display summary of command line options and exit. the classic "help me help you" moment 🫢
  • -v, --verbose β€” operate in verbose mode. she will talk. a lot. affectionately πŸ—£οΈ
  • -E, --extractdir=dir β€” base directory for extracted temporary files, default is what Python's tempfile.gettempdir() returns πŸ“‚
  • -V, --version β€” display version information and exit 🌟
  • -n, --noexception β€” ignore output filters. raw output only, no filter, we die like legends πŸ’€
  • --rawout=file β€” write unfiltered output to file ✍️
  • -f, --file=conffile β€” load user configuration from the specified file, default is $XDG_CONFIG_HOME/rpmlint (~/.config/rpmlint if $XDG_CONFIG_HOME is empty or not set) πŸŽ€
  • -o, --option=value β€” override a configuration option. value is a whitespace separated string, first word of which is the option name to set, and the Python eval() return value for the rest is set as the value for the option. passing only an option name is treated as if None was passed as its value. see the file "config" shipped with rpmlint for the list of configuration options and their types. for example:
-o "NetworkEnabled True"
-o "Distribution 'My favorite distro'"
-o "MaxLineLength 80"
-o "ValidShells ('/bin/sh', '/bin/bash')"

⚠️ CAVEATS ⚠️

okay real talk bestie, listen up 🫢: all checks do not apply to all argument types. for best check coverage, run rpmlint on all source and binary packages your build produces.

the set of checks rpmlint runs on source packages is a superset of the one for plain specfiles. the set of checks run for installed binary packages is a superset of the one for uninstalled binary package files. and the source and binary package check sets are quite different. so like, they're not the same girlie, don't assume πŸ‘€


πŸ“ FILES πŸ“

  • /usr/share/rpmlint/config, /usr/share/rpmlint/config.* β€” built-in configuration. when invoked as someprefix-rpmlint, /usr/share/rpmlint/config.someprefix is used if it exists, otherwise /usr/share/rpmlint/config ✨
  • /etc/rpmlint/*config β€” system wide configuration 🏠
  • $XDG_CONFIG_HOME/rpmlint or ~/.config/rpmlint β€” user configuration πŸ’–

🚦 EXIT CODES 🚦

  • 0 β€” no errors. we love a clean run 🌸
  • 1 β€” unspecified error. vague, mysterious, unbothered πŸ’€
  • 2 β€” interrupted 😭
  • 64 β€” one or more error message printed πŸ“’
  • 66 β€” badness threshold exceeded 🚨 (you crossed the line, bestie)

πŸ‘‘ AUTHOR πŸ‘‘

originally written by Frédéric Lepied, modified and maintained by numerous contributors since. shoutout to the whole group chat 🫢


this program is licensed under the GNU General Public License, see the file COPYING included in the distribution archive. legal girlie behavior, we respect it πŸ’…


and that's the whole page, bestie πŸŽ€ β€” rpmlint, from April 2011, still serving looks and linting packages. mwah πŸ’‹

πŸ“¦ where this page comes from