<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/7be167c23956c184920354a66f57469bad70b659">https://github.com/macports/macports-base/commit/7be167c23956c184920354a66f57469bad70b659</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 7be167c23956c184920354a66f57469bad70b659
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Wed Nov 1 02:39:08 2023 +1100

<span style='display:block; white-space:pre;color:#404040;'>    _upgrade: set newly installed ports' variants better
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Rather than inheriting all the variants of the depending port in this
</span><span style='display:block; white-space:pre;color:#404040;'>    case, apply those requested on the command line and in variants.conf,
</span><span style='display:block; white-space:pre;color:#404040;'>    adding +universal if required to get archs compatible with those of the
</span><span style='display:block; white-space:pre;color:#404040;'>    depending port. This also adds error reporting in this case if the
</span><span style='display:block; white-space:pre;color:#404040;'>    archs cannot be made compatible.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Closes: https://trac.macports.org/ticket/67637
</span>---
 src/macports1.0/macports.tcl | 74 +++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 66 insertions(+), 8 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 6b8b62333..6facb63ac 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;'>@@ -2521,7 +2521,7 @@ proc macports::_upgrade_mport_deps {mport target} {
</span>                 # check that the dep has the required archs
                 set active_archs [_active_archs $dep_portname]
                 if {[_deptype_needs_archcheck $deptype] && $active_archs ni {{} noarch}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    && $required_archs ne "noarch" && $dep_portname ni $depends_skip_archcheck} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    && $required_archs ne "noarch" && [lsearch -exact -nocase $depends_skip_archcheck $dep_portname] == -1} {
</span>                     set missing [list]
                     foreach arch $required_archs {
                         if {$arch ni $active_archs} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3636,8 +3636,8 @@ proc mportdepends {mport {target {}} {recurseDeps 1} {skipSatisfied 1} {accDeps
</span>             }
 
             set check_archs 0
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {$dep_portname ne "" && [_deptype_needs_archcheck $deptype]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                && $dep_portname ni $depends_skip_archcheck} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {$dep_portname ne "" && [macports::_deptype_needs_archcheck $deptype]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                && [lsearch -exact -nocase $depends_skip_archcheck $dep_portname] == -1} {
</span>                 set check_archs 1
             }
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4069,14 +4069,18 @@ proc macports::_upgrade {portname dspec variationslist optionslist {depscachenam
</span>             if {![info exists porturl]} {
                 set porturl file://./
             }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            # Grab the variations from the parent
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            upvar 2 variations variations
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # Merge in global variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            array set variations $variationslist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach {variation value} [array get macports::global_variations] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {![info exists variations($variation)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set variations($variation) $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;'>+            ui_debug "fully merged portvariants: [array get variations]"
</span>             # Don't inherit requested status from the depending port
             unset -nocomplain options(ports_requested)
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[catch {set mport [mportopen $porturl [array get options] [array get variations]]} result]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui_debug $::errorInfo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui_error "Unable to open port: $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[catch {_mport_open_with_archcheck $porturl $dspec $parentmport [array get options] [array get variations]} mport]} {
</span>                 return 1
             }
             # While we're at it, update the portinfo
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4601,6 +4605,60 @@ proc macports::_upgrade {portname dspec variationslist optionslist {depscachenam
</span>     return 0
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# Open the given port, adding +universal if needed to satisfy the arch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# requirements of the dependent mport.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc macports::_mport_open_with_archcheck {porturl depspec dependent_mport options variations} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[catch {set mport [mportopen $porturl $options $variations]} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_debug $::errorInfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_error "Unable to open port ($depspec): $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        error "mportopen failed"
</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;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[info exists portinfo(installs_libs)] && !$portinfo(installs_libs)} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return $mport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set skip_archcheck [_mportkey $dependent_mport depends_skip_archcheck]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set required_archs [_mport_archs $dependent_mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[lsearch -exact -nocase $skip_archcheck $portinfo(name)] >= 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            || [_mport_supports_archs $mport $required_archs]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return $mport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Check if the dependent used a dep type that needs matching archs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set dependent_workername [ditem_key $dependent_mport workername]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set dtypes [_deptypes_for_target install $dependent_workername]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    array set dependent_portinfo [mportinfo $dependent_mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set archcheck_needed 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach dtype $dtypes {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[_deptype_needs_archcheck $dtype] && [info exists dependent_portinfo($dtype)]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             && [lsearch -exact -nocase $dependent_portinfo($dtype) $depspec] >= 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set archcheck_needed 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            break
</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 {!$archcheck_needed} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return $mport
</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;'>+    # Reopen with +universal if possible
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set has_universal [expr {[info exists portinfo(variants)] && "universal" in $portinfo(variants)}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {"universal" ni $variations && $has_universal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            && [llength [_mport_archs $mport]] < 2} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        mportclose $mport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend variations universal +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[catch {set mport [mportopen $porturl $options $variations]} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_debug $::errorInfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_error "Unable to open port $portinfo(name): $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            error "mportopen failed"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[_mport_supports_archs $mport $required_archs]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return $mport
</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;'>+    _explain_arch_mismatch $dependent_portinfo(name) $portinfo(name) $required_archs [_mportkey $mport supported_archs] $has_universal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    error "architecture mismatch"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> # _upgrade calls this to clean up before returning
 proc macports::_upgrade_cleanup {} {
     #upvar ilist ilist regref regref newregref newregref \
</pre><pre style='margin:0'>

</pre>