#!/bin/bash _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 } 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 echo "$(get_root "$grp")/$(ini 1value "files:$grp:$src")" } get_root() { # # Find out target rooot for group $1 # local grp="$1" local root=$(ini 1value "roots:$grp") test -n "$root" || die "missing in config.ini: roots:$grp" echo "$(ini 1value ENV:DESTDIR)$root" } install() { # # Install product # local dst group mode src ini values "lists:group" \ | while read group; do mode=$(ini 1value "modes:$group") ini lskeys "files:$group" \ | while read src; do dst=$(get_dst "$group" "$src") deploy_item "$src" "$dst" "$mode" done done test -f "$MKIT_LOCAL/autoclean" && clean true } uninstall() { # # Uninstall product # local dst group src ini values "lists:group" \ | while read group; do ini lskeys "files:$group" \ | while read src; do dst=$(get_dst "$group" "$src") _maybe rm -vrf "$dst" done done }