diff --git a/handle-package-moves.sh b/handle-package-moves.sh new file mode 100755 index 0000000..ab6c5be --- /dev/null +++ b/handle-package-moves.sh @@ -0,0 +1,109 @@ +#!/bin/bash + +# Updates particles using profiles/updates. +# Arguments: file name(s) to profiles/updates/*. +# example: this-script /usr/portage/profiles/updates/*-2012 + +# Assumes that packages with category foo-bar are in foo-bar.particle +# under $particles_dir. + +# (C) 2012 SÅ‚awomir Nizio +# this scripty is placed in public domain + +# path to the glourious script or name if in PATH +modify_script=${modify_script:-modify.pl} + +# for example: particles.git/weekly +# default value is useful when it's run from particles.git directory +particles_dir=${particles_dir:-weekly} + +# don't edit this +available_after_move=() + +if [[ $# -eq 0 ]]; then + echo "$0 FILE [FILE...]" >&2 + echo "FILE = 4Q-2012, for example" >&2 + exit 1 +fi + +start() { + if ! "$modify_script" --help > /dev/null; then + echo "Looks that I can't execute $modify_script." >&2 + echo "Check if you have that script and adjust \$PATH" >&2 + echo "or \$modify_script if needed." + exit 1 + fi + if ! cd "$particles_dir"; then + echo "cd $particles_dir = nope" >&2 + exit 1 + fi + for file in "$@"; do + readfileanddostuff "$file" || { echo "aborted"; exit 1; } + done + if [[ ${#available_after_move[@]} -gt 0 ]]; then + # Here it can print invalid package names if a package was + # renamed multiple times, or just removed since. + echo + echo "new candidates" + echo "These are packages that weren't present in a particle before" + echo "their rename, and a particle for their category exists." + echo "Displaying them in case it's useful (whitespace separated)." + echo "Check if they refer to packages that are really available!" + echo "${available_after_move[@]}" + else + echo + echo "No new candidates." + fi +} + +readfileanddostuff() { + local file=$1 + local old new + local oldcat newcat + + echo "** $file **" + if [[ ! -r $file ]]; then + echo "$file doesn't exist or can't be read, or is invalid type" >&2 + return 1 + fi + while read op old new; do + [[ $op = move ]] || continue + echo "@@@ $old -> $new" + oldcat=${old%/*} + newcat=${new%/*} + # echo "<$oldcat,$newcat>" + if [[ ! -f $oldcat.particle ]]; then + echo "no-file-old $oldcat.particle, skipping" + continue + fi + + # modify.pl currently returns success when no entry to be deleted + # so we use this to know if new (replaced) entry should be added + # or not + if egrep -q "^\s*$old(,|$)" "$oldcat.particle"; then + # removed even if new name won't be added + "$modify_script" --noask --delete "$oldcat.particle" "$old" + was_present=1 + else + was_present=0 + fi + + if [[ ! -f $newcat.particle ]]; then + echo "no-file-new $newcat.particle, skipping the rest" + continue + fi + + if [[ $was_present = 1 ]]; then + "$modify_script" --noask "$newcat.particle" "$new" + else + # if it wasn't there before (and it's not now) and a particle + # for this category exists (checked above), inform about it + # maybe someone would want to add it + if ! egrep -q "^\s*$new(,|$)" "$newcat.particle"; then + available_after_move+=( "$new" ) + fi + fi + done < "$file" +} + +start "$@"