<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/75bcfc809607bdb12e0817460b25fdec8d3085ed">https://github.com/macports/macports-base/commit/75bcfc809607bdb12e0817460b25fdec8d3085ed</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 75bcfc809 Allow accessing options using qualified names
</span>75bcfc809 is described below
<span style='display:block; white-space:pre;color:#808000;'>commit 75bcfc809607bdb12e0817460b25fdec8d3085ed
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Sun Feb 18 03:11:15 2024 +1100
<span style='display:block; white-space:pre;color:#404040;'> Allow accessing options using qualified names
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Trace procs are only told the name that a variable was accessed as, not
</span><span style='display:block; white-space:pre;color:#404040;'> the name used when adding the trace. So use 'namespace tail' to remove
</span><span style='display:block; white-space:pre;color:#404040;'> any qualifiers before looking up the option name in option_procs or
</span><span style='display:block; white-space:pre;color:#404040;'> option_defaults.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> It will still cause an error to access a traced option via a different
</span><span style='display:block; white-space:pre;color:#404040;'> name entirely (e.g. with upvar).
</span>---
src/port1.0/portutil.tcl | 124 +++++++++++++++++++----------------------------
1 file changed, 51 insertions(+), 73 deletions(-)
<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 75c79004b..1ce3ae070 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;'>@@ -59,12 +59,11 @@ proc option {option args} {
</span> # XXX: right now we just transparently use globals
# eventually this will need to bridge the options between
# the Portfile's interpreter and the target's interpreters.
<span style='display:block; white-space:pre;background:#ffe0e0;'>- global $option
</span> if {[llength $args] > 0} {
ui_debug "setting option $option to $args"
<span style='display:block; white-space:pre;background:#ffe0e0;'>- set $option [lindex $args 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set ::$option [lindex $args 0]
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>- return [set $option]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return [set ::$option]
</span> }
# exists
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -76,8 +75,7 @@ proc exists {option} {
</span> # XXX: right now we just transparently use globals
# eventually this will need to bridge the options between
# the Portfile's interpreter and the target's interpreters.
<span style='display:block; white-space:pre;background:#ffe0e0;'>- global $option
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return [info exists $option]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return [info exists ::$option]
</span> }
##
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -86,10 +84,8 @@ proc exists {option} {
</span> # @param option name of the option
# @param args arguments
proc handle_option {option args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- global $option
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> if {![info exists ::user_options($option)]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- set $option $args
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set ::$option $args
</span> }
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -99,10 +95,8 @@ proc handle_option {option args} {
</span> # @param option name of the option
# @param args arguments
proc handle_option-append {option args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- global $option
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> if {![info exists ::user_options($option)]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- lappend $option {*}$args
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ lappend ::$option {*}$args
</span> }
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -112,13 +106,11 @@ proc handle_option-append {option args} {
</span> # @param option name of the option
# @param args arguments
proc handle_option-prepend {option args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- global $option
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> if {![info exists ::user_options($option)]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if {[info exists $option]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set $option [concat $args [set $option]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[info exists ::$option]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set ::$option [concat $args [set ::$option]]
</span> } else {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- set $option $args
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set ::$option $args
</span> }
}
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -129,11 +121,9 @@ proc handle_option-prepend {option args} {
</span> # @param option name of the option
# @param args arguments
proc handle_option-delete {option args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- global $option
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {![info exists ::user_options($option)] && [info exists $option]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {![info exists ::user_options($option)] && [info exists ::$option]} {
</span> foreach val $args {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- set $option [ldelete [set $option][set $option {}] $val]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set ::$option [ldelete [set ::$option][set ::$option {}] $val]
</span> }
}
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -144,11 +134,9 @@ proc handle_option-delete {option args} {
</span> # @param option name of the option
# @param args arguments
proc handle_option-strsed {option args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- global $option
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {![info exists ::user_options($option)] && [info exists $option]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {![info exists ::user_options($option)] && [info exists ::$option]} {
</span> foreach val $args {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- set $option [strsed [set $option][set $option {}] $val]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set ::$option [strsed [set ::$option][set ::$option {}] $val]
</span> }
}
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -159,13 +147,11 @@ proc handle_option-strsed {option args} {
</span> # @param option name of the option
# @param args arguments
proc handle_option-replace {option args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- global $option
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {![info exists ::user_options($option)] && [info exists $option]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {![info exists ::user_options($option)] && [info exists ::$option]} {
</span> foreach {old new} $args {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- set index [lsearch -exact [set $option] $old]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set index [lsearch -exact [set ::$option] $old]
</span> if {$index != -1} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- lset $option $index $new
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ lset ::$option $index $new
</span> }
}
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -196,13 +182,12 @@ proc options {args} {
</span> # @param action set or delete
# @param value the value to be set, defaults to an empty string
proc options::export {option action {value ""}} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- global $option PortInfo
</span> switch $action {
set {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- set PortInfo($option) $value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set ::PortInfo($option) $value
</span> }
delete {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- unset -nocomplain PortInfo($option)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unset -nocomplain ::PortInfo($option)
</span> }
}
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -224,23 +209,21 @@ proc options_export {args} {
</span> # @param action read/set
# @param value ignored
proc handle_deprecated_option {option action {value ""}} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- global subport $option deprecated_options
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set newoption [lindex $deprecated_options($option) 0]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set refcount [lindex $deprecated_options($option) 1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- global $newoption
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set newoption [lindex $::deprecated_options($option) 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set refcount [lindex $::deprecated_options($option) 1]
</span>
if {$newoption eq ""} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_warn "Port $subport using deprecated option \"$option\"."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_warn "Port $::subport using deprecated option \"$option\"."
</span> return
}
# Increment reference counter
<span style='display:block; white-space:pre;background:#ffe0e0;'>- lset deprecated_options($option) 1 [expr {$refcount + 1}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ lset ::deprecated_options($option) 1 [expr {$refcount + 1}]
</span>
if {$action ne "read"} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- $newoption [set $option]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $newoption [set ::$option]
</span> } else {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- $option [set $newoption]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $option [set ::$newoption]
</span> }
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -272,39 +255,37 @@ proc option_deprecate {option {newoption ""} } {
</span> # @param option the name of the option
# @param args name of procs
proc option_proc {option args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- global option_procs $option
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {[info exists option_procs($option)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set option_procs($option) [concat $option_procs($option) $args]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[info exists ::option_procs($option)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set ::option_procs($option) [concat $::option_procs($option) $args]
</span> # we're already tracing
} else {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- set option_procs($option) $args
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- trace add variable $option {read write unset} option_proc_trace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set ::option_procs($option) $args
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ trace add variable ::$option [list read write unset] option_proc_trace
</span> }
}
# option_proc_trace
# trace handler for option reads. Calls option procedures with correct arguments.
proc option_proc_trace {optionName index op} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- global option_procs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- upvar $optionName $optionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set optionName [namespace tail $optionName]
</span> switch $op {
write {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- foreach p $option_procs($optionName) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- $p $optionName set [set $optionName]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ foreach p $::option_procs($optionName) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ $p $optionName set [set ::$optionName]
</span> }
}
read {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- foreach p $option_procs($optionName) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ foreach p $::option_procs($optionName) {
</span> $p $optionName read
}
}
unset {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- foreach p $option_procs($optionName) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ foreach p $::option_procs($optionName) {
</span> if {[catch {$p $optionName delete} result]} {
ui_debug "error during unset trace ($p): $result\n$::errorInfo"
}
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>- trace add variable $optionName {read write unset} option_proc_trace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ trace add variable ::$optionName [list read write unset] option_proc_trace
</span> }
}
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -478,41 +459,40 @@ proc command_exec {args} {
</span> # and adds a variable trace. The variable traces allows for delayed
# variable and command expansion in the variable's default value.
proc default {option val} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- global $option option_defaults
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {[info exists option_defaults($option)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[info exists ::option_defaults($option)]} {
</span> ui_debug "Re-registering default for $option"
# remove the old trace
<span style='display:block; white-space:pre;background:#ffe0e0;'>- trace remove variable $option {read write unset} default_check
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ trace remove variable ::$option [list read write unset] default_check
</span> } else {
# If option is already set and we did not set it
# do not reset the value
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if {[info exists $option]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[info exists ::$option]} {
</span> return
}
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>- set option_defaults($option) $val
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set $option $val
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- trace add variable $option {read write unset} default_check
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set ::option_defaults($option) $val
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set ::$option $val
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ trace add variable ::$option [list read write unset] default_check
</span> }
# default_check
# trace handler to provide delayed variable & command expansion
# for default variable values
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc default_check {optionName index op} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- global option_defaults $optionName
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc default_check {varName index op} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set optionName [namespace tail $varName]
</span> switch $op {
write {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- unset option_defaults($optionName)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- trace remove variable $optionName {read write unset} default_check
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unset ::option_defaults($optionName)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ trace remove variable ::$optionName [list read write unset] default_check
</span> return
}
read {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- uplevel #0 [list set $optionName] [subst -nocommands {[subst {$option_defaults($optionName)}]}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ uplevel #0 [list set $optionName] [subst -nocommands {[subst {$::option_defaults($optionName)}]}]
</span> return
}
unset {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- unset option_defaults($optionName)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- trace remove variable $optionName {read write unset} default_check
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ unset ::option_defaults($optionName)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ trace remove variable ::$optionName [list read write unset] default_check
</span> return
}
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -521,8 +501,6 @@ proc default_check {optionName index op} {
</span> ##
# Filter options which take strings removing indent to ease Portfile writing
proc handle_option_string {option action args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- global $option
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> switch $action {
set {
set args [join $args]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -553,7 +531,7 @@ proc handle_option_string {option action args} {
</span> lappend fulllist $arg
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>- set $option $fulllist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set ::$option $fulllist
</span> }
}
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -965,10 +943,10 @@ proc getdistname {name} {
</span> # tbool (testbool)
# If the variable exists in the calling procedure's namespace
# and is set to a boolean true value, return 1. Otherwise, return 0
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc tbool {key} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- upvar $key $key
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {[info exists $key]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return [string is true -strict [set $key]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc tbool {_tbool_varname} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ upvar $_tbool_varname $_tbool_varname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[info exists $_tbool_varname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return [string is true -strict [set $_tbool_varname]]
</span> }
return 0
}
</pre><pre style='margin:0'>
</pre>