Package Tasks
=============

*pkgtasks* is a shell script library to ease writing POSIX-compliant shell
scripts to handle common tasks during installation or removal of a package,
e.g.,

  * creating groups and users needed by the package

  * creating and removing directories with special permissions and
    ownership,

  * copying example config files to their final locations during package
    installation, and removing them during package removal if they don't
    differ from the example ones,

  * reminding the user of files that may be customized after package
    installation.

Package tasks have the property of *idempotence* -- they may be invoked
multiple times, but the result must be the same as when invoked once, e.g.,
the `shells` task adds an entry to /etc/shells, but will avoid adding the
same entry more than once.


Getting sources
---------------

The latest version of *pkgtasks* is 1.15 and was released on August 23th, 2017.

See the [release notes](NEWS.md) for information about the changes in this
and all previous releases.


Documentation
-------------

A script may load task modules to define shell functions to perform
various tasks.  A task module is loaded in a POSIX-compliant shell script
by adding the following boilerplate to the script:

	# Import the task loader.
	: ${TASK_MODULE_DIR:=/usr/pkg/share/pkgtasks-1}
	. "${TASK_MODULE_DIR}/load.subr"

	# Load task modules.
	task_load preinstall

The individual package tasks supported by *pkgtasks* are:

  * `directories`: create and remove directories outside of package tree
  * `files`: copy and remove configuration files
  * `fonts`: regenerate X11 font indices
  * `groups`: create groups and warn about groups that may be removed
  * `icon_themes`: create caches in GTK+ icon theme directories
  * `info_files`: register and unregister GNU info files
  * `ocaml_findlib`: update OCaml findlib search paths
  * `permissions`: check and set modes and permissions on special files
  * `shells`: register and unregister login shells
  * `shlibs`: update the shared library cache
  * `users`: create users and warn about users that may be removed

These package tasks support `${PKG_DESTDIR}` to manipulate the correct
filesystem paths for a destdir-installed package.

For convenience, these have been composed into larger meta-tasks:

  * `preinstall`: tasks performed before files are installed
  * `preremove`: tasks performed before files are removed
  * `postinstall`: tasks performed after files are installed
  * `postremove`: tasks performed after files are removed

There are also several utility tasks that may be used to write portable
scripts:

  * `cleanup`: run functions upon improper exit
  * `compare`: compare two files for equality
  * `createfile`: create empty files
  * `dirwalk`: walk a directory tree using depth-first traversal
  * `echo`: write to standard output through a buffer
  * `lock`: create or release a lock file
  * `makedir`: make a directory hierarchy
  * `maketemp`: make unique, temporary files
  * `match`: match lines with a fnmatch(3) glob pattern
  * `platform`: determine the platform (operating system)
  * `quote`: quote strings for use with shell eval
  * `random`: generate random numbers (badly)
  * `refcount`: reference-count system resources
  * `say`: write to standard output with a tag
  * `sort`: sort lines from standard input
  * `taskfunc`: generic function hook for meta-tasks
  * `tee`: duplicate writes to standard output into files
  * `truthy`: evaluate truthiness
  * `valid_options`: check validity of option strings
  * `version`: compare version strings
  * `which`: locate a program file in the $PATH

The documentation for each of these tasks is in man-page style in the
header comments for each task module.
