From Fedora Project Wiki

Revision as of 20:05, 21 February 2009 by Laubersm (talk | contribs) (PackagingDrafts/ScriptletSnippetsFixes moved to Archive:PackagingDrafts/ScriptletSnippetsFixes: Appears to be included in Packaging:ScriptletSnippets#Syntax)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

ScriptletsSnippets fixes

As pointed out by Miroslav Lichvar in http://www.redhat.com/archives/fedora-packaging/2007-May/msg00116.html, the current Packaging/ScriptletSnippets page contains some incorrect information eg. about what determines the exit status of a scriptlet. Here's a suggested replacement for the two last paragraphs of the "Syntax" chapter.

Syntax

[...]

Except in some really exceptional cases (if any), we want all scriptlets to exit with the zero exit status. Because rpm in its default configuration does not at the moment execute shell scriptlets with the -e argument to the shell, excluding explicit exit calls (frowned upon with a non-zero argument!), the exit status of the last command in a scriptlet determines its exit status. Most commands in the snippets in this document have a "|| :" appended to them, which is a generic trick to force the zero exit status for those commands whether they worked or not. Usually the most important bit is to apply this to the last command executed in a scriptlet, or to add a separate command such as plain ":" or "exit 0" as the last one in a scriptlet. Note that depending on the case, other error checking/prevention measures may be more appropriate, as well as running some commands only if we saw a previous command in the scriptlet which is a must prerequisite to succeed.

Non-zero exit codes from scriptlets break installs/upgrades/erases so that no further actions will be taken for that package in a transaction (see scriptlet ordering below), which may for example prevent an old version of a package from being erased on upgrades, leaving behind duplicate rpmdb entries and possibly stale, unowned files on the filesystem. There are some cases where letting the transaction to proceed when some things in scriptlets failed may result in partially broken setup. It is however often limited to that package only whereas letting a transaction to proceed with some packages dropped out on the fly is more likely to result in broader system wide problems.