lzma -dc "${srcdir}${x}" > ${x%.*} || die "$myfail"
fi
;;
+ xz)
+ if [ "${y}" == "tar" ]; then
+ xz -dc "${srcdir}${x}" | tar xof - ${tar_opts}
+ assert "$myfail"
+ else
+ xz -dc "${srcdir}${x}" > ${x%.*} || die "$myfail"
+ fi
+ ;;
*)
vecho "unpack ${x}: file format not recognized. Ignoring."
;;
fi
}
+hasg() {
+ local x s=$1
+ shift
+ for x ; do [[ ${x} == ${s} ]] && echo "${x}" && return 0 ; done
+ return 1
+}
+hasgq() { hasg "$@" >/dev/null ; }
econf() {
local x
- local LOCAL_EXTRA_ECONF="${EXTRA_ECONF}"
! hasq "$EAPI" 0 1 && [[ $EBUILD_PHASE = compile && \
$(type -t src_configure) = function ]] && \
eqawarn "econf called in src_compile instead of src_configure"
- if [ -z "${ECONF_SOURCE}" ]; then
- ECONF_SOURCE="."
- fi
+ : ${ECONF_SOURCE:=.}
if [ -x "${ECONF_SOURCE}/configure" ]; then
if [ -e "${EPREFIX}"/usr/share/gnuconfig/ ]; then
find "${WORKDIR}" -type f '(' \
done
fi
- if [ ! -z "${CBUILD}" ]; then
- LOCAL_EXTRA_ECONF="--build=${CBUILD} ${LOCAL_EXTRA_ECONF}"
- fi
-
- if [ ! -z "${CTARGET}" ]; then
- LOCAL_EXTRA_ECONF="--target=${CTARGET} ${LOCAL_EXTRA_ECONF}"
- fi
-
# if the profile defines a location to install libs to aside from default, pass it on.
# if the ebuild passes in --libdir, they're responsible for the conf_libdir fun.
- LIBDIR_VAR="LIBDIR_${ABI}"
- if [ -n "${ABI}" -a -n "${!LIBDIR_VAR}" ]; then
- CONF_LIBDIR="${!LIBDIR_VAR}"
+ local CONF_LIBDIR LIBDIR_VAR="LIBDIR_${ABI}"
+ if [[ -n ${ABI} && -n ${!LIBDIR_VAR} ]] ; then
+ CONF_LIBDIR=${!LIBDIR_VAR}
fi
- unset LIBDIR_VAR
- if [ -n "${CONF_LIBDIR}" ] && [ "${*/--libdir}" == "$*" ]; then
- if [ "${*/--exec-prefix}" != "$*" ]; then
- local args="$(echo $*)"
- local -a pref=($(echo ${args/*--exec-prefix[= ]}))
- CONF_PREFIX=${pref}
- [ "${CONF_PREFIX:0:1}" != "/" ] && CONF_PREFIX="/${CONF_PREFIX}"
- elif [ "${*/--prefix}" != "$*" ]; then
- local args="$(echo $*)"
- local -a pref=($(echo ${args/*--prefix[= ]}))
- CONF_PREFIX=${pref}
- [ "${CONF_PREFIX:0:1}" != "/" ] && CONF_PREFIX="/${CONF_PREFIX}"
- else
- CONF_PREFIX="${EPREFIX}/usr"
- fi
- export CONF_PREFIX
- [ "${CONF_LIBDIR:0:1}" != "/" ] && CONF_LIBDIR="/${CONF_LIBDIR}"
-
- CONF_LIBDIR_RESULT="$(strip_duplicate_slashes ${CONF_PREFIX}${CONF_LIBDIR})"
-
- LOCAL_EXTRA_ECONF="--libdir=${CONF_LIBDIR_RESULT} ${LOCAL_EXTRA_ECONF}"
+ if [[ -n ${CONF_LIBDIR} ]] && ! hasgq --libdir=\* "$@" ; then
+ export CONF_PREFIX=$(hasg --exec-prefix=\* "$@")
+ [[ -z ${CONF_PREFIX} ]] && CONF_PREFIX=$(hasg --prefix=\* "$@")
+ : ${CONF_PREFIX:=${EPREFIX}/usr}
+ CONF_PREFIX=${CONF_PREFIX#*=}
+ [[ ${CONF_PREFIX} != /* ]] && CONF_PREFIX="/${CONF_PREFIX}"
+ [[ ${CONF_LIBDIR} != /* ]] && CONF_LIBDIR="/${CONF_LIBDIR}"
+ set -- --libdir="$(strip_duplicate_slashes ${CONF_PREFIX}${CONF_LIBDIR})" "$@"
fi
- vecho "${ECONF_SOURCE}/configure" \
+ set -- \
--prefix="${EPREFIX}"/usr \
+ ${CBUILD:+--build=${CBUILD}} \
--host=${CHOST} \
+ ${CTARGET:+--target=${CTARGET}} \
--mandir="${EPREFIX}"/usr/share/man \
--infodir="${EPREFIX}"/usr/share/info \
--datadir="${EPREFIX}"/usr/share \
--sysconfdir="${EPREFIX}"/etc \
--localstatedir="${EPREFIX}"/var/lib \
"$@" \
- ${LOCAL_EXTRA_ECONF}
+ ${EXTRA_ECONF}
+ vecho "${ECONF_SOURCE}/configure" "$@"
- if ! "${ECONF_SOURCE}/configure" \
- --prefix="${EPREFIX}"/usr \
- --host=${CHOST} \
- --mandir="${EPREFIX}"/usr/share/man \
- --infodir="${EPREFIX}"/usr/share/info \
- --datadir="${EPREFIX}"/usr/share \
- --sysconfdir="${EPREFIX}"/etc \
- --localstatedir="${EPREFIX}"/var/lib \
- "$@" \
- ${LOCAL_EXTRA_ECONF}; then
+ if ! "${ECONF_SOURCE}/configure" "$@" ; then
if [ -s config.log ]; then
echo
fi
die "econf failed"
fi
- elif [ -f "${ECONF_SOURCE:-.}/configure" ]; then
+ elif [ -f "${ECONF_SOURCE}/configure" ]; then
die "configure is not executable"
else
die "no configure script found"
unset -f dump_trace die diefunc quiet_mode vecho elog_base eqawarn elog \
esyslog einfo einfon ewarn eerror ebegin _eend eend KV_major \
KV_minor KV_micro KV_to_int get_KV unset_colors set_colors has \
- hasv hasq qa_source qa_call addread addwrite adddeny addpredict \
+ hasg hasgq hasv hasq qa_source qa_call \
+ addread addwrite adddeny addpredict \
lchown lchgrp esyslog use usev useq has_version portageq \
best_version use_with use_enable register_die_hook check_KV \
keepdir unpack strip_duplicate_slashes econf einstall \
return -7
def __str__(self):
+ if self.optional:
+ return "optional"
myvalue = self.__int__()
if myvalue > self.MEDIUM:
return "hard"
# successfully selected.
prefer_asap = True
- # By default, try to avoid selecting root nodes whenever possible. This
- # helps ensure that the maximimum possible number of soft dependencies
- # have been removed from the graph before their parent nodes have
- # selected. This is especially important when those dependencies are
- # going to be rebuilt by revdep-rebuild or `emerge -e system` after the
- # CHOST has been changed (like when building a stage3 from a stage2).
- accept_root_node = False
-
- # State of prefer_asap and accept_root_node flags for successive
- # iterations that loosen the criteria for node selection.
+ # State of variables for successive iterations that loosen the
+ # criteria for node selection.
#
- # iteration prefer_asap accept_root_node
- # 1 True False
- # 2 False False
- # 3 False True
+ # iteration prefer_asap
+ # 1 True
+ # 2 False
#
- # If no nodes are selected on the 3rd iteration, it is due to
+ # If no nodes are selected on the last iteration, it is due to
# unresolved blockers or circular dependencies.
while not mygraph.empty():
selected_nodes = None
ignore_priority = None
if prefer_asap and asap_nodes:
- """ASAP nodes are merged before their soft deps."""
+ # ASAP nodes are merged before their soft deps. Go ahead and
+ # select root nodes here if necessary, since it's typical for
+ # the parent to have been removed from the graph already.
asap_nodes = [node for node in asap_nodes \
if mygraph.contains(node)]
for node in asap_nodes:
# found a non-root node
selected_nodes = [node]
break
- if not selected_nodes and \
- (accept_root_node or ignore_priority is None):
- # settle for a root node
- selected_nodes = [nodes[0]]
+
if selected_nodes:
break
for ignore_priority in xrange(DepPriority.SOFT,
DepPriority.MEDIUM_SOFT + 1):
for node in nodes:
- if nodes is not asap_nodes and \
- not accept_root_node and \
- not mygraph.parent_nodes(node):
+ if not mygraph.parent_nodes(node):
continue
selected_nodes = set()
if gather_deps(ignore_priority,
prefer_asap = False
continue
- if not selected_nodes and not accept_root_node:
- # Maybe there are only root nodes left, so accept them
- # for the next iteration.
- accept_root_node = True
- continue
-
if selected_nodes and ignore_priority > DepPriority.SOFT:
# Try to merge ignored medium deps as soon as possible.
for node in selected_nodes:
scheduler_graph.add(blocked_pkg, uninst_task,
priority=BlockerDepPriority.instance)
- else:
- # None of the Uninstall tasks are acceptable, so
- # the corresponding blockers are unresolvable.
- # We need to drop an Uninstall task here in order
- # to avoid the circular deps code path, but the
- # blocker will still be counted as an unresolved
- # conflict.
- for node in myblocker_uninstalls.leaf_nodes():
- try:
- mygraph.remove(node)
- except KeyError:
- pass
- else:
- uninst_task = node
- ignored_uninstall_tasks.add(node)
- break
+ # Reset the state variables for leaf node selection and
+ # continue trying to select leaf nodes.
+ prefer_asap = True
+ continue
+
+ if not selected_nodes:
+ # Only select root nodes as a last resort. This case should
+ # only trigger when the graph is nearly empty and the only
+ # remaining nodes are isolated (no parents or children). Since
+ # the nodes must be isolated, ignore_priority is not needed.
+ selected_nodes = get_nodes()
+
+ if not selected_nodes and not myblocker_uninstalls.is_empty():
+ # If possible, drop an uninstall task here in order to avoid
+ # the circular deps code path. The corresponding blocker will
+ # still be counted as an unresolved conflict.
+ uninst_task = None
+ for node in myblocker_uninstalls.leaf_nodes():
+ try:
+ mygraph.remove(node)
+ except KeyError:
+ pass
+ else:
+ uninst_task = node
+ ignored_uninstall_tasks.add(node)
+ break
if uninst_task is not None:
- # After dropping an Uninstall task, reset
- # the state variables for leaf node selection and
+ # Reset the state variables for leaf node selection and
# continue trying to select leaf nodes.
prefer_asap = True
- accept_root_node = False
continue
if not selected_nodes:
raise self._unknown_internal_error()
# At this point, we've succeeded in selecting one or more nodes, so
- # it's now safe to reset the prefer_asap and accept_root_node flags
- # to their default states.
+ # reset state variables for leaf node selection.
prefer_asap = True
- accept_root_node = False
mygraph.difference_update(selected_nodes)
def clone(self):
clone = digraph()
clone.nodes = {}
- for k, v in self.nodes.iteritems():
- clone.nodes[k] = (v[0].copy(), v[1].copy(), v[2])
+ for children, parents, node in self.nodes.itervalues():
+ children_clone = {}
+ for child, priorities in children.iteritems():
+ children_clone[child] = priorities[:]
+ parents_clone = {}
+ for parent, priorities in parents.iteritems():
+ parents_clone[parent] = priorities[:]
+ clone.nodes[node] = (children_clone, parents_clone, node)
clone.order = self.order[:]
return clone
pass
return self._selinux_enabled
+ if sys.hexversion >= 0x3000000:
+ keys = __iter__
+ items = iteritems
+
def _shell_quote(s):
"""
Quote a string in double-quotes and use backslashes to
except ImportError:
import pickle
import os
+import sys
from portage.cache import fs_template
from portage.cache import cache_errors
if "__db" in self.__dict__ and self.__db != None:
self.__db.sync()
self.__db.close()
+
+ if sys.hexversion >= 0x3000000:
+ items = iteritems
# License: GPL2
# $Id$
+import sys
import UserDict
import warnings
import weakref
DeprecationWarning)
return key in self
+ if sys.hexversion >= 0x3000000:
+ keys = __iter__
+ items = iteritems
+
class LazyLoad(UserDict.DictMixin):
"""
Lazy loading of values for a dict
self.pull = None
return key in self.d
+ if sys.hexversion >= 0x3000000:
+ keys = __iter__
+ items = iteritems
+
_slot_dict_classes = weakref.WeakValueDictionary()
def slot_dict_class(keys, prefix="_val_"):
def __str__(self):
return str(dict(self.iteritems()))
+ if sys.hexversion >= 0x3000000:
+ items = iteritems
+ keys = __iter__
+ values = itervalues
+
v = SlotDict
_slot_dict_classes[v.allowed_keys] = v
return v
# License: GPL2
# $Id$
+import sys
from portage.cache import template, cache_errors
from portage.cache.template import reconstruct_eclasses
return [ row[0] for row in self.con.fetchall() ]
+ if sys.hexversion >= 0x3000000:
+ items = iteritems
from portage.cache import cache_errors
from portage.cache.cache_errors import InvalidRestriction
from portage.cache.mappings import ProtectedDict
+import sys
import warnings
class database(object):
if cont:
yield cpv
+ if sys.hexversion >= 0x3000000:
+ keys = __iter__
+ items = iteritems
def serialize_eclasses(eclass_dict):
"""takes a dict, returns a string representing said dict"""