#!/bin/bash # Copyright © Sébastien Luttringer # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. dbname='seblu' repo="/home/archlinux/repo/$dbname" repo_64="$repo/x86_64" # packages to add declare -a to_32 to_64 shopt -s nullglob if [[ -t 0 && -t 2 ]]; then RED=$'\e''[1;31m' GREEN=$'\e''[1;32m' BLUE=$'\e''[1;34m' BOLD=$'\e''[0;1m' RESET=$'\e''[m' fi msg() { printf "$GREEN==>$BOLD $1$RESET\n" "${@:1}" } msg2() { printf "$BLUE ->$BOLD $1$RESET\n" "${@:1}" } usage() { echo "usage: ${0##*/} [options] pkg ..." >&2 echo 'options:' >&2 echo " -r: remove package after addition" >&2 exit 2 } # usage : in_array( $needle, $haystack ) # return : 0 - found # 1 - not found in_array() { local needle=$1; shift local item for item in "$@"; do [[ $item = $needle ]] && return 0 # Found done return 1 # Not Found } # $1: srouce # $2: destination cp_acl() { rm -f "$2" touch "$2" cat < "$1" > "$2" } sign_pkg() { msg 'Sign packages' for _pkg; do if [[ ! -f "$_pkg.sig" ]]; then msg2 "Signing $_pkg" gpg --detach-sign "$_pkg" || exit 1 fi done } # add pkg ($2..$n) in argument into repo $1 add_pkg() { (( $# > 1 )) || return local repo="$1" shift msg "Adding packages into $repo" # copy files for _pkg; do msg2 "Copying $_pkg" cp_acl "$_pkg" "$repo/$_pkg" || exit 2 cp_acl "$_pkg.sig" "$repo/$_pkg.sig" || exit 2 done # update db pushd "$repo" >/dev/null msg2 "Updating $dbname.db.tar.gz" repo-add -q -s "$dbname.db.tar.gz" "$@" popd >/dev/null } while getopts 'hr' opt; do case $opt in r) remove=1;; *) usage;; esac done shift $((OPTIND - 1)); (( $# >= 1 )) || usage for _pkg; do [[ "$_pkg" =~ .*\.pkg\.tar\.(xz|zst) ]] && to_64+=("$_pkg") done if (( ${#to_32[@]} + ${#to_64[@]} == 0 )); then echo 'No package to add' >&2 exit 2 fi sign_pkg "${to_32[@]}" "${to_64[@]}" # add x86_64 packages add_pkg "$repo_64" "${to_64[@]}" # delete packages for _pkg in "${to_32[@]}" "${to_64[@]}"; do rm -f "$_pkg" "$_pkg.sig" done # harlinking if type -P hardlink >/dev/null; then hardlink -c "$repo" >/dev/null fi # vim:set ts=2 sw=2 ft=sh noet: