particles/handle-package-moves.sh

110 lines
3.0 KiB
Bash
Raw Permalink Normal View History

#!/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 <slawomir.nizio#sabayon.org>
# 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 "$@"