aboutsummaryrefslogtreecommitdiff
path: root/libs/common
diff options
context:
space:
mode:
Diffstat (limited to 'libs/common')
-rwxr-xr-xlibs/common205
1 files changed, 105 insertions, 100 deletions
diff --git a/libs/common b/libs/common
index 8f1379ee..ce0df299 100755
--- a/libs/common
+++ b/libs/common
@@ -35,6 +35,7 @@ BLOBS_IGNORE="blobs-ignore"
BLOBS_DISCOVER="blobs-discover"
DOTEPOCH=".epoch"
+DOTRNDSEED=".rndseed"
DOTVERSION=".version"
DOTREVISION=".revision"
DOTTARFILES=".tarfiles"
@@ -59,7 +60,7 @@ arguments_list() {
for argument in "$@"
do
- echo "$argument"
+ printf '%s\n' "$argument"
done
}
@@ -84,7 +85,7 @@ path_wildcard_expand() {
local path=$@
# Evaluation fails with unescaped whitespaces.
- path=$( echo "$path" | sed "s/ /\\\ /g" )
+ path=$( printf '%s\n' "$path" | sed "s/ /\\\ /g" )
eval "arguments_list "$path""
}
@@ -111,7 +112,7 @@ file_checksum_check() {
if ! [ -f "$checksum_path" ]
then
- printf "Could not verify file checksum!\n" >&2
+ printf '%s\n' 'Could not verify file checksum!' >&2
return 1
fi
@@ -141,7 +142,7 @@ file_signature_check() {
if ! [ -f "$signature_path" ]
then
- printf "Could not verify file signature!\n" >&2
+ printf '%s\n' 'Could not verify file signature!' >&2
return 1
fi
@@ -180,145 +181,149 @@ directory_filled_check() {
}
archive_files_create() {
- local source_path=$1
-
- local directory=$( basename "$source_path" )
- local tarfiles_path="$source_path/$DOTTARFILES"
- local revision_path="$source_path/$DOTREVISION"
- local version_path="$source_path/$DOTVERSION"
-
- if git_check "$source_path"
- then
- git_files "$source_path" | tr -d '\0' > "$tarfiles_path"
- echo "$DOTTARFILES" | tr -d '\0' >> "$tarfiles_path"
+ local source_path="$1"
+
+ local directory="$(basename "${source_path}")"
+ local tarfiles_path="${source_path}/${DOTTARFILES}"
+ local revision_path="${source_path}/${DOTREVISION}"
+ local version_path="${source_path}/${DOTVERSION}"
+ local epoch_path="${source_path}/${DOTEPOCH}"
+ local rnd_seed_path="${source_path}/${DOTRNDSEED}"
+
+ # Files in "${tarfiles_path}" are NUL terminated.
+ # `tr '\0' '\n'` for human-readable output.
+ if git_check "${source_path}"; then
+ git_files "${source_path}" > "${tarfiles_path}"
+ printf '%s\0' "${DOTTARFILES}" >> "${tarfiles_path}"
else
- touch "$tarfiles_path"
-
- (
- cd "$source_path"
- find
- ) | LC_ALL=C sort | sed "s,^./,," | grep -vP "^\.$" > "$tarfiles_path"
- fi
-
- if [ -f "$revision_path" ]
- then
- echo "$DOTREVISION" | tr -d '\0' >> "$tarfiles_path"
- fi
-
- if [ -f "$version_path" ]
- then
- echo "$DOTVERSION" | tr -d '\0' >> "$tarfiles_path"
+ find "${source_path}" -print0 | env LC_ALL='C.UTF-8' sort -z | sed -z "1d;s,^${source_path}/\\?,,;/^${DOTTARFILES}\$/d" > "${tarfiles_path}"
fi
- if [ -f "$epoch_path" ]
- then
- echo "$DOTEPOCH" | tr -d '\0' >> "$tarfiles_path"
- fi
+ for dotfile in "${revision_path}" \
+ "${version_path}" \
+ "${epoch_path}" \
+ "${rnd_seed_path}"
+ do
+ if [[ -f "${dotfile}" ]]; then
+ printf '%s\0' ".${dotfile##*.}" >> "${tarfiles_path}"
+ fi
+ done
}
archive_files_date() {
- local source_path=$1
+ local source_path="$1"
- local epoch_path="$source_path/$DOTEPOCH"
+ local epoch_path="${source_path}/${DOTEPOCH}"
- if ! [ -z "$SOURCE_DATE_EPOCH" ]
- then
- (
- cd "$source_path"
- find -exec touch --no-dereference --date="@$SOURCE_DATE_EPOCH" {} \;
- )
+ if [[ -n "${SOURCE_DATE_EPOCH}" ]]; then
+ find "${source_path}" -execdir touch --no-dereference --date="@${SOURCE_DATE_EPOCH}" {} +
fi
}
archive_create() {
- local archive_path=$1
- local source_path=$2
- local directory=$3
+ local archive_path="$1"
+ local source_path="$2"
+ local directory="$3"
- local tarfiles_path="$source_path/$DOTTARFILES"
- local directory_path=$( dirname "$archive_path" )
+ local tarfiles_path="${source_path}/${DOTTARFILES}"
+ local directory_path="$(dirname "${archive_path}")"
- mkdir -p "$directory_path"
+ mkdir -p "${directory_path}"
- if [ -z "$directory" ]
- then
- directory=$( basename "$source_path" )
+ if [[ -z "${directory}" ]]; then
+ directory="$(basename "${source_path}")"
fi
- archive_files_create "$source_path"
- archive_files_date "$source_path"
+ archive_files_create "${source_path}"
+ archive_files_date "${source_path}"
+
+ local tar_options=(
+ --create
+ --xz
+ --file="${archive_path}"
+ --files-from="${tarfiles_path}"
+ --transform="s,^,${directory}/,S"
+ --no-recursion
+ --null
+ --owner=0
+ --group=0
+ --numeric-owner
+ )
(
- cd "$source_path"
- tar -cJf "$archive_path" --no-recursion -T "$tarfiles_path" --transform="s,^,$directory/,S" --owner=root --group=root --numeric-owner
+ cd "${source_path}"
+ tar "${tar_options[@]}"
)
}
archive_extract() {
- local archive_path=$1
- local destination_path=$2
+ local archive_path="$1"
+ local destination_path="$2"
- if [ -z "$destination_path" ]
- then
- destination_path=$( dirname "$archive_path" )
+ if [[ -z "${destination_path}" ]]; then
+ destination_path="$(dirname "${archive_path}")"
fi
- tar -xf "$archive_path" -ps -C "$destination_path"
+ tar -xf "${archive_path}" -ps -C "${destination_path}"
}
rootfs_files_create() {
- local source_path=$1
-
- local directory=$( basename "$source_path" )
- local tarfiles_path="$source_path/$DOTTARFILES"
+ local source_path="$1"
- touch "$tarfiles_path"
+ local directory="$(basename "${source_path}")"
+ local tarfiles_path="${source_path}/${DOTTARFILES}"
- (
- cd "$source_path"
- execute_root find
- ) | LC_ALL=C sort | sed "s,^./,," | grep -vP "^$DOTTARFILES|^\.$" > "$tarfiles_path"
+ # Files in "${tarfiles_path}" are NUL terminated.
+ # `tr '\0' '\n'` for human-readable output.
+ execute_root find "${source_path}" -print0 | env LC_ALL='C.UTF-8' sort -z | sed -z "1d;s,^${source_path}/\\?,,;/^${DOTTARFILES}\$/d" > "${tarfiles_path}"
}
rootfs_files_date() {
- local source_path=$1
+ local source_path="$1"
- local epoch_path="$source_path/$DOTEPOCH"
+ local epoch_path="${source_path}/${DOTEPOCH}"
- if ! [ -z "$SOURCE_DATE_EPOCH" ]
- then
- (
- cd "$source_path"
- execute_root find -exec touch --no-dereference --date="@$SOURCE_DATE_EPOCH" {} \;
- )
+ if [[ -n "${SOURCE_DATE_EPOCH}" ]]; then
+ execute_root find "${source_path}" -execdir touch --no-dereference --date="@${SOURCE_DATE_EPOCH}" {} +
fi
}
rootfs_create() {
- local rootfs_path=$1
- local source_path=$2
- local directory=$3
+ local rootfs_path="$1"
+ local source_path="$2"
+ local directory="$3"
- local tarfiles_path="$source_path/$DOTTARFILES"
- local directory_path=$( dirname "$rootfs_path" )
+ local tarfiles_path="${source_path}/${DOTTARFILES}"
+ local directory_path="$(dirname "${rootfs_path}")"
- mkdir -p "$directory_path"
+ mkdir -p "${directory_path}"
- if [ -z "$directory" ]
- then
- directory=$( basename "$source_path" )
+ if [[ -z "${directory}" ]]; then
+ directory="$(basename "${source_path}")"
fi
- rootfs_files_create "$source_path"
- rootfs_files_date "$source_path"
+ rootfs_files_create "${source_path}"
+ rootfs_files_date "${source_path}"
+
+ local tar_options=(
+ --create
+ --xz
+ --file="${rootfs_path}"
+ --files-from="${tarfiles_path}"
+ --no-recursion
+ --null
+ --owner=0
+ --group=0
+ --numeric-owner
+ )
(
- cd "$source_path"
- execute_root tar -cJf "$rootfs_path" --no-recursion -T "$tarfiles_path" --numeric-owner
+ cd "${source_path}"
+ execute_root tar "${tar_options[@]}"
)
- execute_root chmod 644 "$rootfs_path"
- execute_root chown $USER:$USER "$rootfs_path"
+ execute_root chmod 644 "${rootfs_path}"
+ execute_root chown "${USER}:${USER}" "${rootfs_path}"
}
requirements() {
@@ -331,7 +336,7 @@ requirements() {
if [ -z "$requirement_path" ]
then
- printf "Missing requirement: $requirement\n" >&2
+ printf '%s\n' "Missing requirement: $requirement" >&2
exit 1
fi
done
@@ -348,7 +353,7 @@ requirements_root() {
if [ -z "$requirement_path" ]
then
- printf "Missing requirement: $requirement\n" >&2
+ printf '%s\n' "Missing requirement: $requirement" >&2
exit 1
fi
done
@@ -370,22 +375,22 @@ arguments_concat() {
fi
done
- echo "$concat"
+ printf '%s\n' "$concat"
}
execute_root() {
local sudo=$( which sudo 2> /dev/null || true )
local arguments
- printf "Running command as root: " >&2
- echo "$@" >&2
+ printf '%s' 'Running command as root: ' >&2
+ printf '%b\n' "$*" >&2
if ! [ -z "$sudo" ]
then
sudo "$@"
else
# Quote arguments for eval through su.
- arguments=$( printf "%q " "$@" )
+ arguments=$( printf '%q ' "$@" )
su -c "$arguments"
fi
}