summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Cummings <mcummings@gentoo.org>2005-01-17 14:45:24 +0000
committerMichael Cummings <mcummings@gentoo.org>2005-01-17 14:45:24 +0000
commitc5cc072d70cd5f31778096834f3dc4f22fa1d862 (patch)
treeb026763070b06f4114244d8e5abd653d459ea748 /dev-lang/perl
parentadd missing dep on libkmime (diff)
downloadgentoo-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-xdev-lang/perl/files/perl-cleaner296
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