Skip to content
seblu-commit 2.87 KiB
Newer Older
Seblu's avatar
Seblu committed
# 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'
Seblu's avatar
Seblu committed
repo="/srv/ftp/archlinux/$dbname"
repo_32="$repo/i686"
repo_64="$repo/x86_64"

Seblu's avatar
Seblu committed
# packages to add
declare -a to_32 to_64
Seblu's avatar
Seblu committed
[[ -r /etc/makepkg.conf ]] && source /etc/makepkg.conf
[[ -r "$HOME/.makepkg.conf" ]]  && source "$HOME/.makepkg.conf"
shopt -s nullglob

Seblu's avatar
Seblu committed
usage() {
	echo "usage: ${0##*/} [options] pkg ..." >&2
	echo 'options:' >&2
	echo "   -r: remove package after addition" >&2
	exit 2
}

msg() {
	printf "\e[1;32m==>\e[0;1m $1\e[m\n" "${@:1}"
}

Seblu's avatar
Seblu committed
msg2() {
	printf "\e[1;34m  ->\e[0;1m $1\e[m\n" "${@:1}"
}

# 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"
}

Seblu's avatar
Seblu committed
sign_pkg() {
	msg 'Sign packages'
	for _pkg; do
		if [[ ! -f "$_pkg.sig" ]]; then
			msg2 "Signing $_pkg"
			gpg --detach-sign "$_pkg" || exit 1
		fi
	done
}
Seblu's avatar
Seblu committed
# add pkg ($2..$n) in argument into repo $1
add_pkg() {
	(( $# > 1 )) || return
	local repo="$1"
	shift
	msg "Adding packages into $repo"
Seblu's avatar
Seblu committed
	# 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
Seblu's avatar
Seblu committed
	pushd "$repo" >/dev/null
Seblu's avatar
Seblu committed
	msg2 "Updating $dbname.db.tar.gz"
Seblu's avatar
Seblu committed
	repo-add -q -s "$dbname.db.tar.gz" "$@"
Seblu's avatar
Seblu committed
	msg2 "Updating $dbname.files.tar.gz"
Seblu's avatar
Seblu committed
	repo-add -q -s -f "$dbname.files.tar.gz" "$@"
	popd >/dev/null
Seblu's avatar
Seblu committed
}

Seblu's avatar
Seblu committed
while getopts 'hr' opt; do
	case $opt in
		r) remove=1;;
		*) usage;;
	esac
done
shift $((OPTIND - 1));

(( $# >= 1 )) || usage

for _pkg; do
	case "$_pkg" in
		*-i686$PKGEXT) to_32+=("$_pkg");;
		*-x86_64$PKGEXT) to_64+=("$_pkg");;
		*-any$PKGEXT) to_32+=("$_pkg"); to_64+=("$_pkg");;
	esac
done
Seblu's avatar
Seblu committed
if (( ${#to_32[@]} + ${#to_64[@]} == 0 )); then
	echo 'No package to add' >&2
	exit 2
fi

sign_pkg "${to_32[@]}" "${to_64[@]}"

# add i686 packages
add_pkg "$repo_32" "${to_32[@]}"

# add x86_64 packages
add_pkg "$repo_64" "${to_64[@]}"

Seblu's avatar
Seblu committed
# delete packages
for _pkg in "${to_32[@]}" "${to_64[@]}"; do
	rm -f "$_pkg" "$_pkg.sig"
done

# vim:set ts=2 sw=2 ft=sh noet: