head	1.4;
access;
symbols
	RELEASE-1_4:1.3.0.2
	GENTOO_1_4_SNAP_2003010800:1.2;
locks; strict;
comment	@# @;


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

1.3
date	2003.03.01.19.48.55;	author lostlogic;	state Exp;
branches;
next	1.2;

1.2
date	2002.07.19.22.59.56;	author lostlogic;	state Exp;
branches;
next	1.1;

1.1
date	2002.07.19.01.13.33;	author lostlogic;	state Exp;
branches;
next	;


desc
@@


1.4
log
@moved to app-portage
@
text
@#!/bin/bash
#Shows unrequired packages and missing dependencies.
#Author/Maintainer: Brandon Low <lostlogic@@gentoo.org>
#Author: Jerry Haltom <ssrit@@larvalstage.net>

PROG=`basename ${0}`

tmp="/tmp/$$"

#Get PORTDIR_OVERLAY from portage
PORTDIR_OVERLAY="$(/usr/lib/portage/bin/portageq portdir_overlay)"

rm -rf ${tmp} > /dev/null 2>&1
mkdir ${tmp} > /dev/null 2>&1

declare -i i

set -- `getopt -n ${PROG} -o N,R,U,I,v,q,C,h -l needed,removed,unneeded,interactive,verbose,quiet,nocolor,help -- ${*/ --/};[ $? != 0 ] && echo "y"`

while [ ${#} -gt 0 ]
do
	a=${1}
	shift
		case "${a}" in

		-I|--interactive)
				interactive=y
				;;

		-N|--needed)
				needed=y
				;;

		-U|--unneeded)
				unneeded=y
				;;

		-R|--removed)
				removed=y
				;;

		-v|--verbose)
				verb=y
				;;

		-q|--quiet)
				quiet=y
				;;

		-C|--nocolor)
				nocolor=y
				;;

		-h|--help)
				usage=y
				;;

		--)
		[ ${1} ] && usage=y && broke=y
				break
				;;

		*)
		usage=y
		broke=y
		echo "FIXME - OPTION PARSING - ${a}"
		break
		;;

		esac
done

if [ ! ${needed} ] && [ ! ${unneeded} ] && [ ! ${removed} ]; then
  needed=y
  unneeded=y
  removed=y
fi

#Set up colors
if [ ! "${nocolor}" ]; then
		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"
elif [ ${quiet} ] && (
	   ( [ ${needed} ] && [ ${unneeded} ] ) ||
	   ( [ ${unneeded} ] && [ ${removed} ] ) ||
	   ( [ ${removed} ] && [ ${needed} ] )
	 ); then
	NEED=" N"
	UNNE=" U"
	REMO=" R"
fi

if [ ${usage} ]; then
  echo -e "${BR}GenToolKit's Dependency Checker!
${NO}Displays packages that are installed but which none 
of the packages in world or system depend on, and 
displays packages which are depended on by world or
system, but are not currently installed.

${BR}USAGE:
  ${BL}${PROG}${YL}  [${NO}options${YL}]${NO}
  ${BL}${PROG}${GR}  --help${NO}

${BR}OPTIONS:
  ${GR}-U, --unneeded${NO}	display unneeded packages that are installed (${GR}green${NO})
  ${GR}-N, --needed${NO}		display needed packages that are not installed (${RD}red${NO})
  ${GR}-R, --removed${NO}		display installed packages not in portage (${YL}yellow${NO})

  ${GR}-I, --interactive${NO}	interactively modify world file before proceeding
  ${GR}-C, --nocolor${NO}		output without color, if necessary, package types are 
			noted with ${GR}U, N${NO} and ${GR}R${NO} respectively
  ${GR}-v, --verbose${NO}		be more verbose
  ${GR}-q, --quiet${NO}			be quiet (just output the packages, no extra info)

${BR}NOTES:
  ${GR}*${NO} If this script is run on a system that is not up-to-date or which hasn't 
	been cleaned (with '${BL}emerge -c${NO}') recently, the output may be deceptive.
  ${GR}*${NO} If the same package name appears in all three categories, then it is
	definitely time to update that package and then run '${BL}emerge -c${NO}'.
  ${GR}*${NO} The ${GR}-U, -N${NO} and ${GR}-R${NO} options may be combined, defaults to ${GR}-UNR${NO}"
  rm -rf ${tmp} > /dev/null 2>&1
  [ ${broke} ] && exit 1 || exit 0
fi 

X="\([^/]*\)"

#Retrieve currently merged packages.
if [ ${verb} ];then
	echo -e "${CY}Retrieving currently merged packages.${NO}"
fi
find /var/db/pkg -name '*.ebuild' | \
	sed -e "s:/var/db/pkg/::" \
		-e "s:${X}/${X}/${X}:\1/\2:" | \
	sort | uniq >> ${tmp}/current

if [ ${verb} ]; then
	echo -e "${CY}"`cat ${tmp}/current | wc -l` "currently merged packages.${NO}"
	echo -e
fi

#Retrieve system packages and add to image.
if [ ${verb} ];then
	echo -e "${CY}Retrieving system packages.${NO}"
fi
emerge system -eup | \
	sed -e "/ebuild/s:^.*] \([^ ]*\) *:\1:p;d" | \
	sort | uniq \
	> ${tmp}/system

if [ ${verb} ]; then
	echo -e "${CY}"`cat ${tmp}/system | wc -l 2> /dev/null` "packages contained in system.${NO}"
	echo -e
	echo -e "${CY}Preparing world file.${NO}"
fi

#Create local copy of world and ask user to verify it.
cp /var/cache/edb/world ${tmp}/world

if [ ${interactive} ]; then
	${EDITOR} ${tmp}/world
fi

#Retrieve world packages and dependencies and add to image.
if [ ${verb} ]; then
	echo -e
	echo -e "${CY}Preparing list of installed world packages.${NO}"
	echo -e
fi

cat ${tmp}/current | grep -f ${tmp}/world | sort > ${tmp}/world.inst
find /usr/portage ${PORTDIR_OVERLAY} -iname '*.ebuild' | \
	cut -f4,6 -d/ | sed -e 's:\.ebuild::' > ${tmp}/ebuilds
grep -xf ${tmp}/world.inst ${tmp}/ebuilds >> ${tmp}/world.new

if [ ${verb} ]; then
	echo -e "${CY}"`cat ${tmp}/ebuilds | wc -l`"\tebuilds available.${NO}"
	echo -e "${CY}"`cat ${tmp}/world.new | wc -l`"\tpackages contained in final world file.${NO}"
	echo -e
	echo -e "${CY}List prepared, checking dependencies with emerge -eup${NO}"
fi

sort ${tmp}/world.new |sed -e 's:^:\\\=:' | uniq | xargs emerge -eup | \
	tee ${tmp}/log | sed -e '/ebuild/s:^.*] \([^ ]*\) *$:\1:p;d' > ${tmp}/image.unsorted

depends=`cat ${tmp}/image.unsorted|wc -l`

if [ ${depends} -lt "2" ]; then
	echo -e "${RD}There appears to be an unresolved dependency in your world file."
	echo -e "Please check for masking errors or other world file issues,"
	echo -e "and then try again."
	echo -e
	echo -e "The following is the emerge output for your reference:${NO}"
	cat ${tmp}/log
	rm -rf ${tmp} > /dev/null 2>&1
	exit 1
fi

cat ${tmp}/system >> ${tmp}/image.unsorted

#Cleanup image
sort ${tmp}/image.unsorted | uniq > ${tmp}/image

if [ ${verb} ];then
	echo -e "${CY}"`cat ${tmp}/image | wc -l` "packages contained in final image.${NO}"
	echo -e
fi

#Determine packages that exist in current but not in image.
#These packages are safe to clean up.
if [ ${unneeded} ]; then
	if [ ! ${quiet} ]; then
		echo -e "${CY}These packages have no other packages depending on them.${NO}"
	fi

	grep -vxf ${tmp}/image ${tmp}/current > ${tmp}/unneeded
	for line in `cat ${tmp}/unneeded`;do
		echo -e "${GR}${line}${CY}${UNNE}${NO}"
	done

	if [ ! ${quiet} ];then
		echo -e "${CY}Total of"`cat ${tmp}/unneeded|wc -l` "unneeded packages.${NO}"
	fi
fi

#Determine packages that exist in image but not in current.
#These packages should be added.
if [ ${needed} ]; then
	if [ ! ${quiet} ];then
		echo -e
		echo -e "${CY}These packages are depended upon but are not present on the system.${NO}"
	fi

	grep -vxf ${tmp}/current ${tmp}/image > ${tmp}/needed
	for line in `cat ${tmp}/needed`;do
		echo -e "${RD}${line}${CY}${NEED}${NO}"
	done

	if [ ! ${quiet} ];then
		echo -e "${CY}Total of"`cat ${tmp}/needed|wc -l` "needed packages.${NO}"
	fi
fi

#Determine packages that are installed but not currently in portage
if [ ${removed} ]; then
	if [ ! ${quiet} ];then
		echo -e
		echo -e "${CY}These packages are installed but not in the portage tree.${NO}"
	fi
	grep -xf ${tmp}/current ${tmp}/ebuilds > ${tmp}/hascurrent
	grep -vxf ${tmp}/hascurrent ${tmp}/current > ${tmp}/removed
	for line in `cat ${tmp}/removed`;do
		echo -e "${YL}${line}${CY}${REMO}${NO}"
	done

	if [ ! ${quiet} ];then
		echo -e "${CY}Total of"`cat ${tmp}/removed|wc -l` "removed packages.${NO}"
	fi
fi

rm -rf ${tmp} > /dev/null 2>&1
@


1.3
log
@reincarnate dep-clean
@
text
@@


1.2
log
@Revision bump, 0.1.15 had 2 minor issues in the new dep-clean see ChangeLog
@
text
@d3 1
d9 4
d18 1
a18 1
set -- `getopt -n ${PROG} -o N,R,U,I,v,C,h -l needed,removed,unneeded,interactive,verbose,nocolor,help -- ${*/ --/};[ $? != 0 ] && echo "y"`
d46 4
d88 1
a88 1
elif [ ! ${verb} ] && (
d93 1
a93 1
		NEED=" N"
a97 7
if [ `whoami` != "root" ]
then
	echo -e "${RD}Only root can run ${PROG}${NO}"
	rm -rf ${tmp}
	exit 1
fi

d118 1
d133 3
a135 2
[ ${verb} ] && \
echo -e "${CY}Retrieving currently merged packages.${NO}"
d141 4
a144 4
[ ${verb} ] && \
echo -e "${CY}"`cat ${tmp}/current | wc -l` "currently merged packages.${NO}"
[ ${verb} ] && \
echo -e
d147 3
a149 2
[ ${verb} ] && \
echo -e "${CY}Retrieving system packages.${NO}"
d151 1
a151 3
	grep ebuild | \
	sed -e "s:^.*] ::" \
		-e "s: to /::" | \
a153 2
#		-e "s:-r[0-9]*::" \
#		-e "s:-[0-9].*::" | \
d155 5
a159 4
[ ${verb} ] && \
echo -e "${CY}"`cat ${tmp}/system | wc -l 2> /dev/null` "packages contained in system.${NO}"
[ ${verb} ] && \
echo -e
a161 2
[ ${verb} ] && \
echo -e "${CY}Preparing world file.${NO}"
d164 3
a166 2
[ ${interactive} ] && \
${EDITOR} ${tmp}/world
d168 6
a173 4
[ ${verb} ] && \
echo -e "${CY}"`cat ${tmp}/world | wc -l` "packages contained in world.${NO}"
[ ${verb} ] && \
echo -e
d175 11
a185 3
#Retrieve world packages and dependencies and add to image.
[ ${verb} ] && \
echo -e "${CY}Listing world and total dependencies.${NO}"
d187 2
a188 14
qpkg -I -nc -vv | \
	 grep ebuild | \
	 fgrep "`cat ${tmp}/world`" | \
	 cut -f5,6 -d"/" > ${tmp}/world.all

cat ${tmp}/world.all | sed -e s:$:xxx: | \
	fgrep "`find /usr/portage/ -iname '*.ebuild'|cut -f4,6 -d/ | \
		sed -e s:\\.ebuild:xxx:`" | \
		sed -e "s:^:\\\=:" -e "s:xxx::" > ${tmp}/world.new

sort ${tmp}/world.new | uniq | \
	xargs emerge -eup | tee ${tmp}/log | \
	grep ebuild | \
	sed -e "s:^.*] :: ; s: to /::" > ${tmp}/image.unsorted
d208 4
a211 2
[ ${verb} ] && \
echo -e "${CY}"`cat ${tmp}/image | wc -l` "packages contained in final image.${NO}"
d216 7
a222 10
	[ ${verb} ] && \
	echo -e
	[ ${verb} ] && \
	echo -e "${CY}These packages have no other packages depending on them.${NO}"
	i=0
	for pkg in `cat ${tmp}/current`; do
		if [ "`cat ${tmp}/image | grep -x ${pkg} | wc -l`" -eq "0" ]; then
			echo -e "${GR}${pkg}${CY}${UNNE}${NO}"
			i=${i}+1
		fi
d224 4
a227 2
	[ ${verb} ] && \
	echo -e "${CY}Total of ${i} unneeded packages.${NO}"
d233 8
a240 10
	[ ${verb} ] && \
	echo -e
	[ ${verb} ] && \
	echo -e "${CY}These packages are depended upon but are not present on the system.${NO}"
	i=0
	for pkg in `cat ${tmp}/image`; do
		if [ "`cat ${tmp}/current | grep -x ${pkg} | wc -l`" -eq "0" ]; then
			echo -e "${RD}${pkg}${CY}${NEED}${NO}"
			i=${i}+1
		fi
d242 4
a245 2
	[ ${verb} ] && \
	echo -e "${CY}Total of ${i} needed packages.${NO}"
d250 13
a262 13
	[ ${verb} ] && \
	echo -e
	[ ${verb} ] && \
	echo -e "${CY}These packages are installed but not in the portage tree.${NO}"
	cat ${tmp}/current | sed -e s:$:xxx: | \
		fgrep -v "`find /usr/portage/ -iname '*.ebuild'|cut -f4,6 -d/ | \
			sed -e s:\\\.ebuild:xxx:`" | \
		sed -e "s:xxx:${CY}${REMO}${YL}:" > ${tmp}/world
	echo -ne "${YL}"
	cat ${tmp}/world
	echo -ne "${NO}"
	[ ${verb} ] && \
	echo -e "${CY}Total of" `cat ${tmp}/world|wc -l` "removed packages.${NO}"
a265 1

@


1.1
log
@New script dep-clean, see changelog and man dep-clean for more info.
@
text
@d183 1
a183 1
		sed -e s:\.ebuild:xxx:`" | \
d256 1
a256 1
			sed -e s:\.ebuild:xxx:`" | \
@

