Blame docker-builder-data/build/script/common/helpers.sh

Ivan Mahonin e7fa50
# helpers
Ivan Mahonin e7fa50
Ivan Mahonin f17b54
allvars() {
Ivan Mahonin f17b54
    for LOCAL_ALLVARS_VAR_PREFIX in _ {a..z} {A..Z}; do
Ivan Mahonin f17b54
        eval echo -n $\{\!$LOCAL_ALLVARS_VAR_PREFIX*} | sed "s|LOCAL_ALLVARS_VAR_PREFIX||g"
Ivan Mahonin f17b54
        echo -n " "
Ivan Mahonin f17b54
    done
Ivan Mahonin f17b54
}
Ivan Mahonin f17b54
Ivan Mahonin f17b54
vars_clear() {
Ivan Mahonin f17b54
    # local PREFIX=$1
Ivan Mahonin f17b54
    [ ! -z "$1" ] || return 1
Ivan Mahonin f17b54
    for VAR in $(allvars); do
Ivan Mahonin f17b54
        if [[ "$VAR" = $1* ]]; then
Ivan Mahonin f17b54
            unset $VAR
Ivan Mahonin f17b54
        fi
Ivan Mahonin f17b54
    done
Ivan Mahonin f17b54
}
Ivan Mahonin f17b54
Ivan Mahonin f17b54
vars_copy() {
Ivan Mahonin f17b54
    # local PREFIX_FROM=$1
Ivan Mahonin f17b54
    # local PREFIX_TO=$2
Ivan Mahonin f17b54
    # local EXPORT=$3
Ivan Mahonin f17b54
    [ "$1" == "$2" ] && return 0
Ivan Mahonin f17b54
    for VAR in $(allvars); do
Ivan Mahonin f17b54
        if [[ "$VAR" = $1* ]]; then
Ivan Mahonin f17b54
            if [ "$3" = "export" ]; then
Ivan Mahonin f17b54
                eval export ${2}${VAR#$1}='${!VAR}'
Ivan Mahonin f17b54
            else
Ivan Mahonin f17b54
                eval ${2}${VAR#$1}='${!VAR}'
Ivan Mahonin cc53b4
            fi
Ivan Mahonin f17b54
        fi
Ivan Mahonin f17b54
    done
Ivan Mahonin f17b54
}
Ivan Mahonin f17b54
Ivan Mahonin f17b54
vars_rename() {
Ivan Mahonin f17b54
    # local PREFIX_FROM=$1
Ivan Mahonin f17b54
    # local PREFIX_TO=$2
Ivan Mahonin f17b54
    [ ! -z "$1" ] || return 1
Ivan Mahonin f17b54
    vars_copy "$1" "$2"
Ivan Mahonin f17b54
    vars_clear "$1"
Ivan Mahonin f17b54
}
Ivan Mahonin f17b54
    
Ivan Mahonin f17b54
vars_backup() {
Ivan Mahonin f17b54
    # local PREFIX=$1
Ivan Mahonin f17b54
    [ ! -z "$1" ] || return 1
Ivan Mahonin f17b54
    vars_copy "" "$1"
Ivan Mahonin f17b54
}
Ivan Mahonin f17b54
Ivan Mahonin f17b54
vars_restore() {
Ivan Mahonin f17b54
    # local PREFIX=$1
Ivan Mahonin f17b54
    # local EXPORT=$2
Ivan Mahonin f17b54
    [ ! -z "$1" ] || return 1
Ivan Mahonin f17b54
    vars_copy "$1" "" "$2"
Ivan Mahonin f17b54
}
Ivan Mahonin f17b54
Ivan Mahonin e7fa50
copy() {
Ivan Mahonin e7fa50
    local SRC=$1
Ivan Mahonin e7fa50
    local DEST=$2
Ivan Mahonin e7fa50
    if [ -d "$SRC" ]; then
Ivan Mahonin e7fa50
        if ! mkdir -p $DEST; then
Ivan Mahonin e7fa50
            return 1
Ivan Mahonin e7fa50
        fi
Ivan Mahonin e7fa50
        if [ "$(ls -A $1)" ]; then
Ivan Mahonin e7fa50
            if ! cp --remove-destination -rlP $SRC/* "$DEST/"; then
Ivan Mahonin e7fa50
                return 1
Ivan Mahonin e7fa50
            fi
Ivan Mahonin e7fa50
        fi
Ivan Mahonin e7fa50
    elif [ -f "$SRC" ]; then
Ivan Mahonin e7fa50
        if ! (mkdir -p `dirname $DEST` && cp --remove-destination -l "$SRC" "$DEST"); then
Ivan Mahonin e7fa50
            return 1
Ivan Mahonin e7fa50
        fi
Ivan Mahonin e7fa50
    else
Ivan Mahonin e7fa50
        return 1
Ivan Mahonin e7fa50
    fi
Ivan Mahonin e7fa50
}
Ivan Mahonin e7fa50
Ivan Mahonin e7fa50
foreachfile() {
Ivan Mahonin 3ec770
    local DIR="$1"
Ivan Mahonin 3ec770
    local COMMAND="$2"
Ivan Mahonin 3ec770
    if [ -z "$DIR" ] || [ ! -e "$DIR" ]; then
Ivan Mahonin 3ec770
        return 1
Ivan Mahonin 3ec770
    fi
Ivan Mahonin 3ec770
        
Ivan Mahonin 3ec770
    if [ -d "$DIR" ]; then
Ivan Mahonin 3ec770
        for FILE in "$DIR/".*; do
Ivan Mahonin 3ec770
            if [ "$FILE" != "$DIR/." ] && [ "$FILE" != "$DIR/.." ]; then
Ivan Mahonin 3ec770
                if ! "$COMMAND" "$FILE" ${@:3}; then
Ivan Mahonin 3ec770
                    return 1
Ivan Mahonin 3ec770
                fi
Ivan Mahonin 3ec770
            fi
Ivan Mahonin 3ec770
        done
Ivan Mahonin 3ec770
        for FILE in "$DIR/"*; do
Ivan Mahonin 3ec770
            if [ "$FILE" != "$DIR" ] && [ "$FILE" != "$DIR/" ]; then
Ivan Mahonin 3ec770
                if ! "$COMMAND" "$FILE" ${@:3}; then
Ivan Mahonin 3ec770
                    return 1
Ivan Mahonin 3ec770
                fi
Ivan Mahonin 3ec770
            fi
Ivan Mahonin 3ec770
        done
Ivan Mahonin 3ec770
    fi
Ivan Mahonin 3ec770
}
Ivan Mahonin 3ec770
Ivan Mahonin 3ec770
remove_recursive() {
Ivan Mahonin 3ec770
    local DIR="$1"
Ivan Mahonin 3ec770
    local NEEDLE="$2"
Ivan Mahonin 3ec770
Ivan Mahonin 3ec770
    if [ -d "$DIR" ]; then
Ivan Mahonin 3ec770
        rm -f "$DIR/"$NEEDLE
Ivan Mahonin 3ec770
        if ! foreachfile "$DIR" "${FUNCNAME[0]}" "$NEEDLE"; then
Ivan Mahonin 3ec770
            return 1
Ivan Mahonin 3ec770
        fi
Ivan Mahonin 3ec770
    fi
Ivan Mahonin 3ec770
}
Ivan Mahonin 3ec770
Ivan Mahonin 3ec770
foreachfile() {
Ivan Mahonin e7fa50
    local FILE=$1
Ivan Mahonin e7fa50
    local COMMAND=$2
Ivan Mahonin f026f4
    if [ ! -e "$FILE" ]; then
Ivan Mahonin e7fa50
        return 1
Ivan Mahonin e7fa50
    fi
Ivan Mahonin e7fa50
    if [ -d "$FILE" ]; then    
Ivan Mahonin e7fa50
        ls -1 "$FILE" | while read SUBFILE; do
Ivan Mahonin e7fa50
            if ! $COMMAND "$FILE/$SUBFILE" ${@:3}; then
Ivan Mahonin e7fa50
                return 1
Ivan Mahonin e7fa50
            fi
Ivan Mahonin e7fa50
        done
Ivan Mahonin e7fa50
    fi
Ivan Mahonin e7fa50
}
Ivan Mahonin e7fa50
Ivan Mahonin 3ec770
sha512dir() {
Ivan Mahonin 3ec770
    local DIR="$1"
Ivan Mahonin 3ec770
    local INFO="$2"
Ivan Mahonin b22744
    
Ivan Mahonin b22744
    local BASE=$(basename "$DIR")
Ivan Mahonin e7fa50
Ivan Mahonin b22744
    [[ "$BASE" != ".git" ]] || return 0
Ivan Mahonin b22744
    [[ "$BASE" != *.po   ]] || return 0
Ivan Mahonin e7fa50
Ivan Mahonin 3ec770
    if [ "$INFO" = "info" ]; then
Ivan Mahonin 3ec770
        basename "$DIR" || return 1
Ivan Mahonin 3ec770
        stat -c%F:%a:%s "$DIR" || return 1
Ivan Mahonin 3ec770
    fi
Ivan Mahonin 3ec770
        
Ivan Mahonin 3ec770
    if [ -d "$DIR" ]; then
Ivan Mahonin 3ec770
        (foreachfile "$DIR" "${FUNCNAME[0]}" info | sha512sum -b | cut -c1-128) || return 1
Ivan Mahonin b22744
    elif [ -L "$DIR" ]; then
Ivan Mahonin b22744
        (readlink "$DIR" | sha512sum -b | cut -c1-128) || return 1
Ivan Mahonin 3ec770
    else
Ivan Mahonin 3ec770
        (sha512sum -b "$DIR" | cut -c1-128) || return 1
Ivan Mahonin 3ec770
    fi
Ivan Mahonin e7fa50
}
Ivan Mahonin e7fa50
Ivan Mahonin e7fa50
copy_system_lib() {
Ivan Mahonin e7fa50
    local SRC_NAME=$1
Ivan Mahonin e7fa50
    local DST_PATH=$2
Ivan Mahonin 96ed23
    cp --remove-destination /lib/x86_64-linux-gnu/$SRC_NAME* "$DST_PATH" &> /dev/null
Ivan Mahonin 96ed23
    cp --remove-destination /lib/i386-linux-gnu/$SRC_NAME* "$DST_PATH" &> /dev/null
Ivan Mahonin 96ed23
    cp --remove-destination /usr/lib/x86_64-linux-gnu/$SRC_NAME* "$DST_PATH" &> /dev/null
Ivan Mahonin 96ed23
    cp --remove-destination /usr/lib/i386-linux-gnu/$SRC_NAME* "$DST_PATH" &> /dev/null
Ivan Mahonin 38f35f
    cp --remove-destination /usr/local/lib/$SRC_NAME* "$DST_PATH" &> /dev/null
Ivan Mahonin 38f35f
    cp --remove-destination /usr/local/lib64/$SRC_NAME* "$DST_PATH" &> /dev/null
Ivan Mahonin 38f35f
    cp --remove-destination /usr/local/lib/x86_64-linux-gnu/$SRC_NAME* "$DST_PATH" &> /dev/null
Ivan Mahonin 38f35f
    cp --remove-destination /usr/local/lib/i386-linux-gnu/$SRC_NAME* "$DST_PATH" &> /dev/null
Ivan Mahonin 96ed23
    if ! (ls "$DST_PATH/$SRC_NAME"* &> /dev/null); then
Ivan Mahonin 96ed23
        echo "$SRC_NAME not found in system libraries"
Ivan Mahonin 96ed23
        return 1
Ivan Mahonin 96ed23
    fi
Ivan Mahonin e7fa50
}
Ivan Mahonin e7fa50
Ivan Mahonin 474272
add_common_licenses() {
Ivan Mahonin 474272
    local FILE="$1"
Ivan Mahonin 474272
    local TARGET="$2"
Ivan Mahonin 474272
Ivan Mahonin 474272
    local LIC_PATH="/usr/share/common-licenses"
Ivan Mahonin 474272
    [ -d "$LIC_PATH" ] || return 0
Ivan Mahonin 474272
    [[ ! "$FILE" = "$LIC_PATH/"* ]] || return 0
Ivan Mahonin 474272
    ls -d1 "$LIC_PATH/"* | while read SUB_FILE; do
Ivan Mahonin 474272
        if grep -q "$SUB_FILE" "$FILE"; then
Ivan Mahonin 474272
            add_license "$SUB_FILE" "$SUB_FILE" "$TARGET"
Ivan Mahonin 474272
        fi
Ivan Mahonin 474272
    done
Ivan Mahonin 474272
}
Ivan Mahonin 474272
Ivan Mahonin e7fa50
add_license() {
Ivan Mahonin e7fa50
    local FILE="$1"
Ivan Mahonin e7fa50
    local FILE_IN_TITLE="$2"
Ivan Mahonin e7fa50
    local TARGET="$3"
Ivan Mahonin e7fa50
    if [ ! -z "$FILE_IN_TITLE" ]; then
Ivan Mahonin e7fa50
        echo ""                                      >> "$TARGET" || return 1
Ivan Mahonin e7fa50
        echo "-------------------------------------" >> "$TARGET" || return 1
Ivan Mahonin e7fa50
        echo "  File: $FILE_IN_TITLE"                >> "$TARGET" || return 1
Ivan Mahonin e7fa50
        echo "-------------------------------------" >> "$TARGET" || return 1
Ivan Mahonin e7fa50
        echo ""                                      >> "$TARGET" || return 1
Ivan Mahonin e7fa50
    else
Ivan Mahonin e7fa50
        echo ""                                      >> "$TARGET" || return 1
Ivan Mahonin e7fa50
        echo "-------------------------------------" >> "$TARGET" || return 1
Ivan Mahonin e7fa50
        echo ""                                      >> "$TARGET" || return 1
Ivan Mahonin e7fa50
    fi
Ivan Mahonin e7fa50
    cat "$FILE"                                      >> "$TARGET" || return 1
Ivan Mahonin 474272
    add_common_licenses "$FILE" "$TARGET" || return 1
Ivan Mahonin e7fa50
}
Ivan Mahonin e7fa50
Ivan Mahonin e7fa50
copy_system_license() {
Ivan Mahonin e7fa50
    local SRC_NAMES=$1
Ivan Mahonin e7fa50
    local DST_PATH=$2
Ivan Mahonin e7fa50
    local SRC_NAME=
Ivan Mahonin 474272
Ivan Mahonin e7fa50
    for SRC_NAME in $SRC_NAMES; do
Ivan Mahonin e7fa50
        rm -f "$DST_PATH/license-$SRC_NAME"
Ivan Mahonin e7fa50
    done
Ivan Mahonin e7fa50
    for SRC_NAME in $SRC_NAMES; do
Ivan Mahonin e7fa50
        local TARGET="$DST_PATH/license-$SRC_NAME"
Ivan Mahonin 474272
        for SUFFIX in "" {0..9} "-"; do
Ivan Mahonin 474272
            local SUB_NAME="$SRC_NAME$SUFFIX"
Ivan Mahonin 474272
            if [ ! -z "$SUFFIX" ]; then
Ivan Mahonin 474272
                SUB_NAME="$SUB_NAME*"
Ivan Mahonin 474272
            fi
Ivan Mahonin e7fa50
Ivan Mahonin 474272
            for MASK in "/usr/share/doc/$SUB_NAME/copyright" \
Ivan Mahonin 474272
                        "/usr/share/licenses/$SUB_NAME" \
Ivan Mahonin 474272
                        "/usr/share/licenses/$SUB_NAME/*" \
Ivan Mahonin 38f35f
                        "/usr/share/doc/$SUB_NAME/*" \
Ivan Mahonin 38f35f
                        "/usr/local/share/doc/$SUB_NAME/copyright"
Ivan Mahonin 474272
            do
Ivan Mahonin 474272
                local FOUND=
Ivan Mahonin 474272
                ls -d1 $MASK 2>/dev/null | while read FILE; do
Ivan Mahonin 474272
                    if [ -f "$FILE" ] && [[ "$FILE" != *.bz2 ]]; then
Ivan Mahonin 474272
                        FOUND=1
Ivan Mahonin 474272
                        if ! add_license "$FILE" "$FILE" "$TARGET"; then
Ivan Mahonin 474272
                            echo "Cannot add license file: $FILE -> $TARGET";
Ivan Mahonin 474272
                            return 1
Ivan Mahonin 474272
                        fi
Ivan Mahonin 474272
                    fi
Ivan Mahonin 474272
                done
Ivan Mahonin 474272
                if [ ! -z "$FOUND" ]; then
Ivan Mahonin 474272
                    break
Ivan Mahonin 474272
                fi
Ivan Mahonin e7fa50
            done
Ivan Mahonin 474272
Ivan Mahonin 474272
            if [ -z "$SUFFIX" ] && [ -f "$TARGET" ]; then
Ivan Mahonin 474272
                return 0
Ivan Mahonin 474272
            fi
Ivan Mahonin 474272
        done
Ivan Mahonin 474272
Ivan Mahonin e7fa50
        if [ -f "$TARGET" ]; then
Ivan Mahonin e7fa50
            return 0
Ivan Mahonin e7fa50
        fi
Ivan Mahonin e7fa50
    done
Ivan Mahonin e7fa50
Ivan Mahonin e7fa50
    echo "Cannot found any license for one of system packages: $SRC_NAMES (for $DST_PATH)"
Ivan Mahonin e7fa50
    return 1
Ivan Mahonin e7fa50
}
Ivan Mahonin e7fa50