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

</pre>
<p><a href="https://github.com/macports/macports-base/commit/cea9833fd1f84475293be3201ba80fb8ad4c239f">https://github.com/macports/macports-base/commit/cea9833fd1f84475293be3201ba80fb8ad4c239f</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 cea9833f Improve dep cycle handling and reporting
</span>cea9833f is described below

<span style='display:block; white-space:pre;color:#808000;'>commit cea9833fd1f84475293be3201ba80fb8ad4c239f
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Thu Apr 15 13:28:53 2021 +1000

<span style='display:block; white-space:pre;color:#404040;'>    Improve dep cycle handling and reporting
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Fixes: https://trac.macports.org/ticket/59289
</span>---
 src/macports1.0/macports.tcl       | 26 ++++++++++++++++----------
 src/macports1.0/macports_dlist.tcl | 13 ++++++++++---
 2 files changed, 26 insertions(+), 13 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/macports.tcl b/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index f52e09a5..1d51beb6 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2323,14 +2323,20 @@ proc mportexec {mport target} {
</span>         if {$result ne ""} {
             ##
             # When this happens, the failing port usually already printed an
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            # error message. Omit this one to avoid cluttering the output and
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # hiding the *real* problem.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            #set errstring "The following dependencies were not installed:"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            #foreach ditem $result {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            #    append errstring " [ditem_key $ditem provides]"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            #}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            #ui_error $errstring
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # error message. Don't print another here to avoid cluttering the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # output and hiding the *real* problem, unless the problem
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # appears to be a circular dependency, which won't have produced
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # an error message yet.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {$dlist_eval_reason eq "unmet_deps"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set errstring "The following dependencies were not installed\
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    because all of them have unmet dependencies (likely due\
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    to a dependency cycle):"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                foreach ditem $result {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    append errstring " [ditem_key $ditem provides]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ui_error $errstring
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span>             foreach ditem $dlist {
                 catch {mportclose $ditem}
             }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3920,6 +3926,8 @@ proc macports::_upgrade {portname dspec variationslist optionslist {depscachenam
</span>                 array unset portinfo
                 array set portinfo [mportinfo $mport]
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                # mark it in the cache now to guard against circular dependencies
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set depscache(port:$portname) 1
</span>                 # upgrade its dependencies first
                 set status [_upgrade_dependencies portinfo depscache variationslist options]
                 if {$status != 0 && $status != 2 && ![ui_isset ports_processall]} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3938,8 +3946,6 @@ proc macports::_upgrade {portname dspec variationslist optionslist {depscachenam
</span>                     catch {mportclose $mport}
                     return $result
                 }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                # we just installed it, so mark it done in the cache
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set depscache(port:$portname) 1
</span>                 mportclose $mport
             } else {
                 # dependency is satisfied by something other than the named port
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/macports_dlist.tcl b/src/macports1.0/macports_dlist.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index b43ccb69..f5c726a1 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/macports_dlist.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/macports_dlist.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -278,10 +278,15 @@ proc dlist_get_next {dlist statusdict} {
</span> #              occures; if 0, then dlist_eval will return on the
 #              first failure
 #   selector - the selector for determining eligibility
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#   reason_var - variable name to return failure reason in
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc dlist_eval {dlist testcond handler {canfail "0"} {selector "dlist_get_next"}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc dlist_eval {dlist testcond handler {canfail "0"} {selector "dlist_get_next"} {reason_var "dlist_eval_reason"}} {
</span>   array set statusdict [list]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if {$reason_var ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       upvar $reason_var reason
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   set reason ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   # Do a pre-run seeing if any items automagically
        # can evaluate to true.
        if {$testcond ne ""} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -301,7 +306,7 @@ proc dlist_eval {dlist testcond handler {canfail "0"} {selector "dlist_get_next"
</span> 
                if {$ditem eq {}} {
                        if {[llength $dlist] > 0} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                                ui_debug "dlist_eval: all entries in dependency list have unsatisfied dependencies; can't process"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           set reason unmet_deps
</span>                   }
                        break
                } else {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -310,6 +315,7 @@ proc dlist_eval {dlist testcond handler {canfail "0"} {selector "dlist_get_next"
</span>                   if {[catch {{*}$handler $ditem} result]} {
                                ui_debug $::errorInfo
                                ui_error $result
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                                set reason handler
</span>                           return $dlist
                        }
                        # No news is good news at this point.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -321,6 +327,7 @@ proc dlist_eval {dlist testcond handler {canfail "0"} {selector "dlist_get_next"
</span>                   
                        # Abort if we're not allowed to fail
                        if {$canfail == 0 && $result != 0} {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                            set reason handler
</span>                           return $dlist
                        }
                        
</pre><pre style='margin:0'>

</pre>