<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/5d107c1e6e86ef7d830954fe515b3adb779ce9c2">https://github.com/macports/macports-base/commit/5d107c1e6e86ef7d830954fe515b3adb779ce9c2</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 5d107c1e6 registry_installed: add multiple choice disambiguation
</span>5d107c1e6 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 5d107c1e6e86ef7d830954fe515b3adb779ce9c2
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Fri May 23 11:26:47 2025 +1000

<span style='display:block; white-space:pre;color:#404040;'>    registry_installed: add multiple choice disambiguation
</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/70922
</span>---
 src/port/port.tcl | 72 ++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 50 insertions(+), 22 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port/port.tcl b/src/port/port.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index a558cdb0a..deae1ee6f 100755
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port/port.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port/port.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -146,7 +146,17 @@ proc map_friendly_field_names { field } {
</span> }
 
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc registry_installed {portname {portversion ""} {require_single yes} {only_active no}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Return registry handles for the installed port(s) that have the given
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# name and (optionally) version.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# allow_multiple: possible values are "no", "all", or "selected"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#   no: Return one value. Error if more than one port matches and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#       interactive disambiguation is not possible.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#   all: Return a list of all matches.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#   selected: Return a single match, or if more than one port matches,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#       return the values chosen by the user if interactive, otherwise
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#       error.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# only_active: boolean, whether to match only active ports
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc registry_installed {portname {portversion ""} {allow_multiple no} {only_active no}} {
</span>     if {!$only_active} {
         set possible_matches [registry::entry imaged $portname]
     } else {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -164,7 +174,7 @@ proc registry_installed {portname {portversion ""} {require_single yes} {only_ac
</span>         set matches $possible_matches
     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {!$require_single} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$allow_multiple eq "all" || ($matches eq {} && $allow_multiple eq "selected")} {
</span>         return $matches
     }
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -181,9 +191,16 @@ proc registry_installed {portname {portversion ""} {require_single yes} {only_ac
</span>                 lappend portilist "  $portname @[$i version]_[$i revision][$i variants]"
             }
         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[info exists ui_options(questions_singlechoice)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set retindex [$macports::ui_options(questions_singlechoice) $msg "Choice_Q1" $portilist]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$allow_multiple eq "no" && [info exists ui_options(questions_singlechoice)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set retindex [$ui_options(questions_singlechoice) $msg "Choice_Q1" $portilist]
</span>             return [lindex $matches $retindex]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        } elseif {$allow_multiple eq "selected" && [info exists ui_options(questions_multichoice)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set indexlist [$ui_options(questions_multichoice) $msg "Choice_Q2" $portilist]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set retlist [list]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach index $indexlist {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                lappend retlist [lindex $matches $index]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return $retlist
</span>         } else {
             ui_notice $msg
             foreach portstr $portilist {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -198,7 +215,11 @@ proc registry_installed {portname {portversion ""} {require_single yes} {only_ac
</span>             return -code error "Registry error: $portname $portversion not registered as installed."
         }
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    return [lindex $matches 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$allow_multiple eq "no"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return [lindex $matches 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return $matches
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span> }
 
 # Add the entry to the given portlist, adding default values for name,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2681,9 +2702,9 @@ proc action_dependents { action portlist opts } {
</span>     foreachport $portlist {
         set composite_version [composite_version $portversion $variations]
         # choose the active version if there is one
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set ilist [registry_installed $portname $composite_version no yes]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set ilist [registry_installed $portname $composite_version all yes]
</span>         if {$ilist eq ""} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set ilist [registry_installed $portname $composite_version no no]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set ilist [registry_installed $portname $composite_version all no]
</span>         }
         if {$ilist eq ""} {
             break_softcontinue "[string trim "$portname $composite_version"] is not installed" 1 status
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3032,30 +3053,37 @@ proc action_uninstall { action portlist opts } {
</span>     set portlist [portlist_sortdependents $portlist]
 
     foreachport $portlist {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[registry::entry imaged $portname] eq ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set composite_version [composite_version $portversion $variations]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[catch {registry_installed $portname $composite_version selected} matches]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            break_softcontinue "port uninstall failed: $matches" 1 status
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$matches eq ""} {
</span>             # if the code path arrives here the port either isn't installed, or
             # it doesn't exist at all. We can't be sure, but we can check the
             # portindex whether a port by that name exists (in which case not
             # uninstalling it is probably no problem). If there is no port by
             # that name, alert the user in case of typos.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui_info "$portname is not installed"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[catch {set res [mportlookup $portname]} result] || [llength $res] == 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set maybe_vers [expr {$composite_version ne "" ? " @$composite_version" : ""}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_info "${portname}${maybe_vers} is not installed"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {![catch {mportlookup $portname} res] && $res eq ""} {
</span>                 ui_warn "no such port: $portname, skipping uninstall"
             }
             continue
         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set composite_version [composite_version $portversion $variations]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {![dict exists $options ports_uninstall_no-exec]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            && ![catch {registry_installed $portname $composite_version} regref]} {
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[registry::run_target $regref uninstall $options]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach regref $matches {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {![dict exists $options ports_uninstall_no-exec]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    && [registry::run_target $regref uninstall $options]} {
</span>                 continue
             }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[catch {registry_uninstall::uninstall [$regref name] [$regref version] [$regref revision] [$regref variants] $options} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ui_debug $::errorInfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                break_softcontinue "port uninstall failed: $result" 1 status
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span>         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if { [catch {registry_uninstall::uninstall_composite $portname $composite_version $options} result] } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui_debug $::errorInfo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            break_softcontinue "port uninstall failed: $result" 1 status
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Handle possible break_softcontinue from inner loop
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$status != 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            break
</span>         }
     }
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3073,7 +3101,7 @@ proc action_installed { action portlist opts } {
</span>         set restrictedList 1
         foreachport $portlist {
             set composite_version [composite_version $portversion $variations]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[catch {lappend ilist {*}[registry_installed $portname $composite_version no no]} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[catch {lappend ilist {*}[registry_installed $portname $composite_version all no]} result]} {
</span>                 ui_debug $::errorInfo
                 break_softcontinue "port installed failed: $result" 1 status
             }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3137,7 +3165,7 @@ proc action_outdated { action portlist opts } {
</span>         foreach portspec $portlist {
             set portname [dict get $portspec name]
             set composite_version [composite_version [dict get $portspec version] [dict get $portspec variants]]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[catch {lappend ilist {*}[registry_installed $portname $composite_version no yes]} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[catch {lappend ilist {*}[registry_installed $portname $composite_version all yes]} result]} {
</span>                 ui_debug $::errorInfo
                 break_softcontinue "port outdated failed: $result" 1 status
             }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3283,13 +3311,13 @@ proc action_contents { action portlist opts } {
</span>         }
         set composite_version [composite_version $portversion $variations]
         set ilist ""
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[catch {set ilist [registry_installed $portname $composite_version no yes]} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[catch {set ilist [registry_installed $portname $composite_version all yes]} result]} {
</span>             ui_debug $::errorInfo
             break_softcontinue "port contents failed: $result" 1 status
         }
         if {$ilist ne ""} {
             set regref [lindex $ilist 0]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        } elseif {[catch {set regref [registry_installed $portname $composite_version yes no]} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } elseif {[catch {set regref [registry_installed $portname $composite_version no no]} result]} {
</span>             ui_debug $::errorInfo
             break_softcontinue "port contents failed: $result" 1 status
         }
</pre><pre style='margin:0'>

</pre>