adding to tree for later inclusion
authorMichael Cummings <mcummings@gentoo.org>
Mon, 17 Jan 2005 14:45:24 +0000 (14:45 +0000)
committerMichael Cummings <mcummings@gentoo.org>
Mon, 17 Jan 2005 14:45:24 +0000 (14:45 +0000)
dev-lang/perl/files/perl-cleaner [new file with mode: 0755]

diff --git a/dev-lang/perl/files/perl-cleaner b/dev-lang/perl/files/perl-cleaner
new file mode 100755 (executable)
index 0000000..1b29ac8
--- /dev/null
@@ -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