#!/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