81 lines
1.7 KiB
Bash
Executable File
81 lines
1.7 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
containsElement () {
|
|
local e match="$1"
|
|
shift
|
|
for e; do [[ "$e" == "$match" ]] && return 0; done
|
|
return 1
|
|
}
|
|
|
|
SCRIPT_PATH=$(realpath "$0")
|
|
SCRIPT_DIR=$(dirname "$SCRIPT_PATH")
|
|
|
|
DEEP=false
|
|
PKGS=()
|
|
|
|
while getopts "d" flag; do
|
|
case "$flag" in
|
|
d) DEEP=true
|
|
shopt -s globstar;;
|
|
*) >&2 echo "Unknown flag ${flag}"
|
|
exit 2;;
|
|
esac
|
|
done
|
|
|
|
if [ -z "${@:$OPTIND:1}" ]; then
|
|
echo "You have not specified a repository"
|
|
exit 1
|
|
fi
|
|
if ! [ -d "${@:$OPTIND:1}" ]; then
|
|
>&2 echo "The given path is not a directory"
|
|
exit 1
|
|
fi
|
|
|
|
if realpath "${@:$OPTIND:1}" &> /dev/null; then
|
|
REPO=$(realpath "${@:$OPTIND:1}")
|
|
fi
|
|
|
|
shopt -s nullglob
|
|
|
|
create_entry() {
|
|
if [ $# -eq 0 ]; then
|
|
return 0
|
|
fi
|
|
if ! [ -f "$1" ]; then
|
|
return 0
|
|
fi
|
|
|
|
info="info:"$'\n'
|
|
info+=$(tar -xf "$pkg" pkg.info -O | sed 's/^/ /g')
|
|
package=$(echo "$info" | grep 'name: ' | xargs | awk '{print $2}')
|
|
if ! echo "$info" | grep -q '^ type: binary'; then
|
|
>&2 echo "The following package is not a binary package: ${package}"
|
|
exit 1
|
|
fi
|
|
if containsElement "$package" "${PKGS[@]}"; then
|
|
>&2 echo "The following package was found in more than 1 package archives: ${package}"
|
|
exit 1
|
|
fi
|
|
PKGS+=("$package")
|
|
file="$(realpath -s --relative-to="$REPO" "$pkg")"
|
|
info+=$'\n'"download: ${file}"
|
|
info+=$'\n'"download_size: "$(cat "$pkg" | wc -c)
|
|
info+=$'\n'"installed_size: "$(tar -xf "$pkg" files.tar.gz -O | zcat | wc -c)
|
|
info+=$'\n---'
|
|
echo "$info"
|
|
}
|
|
|
|
if ! $DEEP; then
|
|
for arch in "$REPO"/*/; do
|
|
for pkg in "$arch"/*.bpm; do
|
|
create_entry "$pkg"
|
|
done
|
|
done
|
|
else
|
|
for arch in "$REPO"/*/; do
|
|
for pkg in "$arch"/**/*.bpm; do
|
|
create_entry "$pkg"
|
|
done
|
|
done
|
|
fi
|