diff options
author | Michael Cummings <mcummings@gentoo.org> | 2005-01-17 14:45:24 +0000 |
---|---|---|
committer | Michael Cummings <mcummings@gentoo.org> | 2005-01-17 14:45:24 +0000 |
commit | c5cc072d70cd5f31778096834f3dc4f22fa1d862 (patch) | |
tree | b026763070b06f4114244d8e5abd653d459ea748 /dev-lang/perl | |
parent | add missing dep on libkmime (diff) | |
download | gentoo-2-c5cc072d70cd5f31778096834f3dc4f22fa1d862.tar.gz gentoo-2-c5cc072d70cd5f31778096834f3dc4f22fa1d862.tar.bz2 gentoo-2-c5cc072d70cd5f31778096834f3dc4f22fa1d862.zip |
adding to tree for later inclusion
Diffstat (limited to 'dev-lang/perl')
-rwxr-xr-x | dev-lang/perl/files/perl-cleaner | 296 |
1 files changed, 296 insertions, 0 deletions
diff --git a/dev-lang/perl/files/perl-cleaner b/dev-lang/perl/files/perl-cleaner new file mode 100755 index 000000000000..1b29ac82ffc5 --- /dev/null +++ b/dev-lang/perl/files/perl-cleaner @@ -0,0 +1,296 @@ +#!/bin/bash + +# First and foremost - make sure we have a perl to work with... +PERL=`which perl` +if [ "${PERL}x" == "x" ]; then + echo "NO PERL INSTALLED!! (at least not in your path)" + exit +fi +eval `perl '-V:version'` +PERL_VERSION=${version} + + +TMPDIR="/tmp" +PKGDIR="/var/db/pkg" +DATESTAMP=`date +"%Y%m%d%H%M%S"` +LOG="${TMPDIR}/perl-cleaner.log.$DATESTAMP" + +ASK="" + +if [ ! -z $2 ]; then + ASK=Y +fi + +# Set up our temporary files + +function cleanrun() { +for FILE in modules.list ebuilds.preinstall ebuilds.ordered ebuilds.reinstall ; do + +if [ -f $TMPDIR/$FILE ]; then + cp /dev/null $TMPDIR/$FILE +else + touch $TMPDIR/$FILE +fi + +done +} + +function postclean { +for FILE in modules.list ebuilds.preinstall ebuilds.ordered ebuilds.reinstall; do + +if [ -f $TMPDIR/$FILE ]; then + rm -f $TMPDIR/$FILE +fi + +done + +echo "" +echo "For a complete log, please read ${TMPDIR}/perl-cleaner.log.DATESTAMP" +echo "" +} + +# This is to clean out the old .ph files generated in our last perl install +function ph_clean() { +echo "`date` : Beginning a clean up of .ph files" +echo "`date` : Beginning a clean up of .ph files">>$LOG + +INC=`perl -e 'foreach $line (@INC) { next if $line eq "."; next if $line =~ m/'${PERL_VERSION}'/; print "$line\n" }'` + +echo "Locating ph files for removal" +for DIR in $INC; do + if [ -d $DIR ]; then + for file in `find $DIR -name "*.ph" -type f`; do + if [ ! `echo "$file"|grep $PERL_VERSION` ]; then + echo "`date` : Removing old ph file: $file" + echo "`date` : Removing old ph file: $file">>$LOG + rm $file + fi + done + fi +done +} + +# Generate ph files; this is useful if we've upgraded packages with headers so that perl knows the new info +function ph_update() { + echo "`date` : Updating ph files" + echo "`date` : Updating ph files">>$LOG + cd /usr/include; h2ph * sys/* arpa/* netinet/* bits/* security/* asm/* >>$LOG +} + +# Build a list of modules installed under older perls - only valid if the module was an ebuild :) +function module_list() { +# Reset INC - INC is dynamically generated, and if we removed any ph +# files - and they were the only thing left in a dir - then there's +# no sense in revisiting that dir +echo "`date` : Building list of modules for reinstall" +echo "`date` : Building list of modules for reinstall">>$LOG +INC=`perl -e 'foreach $line (@INC) { next if $line eq "."; next if $line =~ m/'${PERL_VERSION}'/; print "$line\n" }'` +echo "Locating modules for reinstall" +for DIR in $INC; do + if [ -d $DIR ]; then + for file in `find $DIR -iname "*.pm" -type f|grep -v "${PERL_VERSION}"`; do + grep -l $file $PKGDIR/*/*/CONTENTS >>$TMPDIR/modules.list + done + fi +done +} + +# The meat of it - rebuilding the ebuilds +# ALL emerges are oneshots - we don't want to mess with the world file +# We first attempt to emerge the specific module that was installed last time +# If that fails, we attempt to install a newer version + +function ebuild_rebuild() { + +echo "`date` : Rebuilding modules: Building list of ebuilds" +echo "`date` : Rebuilding modules: Building list of ebuilds">>$LOG +if [ -s $TMPDIR/modules.list ]; then + for line in `cat $TMPDIR/modules.list|sort -u`; do + echo "$line"|sed -e 's|.*pkg/||' | sed -e 's|/CONTENTS||'|grep -v "dev-lang/perl" >>$TMPDIR/ebuilds.preinstall + done +fi + + +# If they asked for interactive, let them see what will be reinstalled +if [ -s $TMPDIR/ebuild.preinstall ]; then + + if [ ! -z $ASK ]; then + echo "Press Enter to see the list of ebuilds we'll be avaluating" + read key + if [ ! -z $PAGER ]; then + $PAGER $TMPDIR/ebuilds.preinstall + else + more $TMPDIR/ebuilds.preinstall + fi + printf "Continue? (Y/N) " + read ANSWER + if [ `echo "${ANSWER}" | egrep -e "^n|N" ` ]; then + echo "`date` : USER ABORTED REBUILD">>$LOG + exit + fi + fi + + for EBUILD in `cat $TMPDIR/ebuilds.preinstall`; do + if emerge --oneshot -p "=$EBUILD"|egrep -q ".*ebuilds.*satisfy"; then + if emerge --oneshot -p ">=$EBUILD"|egrep -q ".*ebuilds.*satisfy"; then + echo "`date` : There are no unmasked ebuilds to satisfy $EBUILD. Skipping" + echo "`date` : There are no unmasked ebuilds to satisfy $EBUILD. Skipping">>$LOG + sleep 2 + else + if [ ! -z $ASK ]; then + printf "${EBUILD} isn't available, but a new version is. Install? (Y/N) " + read ANSWER + if [ `echo "${ANSWER}" | egrep -e "^y|Y" ` ]; then + echo ">=$EBUILD" >> $TMPDIR/ebuilds.ordered + echo "`date` : User chose to install >=${EBUILD}">>$LOG + fi + else + echo ">=$EBUILD" >>$TMPDIR/ebuilds.ordered + fi + fi + else + echo "=$EBUILD">>$TMPDIR/ebuilds.ordered + + fi + done + + if [ -s $TMPDIR/ebuilds.ordered ]; then + if [ ! -z $ASK ]; then + echo "Press Enter to see the final list of ebuilds to install" + read key + if [ ! -z $PAGER ]; then + $PAGER $TMPDIR/ebuilds.ordered + else + more $TMPDIR/ebuilds.ordered + fi + printf "Continue? (Y/N) " + read ANSWER + if [ `echo "${ANSWER}" | egrep -e "^n|N" ` ]; then + echo "`date` : USER ABORTED REBUILD">>$LOG + exit + fi + fi + +# Cut down to one line so portage can handle ordering these appropriately + emerge -p --oneshot `cat $TMPDIR/ebuilds.ordered` | grep ebuild | sed 's:\([^ ]\+\):=\1:g' | sed 's:.*\] \([^ ]*\) .*:\1:'>>$TMPDIR/ebuilds.reinstall + + echo "Reinstalling ebuilds" + echo "`date` : Ebuilds to reinstall: ">>$LOG + cat $TMPDIR/ebuilds.reinstall>>$LOG + echo "" >>$LOG + +# Now that we have them in the right order, emerge them one at a time +# This is to avoid problems if one doesn't emerge correctly + + for EBUILD in `cat $TMPDIR/ebuilds.reinstall`; do + if [ ! -z $ASK ]; then + emerge --oneshot --ask "$EBUILD" + else + emerge --oneshot "$EBUILD" + fi + done + else + echo "" + echo "Nothing to reinstall!" + echo "" + fi +else + echo "" + echo "Nothing to reinstall!" + echo "" +fi + +} + +# Locate .so's and binaries linked against libperl.so +# The coup is in ! -newer libperl.so - cut out anything that was obviously installed +# after our last install of libperl, which should cut out the false positives. + +function libperl_list() { +echo "`date` : Locating ebuilds linked against libperl" +echo "`date` : Locating ebuilds linked against libperl">>$LOG +for i in $(find $(egrep -v ^# /etc/ld.so.conf) -type f -name '*.so*' ! -newer /usr/lib/libperl.so ) \ + $(find $(echo $PATH | sed 's/:/ /g') -type f -perm +0111 ! -newer /usr/lib/libperl.so ) ; +do + echo "Checking ${i}" #MPC + if [ -f ${i} ]; then + ldd ${i} 2>&1 | grep "libperl" - >/dev/null && grep -l $i $PKGDIR/*/*/CONTENTS>>$TMPDIR/modules.list; + fi +done + +} + +# Assuming a successful module run, look to see whats left over +function leftovers() { +echo "`date` : Finding left over modules" +echo "`date` : Finding left over modules">>$LOG + +echo "`date` : The following files remain. These were either installed by hand" +echo "`date` : or edited. This script cannot deal with them." +echo "" + +echo "`date` : The following files remain. These were either installed by hand">>$LOG +echo "`date` : or edited. This script cannot deal with them.">>$LOG +echo "">>$LOG + +INC=`perl -e 'foreach $line (@INC) { next if $line eq "."; next if $line =~ m/'${PERL_VERSION}'/; print "$line\n" }'` +for DIR in $INC; do + if [ -d $DIR ]; then + for file in `find $DIR -type f |grep -v "${PERL_VERSION}" ` ; do + echo "`date` : ${file}">>$LOG + done + fi +done +} + +cleanrun + +case "$1" in + leftovers) + leftovers + ;; + modules) + module_list + ebuild_rebuild + leftovers + ;; + libperl) + libperl_list + ebuild_rebuild + ;; + ph-clean) + ph_clean + ;; + phupdate) + ph_update + ;; + phall) + ph_clean + ph_update + ;; + all) + ph_clean + ph_update + module_list + libperl_list + ebuild_rebuild + leftovers + ;; + *) + echo "Usage: $0 [options] [ask]" + printf "\tmodules - rebuild perl modules\n" + printf "\tlibperl - rebuild anything linked against libperl\n" + printf "\tph-clean - clean out old ph files from a previous perl\n" + printf "\tphupdate - update existing ph files, useful after an upgrade to system parts like the kernel\n" + printf "\tphall - clean out old ph files and run phupdate\n" + printf "\tall - rebuild modules, libperl linkages, clean ph files, and rebuild them\n" + printf "\n" + printf "\task - ask for confirmation on each emerge" + printf "\n\n" + + ;; +esac + +postclean + +exit |