Date: Fri, 07 Mar 2014 12:29:52 -0500 From: "R. Scott Evans" <freebsd-questions@rsle.net> To: freebsd-questions@freebsd.org Subject: Re: pkg equivalent of "pkg_info -R" Message-ID: <531A0210.3070705@rsle.net> In-Reply-To: <5319F0B7.3030200@netfence.it> References: <53186ABC.5060601@netfence.it> <20140306184030.078a99cedac859b5c5b83e22@embarqmail.com> <53196D17.8000300@FreeBSD.org> <5319F0B7.3030200@netfence.it>
next in thread | previous in thread | raw e-mail | index | archive | help
On 03/07/14 11:15, Andrea Venturoli wrote:
> On 03/07/14 07:54, Matthew Seaman wrote:
>
>> Yes, being able to generate the entire dependency tree would be a
>> desirable option.
>
> Exactly.
>
> In the example I gave, the rationale was, after the vulnerabiliy in
> gnutls, getting a list of services which needed restarting.
>
>> It's not particularly difficult, but it does require
>> implementing recursive behaviour for such lookups. That just needs
>> someone to step up and code it...
>
> I was just surprised that some funcionality I very often use was gone.
> Perhaps I'm doing things in a peculiar ways?
> Are there so few people doing this, that it could be overlooked?
>
> Of course, getting back to the previous example, listing the binaries
> which are linked against gnutls might be another route...
>
>> Until then, you'ld have to write a shell wrapper around pkg query to
>> achieve the same effect.
>
> Ok.
> I'd just hate do duplicate work...
>
> bye
> av.
Okay, you got a python solution but here's my bourne shell version (I
dislike python :-)
-scott
#!/bin/sh
# Show ALL ports required for a given port.
################################################################################
WORK=`pkg info -r $1 | grep -v ":"`
while [ "X$WORK" != "X" ]; do
for word in $WORK; do
if [ "X$NEW" = "X" ]; then
NEW=$word
else
NEW="$NEW $word"
fi
CHECK=`pkg info -r $word | grep -v ":"`
for new in $CHECK; do
testN=`echo "$NEW" | grep -w $new`
testW=`echo "$WORK" | grep -w $new`
if [ "X$testN" = "X" ] && [ "X$testW" = "X" ]; then
WORK="$WORK $new"
fi
done
WC=`echo $WORK | wc -w | cut -w -f 2`
if [ $WC = 1 ]; then
WORK=""
else
WORK=`echo $WORK | cut -d ' ' -f 2-$WC`
fi
done
done
## PRINT ALL RESULTS ON ONE (LONG) LINE
#echo $NEW
## OR THE RESULTS, ONE ENTRY PER LINE (easier to sort)
for X in $NEW; do
echo $X
done
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?531A0210.3070705>
