110 lines
3.0 KiB
Bash
110 lines
3.0 KiB
Bash
|
#!/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 "$@"
|