Add tests.

Fix single-file archiving.
This commit is contained in:
redxef 2023-06-07 13:21:53 +02:00
parent 91e9038bda
commit 482da4b833
Signed by: redxef
GPG key ID: 7DAC3AA211CBD921
5 changed files with 94 additions and 8 deletions

View file

@ -3,8 +3,11 @@ SCRIPT := tarback.sh
SCRIPT_NAME := $(SCRIPT:.sh=) SCRIPT_NAME := $(SCRIPT:.sh=)
PREFIX ?= /usr/local PREFIX ?= /usr/local
install: $(PLUGINS) install: $(SCRIPT) $(PLUGINS)
install -D -t $(PREFIX)/share/tarback -m 0644 -o root -g root $^ install -D -t $(PREFIX)/share/tarback -m 0644 -o root -g root $^
install -D -m 0755 -o root -g root -T $(SCRIPT) $(PREFIX)/bin/$(SCRIPT_NAME) install -D -m 0755 -o root -g root -T $(SCRIPT) $(PREFIX)/bin/$(SCRIPT_NAME)
.PHONY: install test: $(SCRIPT) $(PLUGINS)
./test.sh
.PHONY: install test

View file

@ -8,9 +8,13 @@ XDG_DATA_DIRS="${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
TARBACK_REMOTE_DEFAULT= TARBACK_REMOTE_DEFAULT=
TARBACK_TRANSFORM_REMOTE_COMMAND_DEFAULT= TARBACK_TRANSFORM_REMOTE_COMMAND_DEFAULT=
# shellcheck disable=SC2016 # disable variable not expanding hint # shellcheck disable=SC2016 # disable variable not expanding hint
TARBACK_TAR_CREATE_COMMAND_DEFAULT='tar c -C "$(dirname "$1")" "$(basename "$1")"' TARBACK_TAR_CREATE_COMMAND_DEFAULT='tar c -C "$1" .'
# shellcheck disable=SC2016 # disable variable not expanding hint # shellcheck disable=SC2016 # disable variable not expanding hint
TARBACK_TAR_EXTRACT_COMMAND_DEFAULT='tar x -C "$(dirname "$1")"' TARBACK_TAR_CREATE_COMMAND_FILE_DEFAULT='tar c -C "$(dirname "$1")" "$(basename "$1")"'
# shellcheck disable=SC2016 # disable variable not expanding hint
TARBACK_TAR_EXTRACT_COMMAND_DEFAULT='tar x -C "$1"'
# shellcheck disable=SC2016 # disable variable not expanding hint
TARBACK_TAR_EXTRACT_COMMAND_FILE_DEFAULT='tar x -C "$(dirname "$1")"'
TARBACK_COMPRESSION_DEFAULT='xz' TARBACK_COMPRESSION_DEFAULT='xz'
TARBACK_SPLIT_DEFAULT="split -b $((128*1024*1024)) -" TARBACK_SPLIT_DEFAULT="split -b $((128*1024*1024)) -"
TARBACK_MERGE_DEFAULT='cat' TARBACK_MERGE_DEFAULT='cat'
@ -23,7 +27,9 @@ TARBACK_REMOTE="${TARBACK_REMOTE:-$TARBACK_REMOTE_DEFAULT}"
# remote command, see _transform_ssh_command for an example # remote command, see _transform_ssh_command for an example
TARBACK_TRANSFORM_REMOTE_COMMAND="${TARBACK_TRANSFORM_REMOTE_COMMAND:-$TARBACK_TRANSFORM_REMOTE_COMMAND_DEFAULT}" TARBACK_TRANSFORM_REMOTE_COMMAND="${TARBACK_TRANSFORM_REMOTE_COMMAND:-$TARBACK_TRANSFORM_REMOTE_COMMAND_DEFAULT}"
TARBACK_TAR_CREATE_COMMAND="${TARBACK_TAR_CREATE_COMMAND:-$TARBACK_TAR_CREATE_COMMAND_DEFAULT}" TARBACK_TAR_CREATE_COMMAND="${TARBACK_TAR_CREATE_COMMAND:-$TARBACK_TAR_CREATE_COMMAND_DEFAULT}"
TARBACK_TAR_CREATE_COMMAND_FILE="${TARBACK_TAR_CREATE_COMMAND_FILE:-$TARBACK_TAR_CREATE_COMMAND_FILE_DEFAULT}"
TARBACK_TAR_EXTRACT_COMMAND="${TARBACK_TAR_EXTRACT_COMMAND:-$TARBACK_TAR_EXTRACT_COMMAND_DEFAULT}" TARBACK_TAR_EXTRACT_COMMAND="${TARBACK_TAR_EXTRACT_COMMAND:-$TARBACK_TAR_EXTRACT_COMMAND_DEFAULT}"
TARBACK_TAR_EXTRACT_COMMAND_FILE="${TARBACK_TAR_EXTRACT_COMMAND_FILE:-$TARBACK_TAR_EXTRACT_COMMAND_FILE_DEFAULT}"
TARBACK_COMPRESSION="${TARBACK_COMPRESSION:-$TARBACK_COMPRESSION_DEFAULT}" TARBACK_COMPRESSION="${TARBACK_COMPRESSION:-$TARBACK_COMPRESSION_DEFAULT}"
TARBACK_SPLIT="${TARBACK_SPLIT:-$TARBACK_SPLIT_DEFAULT}" TARBACK_SPLIT="${TARBACK_SPLIT:-$TARBACK_SPLIT_DEFAULT}"
TARBACK_MERGE="${TARBACK_MERGE:-$TARBACK_MERGE_DEFAULT}" TARBACK_MERGE="${TARBACK_MERGE:-$TARBACK_MERGE_DEFAULT}"
@ -58,26 +64,44 @@ _transform_remote() {
echo "$r" echo "$r"
} }
create() { _create() {
# $1 ... src # $1 ... src
# $2 ... dst # $2 ... dst
src="$1" src="$1"
dst="$(_transform_split_name "$2")" dst="$(_transform_split_name "$2")"
tarback_tar_create_command="$(_transform_remote "$TARBACK_TAR_CREATE_COMMAND")" if [ -d "$src" ]; then
tarback_tar_create_command="$TARBACK_TAR_CREATE_COMMAND"
else
tarback_tar_create_command="$TARBACK_TAR_CREATE_COMMAND_FILE"
fi
tarback_tar_create_command="$(_transform_remote "$tarback_tar_create_command")"
$TARBACK_REMOTE sh -c "$tarback_tar_create_command" - "$src" \ $TARBACK_REMOTE sh -c "$tarback_tar_create_command" - "$src" \
| $TARBACK_COMPRESSION \ | $TARBACK_COMPRESSION \
| $TARBACK_SPLIT "$dst" | $TARBACK_SPLIT "$dst"
} }
restore() { create() {
_create "$@"
}
_restore() {
src="$(_transform_split_name "$1")" src="$(_transform_split_name "$1")"
dst="$2" dst="$2"
tarback_tar_extract_command="$(_transform_remote "$TARBACK_TAR_EXTRACT_COMMAND")" if [ ! -e "$dst" ] && [ -d "$(dirname "$dst")" ]; then
tarback_tar_extract_command="$TARBACK_TAR_EXTRACT_COMMAND_FILE"
else
tarback_tar_extract_command="$TARBACK_TAR_EXTRACT_COMMAND"
fi
tarback_tar_extract_command="$(_transform_remote "$tarback_tar_extract_command")"
$TARBACK_MERGE "$src"* \ $TARBACK_MERGE "$src"* \
| $TARBACK_COMPRESSION --decompress --stdout \ | $TARBACK_COMPRESSION --decompress --stdout \
| $TARBACK_REMOTE sh -c "$tarback_tar_extract_command" - "$dst" | $TARBACK_REMOTE sh -c "$tarback_tar_extract_command" - "$dst"
} }
restore() {
_restore "$@"
}
short_options='p:' short_options='p:'
while getopts "$short_options" arg; do while getopts "$short_options" arg; do
case "$arg" in case "$arg" in

22
test.sh Executable file
View file

@ -0,0 +1,22 @@
#!/bin/sh
set -eu
failed=0
for f in ./tests/test-*.sh; do
printf '%s' "Running test $f ... "
if "$f"; then
echo "succeeded"
else
failed=$((failed+1))
echo "failed"
fi
done
if [ $failed -ne 0 ]; then
echo "$failed tests failed"
exit 1
else
echo "all succeeded"
exit 0
fi

10
tests/common.sh Executable file
View file

@ -0,0 +1,10 @@
#!/bin/sh
create_directories() {
workdir="$(mktemp -d)"
mkdir -p "$workdir/source"
mkdir -p "$workdir/dest"
mkdir -p "$workdir/restore"
echo 'Hello World!' > "$workdir/source/hello_world.txt"
echo "$workdir"
}

27
tests/test-000-simple.sh Executable file
View file

@ -0,0 +1,27 @@
#!/bin/sh
set -eu
. ./tests/common.sh
# archive whole directory
workdir="$(create_directories)"
./tarback.sh create "$workdir/source" "$workdir/dest/source.tar.xz"
./tarback.sh restore "$workdir/dest/source.tar.xz" "$workdir/restore"
diff "$workdir/source" "$workdir/restore"
rm -rf "$workdir"
# archive single file
workdir="$(create_directories)"
./tarback.sh create "$workdir/source/hello_world.txt" "$workdir/dest/source.tar.xz"
./tarback.sh restore "$workdir/dest/source.tar.xz" "$workdir/restore/hello_world.txt"
diff "$workdir/source" "$workdir/restore"
rm -rf "$workdir"
# split archive
workdir="$(create_directories)"
TARBACK_SPLIT="split -b 10 -" ./tarback.sh create "$workdir/source/hello_world.txt" "$workdir/dest/source.tar.xz"
TARBACK_SPLIT="split -b 10 -" ./tarback.sh restore "$workdir/dest/source.tar.xz" "$workdir/restore/hello_world.txt"
diff "$workdir/source" "$workdir/restore"
[ "$(ls -1 "$workdir/dest/"*.part* | wc -l)" -gt 1 ]
rm -rf "$workdir"