<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/a83bf738719f6127f051969560135bf624c2f8a6">https://github.com/macports/macports-base/commit/a83bf738719f6127f051969560135bf624c2f8a6</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 a83bf7387 mpkg: add +universal to deps if needed
</span>a83bf7387 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit a83bf738719f6127f051969560135bf624c2f8a6
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Tue Apr 8 14:34:31 2025 +1000

<span style='display:block; white-space:pre;color:#404040;'>    mpkg: add +universal to deps if needed
</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/34177
</span>---
 src/macports1.0/macports.tcl |   3 +
 src/package1.0/portmpkg.tcl  | 150 +++++++++++++++++++++++++++++--------------
 src/port1.0/portutil.tcl     |  18 ++++++
 3 files changed, 123 insertions(+), 48 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 8438a90f0..256d4b90a 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;'>@@ -2003,6 +2003,9 @@ proc macports::worker_init {workername portpath porturl portbuildpath options va
</span>     $workername alias _portnameactive _portnameactive
     $workername alias get_actual_cxx_stdlib macports::get_actual_cxx_stdlib
     $workername alias shellescape macports::shellescape
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    $workername alias _mportkey _mportkey
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    $workername alias _mport_archs macports::_mport_archs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    $workername alias _mport_supports_archs macports::_mport_supports_archs
</span> 
     # New Registry/Receipts stuff
     $workername alias registry_new registry::new_entry
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/package1.0/portmpkg.tcl b/src/package1.0/portmpkg.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 94275a64f..4d75fdf87 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/package1.0/portmpkg.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/package1.0/portmpkg.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -56,29 +56,31 @@ proc portmpkg::mpkg_main {args} {
</span>     return [package_mpkg $subport $epoch $version $revision]
 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc portmpkg::make_dependency_list {portname destination} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global prefix package.flat requested_variations
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set result [list]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[catch {set res [mport_lookup $portname]} error]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui_debug $::errorInfo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return -code error "port lookup failed: $error"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc portmpkg::archcheck {mport dependent_mport} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set portinfo [mport_info $mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict exists $portinfo installs_libs] && ![dict get $portinfo installs_libs]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return 1
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    lassign $res portname portinfo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[getuid] == 0 && [geteuid] != 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        seteuid 0; setegid 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set deprivileged 1
</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;'>+    if {[lsearch -exact -nocase $skip_archcheck [dict get $portinfo name]] >= 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return 1
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set mport [mport_open [dict get $portinfo porturl] [dict create prefix $prefix package.destpath ${destination} package.flat ${package.flat} subport $portname] [array get requested_variations]]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[info exists deprivileged]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        global macportsuser
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        setegid [uname_to_gid $macportsuser]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        seteuid [name_to_uid $macportsuser]
</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 {[_mport_supports_archs $mport $required_archs]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return 1
</span>     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Since only depends_lib and depends_run are considered in mpkg,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # there's no need to check if the dep type needs matching archs.
</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;'>+proc portmpkg::get_dependencies {mport dep_map base_options variations} {
</span>     set portinfo [mport_info $mport]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    set portname [dict get $portinfo name]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![dict exists $dep_map $portname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # guard against infinite recursion with circular dependencies
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict set dep_map $portname {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span> 
     # get the union of depends_run and depends_lib
     set depends [list]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -88,32 +90,92 @@ proc portmpkg::make_dependency_list {portname destination} {
</span>     foreach depspec $depends {
         set dep [_get_dep_port $depspec]
         if {$dep ne ""} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            lappend result {*}[make_dependency_list $dep $destination]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # Get the dep's mport handle, opening it if needed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[catch {set res [mport_lookup $dep]} error]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ui_debug $::errorInfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                return -code error "port lookup failed: $error"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # depname will have canonical case and so can safely be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # used as the dict key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lassign $res depname dep_portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set add_deps 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[dict exists $dep_map $depname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set dep_mport [dict get $dep_map $depname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # The dep has already been processed, so there's
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # nothing to do in this case if the archs match.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set options $base_options
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict set options subport $depname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                exec_with_available_privileges {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set dep_mport [mport_open [dict get $dep_portinfo porturl] $options $variations]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set add_deps 1
</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 if the archs aren't compatible
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {![archcheck $dep_mport $mport] && ![dict exists $variations universal]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set check_portinfo [mport_info $dep_mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set dep_archs [_mport_archs $dep_mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {[dict exists $check_portinfo variants] && "universal" in [dict get $check_portinfo variants]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        && [llength $dep_archs] < 2} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    mport_close $dep_mport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set uvariations $variations
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    dict set uvariations universal +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set options $base_options
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    dict set options subport $depname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    exec_with_available_privileges {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        set dep_mport [mport_open [dict get $dep_portinfo porturl] $options $uvariations]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set add_deps 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # dep_map entry for this dep will be updated in the recursive call
</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 {$add_deps} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # Add this dependency and its dependencies to the dep_map
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set dep_map [get_dependencies $dep_mport $dep_map $base_options $variations]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span>         }
     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    lappend result [list $portname [dict get $portinfo version] [dict get $portinfo revision] $mport]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return $result
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # ensure this port comes after its deps in the dict
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    dict unset dep_map $portname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    dict set dep_map $portname [list $mport [dict get $portinfo version] [dict get $portinfo revision]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return $dep_map
</span> }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc portmpkg::make_one_package {portname mport} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[getuid] == 0 && [geteuid] != 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        seteuid 0; setegid 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set deprivileged 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc portmpkg::make_dependency_list {portname destination} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global prefix package.flat requested_variations
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[catch {set res [mport_lookup $portname]} error]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_debug $::errorInfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return -code error "port lookup failed: $error"
</span>     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    lassign $res portname portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set base_options [dict create prefix $prefix package.destpath ${destination} package.flat ${package.flat}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set options $base_options
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    dict set options subport $portname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set variations [array get requested_variations]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    exec_with_available_privileges {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set mport [mport_open [dict get $portinfo porturl] $options $variations]
</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 result [get_dependencies $mport [dict create] $base_options $variations]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    mport_close $mport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # don't re-package ourself
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    dict unset result $portname
</span> 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    return $result
</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 portmpkg::make_one_package {portname mport} {
</span>     ui_debug "building dependency package: $portname"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set result [mport_exec $mport pkg]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    exec_with_available_privileges {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set result [mport_exec $mport pkg]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span>     mport_close $mport
     if {$result} {
         error "Processing of port $portname failed"
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[info exists deprivileged]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        global macportsuser
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        setegid [uname_to_gid $macportsuser]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        seteuid [name_to_uid $macportsuser]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span> }
 
 proc portmpkg::mpkg_path {portname portversion portrevision} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -136,26 +198,18 @@ proc portmpkg::package_mpkg {portname portepoch portversion portrevision} {
</span>         set packages_path ${mpkgpath}/Contents/Packages
         set resources_path ${mpkgpath}/Contents/Resources
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    system "mkdir -p -m 0755 [shellescape ${packages_path}]"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    system "mkdir -p -m 0755 [shellescape ${resources_path}]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    xinstall -d -m 0755 ${packages_path} ${resources_path}
</span> 
     set dependencies [list]
     # get deplist
     set deps [make_dependency_list $portname $packages_path]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set deps [lsort -unique $deps]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach dep $deps {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set name [lindex $dep 0]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set vers [lindex $dep 1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set rev [lindex $dep 2]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set mport [lindex $dep 3]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # don't re-package ourself
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {$name ne $portname} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            make_one_package $name $mport
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {${package.flat} && ${os.major} >= 10} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                lappend dependencies org.macports.${name} [portpkg::image_name ${name} ${vers} ${rev}]-component.pkg
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                lappend dependencies [portpkg::image_name ${name} ${vers} ${rev}].pkg
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    dict for {name depinfo} $deps {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lassign $depinfo mport vers rev
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        make_one_package $name $mport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {${package.flat} && ${os.major} >= 10} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend dependencies org.macports.${name} [portpkg::image_name ${name} ${vers} ${rev}]-component.pkg
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend dependencies [portpkg::image_name ${name} ${vers} ${rev}].pkg
</span>         }
     }
     if {${package.flat} && ${os.major} >= 10} {
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portutil.tcl b/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 0ec87f1cf..245e0d4ab 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3167,6 +3167,24 @@ proc exec_as_uid {uid code} {
</span>     return -code $retcode $result
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# Run the given code, becoming root first if possible, and dropping
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# privileges again afterward.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc exec_with_available_privileges {code} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[getuid] == 0 && [geteuid] != 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        seteuid 0; setegid 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set deprivileged 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    try {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        uplevel 1 $code
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } finally {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[info exists deprivileged]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            global macportsuser
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            setegid [uname_to_gid $macportsuser]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            seteuid [name_to_uid $macportsuser]
</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> # dependency analysis helpers
 
 ### _libtest is private; subject to change without notice
</pre><pre style='margin:0'>

</pre>