commit:     622535d24325820a5d042b16ebcd1a57b11cd802
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Wed Sep 17 21:20:40 2014 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Wed Sep 17 21:20:40 2014 +0000
URL:        
http://sources.gentoo.org/gitweb/?p=proj/crossdev.git;a=commit;h=622535d2

switch from PORTDIR/PORTDIR_OVERLAY to repositories_configuration

URL: https://bugs.gentoo.org/520880
Signed-off-by: Mike Frysinger <vapier <AT> gentoo.org>

---
 crossdev                | 78 ++++++++++++++++++++++++++++++++++++-------------
 wrappers/emerge-wrapper | 19 ++++++++++--
 2 files changed, 74 insertions(+), 23 deletions(-)

diff --git a/crossdev b/crossdev
index 29fe431..164c2ea 100755
--- a/crossdev
+++ b/crossdev
@@ -7,7 +7,8 @@ CROSSDEV_VER="@CDEVPV@"
 cd /
 umask 0022 #159111
 
-if [[ ${ROOT:-/} != "/" ]] ; then
+: ${ROOT:=/}
+if [[ ${ROOT} != "/" ]] ; then
        echo "Sorry, but crossdev does not support ROOT." 1>&2
        exit 2
 fi
@@ -60,7 +61,7 @@ Options:
 
 Overlay Options:
     ${GOOD}-oS, --overlays${NORMAL} list     Space delimited list of overlays 
to search
-                                [default: \${PORTDIR_OVERLAY}]
+                                [default: \`portageq 
repositories_configuration\`]
     ${GOOD}-oO, --ov-output${NORMAL} path    Overlay to write crossdev package 
links
                                 [default: uses repo with name 'crossdev', or
                                  'cross-\${CTARGET}', or falls back to first
@@ -308,11 +309,56 @@ parse_target() {
        esac
 }
 
+parse_repo_config() {
+       # Ugh, ini parser here we come.
+       # [DEFAULT]
+       # main-repo = gentoo
+       # [crossdev]
+       # location = /usr/local/portage
+       # masters = gentoo
+       # priority = 0
+       local repo_config=$(portageq repositories_configuration "${ROOT}")
+       local flat_config=$(echo "${repo_config}" | gawk '
+               {
+                       if ($1 == "main-repo") {
+                               main_repo = $NF
+                       } else if ($1 ~ /^\[/) {
+                               if (repo_name && loc)
+                                       repos[prio] = repo_name ":" loc
+                               repo_name = gensub(/\[([^\]]*)\]/, "\\1", "", 
$1)
+                               loc = prio = ""
+                       } else if ($1 == "priority") {
+                               prio = $3
+                       } else if ($1 == "location") {
+                               loc = $3
+                       }
+               }
+               END {
+                       repos[prio] = repo_name ":" loc
+
+                       print(main_repo)
+                       asorti(repos, prios)
+                       for (prio in prios)
+                               print(repos[prios[prio]])
+               }
+       ')
+
+       MAIN_REPO_NAME=$(echo "${flat_config}" | head -1)
+       REPO_CONFIG=$(echo "${flat_config}" | sed 1d)
+       MAIN_REPO_PATH=$(echo "${REPO_CONFIG}" | sed -n 
"/^${MAIN_REPO_NAME}:/s,^[^:]*:,,p")
+       if [[ -z ${SEARCH_OVERLAYS} ]] ; then
+               # see if user gave us an overlay search list, otherwise
+               # default to whatever is configured in portage
+               SEARCH_OVERLAYS=$(echo "${REPO_CONFIG}" | sed -e 
"/^${MAIN_REPO_NAME}:/d" -e 's,^[^:]*:,,')
+       fi
+}
+
 setup_portage_vars() {
        local arch=${ARCH} arch_set=${ARCH+set}
        local chost=${CHOST} chost_set=${CHOST+set}
        unset ARCH CHOST
-       eval $(portageq envvar -v PORTDIR_OVERLAY PORTDIR PORT_LOGDIR 
PORTAGE_TMPDIR ARCH CHOST)
+       eval $(portageq envvar -v PORT_LOGDIR PORTAGE_TMPDIR ARCH CHOST)
+       parse_repo_config
 
        # keep the original values, but be aware of the native ones
        HARCH=${ARCH}
@@ -320,24 +366,20 @@ setup_portage_vars() {
        HCHOST=${CHOST}
        [[ ${chost_set} == "set" ]] && CHOST=${chost} || unset CHOST
 
-       # see if user gave us an overlay search list, otherwise
-       # default to whatever is configured in portage
-       : ${SEARCH_OVERLAYS:=${PORTDIR_OVERLAY}}
-
        # see if user told us where to write things, otherwise
        # set up some repos.conf magic if possible.  if not,
        # install our stuff to the first overlay in the list.
        if [[ -z ${CROSSDEV_OVERLAY} ]] ; then
-               CROSSDEV_OVERLAY=${SEARCH_OVERLAYS%% *}
-
                local repo
                for repo in "cross-${CTARGET}" crossdev ; do
-                       repo=$(portageq get_repo_path / "${repo}")
+                       repo=$(echo "${REPO_CONFIG}" | sed -n 
"/^${repo}:/s,^[^:]*:,,p")
                        if [[ -n ${repo} ]] ; then
                                CROSSDEV_OVERLAY=${repo}
                                break
                        fi
                done
+
+               : ${CROSSDEV_OVERLAY:=$(echo "${SEARCH_OVERLAYS}" | head -1)}
        fi
 
        # make sure we have a valid logdir
@@ -626,8 +668,8 @@ show_target_cfg() {
 
 setup_portage_vars
 if [[ -z ${CROSSDEV_OVERLAY} ]] ; then
-       eerror "You need to specify an output overlay.  Please use --ov-output 
or set"
-       eerror "PORTDIR_OVERLAY in your make.conf.  A standard setting is: 
/usr/local/portage"
+       eerror "You need to specify an output overlay.  Please use --ov-output, 
or consult"
+       eerror "https://wiki.gentoo.org/wiki/Overlay/Local_overlay for more 
details."
        exit 1
 fi
 
@@ -663,7 +705,7 @@ multilib_env() {
 
        # ask multilib.eclass to tell us how things work
        inherit() { :; }
-       for p in ${SEARCH_OVERLAYS} ${PORTDIR} ; do
+       for p in ${SEARCH_OVERLAYS} ${MAIN_REPO_PATH} ; do
                p+="/eclass/multilib.eclass"
                if [[ -e ${p} ]] ; then
                        . "${p}"
@@ -832,7 +874,7 @@ set_use_mask() {
 }
 set_links() {
        local cat=$1 pkg=$2 ovl=$3
-       local s srcdir=${PORTDIR} d
+       local s srcdir=${MAIN_REPO_PATH} d
 
        d="${CROSSDEV_OVERLAY}"/cross-${CTARGET}/${pkg}
        # if auto searching and something is already set, leave it be
@@ -952,7 +994,7 @@ set_metadata() {
        fi
 
        # build up a list of possible repos where we can pull from
-       for d in "${BOVL}" "${GOVL}" "${KOVL}" "${LOVL}" ${SEARCH_OVERLAYS} 
"${PORTDIR}" ; do
+       for d in "${BOVL}" "${GOVL}" "${KOVL}" "${LOVL}" ${SEARCH_OVERLAYS} 
"${MAIN_REPO_PATH}" ; do
                [[ -z ${d} ]] && continue
 
                name=
@@ -1090,12 +1132,6 @@ doemerge() {
        eend 0
 }
 
-# Make this "just work" rather than worrying about user not putting
-# this overlay path into their system settings already.
-if [[ -n ${CROSSDEV_OVERLAY} ]] ; then
-       export PORTDIR_OVERLAY="${CROSSDEV_OVERLAY} ${PORTDIR_OVERLAY}"
-fi
-
 # We include the '-u' so that we don't re-emerge packages.  Avoid
 # using --nodeps as packages have more host depends nowadays (like
 # gcc wanting updated mpfr/gmp).  Don't use --oneshot anymore to

diff --git a/wrappers/emerge-wrapper b/wrappers/emerge-wrapper
index 7bcbcf0..154d82e 100755
--- a/wrappers/emerge-wrapper
+++ b/wrappers/emerge-wrapper
@@ -41,7 +41,7 @@ cross_wrap_etc()
        # Re-use existing CHOST->portage ARCH mapping code
        ARCH=$(
                inherit() { :; }
-               . "${PORTDIR}"/eclass/toolchain-funcs.eclass
+               . "${MAIN_REPO_PATH}"/eclass/toolchain-funcs.eclass
                tc-arch
        )
        [[ ${ARCH} == "unknown" ]] && emit_setup_warning
@@ -109,10 +109,25 @@ cross_init()
 
 # CBUILD must be the first thing we export, but might as well avoid
 # running portageq multiple times ...
-import_vars="PORTDIR DISTDIR PORTDIR_OVERLAY MAKEOPTS GENTOO_MIRRORS"
+import_vars="DISTDIR MAKEOPTS GENTOO_MIRRORS"
 eval $(portageq envvar -v CBUILD ${import_vars})
 export CBUILD
 
+# Probably shouldn't hardcode "gentoo" here.
+MAIN_REPO_PATH=$(portageq repositories_configuration / | gawk '
+       {
+               if ($1 == "main-repo") {
+                       main_repo = $NF
+               } else if ($1 ~ /^\[/) {
+                       locs[repo_name] = loc
+                       repo_name = gensub(/\[([^\]]*)\]/, "\\1", "", $1)
+               } else if ($1 == "location") {
+                       loc = $3
+               }
+       }
+       END { print(locs[main_repo]) }
+')
+
 # Get default CHOST value from program name
 CHOST=${0##*/}
 CHOST=${CHOST%-emerge}

Reply via email to