123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- #!/bin/bash
- # MKit - simple install helper
- # See LICENSE file for copyright and license details.
-
- mkit_import ini
- mkit_import build
-
- __deploy__item() {
- #
- # Deploy item and make it look like wanted
- #
- # usage: __deploy__item src dst [mode]
- #
- # Both src and dst must be names of actual items[1],
- # whereas dst must not exist. On update, dst is
- # usually to be replaced but that is uninstall's
- # job!
- #
- # [1] Ie. src=foo and dst=/foo/bar does *always*
- # mean that foo will become 'bar'. This is
- # different than traditional `cp` behavior,
- # when this depends if 'bar' already exists
- # as a directory.
- #
- # If mode is omitted or empty, MKIT_DEFAULT_MODE is
- # used instead.
- #
- # Directories are copied recursively, and mode is
- # applied only to files.
- #
- local src=$1 # source path
- local dst=$2 # destination path
- local mode=${3:-$MKIT_DEFAULT_MODE} # mode
- local item # each in directory
- if test -d "$src"; then
- find "$src" -type f \
- | while read -r item; do
- [[ $item =~ .skel$ ]] \
- && grep -qe "${item%.skel}" "$MKIT_LOCAL/built.lst" \
- && continue
- __deploy__item "$item" "$dst${item#"$src"}" "$mode"
- done
- else
- test "$mode" == "SRC" && mode=$(stat -c "%a" "$src")
- __deploy__maybe install -DTvm "$mode" "$src" "$dst"
- fi
- }
-
- __deploy__dst() {
- #
- # Find out target path for src file $2 of group $1
- #
- local grp=$1 # deploy group
- local src=$2 # each source
- local dst=$3 # alternative destination name
- test -n "$dst" || dst=${src##*/}
- echo "$(__deploy__root "$grp")/$dst"
- }
-
- __deploy__root() {
- #
- # Find out target root for group $1
- #
- local grp=$1 # deploy group
- local root # root for this group
- local destdir # value of DESTDIR
- root=$(ini 1value "roots:$grp")
- destdir=$(ini 1value ENV:DESTDIR)
- destdir=${destdir%/}
- case $destdir:$root in
- *:) die "missing in config.ini: roots:$grp" ;;
- :*) echo "$root" ;;
- *:*) echo "$destdir/$root" ;;
- esac
- }
-
- __deploy__maybe() {
- #
- # Call the deploy command $1 $@ unless in dry mode
- #
- debug "$@"
- local cmd="$1"; shift
- $MKIT_DRY && return
- case "$cmd" in
- cp|rm|rmdir|chmod|mkdir) $cmd "$@" ;;
- install) command -p install "$@" ;;
- *) die "bad command called";;
- esac
- }
-
- install() {
- #
- # Install product
- #
- local group # each deploy group
- local mode # mode (group-specific)
- local src # each source path
- local dst # each (final absolute) destination path
- ini lskeys "files" \
- | sort \
- | uniq \
- | while read -r group; do
- mode=$(ini 1value "modes:$group")
- ini values "files:$group" \
- | while read -r src dst; do
- dst=$(__deploy__dst "$group" "$src" "$dst")
- __deploy__item "$src" "$dst" "$mode"
- done
- done
- test -f "$MKIT_LOCAL/autoclean" && clean
- true
- }
-
- uninstall() {
- #
- # Uninstall product
- #
- local group # each deploy group
- local src # each source path
- local dst # each (final absolute) destination path
- ini lskeys "files" \
- | sort \
- | uniq \
- | while read -r group; do
- ini values "files:$group" \
- | while read -r src dst; do
- dst=$(__deploy__dst "$group" "$src" "$dst")
- __deploy__maybe rm -vrf "$dst"
- done
- done
- }
|