> Hello all.
>
> While port removal happens less frequently than addition, it still
> happens. It involves a few different operations that are done each
> time and thus could be automated. It's not that much about time
> saving (port removal doesn't involve much analytics), but about
> not forgetting stuff.
>
> Here is a proposal of portrm utility. Currently it does following:
>
> 1. Remove mentions of port from category Makefile.
> 2. Add a record to devel/quirks (using dirty tricks, of course).
> 3. Removes all port files under CVS control.
>
> The utility is intended to be run under port directory. It gives
> you a chance to make sure you're removing the correct port before
> going on, and leaves the actual commit to you. I verified it on
> the graphics/digikam-kde4 port. :)
>
> I think this should also check that the port isn't used by anything
> else, but I want to make sure the idea is welcome by senior porters
> first. So all comments are welcome.
And here is a slightly improved version, after first real try.
--
WBR,
Vadim Zhukov
#!/bin/ksh
set -e
set -u
CVS=${CVS:-cvs}
PORTSDIR=${PORTSDIR:-$(make -V PORTSDIR)}
case $PORTSDIR in
*\$*)
echo 'Could not detect $PORTSDIR via make invocation,' >&2
echo 'please set it as the environment variable.' >&2
exit 1
esac
if ! command -v cvsdo >/dev/null; then
echo "cvsutils package is not installed" >&2
exit 1
fi
quirks=devel/quirks/files/Quirks.pm
if ! [ -f "$PORTSDIR/$quirks" ]; then
echo "could not find $PORTSDIR/$quirks" >&2
exit 1
fi
pkgstems=$(make show=PKGNAMES | sed -E 's/-[0-9][^[:space:]]*//g')
portpath=$(pwd)
portpath=${portpath##${PORTSDIR}/}
cat=${portpath%/*}
portname=${portpath##*/}
echo -n "removing $portname from category $cat, is it right? (yes/no) " >&2
read ans
ans=$(echo "$ans" | tr A-Z a-z)
case $ans in
y|ye|yes)
;;
*)
echo "canceled" >&2
exit 3
;;
esac
enum_files() {
find "$1" -type d -name CVS | while IFS= read cvsd; do
cvsd=${cvsd%/CVS}
awk -F / '$1 == "" {print $2}' $cvsd/CVS/Entries | sed
"s,^,$cvsd/,"
done
}
cd -- "$PORTSDIR"
qtmp=$(mktemp $quirks.XXXXXXXX)
trap "rm $qtmp" EXIT
nmsg=0
msg_found=false
msg_ended=false
obs_found=false
obs_ended=false
reason=
exec 3<$quirks
while IFS= read -ru3 line; do
case $line in
"my @msg ="*)
if $msg_found; then
echo "duplicated @msg in $quirks" >&2
exit 1
fi
msg_found=true
;;
\)\;)
if $msg_found && ! $msg_ended; then
msg_ended=true
echo "Removal reasons available:" >&2
for i in $(jot $nmsg 0); do
echo " $i. ${msg[$i]}" >&2
done
echo -n "Type a reason number, or a new reason text: "
>&2
read reason
case $reason in
+([0-9]))
if [ $reason -ge $nmsg ]; then
echo "wrong number" >&2
exit 2
fi
;;
*\"*|*\$*)
echo "invalid reason text" >&2
exit 2
;;
*)
printf "\t\"%s\", #${nmsg}\n" "$nmsg" >>$qtmp
reason=$nmsg
;;
esac
fi
;;
"my \$obsolete_reason ="*)
if ! $msg_ended; then
echo "could not find obsolete reasons message list in
$quirks" >&2
exit 1
fi
if $obs_found; then
echo "duplicated \$obsolete_reason in $quirks" >&2
exit 1
fi
obs_found=true
;;
\}\;)
if $obs_found && ! $obs_ended; then
obs_ended=true
for stem in $pkgstems; do
printf "\t'%s' => %s,\n" "$stem" $reason >>$qtmp
done
fi
;;
*)
if $msg_found && ! $msg_ended; then
msg[$nmsg]=$(echo "$line" | awk -F '"' '{print $2}')
nmsg=$((nmsg + 1))
fi
;;
esac
printf "%s\n" "$line" >>$qtmp
done
mv $qtmp $quirks
trap "" EXIT
echo "Updating affected files..." >&2
$CVS update devel/quirks "$cat/Makefile" "$portpath"
portbump devel/quirks
cvsdo rm -f $(enum_files "$portpath")
perl -ni -e "/SUBDIR\\s*\\+?=\\s*$portname\\b/ or print" "$cat/Makefile"
echo "Here are changes to be made outside port directory:"
$CVS diff "$cat/Makefile" devel/quirks || true
echo
echo "======================================================"
echo "Now you can type the following in $PORTSDIR to commit:"
echo " cd $PORTSDIR && $CVS commit $cat/Makefile devel/quirks $portpath"