#!/bin/bash check_env() { # # Check that environment variables have been set properly # PREFIX="$(readlink -m "$PREFIX")" test -d "$PREFIX" || die "PREFIX points to non-existent directory: $PREFIX" } 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 cp -Tvr "$src" "$dst" find "$dst" -type f -print0 | xargs -0 chmod -c "$mode" else command -p 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 "$root" } install() { # # Install product # check_env 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 .autoclean && clean true } uninstall() { # # Uninstall product # check_env 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") rm -vrf "$dst" done done }