<pre style='margin:0'>
Joshua Root (jmroot) pushed a commit to branch master
in repository mpbb.

</pre>
<p><a href="https://github.com/macports/mpbb/commit/f83c5266f670e1334e6a3eb1591194c6c0efe593">https://github.com/macports/mpbb/commit/f83c5266f670e1334e6a3eb1591194c6c0efe593</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new f83c526  mpbb dependency management improvements
</span>f83c526 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit f83c5266f670e1334e6a3eb1591194c6c0efe593
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Sat Jan 1 17:54:28 2022 +1100

<span style='display:block; white-space:pre;color:#404040;'>    mpbb dependency management improvements
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    * Only deactivate ports that are not needed for the next build, rather
</span><span style='display:block; white-space:pre;color:#404040;'>      than always deactivating everything.
</span><span style='display:block; white-space:pre;color:#404040;'>    * Only deactivate ports before dependency installations if building
</span><span style='display:block; white-space:pre;color:#404040;'>      from source (most installs will now be from an archive).
</span><span style='display:block; white-space:pre;color:#404040;'>    * Fail fast if a dependency is in the failcache, rather than continuing
</span><span style='display:block; white-space:pre;color:#404040;'>      to check the rest of the deps. That does mean that multiple failed
</span><span style='display:block; white-space:pre;color:#404040;'>      deps might have to be discovered one at a time by maintainers, but
</span><span style='display:block; white-space:pre;color:#404040;'>      on the other hand the failcache checks can really add up and cause us
</span><span style='display:block; white-space:pre;color:#404040;'>      to spend significant time on a port that we already know will fail.
</span><span style='display:block; white-space:pre;color:#404040;'>    * Replace much shell code with Tcl in order to take advantage of direct
</span><span style='display:block; white-space:pre;color:#404040;'>      API access to avoid repeated work.
</span><span style='display:block; white-space:pre;color:#404040;'>    * Turn off verbose and debug output during the final activation step.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    See: https://trac.macports.org/ticket/62621
</span>---
 mpbb-cleanup              |   7 -
 mpbb-install-dependencies | 194 +------------------
 tools/dependencies.tcl    | 460 +++++++++++++++++++++++++++++++++++++++++-----
 3 files changed, 419 insertions(+), 242 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/mpbb-cleanup b/mpbb-cleanup
</span><span style='display:block; white-space:pre;color:#808080;'>index 0594cae..31df409 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/mpbb-cleanup
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/mpbb-cleanup
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -78,13 +78,6 @@ cleanup() {
</span>     echo "----> Free disk space before cleanup: $(format_size "$disk_free_before")"
     echo
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    echo "----> Deactivating ports"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # $option_prefix is set by mpbb
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # shellcheck disable=SC2154
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if [ -n "$("${option_prefix}/bin/port" -q echo active)" ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        "${option_prefix}/bin/port" -fp deactivate active
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span>     if [[ ${BUILDBOT_BUILDERNAME:-unknown} == *-watcher ]]; then
         echo
         echo "----> Uninstalling unneeded ports"
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/mpbb-install-dependencies b/mpbb-install-dependencies
</span><span style='display:block; white-space:pre;color:#808080;'>index ee07521..a69f634 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/mpbb-install-dependencies
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/mpbb-install-dependencies
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -23,195 +23,21 @@ install-dependencies() {
</span>         err "Must specify a port"
         return 1
     fi
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    local dependencies
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    local dependencies_count
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    local dependencies_counter
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    local depname
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    local depvariants
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    local failcachecounter
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    local start_time
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # $option_log_dir is set in mpbb
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # shellcheck disable=SC2154
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    local log_status_dependencies="${option_log_dir}/dependencies-progress.txt"
</span>     local log_subports_progress="${option_log_dir}/ports-progress.txt"
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    local result
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    # prepare the log file and make sure to start with an empty one
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    mkdir -p "${option_log_dir}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    > "$log_status_dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # clear the port list
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    rm -f "${option_work_dir}/all_ports"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # save $@ since 'set' is used below
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    orig_args="$@"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # for timing
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    start_time=$(date +%s)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Only install deps if we're actually going to build the requested port.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Script attempts to get to a state where all dependencies (and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # only dependencies) of the port are active
</span>     # $option_prefix and $thisdir are set in mpbb
     # shellcheck disable=SC2154
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if [[ -f $("${option_prefix}/bin/port-tclsh" "${thisdir}/tools/archive-path.tcl" ${orig_args}) ]]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        echo "${orig_args} Already installed, not installing or activating dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    echo "archive-path took $(expr $(date +%s) - $start_time) seconds" | tee -a "$log_status_dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    start_time=$(date +%s)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # calculate list of dependencies in-order
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # $option_prefix and $thisdir are set in mpbb
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # shellcheck disable=SC2154
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    dependencies=$("${option_prefix}/bin/port-tclsh" "${thisdir}/tools/dependencies.tcl" "$@")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if [ $? -ne 0 ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        echo "Calculating dependencies for '$port' failed, aborting." >&2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        echo "Building '$port' ... [ERROR] (failed to calculate dependencies) maintainers: $(get-maintainers "$port")." >> "$log_subports_progress"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    echo "dependencies took $(expr $(date +%s) - $start_time) seconds" | tee -a "$log_status_dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    start_time=$(date +%s)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if [ -z "$dependencies" ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        echo "'$port' has no dependencies, continuing." >&2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    dependencies_count=$(echo "$dependencies" | wc -l | sed 's/ *//g')
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    dependencies_counter=1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    echo "Installing $dependencies_count dependencies of $port:" | tee -a "$log_status_dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    echo "$dependencies" | sed -E 's/^/ - /' | tee -a "$log_status_dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    echo >> "$log_status_dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Check whether any of the dependencies have previously failed
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    failcachecounter=0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    while read -r dependency; do
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Split portname +variant1+variant2 into portname and active
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # variants, where the variants are optional.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set $dependency
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        depname="$1"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # remove surrounding quotes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        depvariants="${2%\"}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        depvariants="${depvariants#\"}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # $depvariants isn't quoted on purpose
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # shellcheck disable=SC2086
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if ! failcache_test "$depname" $depvariants; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            text="Dependency '${depname}' with variants '${depvariants}' has previously failed and is required."
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            echo "$text" >&2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            echo "$text" >> "$log_status_dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            echo "Building '$port' ... [ERROR] (failed to install dependency '${depname}') maintainers: $(get-maintainers "$port" "${depname}")." >> "$log_subports_progress"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            failcachecounter=$((failcachecounter + 1))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    done <<<"$dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    echo "failcache took $(expr $(date +%s) - $start_time) seconds" | tee -a "$log_status_dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    start_time=$(date +%s)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if [ $failcachecounter -gt 0 ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        echo "Aborting build because $failcachecounter dependencies are known to fail." >&2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    while read -r dependency; do
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Split portname +variant1+variant2 into portname and active and
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # requested variants, where the variants are optional.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set $dependency
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        depname=$1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # remove surrounding quotes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        depvariants="${2%\"}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        depvariants="${depvariants#\"}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        deprequestedvariants="${3%\"}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        deprequestedvariants="${deprequestedvariants#\"}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        text="Installing dependency ($dependencies_counter of $dependencies_count) '${depname}' with variants '${depvariants}' (requesting '${deprequestedvariants}')"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        echo "----> ${text}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        echo -n "${text} ... " >> "$log_status_dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # $option_prefix and $thisdir are set in mpbb
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # shellcheck disable=SC2154
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if [[ -f $("${option_prefix}/bin/port-tclsh" "${thisdir}/tools/archive-path.tcl" "${depname}" "${deprequestedvariants}") ]]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            echo "Already installed, nothing to do"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            echo "[OK]" >> "$log_status_dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            dependencies_counter=$((dependencies_counter + 1))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # First try to get a binary archive in case the local archives were deleted.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # $deprequestedvariants isn't quoted on purpose
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # shellcheck disable=SC2154,SC2086
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if ! "${option_prefix}/bin/port" -d archivefetch "$depname" $deprequestedvariants; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # This port command should never fail. If no archive was
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # available, it will still return with 0.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                echo "Fetching archive for dependency '${depname}' with variants '${deprequestedvariants}' failed, aborting." >&2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                echo "[FAIL] (archivefetch)" >> "$log_status_dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                echo "Building '$port' ... [ERROR] (failed to archivefetch dependency '${depname}')." >> "$log_subports_progress"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # Do not add to failcache.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                return 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # Fetch distfiles to check for fetch failures. If the archivefetch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # above downloaded an archive, the fetch phase is already marked as
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # completed in the statefile and this will do nothing.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # $deprequestedvariants isn't quoted on purpose
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # shellcheck disable=SC2154,SC2086
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if ! "${option_prefix}/bin/port" -d fetch "$depname" $deprequestedvariants; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                echo "Fetch of dependency '${depname}' with variants '${deprequestedvariants}' failed, aborting." >&2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                echo "[FAIL] (fetch)" >> "$log_status_dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                echo "Building '$port' ... [ERROR] (failed to fetch dependency '${depname}') maintainers: $(get-maintainers "$port" "${depname}")." >> "$log_subports_progress"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # Do not add to failcache. This could be a temporary problem that will
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # be resolved once the file appears on mirrors.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                return 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # $deprequestedvariants isn't quoted on purpose
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # shellcheck disable=SC2154,SC2086
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if ! "${option_prefix}/bin/port" -dn install --unrequested "$depname" $deprequestedvariants; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                echo "Build of dependency '${depname}' with variants '${deprequestedvariants}' failed, aborting." >&2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                echo "[FAIL]" >> "$log_status_dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                echo "Building '$port' ... [ERROR] (failed to install dependency '${depname}') maintainers: $(get-maintainers "$port" "${depname}")." >> "$log_subports_progress"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # Update failcache
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # $depvariants isn't quoted on purpose
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # shellcheck disable=SC2086
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                failcache_failure "$depname" $depvariants
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if [ $? -ne 0 ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    err "failcache_failure $depname $depvariants failed."
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    return 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                return 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                echo "[OK]" >> "$log_status_dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # Remove failcache if it exists
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # $depvariants isn't quoted on purpose
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # shellcheck disable=SC2086
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                failcache_success "$depname" $depvariants
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if [ $? -ne 0 ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    err "failcache_success $depname $depvariants failed."
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    return 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                dependencies_counter=$((dependencies_counter + 1))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # deactivate everything between builds
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # $option_prefix is set by mpbb
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # shellcheck disable=SC2154
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                "${option_prefix}/bin/port" -fp deactivate active
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    "${option_prefix}/bin/port-tclsh" "${thisdir}/tools/dependencies.tcl" --failcache_dir "${option_failcache_dir}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        --logs_dir "${option_log_dir}" "$@"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    result=$?
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if [ $result -ne 0 ]; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        echo "Processing dependencies for '$port' failed, aborting." >&2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if [ $result -eq 2 ]; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            echo "Building '$port' ... [ERROR] (failed to activate dependencies) maintainers: $(get-maintainers "$port")." >> "$log_subports_progress"
</span>         fi
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        # add to the list for gather_archives
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        echo "$depname $deprequestedvariants" >> "${option_work_dir}/all_ports"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    done <<<"$dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    echo "installing took $(expr $(date +%s) - $start_time) seconds" | tee -a "$log_status_dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    start_time=$(date +%s)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Activate everything now that we know it's all built and installed.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    echo "Activating all dependencies..."
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # $option_prefix is set by mpbb, and dependencies isn't quoted on purpose
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # shellcheck disable=SC2154,SC2086
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if ! "${option_prefix}/bin/port" -dn install --unrequested $(cat "${option_work_dir}/all_ports"); then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        echo "Activating all dependencies failed, aborting." >&2
</span>         return 1
     fi
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    echo "activating took $(expr $(date +%s) - $start_time) seconds" | tee -a "$log_status_dependencies"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    echo "Done."
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/tools/dependencies.tcl b/tools/dependencies.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index fec0792..cd65b9a 100755
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/tools/dependencies.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/tools/dependencies.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,8 +1,7 @@
</span> #!/usr/bin/env port-tclsh
 # -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
 #
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Writes a list of dependencies for a given port including variants (e.g. if
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# the universal variant is required) to stdout.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Ensure that all dependencies needed to install a given port are active.
</span> #
 # Copyright (c) 2016 The MacPorts Project.
 # Copyright (c) 2016 Clemens Lang <cal@macports.org>
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -32,19 +31,51 @@
</span> # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+set start_time [clock seconds]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> package require macports
<span style='display:block; white-space:pre;background:#e0ffe0;'>+package require registry2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+source [file join [file dirname [info script]] failcache.tcl]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set failcache_dir ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set logs_dir ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+while {[string range [lindex $::argv 0] 0 1] eq "--"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    switch -- [lindex $::argv 0] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        --failcache_dir {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set failcache_dir [lindex $::argv 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set ::argv [lreplace $::argv 0 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        --logs_dir {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set logs_dir [lindex $::argv 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set ::argv [lreplace $::argv 0 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        default {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_error "unknown option: [lindex $::argv 0]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            exit 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set ::argv [lreplace $::argv 0 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {$logs_dir ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set log_status_dependencies [open ${logs_dir}/dependencies-progress.txt w]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set log_subports_progress [open ${logs_dir}/ports-progress.txt a]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set log_status_dependencies [open /dev/null a]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set log_subports_progress $log_status_dependencies
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span> 
 if {[llength $::argv] == 0} {
     puts stderr "Usage: $argv0 <portname> \[(+|-)variant...\]"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    exit 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    exit 2
</span> }
 
 # initialize macports
<span style='display:block; white-space:pre;background:#ffe0e0;'>-set my_options(ports_source_only) yes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-if {[catch {mportinit "" my_options ""} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {[catch {mportinit "" "" ""} result]} {
</span>    ui_error "$errorInfo"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-   ui_error "Failed to initialize ports sytem: $result"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   exit 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ui_error "Failed to initialize ports system: $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   exit 2
</span> }
 
 # look up the path of the Portfile for the given port
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -58,7 +89,7 @@ try {
</span>     }
 } catch {{*} eCode eMessage} {
     ui_error "mportlookup $portname failed: $eMessage"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    exit 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    exit 2
</span> }
 
 # parse the given variants from the command line
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -73,69 +104,396 @@ foreach item [lrange $::argv 1 end] {
</span> array set portinfo [lindex $result 1]
 #try -pass_signal {...}
 try {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set mport [mportopen $portinfo(porturl) [list subport $portname] [array get variants]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set mport [mportopen $portinfo(porturl) [list subport $portinfo(name)] [array get variants]]
</span> } catch {{*} eCode eMessage} {
     ui_error "mportopen ${portinfo(porturl)} failed: $eMessage"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    exit 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    exit 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+array set portinfo [mportinfo $mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {[registry::entry imaged $portinfo(name) $portinfo(version) $portinfo(revision) $portinfo(canonical_active_variants)] ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts "$::argv already installed, not installing or activating dependencies"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    exit 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set toplevel_depstypes [list depends_fetch depends_extract depends_patch depends_build depends_lib depends_run]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set recursive_depstypes [list depends_lib depends_run]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+foreach p [split $env(PATH) :] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![string match ${macports::prefix}* $p]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend bin_search_path $p
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set lib_search_path [list /Library/Frameworks /System/Library/Frameworks /lib /usr/lib]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# check if depspec is fulfilled by a port, and if so, append its
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# name to the variable named by retvar
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc check_dep_needs_port {depspec retvar} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    upvar $retvar ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set splitlist [split $depspec :]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set portname [lindex $splitlist end]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set depregex [lindex $splitlist 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    switch [lindex $splitlist 0] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        bin {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set depregex \^$depregex\$
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set search_path $::bin_search_path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set executable 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lib {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set search_path $::lib_search_path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set i [string first . $depregex]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {$i < 0} {set i [string length $depregex]}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set depname [string range $depregex 0 ${i}-1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set depversion [string range $depregex $i end]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            regsub {\.} $depversion {\.} depversion
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set depregex \^${depname}${depversion}\\.dylib\$
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set executable 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        path {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # separate directory from regex
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set fullname $depregex
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            regexp {^(.*)/(.*?)$} $fullname match search_path depregex
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[string index $search_path 0] ne "/"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                || [string match ${macports::prefix}* $search_path]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # Path in prefix, can be assumed to be from a port
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                lappend ret $portname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set depregex \^$depregex\$
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set executable 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        port {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend ret $portname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![_mportsearchpath $depregex $search_path $executable]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend ret $portname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Get the ports needed by a given port.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc collect_deps {portinfovar retvar} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    upvar $portinfovar portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    upvar $retvar ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach deptype $::recursive_depstypes {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[info exists portinfo($deptype)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach depspec $portinfo($deptype) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                check_dep_needs_port $depspec ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# return mantainer email addresses for the given port names
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc get_maintainers {args} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set retlist [list]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach portname $args {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set result [mportlookup $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[llength $result] < 2} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                continue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } catch {{*} eCode eMessage} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_error "mportlookup $portname failed: $eMessage"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            continue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        array unset portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        array set portinfo [lindex $result 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach sublist [macports::unobscure_maintainers $portinfo(maintainers)] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach {key value} $sublist {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {$key eq "email"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    lappend retlist $value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [join $retlist ,]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc open_port {portname} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set result [mportlookup $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[llength $result] < 2} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_error "No such port: $portname"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts $::log_subports_progress "Building '$::portname' ... \[ERROR\] (unknown dependency '$portname') maintainers: [get_maintainers $::portname])."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            exit 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } catch {{*} eCode eMessage} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_error "mportlookup $portname failed: $eMessage"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        exit 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    array set portinfo [lindex $result 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set mport [mportopen $portinfo(porturl) [list subport $portinfo(name)] [list]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } catch {{*} eCode eMessage} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_error "mportopen $portinfo(porturl) failed: $eMessage"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        exit 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![info exists ::mportinfo_array($mport)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set ::mportinfo_array($mport) [mportinfo $mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    array set portinfo $::mportinfo_array($mport)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [list $mport [array get portinfo]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc deactivate_unneeded {portinfovar} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    upvar $portinfovar portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Unfortunately mportdepends doesn't have quite the right semantics
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # to be useful here. It's concerned with what is needed and not
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # present, whereas here we're concerned with removing what we can do
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # without. Future API opportunity?
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set deplist [list]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach deptype $::toplevel_depstypes {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[info exists portinfo($deptype)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach depspec $portinfo($deptype) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                check_dep_needs_port $depspec deplist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    while {$deplist ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set dep [lindex $deplist end]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set deplist [lreplace ${deplist}[set deplist {}] end end]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {![info exists needed_array($dep)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set needed_array($dep) 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set needed [list]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lassign [open_port $dep] mports_array($dep) infolist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            array unset depportinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            array set depportinfo $infolist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            collect_deps depportinfo needed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach newdep $needed {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {![info exists needed_array($newdep)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    lappend deplist $newdep
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set dependents_check_list [list]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach e [registry::entry installed] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Deactivate everything we don't need and also ports we do need that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # are active with non-default variants. The latter will reduce
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # performance for universal installations a bit, but those are much
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # less common and this ensures consistent behaviour.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {![info exists needed_array([$e name])]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {![registry::run_target $e deactivate [list ports_force yes]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                      && [catch {portimage::deactivate [$e name] [$e version] [$e revision] [$e variants] [list ports_force yes]} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                puts stderr $::errorInfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                puts stderr "Deactivating [$e name] @[$e version]_[$e revision][$e variants] failed: $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                exit 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            array unset entryinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            array set entryinfo $::mportinfo_array($mports_array([$e name]))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {$entryinfo(canonical_active_variants) ne [$e variants]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                lappend dependents_check_list {*}[$e dependents]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # also deactivate dependents of any needed deactivated ports
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    while {$dependents_check_list ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set e [lindex $dependents_check_list end]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set dependents_check_list [lreplace ${dependents_check_list}[set dependents_check_list {}] 0 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[$e state] eq "installed"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend dependents_check_list {*}[$e dependents]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {![registry::run_target $e deactivate [list ports_force yes]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                      && [catch {portimage::deactivate [$e name] [$e version] [$e revision] [$e variants] [list ports_force yes]} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                puts stderr $::errorInfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                puts stderr "Deactivating [$e name] @[$e version]_[$e revision][$e variants] failed: $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                exit 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span> }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+puts stderr "init took [expr {[clock seconds] - $start_time}] seconds"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set start_time [clock seconds]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+deactivate_unneeded portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+puts stderr "deactivating unneeded ports took [expr {[clock seconds] - $start_time}] seconds"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set start_time [clock seconds]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> # gather a list of dependencies with the correct variants (+universal is dealt
 # with in specific ways)
 if {[mportdepends $mport "activate"] != 0} {
     ui_error "mportdepends $portname activate failed."
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    exit 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    exit 2
</span> }
 
 # sort these dependencies topologically; exclude the given port itself
 set dlist [dlist_append_dependents $macports::open_mports $mport {}]
 dlist_delete dlist $mport
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-## print dependencies with variants
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc printdependency {ditem} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global variants
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set depinfo [mportinfo $ditem]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # To calculate the correct string with the explicitly disabled default
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # variants, if any, we need the default variants first.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    #
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Given the active_variants of the current dependency calculation and the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # default variants, calculate the required string.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set default_variants {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[info exists depinfo(vinfo)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        foreach {vname vattrs} $depinfo(vinfo) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            foreach {key val} $vattrs {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if {$key eq "is_default" && $val eq "+"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    lappend default_variants $vname
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    break
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# produce a list of deps in sorted order
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set dlist_sorted [list]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc append_it {ditem} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    lappend ::dlist_sorted $ditem
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set ::mportinfo_array($ditem) [mportinfo $ditem]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+dlist_eval $dlist {} [list append_it]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+unset dlist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+puts stderr "calculating deps took [expr {[clock seconds] - $start_time}] seconds"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set start_time [clock seconds]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# print a message to two channels
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc tee {msg ch1 ch2} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts $ch1 $msg
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts $ch2 $msg
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set dependencies_count [llength $dlist_sorted]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+tee "Installing $dependencies_count dependencies of $portname:" $log_status_dependencies stdout
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+foreach ditem $dlist_sorted {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    tee "[ditem_key $ditem provides] [_mportkey $ditem PortInfo(canonical_active_variants)]" $log_status_dependencies stdout
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+puts $log_status_dependencies ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+## ensure dependencies are installed and active
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc checkdep_failcache {ditem} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    array set depinfo $::mportinfo_array($ditem)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[check_failcache $depinfo(name) [ditem_key $ditem porturl] $depinfo(canonical_active_variants)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        tee "Dependency '$depinfo(name)' with variants '$depinfo(canonical_active_variants)' has previously failed and is required." $::log_status_dependencies stderr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts "Port $depinfo(name) previously failed in build [check_failcache $depinfo(name) [ditem_key $ditem porturl] $depinfo(canonical_active_variants) yes]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts $::log_subports_progress "Building '$::portname' ... \[ERROR\] (failed to install dependency '$depinfo(name)') maintainers: [get_maintainers $::portname $depinfo(name)]."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # could keep going to report all deps in the failcache, but failing fast seems better
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        exit 1
</span>     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set activevariantstring ""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set requestedvariantstring ""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set active_variants $depinfo(active_variants)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {$failcache_dir ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach ditem $dlist_sorted {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        checkdep_failcache $ditem
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts stderr "checking failcache took [expr {[clock seconds] - $start_time}] seconds"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set start_time [clock seconds]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set relevant_variants [lsort -unique [concat [array names active_variants] $default_variants]]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach variant $relevant_variants {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[info exists active_variants($variant)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            append activevariantstring "$active_variants($variant)$variant"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {$variant ni $default_variants} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                append requestedvariantstring "$active_variants($variant)$variant"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # the only case where this situation can occur is a default variant that was explicitly disabled
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            append requestedvariantstring "-$variant"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc install_dep {ditem} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    array set depinfo $::mportinfo_array($ditem)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    incr ::dependencies_counter
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set msg "Installing dependency ($::dependencies_counter of $::dependencies_count) '$depinfo(name)' with variants '$depinfo(canonical_active_variants)'"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts -nonewline $::log_status_dependencies "$msg ... "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts "----> ${msg}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[registry::entry imaged $depinfo(name) $depinfo(version) $depinfo(revision) $depinfo(canonical_active_variants)] ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts "Already installed, nothing to do"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts $::log_status_dependencies {[OK]}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set workername [ditem_key $ditem workername]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[$workername eval [list _archive_available]]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # First fetch the archive
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set fail 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[catch {mportexec $ditem archivefetch} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts stderr $::errorInfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_error "Archivefetch failed: $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set fail 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$fail || $result > 0 || [$workername eval [list find_portarchive_path]] eq ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts stderr "Fetching archive for dependency '$depinfo(name)' with variants '$depinfo(canonical_active_variants)' failed, aborting."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts $::log_status_dependencies {[FAIL] (archivefetch)}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts $::log_subports_progress "Building '$::portname' ... \[ERROR\] (failed to archivefetch dependency '$depinfo(name)')."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            exit 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # No archive. This should be rare, but can happen in some cases. Will build from source.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set ::any_built 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Deactivate ports not needed for this build so they don't interfere
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        deactivate_unneeded depinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Fetch and checksum the distfiles
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # (Bad things happen if you run fetch and checksum separately on the same mport, because
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # init functions get called twice and add duplicate distfiles. Yes, that's a bug.)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set fail 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[catch {mportexec $ditem checksum} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts stderr $::errorInfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_error "Checksum failed: $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set fail 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$fail || $result > 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts stderr "Fetch/checksum of dependency '$depinfo(name)' with variants '$depinfo(canonical_active_variants)' failed, aborting."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts $::log_status_dependencies {[FAIL] (fetch)}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts $::log_subports_progress "Building '$::portname' ... \[ERROR\] (failed to fetch dependency '$depinfo(name)') maintainers: [get_maintainers $::portname $depinfo(name)]."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            exit 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Now install
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[catch {mportexec $ditem install} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts stderr $::errorInfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_error "Install failed: $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set fail 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$fail || $result > 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts stderr "Build of dependency '$depinfo(name)' with variants '$depinfo(canonical_active_variants)' failed, aborting."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts $::log_status_dependencies {[FAIL]}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts $::log_subports_progress "Building '$::portname' ... \[ERROR\] (failed to install dependency '$depinfo(name)') maintainers: [get_maintainers $::portname $depinfo(name)]."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$::failcache_dir ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            failcache_update $depinfo(name) [ditem_key $ditem porturl] $depinfo(canonical_active_variants) 1
</span>         }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        exit 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts $::log_status_dependencies {[OK]}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Clear any failcache entry
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$::failcache_dir ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            failcache_update $depinfo(name) [ditem_key $ditem porturl] $depinfo(canonical_active_variants) 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # The interp delete hack in _mportexec makes the mport more or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # less unusable after installing. Make sure it really gets
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # closed even if there are dangling refs.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ditem_key $ditem refcnt 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        mportclose $ditem
</span>     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {$activevariantstring eq ""} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set activevariantstring {""}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Show all output for anything that gets installed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set macports::channels(debug) stderr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set macports::channels(info) stdout
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set dependencies_counter 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set any_built 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+foreach ditem $dlist_sorted {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    install_dep $ditem
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Go back to being quiet
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set macports::channels(debug) {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set macports::channels(info) {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+puts stderr "installing deps took [expr {[clock seconds] - $start_time}] seconds"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set start_time [clock seconds]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {$any_built} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # active ports likely changed, so do this again
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    deactivate_unneeded portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc activate_dep {ditem} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    array set depinfo $::mportinfo_array($ditem)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set entrylist [registry::entry imaged $depinfo(name) $depinfo(version) $depinfo(revision) $depinfo(canonical_active_variants)]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[llength $entrylist] < 1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts stderr "Failed to activate $depinfo(name) @$depinfo(version)_$depinfo(revision)$depinfo(canonical_active_variants): Not installed?!"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        exit 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[llength $entrylist] > 1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts stderr "Warning: got multiple registry entries matching $depinfo(name) @$depinfo(version)_$depinfo(revision)$depinfo(canonical_active_variants)"
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {$requestedvariantstring eq ""} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set requestedvariantstring {""}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set e [lindex $entrylist 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![registry::run_target $e activate [list]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              && [catch {portimage::activate [$e name] [$e version] [$e revision] [$e variants] [list]} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts stderr $::errorInfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts stderr "Activating [$e name] @[$e version]_[$e revision][$e variants] failed: $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        exit 2
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    puts [string trim "$depinfo(name) $activevariantstring $requestedvariantstring"]
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-dlist_eval $dlist {} [list printdependency]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+puts "Activating all dependencies..."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+foreach ditem $dlist_sorted {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    activate_dep $ditem
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+puts stderr "activating deps took [expr {[clock seconds] - $start_time}] seconds"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+puts "Done."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+exit 0
</span></pre><pre style='margin:0'>

</pre>