#!/bin/bash _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" local dst="$2" local mode="${3:-$MKIT_DEFAULT_MODE}" if test -d "$src"; then _maybe mkdir -vp "$(dirname "$dst")" _maybe cp -Tvr "$src" "$dst" find "$dst" -type f \ | while read chmod_item; do _maybe chmod "$mode" "$chmod_item" done else _maybe install -DTvm "$mode" "$src" "$dst" fi } _get_dst() { # # Find out target path for src file $2 of group $1 # local grp=$1 local src=$2 local dst=$3 test -n "$dst" || dst=${src##*/} echo "$(_get_root "$grp")/$dst" } _get_root() { # # Find out target root for group $1 # local grp="$1" local root=$(ini 1value "roots:$grp") local destdir=$(ini 1value ENV:DESTDIR) destdir=${destdir%/} case $destdir:$root in *:) die "missing in config.ini: roots:$grp" ;; :*) echo "$root" ;; *:*) echo "$destdir/$root" ;; esac } _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 dst group mode src ini lskeys "files" \ | sort \ | uniq \ | while read group; do mode=$(ini 1value "modes:$group") ini values "files:$group" \ | while read src dst; do dst=$(_get_dst "$group" "$src" "$dst") _deploy_item "$src" "$dst" "$mode" done done test -f "$MKIT_LOCAL/autoclean" && clean true } uninstall() { # # Uninstall product # local dst group src ini lskeys "files" \ | sort \ | uniq \ | while read group; do ini values "files:$group" \ | while read src dst; do dst=$(_get_dst "$group" "$src" "$dst") _maybe rm -vrf "$dst" done done }