head	1.5;
access;
symbols
	RELEASE-1_4:1.3.0.2;
locks; strict;
comment	@# @;


1.5
date	2003.08.15.12.50.15;	author lanius;	state dead;
branches;
next	1.4;

1.4
date	2003.08.14.03.29.41;	author vapier;	state Exp;
branches;
next	1.3;

1.3
date	2003.07.18.16.16.14;	author mholzer;	state Exp;
branches;
next	1.2;

1.2
date	2003.05.09.14.51.33;	author utx;	state Exp;
branches;
next	1.1;

1.1
date	2003.05.08.11.38.08;	author liquidx;	state Exp;
branches;
next	;


desc
@@


1.5
log
@moved to app-portage
@
text
@#! /bin/bash

# Copyright 1999-2003 Gentoo Technologies, Inc.
# $Header: /home/cvsroot/gentoo-x86/app-admin/gentoolkit/files/scripts/revdep-rebuild,v 1.4 2003/08/14 03:29:41 vapier Exp $

# revdep-rebuild: Reverse dependency rebuilder.
# Author: Stanislav Brabec <utx@@gentoo.org>

# requires: qpkg

# Known problems:
#
# In exact ebuild mode revdep-rebuild can fails to get order packages,
# which are not up to date. This is because emerge first tries to
# merge latest package and last in resort it tries to degrade.
# http://bugs.gentoo.org/show_bug.cgi?id=23018
#
# Rebuild in --package-names mode should be default, but emerge has no
# feature to update to latest version of defined SLOT.
# http://bugs.gentoo.org/show_bug.cgi?id=4698

# Mask of specially evaluated libraries (exactly one space separated).
LD_LIBRARY_MASK="libodbcinst.so libodbc.so libjava.so libjvm.so"

# List of directories to be searched (feel free to edit it)
# Note /usr/libexec and /usr/local/subprefix cotradicts FHS, but are present
# /var/something is for cgi and similar scripts
SEARCH_DIRS="/lib /bin /sbin /usr/lib /usr/bin /usr/sbin /usr/libexec /usr/X11R6/lib /usr/X11R6/bin /usr/X11R6/sbin  /usr/e1* /usr/local /usr/qt* /usr/kde/*/lib /usr/*-*-linux-gnu /opt /var/qmail /var/vpopmail /home/httpd/cgi-bin"

# Base of temporary files names.
LIST=~/.revdep-rebuild

shopt -s nullglob
shopt -s expand_aliases
unalias -a

NO="\x1b[0;0m"
BR="\x1b[0;01m"
CY="\x1b[36;01m"
GR="\x1b[32;01m"
RD="\x1b[31;01m"
YL="\x1b[33;01m"
BL="\x1b[34;01m"

alias echo_v=echo

PACKAGE_NAMES=false
SONAME="not found"
SONAME_GREP=fgrep
SEARCH_BROKEN=true

while : ; do
	case "$1" in
	-h | --help )
		echo "Usage: $0 [OPTIONS] [--] [EMERGE_OPTIONS]"
		echo
		echo "Broken reverse dependency rebuilder."
		echo
		echo "  -X, --package-names  recompile based on package names, not exact versions"
		echo "      --soname SONAME  recompile packages using library with SONAME instead"
		echo "                       of broken library"
		echo "      --soname-regexp SONAME"
		echo "                       the same as --soname, but accepts grep-style regexp"
		echo "  -q, --quiet          be less verbose"
		echo
		echo "Calls emerge, all other options are used for it (e. g. -p, --pretend)."
		echo
		echo "Report bugs to <utx@@gentoo.org>"
		exit 0
		;;
	-X | --package-names )
		PACKAGE_NAMES=true
		shift
		;;
	-q | --quiet )
		alias echo_v=:
		shift
		;;
	--soname=* )
		SONAME="${1#*=}"
		SEARCH_BROKEN=false
		shift
		;;
	--soname )
		SONAME="$2"
		SEARCH_BROKEN=false
		shift 2
		;;
	--soname-regexp=* )
		SONAME="${1#*=}"
		SONAME_GREP=grep
		SEARCH_BROKEN=false
		shift
		;;
	--soname-regexp )
		SONAME="$2"
		SONAME_GREP=grep
		SEARCH_BROKEN=false
		shift 2
		;;
	-- )
		shift
		break
		;;
	* )
		break
		;;
	esac
done

function set_trap () {
	trap "rm_temp $1" SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM
}

function rm_temp () {
	echo " terminated."
	echo "Removing incomplete $1."
	rm $1
	echo
	exit 1
}

if $SEARCH_BROKEN ; then
	SONAME_SEARCH="$SONAME"
	LLIST=$LIST
	HEAD_TEXT="broken by any package update"
	OK_TEXT="Dynamic linking on your system is consistent"
	WORKING_TEXT=" consistency"
else
	SONAME_SEARCH="	$SONAME "
	LLIST=${LIST}_$(echo "$SONAME_SEARCH$SONAME" | md5sum | head -c 8)
	HEAD_TEXT="using given shared object name"
	OK_TEXT="There are no dynamic links to $SONAME"
	WORKING_TEXT=""
fi

echo
echo "Checking reverse dependencies..."
echo "Packages containing binaries and libraries $HEAD_TEXT,"
echo "will be recompiled."

echo
echo -n -e "${GR}Collecting system binaries and libraries...${NO}"
if [ -f $LIST.1_files ] ; then
	echo " using existing $LIST.1_files."
else
	set_trap "$LIST.1_files"
	find $SEARCH_DIRS -type f \( -perm +u+x -o -name '*.so' -o -name '*.so.*' \) 2>/dev/null >$LIST.1_files
	echo -e " done.\n  ($LIST.1_files)"
fi

if $SEARCH_BROKEN ; then
	echo
	echo -n -e "${GR}Collecting complete LD_LIBRARY_PATH...${NO}"
	if [ -f $LIST.2_ldpath ] ; then
	echo " using existing $LIST.2_ldpath."
	else
	set_trap "$LIST.2_ldpath"
	(
		grep '.*\.so\(\|\..*\)$' <$LIST.1_files | sed 's:/[^/]*$::'
		sed '/^#/d;s/#.*$//' </etc/ld.so.conf
	) | uniq | sort | uniq |
	tr '\n' : | tr -d '\r' | sed 's/:$//' >$LIST.2_ldpath
	echo -e " done.\n  ($LIST.2_ldpath)"
	fi
	export COMPLETE_LD_LIBRARY_PATH="$(cat $LIST.2_ldpath)"
fi

echo
echo -n -e "${GR}Checking dynamic linking$WORKING_TEXT...${NO}"
if [ -f $LLIST.3_rebuild ] ; then
	echo " using existing $LLIST.3_rebuild."
else
	echo_v
	set_trap "$LLIST.3_rebuild"
	LD_MASK="\\(	$(echo "$LD_LIBRARY_MASK" | sed 's/\./\\./g;s/ / \\|	/g') \\)"
	echo -n >$LLIST.3_rebuild
	cat $LIST.1_files | while read FILE ; do
	# Note: double checking seems to be faster than single
	# with complete path (special add ons are rare).
	if ldd "$FILE" 2>/dev/null | grep -v "$LD_MASK" |
		$SONAME_GREP -q "$SONAME_SEARCH" ; then
		if $SEARCH_BROKEN ; then
		if LD_LIBRARY_PATH="$COMPLETE_LD_LIBRARY_PATH" \
		ldd "$FILE" 2>/dev/null | grep -v "$LD_MASK" |
			$SONAME_GREP -q "$SONAME_SEARCH" ; then
			echo "$FILE" >>$LLIST.3_rebuild
			echo_v "  broken $FILE (requires $(ldd "$FILE" | sed -n 's/	\(.*\) => not found$/\1/p' | tr '\n' ' ' | sed 's/ $//' ))"
		fi
		else
		echo "$FILE" >>$LLIST.3_rebuild
		echo_v "  found $FILE"
		fi
	fi
	done
	echo -e " done.\n  ($LLIST.3_rebuild)"
fi

if $PACKAGE_NAMES ; then
	EXACT_EBUILDS=false

	echo
	echo -n -e "${GR}Assigning files to packages...${NO}"
	if [ -f $LLIST.4_packages_raw ] ; then
		echo " using existing $LLIST.4_packages_raw."
	else
		set_trap "$LLIST.4_packages_raw"
		echo -n >$LLIST.4_packages_raw
		echo -n >$LLIST.4_package_owners
		cat $LLIST.3_rebuild | while read FILE ; do
			PKG="$(qpkg -nc -f "$FILE")"
			if [ -z "$PKG" ] ; then
				echo -n -e "\n  ${RD}*** $FILE not owned by any package is broken! ***${NO}"
				echo "$FILE -> (none)" >> $LLIST.4_package_owners
				echo_v -n -e "\n  $FILE -> (none)"
			else
				echo "$PKG" >> $LLIST.4_packages_raw
				echo "$FILE -> $PKG" >> $LLIST.4_package_owners
				echo_v -n -e "\n  $FILE -> $PKG"
			fi
		done
		echo_v
		echo -e " done.\n  ($LLIST.4_packages_raw, $LLIST.4_package_owners)"
	fi

	echo
	echo -n -e "${GR}Cleaning list of packages to rebuild...${NO}"
	if [ -f $LLIST.5_packages ] ; then
		echo " using existing $LLIST.5_packages."
	else
		set_trap "$LLIST.5_packages"
		sort <$LLIST.4_packages_raw | uniq >$LLIST.5_packages
		echo -e " done.\n  ($LLIST.5_packages)"
	fi

	RAW_REBUILD_LIST="$(cat $LLIST.5_packages | tr '\n' ' ')"

else
	EXACT_EBUILDS=true

	echo
	echo -n -e "${GR}Assigning files to ebuilds...${NO}"
	if [ -f $LLIST.4_ebuilds ] ; then
		echo " using existing $LLIST.4_ebuilds."
	else
		if [ -s "$LLIST.3_rebuild" ] ; then
			set_trap "$LLIST.4_ebuilds"
			cat $LLIST.3_rebuild | sed 's/^/obj /;s/$/ /' |
			(
				cd /var/db/pkg
				fgrep -l -f - */*/CONTENTS
			) | sed s:/CONTENTS:: > $LLIST.4_ebuilds
			echo -e " done.\n  ($LLIST.4_ebuilds)"
		else
			echo " Nothing to rebuild"
			echo -n > $LLIST.4_ebuilds
		fi
	fi

	RAW_REBUILD_LIST="$(cat $LLIST.4_ebuilds | sed s/^/=/ | tr '\n' ' ')"
fi

echo
echo -n -e "${GR}Evaluating package order...${NO}"
if [ -f $LLIST.5_order ] ; then
	echo " using existing $LLIST.5_order."
else
	if [ ! -z "$RAW_REBUILD_LIST" ] ; then
		REBUILD_GREP="^\\($( (emerge --nospinner --pretend --oneshot --nodeps $RAW_REBUILD_LIST ; echo $? >$LLIST.5_status ) | sed -n 's/\./\\&/g;s/ //g;s/$/\\/;s/\[[^]]*\]//gp' | tr '\n' '|' | sed 's/|$//'))\$"
		if [ $(cat $LLIST.5_status) -gt 0 ] ; then
			echo ""
			echo -e "${RD}Warning: Failed to resolve package order."
			echo -e "Will merge in \"random\" order!${NO}"
			echo "Possible reasons:"
			echo "- Some ebuilds are no more in portage tree."
			echo "- Some ebuilds are masked, try to change ACCEPT_KEYWORDS=\"~<your platform>\""
			echo "  and/or use /etc/portage/package.unmask"
			for i in . . . . . ; do
			echo -n -e '\a.'
			sleep 1
			done
			ln -f $LLIST.4_ebuilds $LLIST.5_order
		else
			emerge --nospinner --pretend --oneshot --emptytree $RAW_REBUILD_LIST | sed -n 's/ //g;s/^.*\]//p' | grep "$REBUILD_GREP" >$LLIST.5_order
		fi
	else
		echo -n "" >$LLIST.5_order
	fi
	echo -e " done.\n  ($LLIST.5_order)"
fi

REBUILD_LIST="$(cat $LLIST.5_order | sed s/^/=/ | tr '\n' ' ')"

trap - SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM

if [ -z "$REBUILD_LIST" ] ; then
	echo -e "\n${GR}$OK_TEXT... All done.${NO} "
	rm $LIST.[1-2]_*
	rm $LLIST.[3-9]_*
	exit 0
fi

IS_REAL_MERGE=true
echo " $* " | grep -q '\( -p \| --pretend \)' && IS_REAL_MERGE=false

echo
echo -e "${GR}All prepared. Starting rebuild...${NO}"
echo "emerge --oneshot --nodeps $@@ $REBUILD_LIST"
if $IS_REAL_MERGE ; then
	for i in . . . . . . . . . . ; do
		echo -n -e '\a.'
		sleep 1
	done
	echo
fi

#if $EXACT_EBUILDS ; then
# Uncomment following, if you want to recompile masked ebuilds.
## FIXME: Check for PORTDIR_OVERLAY
#	echo -e "${GR}Temporarilly disablink package mask...${NO}"
#	trap "mv -i /usr/portage/profiles/package.mask.hidden /usr/portage/profiles/package.mask ; echo -e "\\n\\nTerminated." ; exit 1" \
#	SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM
#	mv -i /usr/portage/profiles/package.mask /usr/portage/profiles/package.mask.hidden
#fi

# Run in background to correctly handle Ctrl-C
(
	emerge --oneshot --nodeps $@@ $REBUILD_LIST
	echo $? >$LLIST.6_status
) &
wait

#if $EXACT_EBUILDS ; then
#	mv -i /usr/portage/profiles/package.mask.hidden /usr/portage/profiles/package.mask
#	trap - SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM
#fi

if [ "$(cat $LLIST.6_status)" -gt 0 ] ; then
	echo
	echo -e "${RD}Result is not OK, you have following chances:${NO}"
	echo "- if emerge failed during build, fix the problems and re-run revdep-rebuild"
	echo "    or"
	echo "- use -X or --package-names as first argument (try to rebuild package, not exact"
	echo "  ebuild - ignores SLOT!)"
	echo "    or"
	echo "- set ACCEPT_KEYWORDS=\"~<your platform>\" and/or /etc/portage/package.unmask"
	echo "  (and remove $LLIST.5_order to be evaluated again)"
	echo "    or"
	echo "- modify the above emerge command and run it manually"
	echo "    or"
	echo "- compile or unmerge unsatisfied packages manually, remove temporary files and"
	echo "  try again (you can edit package/ebuild list first)"
	echo
	echo -e "${GR}To remove temporary files, please run:${NO}"
	echo "rm $LIST*.?_*"
else
	if $IS_REAL_MERGE ; then
		trap "echo -e \" terminated. Please remove them manually:\nrm $LIST*.?_*\" ; exit 1" \
			SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM
		echo -n -e "${GR}Build finished correctly. Removing temporary files...${NO} "
		for i in . . . . . . . . . . ; do
			echo -n -e '.'
			sleep 1
		done
		echo
		rm $LIST.[1-2]_*
		rm $LLIST.[3-9]_*
		echo "You can re-run revdep-rebuild to verify that all libraries and binaries"
		echo "are fixed. If some inconsistency remains, it can be orphaned file, deep"
		echo "dependency, binary package or specially evaluated library."
		else
		echo -e "${GR}Now you can remove -p (or --pretend) from arguments and re-run revdep-rebuild.${NO}"
	fi
fi
@


1.4
log
@speed fix #26270 and fix indentation
@
text
@d4 1
a4 1
# $Header: /home/cvsroot/gentoo-x86/app-admin/gentoolkit/files/scripts/revdep-rebuild-2,v 1.1 2003/07/09 16:46:58 utx Exp $
@


1.3
log
@cleanup
@
text
@d53 1
a53 1
    case "$1" in
d55 16
a70 16
	    echo "Usage: $0 [OPTIONS] [--] [EMERGE_OPTIONS]"
	    echo
	    echo "Broken reverse dependency rebuilder."
	    echo
	    echo "  -X, --package-names  recompile based on package names, not exact versions"
	    echo "      --soname SONAME  recompile packages using library with SONAME instead"
	    echo "                       of broken library"
	    echo "      --soname-regexp SONAME"
	    echo "                       the same as --soname, but accepts grep-style regexp"
	    echo "  -q, --quiet          be less verbose"
	    echo
	    echo "Calls emerge, all other options are used for it (e. g. -p, --pretend)."
	    echo
	    echo "Report bugs to <utx@@gentoo.org>"
	    exit 0
	    ;;
d72 3
a74 3
	    PACKAGE_NAMES=true
	    shift
	    ;;
d76 3
a78 3
	    alias echo_v=:
	    shift
	    ;;
d80 4
a83 4
	    SONAME="${1#*=}"
	    SEARCH_BROKEN=false
	    shift
	    ;;
d85 4
a88 4
	    SONAME="$2"
	    SEARCH_BROKEN=false
	    shift 2
	    ;;
d90 5
a94 5
	    SONAME="${1#*=}"
	    SONAME_GREP=grep
	    SEARCH_BROKEN=false
	    shift
	    ;;
d96 5
a100 5
	    SONAME="$2"
	    SONAME_GREP=grep
	    SEARCH_BROKEN=false
	    shift 2
	    ;;
d102 3
a104 3
	    shift
	    break
	    ;;
d106 3
a108 3
	    break
	    ;;
    esac
d112 1
a112 1
    trap "rm_temp $1" SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM
d116 5
a120 5
    echo " terminated."
    echo "Removing incomplete $1."
    rm $1
    echo
    exit 1
d124 5
a128 5
    SONAME_SEARCH="$SONAME"
    LLIST=$LIST
    HEAD_TEXT="broken by any package update"
    OK_TEXT="Dynamic linking on your system is consistent"
    WORKING_TEXT=" consistency"
d130 5
a134 5
    SONAME_SEARCH="	$SONAME "
    LLIST=${LIST}_$(echo "$SONAME_SEARCH$SONAME" | md5sum | head -c 8)
    HEAD_TEXT="using given shared object name"
    OK_TEXT="There are no dynamic links to $SONAME"
    WORKING_TEXT=""
d145 1
a145 1
    echo " using existing $LIST.1_files."
d147 3
a149 3
    set_trap "$LIST.1_files"
    find $SEARCH_DIRS -type f \( -perm +u+x -o -name '*.so' -o -name '*.so.*' \) 2>/dev/null >$LIST.1_files
    echo -e " done.\n  ($LIST.1_files)"
d153 3
a155 3
    echo
    echo -n -e "${GR}Collecting complete LD_LIBRARY_PATH...${NO}"
    if [ -f $LIST.2_ldpath ] ; then
d157 1
a157 1
    else
d160 2
a161 2
	    grep '.*\.so\(\|\..*\)$' <$LIST.1_files | sed 's:/[^/]*$::'
	    sed '/^#/d;s/#.*$//' </etc/ld.so.conf
d165 2
a166 2
    fi
    export COMPLETE_LD_LIBRARY_PATH="$(cat $LIST.2_ldpath)"
d172 1
a172 1
    echo " using existing $LLIST.3_rebuild."
d174 7
a180 7
    echo_v
    set_trap "$LLIST.3_rebuild"
    LD_MASK="\\(	$(echo "$LD_LIBRARY_MASK" | sed 's/\./\\./g;s/ / \\|	/g') \\)"
    echo -n >$LLIST.3_rebuild
    cat $LIST.1_files | while read FILE ; do
# Note: double checking seems to be faster than single
# with complete path (special add ons are rare).
d182 2
a183 2
	    $SONAME_GREP -q "$SONAME_SEARCH" ; then
	    if $SEARCH_BROKEN ; then
d186 3
a188 3
		    $SONAME_GREP -q "$SONAME_SEARCH" ; then
		    echo "$FILE" >>$LLIST.3_rebuild
		    echo_v "  broken $FILE (requires $(ldd "$FILE" | sed -n 's/	\(.*\) => not found$/\1/p' | tr '\n' ' ' | sed 's/ $//' ))"
d190 1
a190 1
	    else
d193 1
a193 1
	    fi
d195 2
a196 2
    done
    echo -e " done.\n  ($LLIST.3_rebuild)"
d200 1
a200 1
    EXACT_EBUILDS=false
d202 23
a224 23
    echo
    echo -n -e "${GR}Assigning files to packages...${NO}"
    if [ -f $LLIST.4_packages_raw ] ; then
	echo " using existing $LLIST.4_packages_raw."
    else
	set_trap "$LLIST.4_packages_raw"
	echo -n >$LLIST.4_packages_raw
	echo -n >$LLIST.4_package_owners
	cat $LLIST.3_rebuild | while read FILE ; do
	    PKG="$(qpkg -nc -f "$FILE")"
	    if [ -z "$PKG" ] ; then
		echo -n -e "\n  ${RD}*** $FILE not owned by any package is broken! ***${NO}"
		echo "$FILE -> (none)" >> $LLIST.4_package_owners	    
		echo_v -n -e "\n  $FILE -> (none)"
	    else
		echo "$PKG" >> $LLIST.4_packages_raw
		echo "$FILE -> $PKG" >> $LLIST.4_package_owners	    
		echo_v -n -e "\n  $FILE -> $PKG"
	    fi
	done
	echo_v
	echo -e " done.\n  ($LLIST.4_packages_raw, $LLIST.4_package_owners)"
    fi
d226 9
a234 9
    echo
    echo -n -e "${GR}Cleaning list of packages to rebuild...${NO}"
    if [ -f $LLIST.5_packages ] ; then
	echo " using existing $LLIST.5_packages."
    else
	set_trap "$LLIST.5_packages"
	sort <$LLIST.4_packages_raw | uniq >$LLIST.5_packages
	echo -e " done.\n  ($LLIST.5_packages)"
    fi
d236 1
a236 1
    RAW_REBUILD_LIST="$(cat $LLIST.5_packages | tr '\n' ' ')"
d239 1
a239 1
    EXACT_EBUILDS=true
d241 18
a258 13
    echo
    echo -n -e "${GR}Assigning files to ebuilds...${NO}"
    if [ -f $LLIST.4_ebuilds ] ; then
	echo " using existing $LLIST.4_ebuilds."
    else
	set_trap "$LLIST.4_ebuilds"
	cat $LLIST.3_rebuild | sed 's/^/obj /;s/$/ /' |
	(
	    cd /var/db/pkg
	    fgrep -l -f - */*/CONTENTS
	) | sed s:/CONTENTS:: > $LLIST.4_ebuilds
	echo -e " done.\n  ($LLIST.4_ebuilds)"
    fi
d260 1
a260 1
    RAW_REBUILD_LIST="$(cat $LLIST.4_ebuilds | sed s/^/=/ | tr '\n' ' ')"
d266 1
a266 1
    echo " using existing $LLIST.5_order."
d268 18
a285 15
    if [ ! -z "$RAW_REBUILD_LIST" ] ; then
	REBUILD_GREP="^\\($( (emerge --nospinner --pretend --oneshot --nodeps $RAW_REBUILD_LIST ; echo $? >$LLIST.5_status ) | sed -n 's/\./\\&/g;s/ //g;s/$/\\/;s/\[[^]]*\]//gp' | tr '\n' '|' | sed 's/|$//'))\$"
	if [ $(cat $LLIST.5_status) -gt 0 ] ; then
	    echo ""
	    echo -e "${RD}Warning: Failed to resolve package order."
	    echo -e "Will merge in \"random\" order!${NO}"
	    echo "Possible reasons:"
	    echo "- Some ebuilds are no more in portage tree."
	    echo "- Some ebuilds are masked, try to change ACCEPT_KEYWORDS=\"~<your platform>\""
	    echo "  and/or use /etc/portage/package.unmask"
	    for i in . . . . . ; do
		echo -n -e '\a.'
		sleep 1
	    done
	    ln -f $LLIST.4_ebuilds $LLIST.5_order
d287 1
a287 1
	    emerge --nospinner --pretend --oneshot --emptytree $RAW_REBUILD_LIST | sed -n 's/ //g;s/^.*\]//p' | grep "$REBUILD_GREP" >$LLIST.5_order
d289 1
a289 4
    else
	echo -n "" >$LLIST.5_order
    fi
    echo -e " done.\n  ($LLIST.5_order)"
d297 4
a300 4
    echo -e "\n${GR}$OK_TEXT... All done.${NO} "
    rm $LIST.[1-2]_*
    rm $LLIST.[3-9]_*
    exit 0
d310 5
a314 5
    for i in . . . . . . . . . . ; do
	echo -n -e '\a.'
	sleep 1
    done
    echo
d320 2
a321 2
#    echo -e "${GR}Temporarilly disablink package mask...${NO}"
#    trap "mv -i /usr/portage/profiles/package.mask.hidden /usr/portage/profiles/package.mask ; echo -e "\\n\\nTerminated." ; exit 1" \
d323 1
a323 1
#    mv -i /usr/portage/profiles/package.mask /usr/portage/profiles/package.mask.hidden
d328 2
a329 2
    emerge --oneshot --nodeps $@@ $REBUILD_LIST
    echo $? >$LLIST.6_status
d334 2
a335 2
#    mv -i /usr/portage/profiles/package.mask.hidden /usr/portage/profiles/package.mask
#    trap - SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM
d339 17
a355 17
    echo
    echo -e "${RD}Result is not OK, you have following chances:${NO}"
    echo "- if emerge failed during build, fix the problems and re-run revdep-rebuild"
    echo "    or"
    echo "- use -X or --package-names as first argument (try to rebuild package, not exact"
    echo "  ebuild - ignores SLOT!)"
    echo "    or"
    echo "- set ACCEPT_KEYWORDS=\"~<your platform>\" and/or /etc/portage/package.unmask"
    echo "  (and remove $LLIST.5_order to be evaluated again)"
    echo "    or"
    echo "- modify the above emerge command and run it manually"
    echo "    or"
    echo "- compile or unmerge unsatisfied packages manually, remove temporary files and"
    echo "  try again (you can edit package/ebuild list first)"
    echo
    echo -e "${GR}To remove temporary files, please run:${NO}"
    echo "rm $LIST*.?_*"
d357 17
a373 17
    if $IS_REAL_MERGE ; then
	trap "echo -e \" terminated. Please remove them manually:\nrm $LIST*.?_*\" ; exit 1" \
	    SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM
	echo -n -e "${GR}Build finished correctly. Removing temporary files...${NO} "
	for i in . . . . . . . . . . ; do
	    echo -n -e '.'
	    sleep 1
	done
	echo
	rm $LIST.[1-2]_*
	rm $LLIST.[3-9]_*
	echo "You can re-run revdep-rebuild to verify that all libraries and binaries"
	echo "are fixed. If some inconsistency remains, it can be orphaned file, deep"
	echo "dependency, binary package or specially evaluated library."
    else
	echo -e "${GR}Now you can remove -p (or --pretend) from arguments and re-run revdep-rebuild.${NO}"
    fi
@


1.2
log
@cosmetical - temporary files name base change
@
text
@d4 3
a6 1
# $Header: /home/cvsroot/gentoo-x86/app-admin/gentoolkit/files/scripts/revdep-rebuild,v 1.1 2003/05/08 11:38:08 liquidx Exp $
d11 10
a20 2
# FIXME: Rebuild order should follow DEPEND tree, otherwise packages
# can be rebuild incorrectly or fail.
d25 5
d48 3
d60 4
d79 22
d123 14
d139 1
a139 1
echo "Packages containing binaries and libraries broken by any package update,"
d148 1
a148 2
# Note /usr/libexec and /usr/local/subprefix cotradicts FHS, but are present
    find /lib /bin /sbin /usr/lib /usr/bin /usr/sbin /usr/libexec /usr/X11R6/lib /usr/X11R6/bin /usr/X11R6/sbin /usr/local /usr/kde/*/lib /usr/*-*-linux-gnu /opt -type f \( -perm +u+x -o -name '*.so' -o -name '*.so.*' \) 2>/dev/null >$LIST.1_files
d152 15
a166 12
echo
echo -n -e "${GR}Collecting complete LD_LIBRARY_PATH...${NO}"
if [ -f $LIST.2_ldpath ] ; then
    echo " using existing $LIST.2_ldpath."
else
    set_trap "$LIST.2_ldpath"
    (
	grep '.*\.so\(\|\..*\)$' <$LIST.1_files | sed 's:/[^/]*$::'
	sed '/^#/d;s/#.*$//' </etc/ld.so.conf
    ) | uniq | sort | uniq |
    tr '\n' : | tr -d '\r' | sed 's/:$//' >$LIST.2_ldpath
    echo -e " done.\n  ($LIST.2_ldpath)"
a167 1
export COMPLETE_LD_LIBRARY_PATH="$(cat $LIST.2_ldpath)"
d170 3
a172 3
echo -n -e "${GR}Checking dynamic linking consistency...${NO}"
if [ -f $LIST.3_broken ] ; then
    echo " using existing $LIST.3_broken."
d175 1
a175 1
    set_trap "$LIST.3_broken"
d177 1
a177 1
    echo -n >$LIST.3_broken
d181 4
a184 3
	if ldd "$FILE" 2>/dev/null  | grep -v "$LD_MASK" |
	    fgrep -q 'not found' ; then
	    if LD_LIBRARY_PATH="$COMPLETE_LD_LIBRARY_PATH" \
d186 7
a192 3
		fgrep -q 'not found' ; then
		echo "$FILE" >>$LIST.3_broken
		echo_v "  broken $FILE (requires $(ldd "$FILE" | sed -n 's/	\(.*\) => not found$/\1/p' | tr '\n' ' ' | sed 's/ $//' ))"
d196 1
a196 1
    echo -e " done.\n  ($LIST.3_broken)"
d204 2
a205 2
    if [ -f $LIST.4_packages_raw ] ; then
	echo " using existing $LIST.4_packages_raw."
d207 4
a210 4
	set_trap "$LIST.4_packages_raw"
	echo -n >$LIST.4_packages_raw
	echo -n >$LIST.4_package_owners
	cat $LIST.3_broken | while read FILE ; do
d214 1
a214 1
		echo "$FILE -> (none)" >> $LIST.4_package_owners	    
d217 2
a218 2
		echo "$PKG" >> $LIST.4_packages_raw
		echo "$FILE -> $PKG" >> $LIST.4_package_owners	    
d223 1
a223 1
	echo -e " done.\n  ($LIST.4_packages_raw, $LIST.4_package_owners)"
d228 2
a229 2
    if [ -f $LIST.5_packages ] ; then
	echo " using existing $LIST.5_packages."
d231 3
a233 3
	set_trap "$LIST.5_packages"
	sort <$LIST.4_packages_raw | uniq >$LIST.5_packages
	echo -e " done.\n  ($LIST.5_packages)"
d236 1
a236 1
    REBUILD_LIST="$(cat $LIST.5_packages | tr '\n' ' ')"
d243 2
a244 2
    if [ -f $LIST.4_ebuilds ] ; then
	echo " using existing $LIST.4_ebuilds."
d246 2
a247 2
	set_trap "$LIST.4_ebuilds"
	cat $LIST.3_broken | sed 's/^/obj /;s/$/ /' |
d251 2
a252 2
	) | sed s:/CONTENTS:: > $LIST.4_ebuilds
	echo -e " done.\n  ($LIST.4_ebuilds)"
d255 30
a284 1
    REBUILD_LIST="$(cat $LIST.4_ebuilds | sed s/^/=/ | tr '\n' ' ')"
d287 2
d292 3
a294 2
    echo -e "\n${GR}Dynamic linking on your system is consistent... All done.${NO} "
    rm $LIST.?_*
d324 1
a324 1
    echo $? >$LIST.6_status
d333 1
a333 1
if [ "$(cat $LIST.6_status)" -gt 0 ] ; then
d336 1
a336 1
    echo "- if emerge failed during build, fix the problems and re-run this script"
d341 3
d350 1
a350 1
    echo "rm $LIST.?_*"
d353 1
a353 1
	trap "echo -e \" terminated. Please remove them manually:\nrm $LIST.?_*\" ; exit 1" \
d361 3
a363 2
	rm $LIST.?_*
	echo "You can re-run this script to verify that all libraries and binaries"
d367 1
a367 1
	echo -e "${GR}Now you can remove -p (or --pretend) from arguments and re-run the script.${NO}"
@


1.1
log
@added broken dependency rebuilder script
@
text
@d4 1
a4 1
# $Header: /home/cvsroot/gentoolkit/src/revdep-rebuild/revdep-rebuild,v 1.1 2003/05/08 11:25:30 liquidx Exp $
d16 1
a16 1
LIST=~/.reverse-dep-shlib-rebuild
@

