<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/423f863f81885db84b822fb6498d650761b873d1">https://github.com/macports/macports-base/commit/423f863f81885db84b822fb6498d650761b873d1</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 423f863f8 restore: track opened mports and close when done
</span>423f863f8 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 423f863f81885db84b822fb6498d650761b873d1
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Thu Jun 6 05:43:45 2024 +1000

<span style='display:block; white-space:pre;color:#404040;'>    restore: track opened mports and close when done
</span>---
 src/macports1.0/migrate.tcl |  5 ++++-
 src/macports1.0/restore.tcl | 52 +++++++++++++++++++++++++++++++--------------
 2 files changed, 40 insertions(+), 17 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 f1b4f44d8..f835d0814 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;'>@@ -154,9 +154,12 @@ namespace eval migrate {
</span>                 continue
             }
             set variations [restore::variants_to_variations_arr $requested_variants]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            # Set same options as restore code so it's more likely the open mports
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # can be reused rather than having to be opened again.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set options [dict create ports_requested [$port requested] subport $portname]
</span>             lassign [mportlookup $portname] portname portinfo
             if {$portname eq "" ||
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                [catch {mportopen [dict get $portinfo porturl] [dict create subport $portname] $variations} mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                [catch {mportopen [dict get $portinfo porturl] $options $variations} mport]
</span>             } then {
                 incr portfile_counter
                 $progress update $portfile_counter $portfile_total
<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 96b328eea..e0ea3b08b 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;'>@@ -42,6 +42,7 @@ package require lambda 1
</span> 
 namespace eval restore {
     variable ui_prefix
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    variable mports
</span> 
     proc main {opts} {
         # The main function. If the action is provided a snapshot id, then it deactivates
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -341,6 +342,7 @@ namespace eval restore {
</span>     #       The list in dependency-sorted order
     #       The dependency graph, to be destroyed by calling $dependencies destroy
     proc resolve_dependencies {snapshot} {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        variable mports
</span>         set portlist [$snapshot ports]
         set ports [dict create]
         set dep_ports [dict create]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -415,6 +417,7 @@ namespace eval restore {
</span>                 $progress update $requested_counter $requested_total
                 continue
             }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            lassign $port portname portinfo
</span> 
             if {[dict exists $ports $portname]} {
                 lassign [dict get $ports $portname] requested _ variants
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -427,11 +430,17 @@ namespace eval restore {
</span>             }
 
             # Open the port with the requested variants from the snapshot
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set variations [variants_to_variations_arr $variants]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set portinfo [lindex $port 1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[catch {set mport [mportopen [dict get $portinfo porturl] [dict create subport [dict get $portinfo name]] $variations]} result]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                $progress intermission
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                error "Unable to open port '$portname': $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {![dict exists $mports $portname $variants]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set options [dict create ports_requested $requested subport $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set variations [variants_to_variations_arr $variants]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {[catch {set mport [mportopen [dict get $portinfo porturl] $options $variations]} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    $progress intermission
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    ui_error "Unable to open port '$portname' with variants '$variants': $result"
</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;'>+                dict set mports $portname $variants $mport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set mport [dict get $mports $portname $variants]
</span>             }
             set portinfo [mportinfo $mport]
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -534,6 +543,7 @@ namespace eval restore {
</span>     }
 
     proc restore_state {snapshot} {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        variable mports [dict create]
</span>         lassign [resolve_dependencies $snapshot] sorted_snapshot_portlist dependencies
 
         # map from port name to an entry describing why the port failed or was
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -585,28 +595,38 @@ namespace eval restore {
</span>                 _handle_failure failed $dependencies $name "port $name not found in the port index"
                 continue
             }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set portinfo [lindex $res 1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set porturl [dict get $portinfo porturl]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set options [dict create ports_requested $requested subport [dict get $portinfo name]]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set variations [variants_to_variations_arr $variants]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lassign $res portname portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {![dict exists $mports $portname $variants]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set porturl [dict get $portinfo porturl]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set options [dict create ports_requested $requested subport $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set variations [variants_to_variations_arr $variants]
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[catch {set workername [mportopen $porturl $options $variations]} result]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui_msg $::errorInfo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                _handle_failure failed $dependencies $name "unable to open port $name: $result"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                continue
</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;'>+                    _handle_failure failed $dependencies $name "unable to open port $name: $result"
</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;'>+                dict set mports $portname $variants $mport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set mport [dict get $mports $portname $variants]
</span>             }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[catch {set result [mportexec $workername $target]} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[catch {set result [mportexec $mport $target]} result]} {
</span>                 ui_msg "$::errorInfo"
                 _handle_failure failed $dependencies $name "Unable to execute target $target for port $name: $result"
             } elseif {$result != 0} {
                 _handle_failure failed $dependencies $name "Failed to $target $name"
             }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            mportclose $workername
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            mportclose $mport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict unset mports $portname $variants
</span>         }
 
         $dependencies destroy
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict for {pname sub} $mports {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict for {variants mport} $sub {
</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> 
         return $failed
     }
</pre><pre style='margin:0'>

</pre>