<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>