On 2008/02/04, Ryan Hill <[EMAIL PROTECTED]> wrote:
>
> Can someone provide a tool that given a package name simply prints
> the category or cat/pkg, or if ambiguous, prints the multiple
> cat/pkgs or returns an error code? I don't care what it's written in
> as long as it's relatively quick.
As long as you're only interrested in stuffs from the Portage tree,
and not overlays, and you have portage-utils installed along with its
post-sync hook, you can use one of this function:
find_cat1() {
qsearch -CsN "^${1}$"
}
find_cat2() {
sed -n "\\|/${1}/|s:/[^/]*\$::p" "${PORTDIR}"/.ebuild.x \
| uniq
}
Note that find_cat1() is case-insensitive, probably not what you want.
And without portage-utils' ebuilds cache, this works too:
find_cat3() {
pushd "${PORTDIR}" >/dev/null
ls -1d $(sed "s:\$:/${1}:" profiles/categories) 2>/dev/null
popd >/dev/null
}
Here are some benchs (real time, with 1 run from cold I/O cache, and
then 100 runs also from cold I/O cache, with "fuse" as argument):
* find_cat1:
- 0m0.972s
- 0m25.967s
(No real advantage... that's not the primary target of this applet.)
* find_cat2:
- 0m0.237s
- 0m3.746s
(Acceptable in both cases.)
* find_cat3:
- 0m2.319s
- 0m2.607s
(Really slow on first run, but really fast once the tree as been
walked. May be a good choice in some contexts.)
--
TGL.
--
[email protected] mailing list