summaryrefslogblamecommitdiff
path: root/support/scripts/install.sh
blob: fb26219b51e9f9d00e37161125f4d8fff17356b7 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12











                                                                              













                                                                               


         













                                           










                                  
                                      
                                       
       
                            

















                                         







                                                       



                    
                              
                               




                            
                           

                   
                   



                                           
                                             
            
                                        






                                       
                                        








                                                

                                                               





                                                                              
########################################################-*-Shell-script-*-####
# Install Function
##############################################################################
# $Id$

source ${0%/*}/stdlib.sh;

##############################################################################
# install

function install-args() {
    case "$1" in
        --version             ) echo "install (bash script) $version"; exit 0;;
        -d                    ) directory="true"; return 1;;
        --directory           ) directory="true"; return 1;;
        -D                    ) leading="true"; return 1;;
        -o                    ) args-option-value owner "$@";;
        --owner=*             ) args-inline-value owner "$@";;
        -g                    ) args-option-value group "$@";;
        --group=*             ) args-inline-value group "$@";;
        -m                    ) args-option-value mode  "$@";;
        --mode=*              ) args-inline-value mode  "$@";;
        -p                    ) preserve="true"; return 1;;
        --preserve-timestamps ) preserve="true"; return 1;;
        -*                    ) args-option-unknown     "$@";;
        *                     ) args-append-array files "$@";;
    esac;
}

function install-attr() {
    local file="$1";
    if [ -n "$mode" ]; then
        run chmod "$mode" "$file";
    fi;
    if [ -n "$owner" -a -n "$group" ]; then
        run chown "$owner:$group" "$file";
    elif [ -n "$owner" ]; then
        run chown "$owner" "$file";
    elif [ -n "$group" ]; then
        run chown ":$group" "$file";
    fi;
}

function install-mkdir() {
    local dstpath="$1"; shift 1;
    if [ "$dstpath" != "." ]; then
        run mkdir -p "$dstpath";
    fi;
}

function install-copy() {
    local srcfile="$1"; shift 1;
    local dstfile="$1"; shift 1;
    run cp "$srcfile" "$dstfile";
    if [ "$preserve" == "true" ]; then
        touch -r "$srcfile" "$dstfile";
    fi;
    install-attr "$dstfile";
}

function install-dirs() {
    while [ $# -gt 0 ]; do
        local dstpath="$1"; shift 1;
        install-mkdir "$dstpath";
        install-attr "$dstpath";
    done;
}

function install-file() {
    local srcfile="$1"; shift 1;
    local dstfile="$1"; shift 1;
    local dstpath="`dirname "$dstfile"`";
    if [ "$leading" == "true" ]; then
        install-mkdir "$dstpath";
    fi;
    install-copy "$srcfile" "$dstfile";
}

function install-files() {
    local dstpath="$1"; shift 1;
    while [ $# -gt 0 ]; do
        local srcfile="$1"; shift 1;
        local dstfile="$dstpath/`basename "$srcfile"`";
        install-copy "$srcfile" "$dstfile";
    done;
}

function install() {
    local program="$FUNCNAME";
    local version='$Revision$';
    local directory="false";
    local leading="false";
    local owner="";
    local group="";
    local mode="";
    local preserve="false";
    local -a files;

    args-loop "$@";

    local count="${#files[@]}";
    if [ $count -lt 1 ]; then
        if [ "$directory" == "true" ]; then
            abort "missing target directory";
        else
            abort "missing source file";
        fi;
    fi;

    if [ "$directory" == "true" ]; then
        install-dirs "${files[@]}";
    else
        if [ $count -lt 2 ]; then
            abort "missing destination";
        fi;

        local last="${files[$(($count-1))]}";
        if [ -d "$last" ]; then
            unset files[$(($count-1))];
            install-files "$last" "${files[@]}";
        elif [ $count -eq 2 ]; then
            install-file "${files[@]}";
        else
            local text1="installing multiple files, but last";
            local text2="argument, '$last' is not a directory";
            abort "$text1 $text2";
        fi;
    fi;
}

##############################################################################