<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/b2e4dfdf91f8e723f09a4f60b4a9c3c38ee53c9c">https://github.com/macports/macports-base/commit/b2e4dfdf91f8e723f09a4f60b4a9c3c38ee53c9c</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 b2e4dfdf9 migrate: handle arch-only migrations
</span>b2e4dfdf9 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit b2e4dfdf91f8e723f09a4f60b4a9c3c38ee53c9c
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Sat May 25 01:22:30 2024 +1000

<span style='display:block; white-space:pre;color:#404040;'>    migrate: handle arch-only migrations
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Reinstall ports that will be built for different archs after doing so.
</span>---
 src/macports1.0/migrate.tcl | 90 +++++++++++++++++++++++++++++++++++++++------
 src/macports1.0/restore.tcl |  1 -
 2 files changed, 79 insertions(+), 12 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/migrate.tcl b/src/macports1.0/migrate.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index ff1b44780..645986f5c 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/migrate.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/migrate.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -100,11 +100,73 @@ namespace eval migrate {
</span> 
         ui_msg "Deactivating all ports..."
         restore::deactivate_all
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lassign [get_intree_archs $snapshot] ports_in_tree_archs mport_list
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # get_intree_archs opens Portfiles. Leaving them open for now because
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # restore_snapshot will want to use the same ones.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>         ui_msg "Uninstalling ports that need to be reinstalled..."
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        uninstall_incompatible
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        uninstall_incompatible $ports_in_tree_archs
</span> 
         ui_msg "Restoring ports..."
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        return [restore_snapshot]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set ret [restore_snapshot]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Close mports that get_intree_archs opened
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach mport $mport_list {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            mportclose $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;'>+        return $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;'>+    # Open the current in-tree Portfile for each port in the snapshot,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # using the recorded requested variants, and figure out its archs.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # @return a list of two elements:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    #   1. A dict mapping portname -> requested_variants -> archs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    #   2. A list of the mport handles for the opened Portfiles.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc get_intree_archs {snapshot} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set fancy_output [expr {![macports::ui_isset ports_debug] && [info exists macports::ui_options(progress_generic)]}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$fancy_output} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set progress $macports::ui_options(progress_generic)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            proc noop {args} {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set progress noop
</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 intree_archs [dict create]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set mports [list]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_msg "$macports::ui_prefix Loading Portfiles"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        $progress start
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set portfile_counter 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set snapshot_ports [$snapshot ports]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set portfile_total [llength $snapshot_ports]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        $progress update $portfile_counter $portfile_total
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach port $snapshot_ports {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lassign $port portname _ _ _ requested_variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set variations [restore::variants_to_variations_arr $requested_variants]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lassign [mportlookup $portname] portname portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {$portname eq "" ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                [catch {mportopen [dict get $portinfo porturl] [dict create subport $portname] $variations} mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            } then {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                incr portfile_counter
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                $progress update $portfile_counter $portfile_total
</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;'>+            set workername [ditem_key $mport workername]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set mport_archs [$workername eval [list get_canonical_archs]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict set intree_archs $portname $requested_variants $mport_archs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend mports $mport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            incr portfile_counter
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            $progress update $portfile_counter $portfile_total
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        $progress finish
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return [list $intree_archs $mports]
</span>     }
 
     ##
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -123,23 +185,29 @@ namespace eval migrate {
</span>     }
 
     ##
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Uninstall installed ports that are not compatible with
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # the current platform
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Uninstall installed ports that are not compatible with the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # current platform, or that would build for a different arch with
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # the current configuration.
</span>     #
     # @return void on success, raises an error on failure
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    proc uninstall_incompatible {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc uninstall_incompatible {ports_in_tree_archs} {
</span>         set options [dict create ports_nodepcheck 1 ports_force 1]
         set portlist [restore::deactivation_order [registry::entry imaged]]
         foreach port $portlist {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            # TODO: check archs match (needs open mport)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set portname [$port name]
</span>             if {![snapshot::_os_mismatch [$port os_platform] [$port os_major]]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                # Compatible with current platform
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                continue
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # Compatible with current platform, check that archs match
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set snapshot_reqvar [$port requested_variants]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {[dict exists $ports_in_tree_archs $portname $snapshot_reqvar]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    && [dict get $ports_in_tree_archs $portname $snapshot_reqvar]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        eq [$port archs]} {
</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:#ffe0e0;'>-            ui_msg "Uninstalling: [$port name]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_msg "Uninstalling: $portname"
</span>             if {![registry::run_target $port uninstall $options]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    && [catch {registry_uninstall::uninstall [$port name] [$port version] [$port revision] [$port variants] $options} result]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui_error "Error uninstalling [$port name]: $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    && [catch {registry_uninstall::uninstall $portname [$port version] [$port revision] [$port variants] $options} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ui_error "Error uninstalling ${portname}: $result"
</span>             }
         }
     }
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/restore.tcl b/src/macports1.0/restore.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 36748fb67..e13bf6e22 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/restore.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/restore.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -93,7 +93,6 @@ namespace eval restore {
</span>         deactivate_all
 
         ui_msg "$restore::ui_prefix Restoring snapshot '[$snapshot note]' created at [$snapshot created_at]"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set snapshot_portlist [$snapshot ports]
</span>         set failed [restore_state [$snapshot ports]]
 
         if {[dict size $failed] > 0} {
</pre><pre style='margin:0'>

</pre>