|
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 |
|