aboutsummaryrefslogtreecommitdiff
path: root/tools/install.sh
diff options
context:
space:
mode:
Diffstat (limited to 'tools/install.sh')
-rwxr-xr-xtools/install.sh90
1 files changed, 90 insertions, 0 deletions
diff --git a/tools/install.sh b/tools/install.sh
new file mode 100755
index 0000000..f79cb3b
--- /dev/null
+++ b/tools/install.sh
@@ -0,0 +1,90 @@
+#!/bin/sh -e
+# Portable install version that supports -D -m and -t
+usage() {
+ printf '%s\n' "usage: $0 [-D] [-m mode] source dest" \
+ " or: $0 [-D] [-m mode] [-t dir] [source...]" >&2
+ exit 1
+}
+
+die() { printf '%s\n' "$@" >&2; exit 1;}
+
+mkdirp=''
+target=''
+mode=''
+REST=''
+parse() {
+ OPTIND=$(($#+1))
+ while OPTARG= && [ $# -gt 0 ]; do
+ case $1 in
+ -[tm]?*) OPTARG=$1; shift
+ eval 'set -- "${OPTARG%"${OPTARG#??}"}" "${OPTARG#??}"' ${1+'"$@"'}
+ ;;
+ -[!-]?*) OPTARG=$1; shift
+ eval 'set -- "${OPTARG%"${OPTARG#??}"}" -"${OPTARG#??}"' ${1+'"$@"'}
+ OPTARG= ;;
+ esac
+ case $1 in
+ '-D')
+ [ "${OPTARG:-}" ] && OPTARG=${OPTARG#*\=} && set "noarg" "$1" && break
+ eval '[ ${OPTARG+x} ] &&:' && OPTARG='1' || OPTARG=''
+ mkdirp="$OPTARG"
+ ;;
+ '-t')
+ [ $# -le 1 ] && set "required" "$1" && break
+ OPTARG=$2
+ target="$OPTARG"
+ shift ;;
+ '-m')
+ [ $# -le 1 ] && set "required" "$1" && break
+ OPTARG=$2
+ mode="$OPTARG"
+ shift ;;
+ '-h'|'--help')
+ usage
+ exit 0 ;;
+ --)
+ shift
+ while [ $# -gt 0 ]; do
+ REST="${REST} \"\${$((OPTIND-$#))}\""
+ shift
+ done
+ break ;;
+ [-]?*) set "unknown" "$1"; break ;;
+ *)
+ REST="${REST} \"\${$((OPTIND-$#))}\""
+ esac
+ shift
+ done
+ [ $# -eq 0 ] && { OPTIND=1; unset OPTARG; return 0; }
+ case $1 in
+ unknown) set "Unrecognized option: $2" "$@" ;;
+ noarg) set "Does not allow an argument: $2" "$@" ;;
+ required) set "Requires an argument: $2" "$@" ;;
+ pattern:*) set "Does not match the pattern (${1#*:}): $2" "$@" ;;
+ notcmd) set "Not a command: $2" "$@" ;;
+ *) set "Validation error ($1): $2" "$@"
+ esac
+ echo "$1" >&2
+ exit 1
+}
+
+parse "$@" && eval set -- "$REST"
+
+if [ "$target" ]; then
+ [ "$mkdirp" ] || [ -d "$target" ] || die "$target doesn't exist"
+ mkdir -p "$target"
+ for arg; do
+ [ -d "$target/${arg##*/}" ] && die "$target/${arg##*/} is a directory"
+ cp "$arg" "$target/${arg##*/}"
+
+ # Most implementations set the mode to 0755 by default when -t is set.
+ chmod "${mode:=0755}" "$target/${arg##*/}"
+ done
+else
+ case "$2" in */*) [ "$mkdirp" ] || [ -d "${2%/*}" ] || die "${2%/*} doesn't exist"
+ mkdir -p "${2%/*}"
+ esac
+ [ -d "$2" ] && die "$2 is a directory"
+ cp "$1" "$2"
+ chmod "${mode:=0755}" "$2"
+fi