aboutsummaryrefslogtreecommitdiff
path: root/src/ego/ego
diff options
context:
space:
mode:
Diffstat (limited to 'src/ego/ego')
-rw-r--r--src/ego/ego86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/ego/ego b/src/ego/ego
new file mode 100644
index 0000000..f1691f2
--- /dev/null
+++ b/src/ego/ego
@@ -0,0 +1,86 @@
+echo1() {
+ echo "$1"
+}
+
+ego() {
+ local portdir tmpdir category pkg target
+
+ # This is WAY faster than portageq:
+ # portdir=$(portageq portdir)
+ # tmpdir=$(portageq envvar PORTAGE_TMPDIR)/portage
+ eval $(
+ . /etc/make.globals
+ . /etc/make.conf
+ export PORTDIR PORTAGE_TMPDIR
+ export | sed -n '
+ s/^declare -x PORTDIR=/portdir=/p
+ s/^declare -x PORTAGE_TMPDIR=\(.*\)/tmpdir=\1\/portage/p'
+ )
+
+ case $1 in
+ *-*/*)
+ pkg=${1##*/}
+ category=${1%/*}
+ ;;
+
+ ?*)
+ pkg=$1
+ # require an ebuild so that we can block deprecated packages
+ # such as dev-libs/rep-gtk
+ category=$(echo1 $portdir/*-*/$pkg/*.ebuild)
+ [[ -f $category ]] || category=$(echo1 $portdir/*-*/$pkg*/*.ebuild)
+ [[ -f $category ]] || category=$(echo1 $portdir/*-*/*$pkg/*.ebuild)
+ [[ -f $category ]] || category=$(echo1 $portdir/*-*/*$pkg*/*.ebuild)
+ if [[ ! -f $category ]]; then
+ echo "Can't find $pkg in $portdir" >&2
+ return 1
+ fi
+ pkg=${category%/*}
+ pkg=${pkg##*/}
+ category=${category#$portdir/}
+ category=${category%%/*}
+ ;;
+
+ *)
+ # Check if we're under $portdir first
+ pkg=${PWD##*/}
+ category=${PWD%/*}
+ category=${category##*/}
+ if [[ ! -d $portdir/$category/$pkg ]]; then
+ # Next check if we're in PORTAGE_TMPDIR
+ if [[ $PWD = $tmpdir/* ]]; then
+ pkg=${PWD#$tmpdir/}
+ pkg=${pkg%%/*}
+ pkg=${pkg%%-[0-9]*} # not really a valid assumption
+ category=$(echo1 $portdir/*-*/$pkg/*.ebuild)
+ if [[ ! -f $category ]]; then
+ echo "Can't find $pkg in $portdir" >&2
+ return 1
+ fi
+ category=${category#$portdir/}
+ category=${category%%/*}
+ else
+ echo "syntax: ego [pkgname]" >&2
+ echo "or simply ego from a dir under $portdir or $tmpdir" >&2
+ return 1
+ fi
+ fi
+ ;;
+ esac
+
+ # go to tmpdir or portdir?
+ if [[ $PWD/ = */$category/$pkg/* ]]; then
+ [[ -n $tmpdir ]] || tmpdir=$(portageq envvar PORTAGE_TMPDIR)/portage
+ target=$(command ls -1td $tmpdir/$pkg-* 2>/dev/null | head -n 1)
+ if [[ -z $target ]]; then
+ echo "No matches found for $tmpdir/$pkg-*" >&2
+ return 1
+ fi
+ cd $target/work/$pkg* 2>/dev/null ||
+ cd $target/work 2>/dev/null ||
+ cd $target
+ else
+ cd $portdir/$category/$pkg
+ fi
+}
+