Browse Source

update bootsupport + layout bootsupport: punk::lib 0.4.0, punk::repl 0.3.0, punk::packagepreference 0.2.0, shellthread 1.7.0

punkcheck-managed regeneration propagating the G-058 module releases (static runtime package baseline seeding + policy) into src/bootsupport/modules and the punk.project-0.1 / punk.shell-0.1 layout bootsupport copies.

Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com
master
Julian Noble 5 days ago
parent
commit
bd1baa39f6
  1. 44
      src/bootsupport/modules/punk/lib-0.4.0.tm
  2. 31
      src/bootsupport/modules/punk/packagepreference-0.2.0.tm
  3. 18
      src/bootsupport/modules/punk/repl-0.3.0.tm
  4. 19
      src/bootsupport/modules/shellthread-1.7.0.tm
  5. 44
      src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/lib-0.4.0.tm
  6. 31
      src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/packagepreference-0.2.0.tm
  7. 18
      src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/repl-0.3.0.tm
  8. 19
      src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/shellthread-1.7.0.tm
  9. 44
      src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/lib-0.4.0.tm
  10. 31
      src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/packagepreference-0.2.0.tm
  11. 18
      src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/repl-0.3.0.tm
  12. 19
      src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/shellthread-1.7.0.tm

44
src/bootsupport/modules/punk/lib-0.3.1.tm → src/bootsupport/modules/punk/lib-0.4.0.tm

@ -8,7 +8,7 @@
# (C) 2024 # (C) 2024
# #
# @@ Meta Begin # @@ Meta Begin
# Application punk::lib 0.3.1 # Application punk::lib 0.4.0
# Meta platform tcl # Meta platform tcl
# Meta license BSD # Meta license BSD
# @@ Meta End # @@ Meta End
@ -18,7 +18,7 @@
# doctools header # doctools header
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
#*** !doctools #*** !doctools
#[manpage_begin punkshell_module_punk::lib 0 0.3.1] #[manpage_begin punkshell_module_punk::lib 0 0.4.0]
#[copyright "2024"] #[copyright "2024"]
#[titledesc {punk general utility functions}] [comment {-- Name section and table of contents description --}] #[titledesc {punk general utility functions}] [comment {-- Name section and table of contents description --}]
#[moddesc {punk library}] [comment {-- Description at end of page heading --}] #[moddesc {punk library}] [comment {-- Description at end of page heading --}]
@ -8197,6 +8197,12 @@ namespace eval punk::lib {
is used, in which case punk::libunknown is sourced from the tm paths that were is used, in which case punk::libunknown is sourced from the tm paths that were
already set up by the earlier part of the script. already set up by the earlier part of the script.
When the kit boot captured runtime static/builtin packages
(::punkboot::static_packages - see punk_main.tcl), the script also copies
that baseline and seeds 'package ifneeded <name> <ver> {load {} <prefix>}'
entries so statically-linked packages (e.g Thread/twapi on a tcl-sfe
runtime) resolve in the target.
See also: punk::lib::interp_sync_package_paths" See also: punk::lib::interp_sync_package_paths"
@opts @opts
-libunknown -type boolean -default 0 -help\ -libunknown -type boolean -default 0 -help\
@ -8235,6 +8241,18 @@ namespace eval punk::lib {
append script "tcl::tm::add \{*\}\[list [lreverse $tmlist]\]\n" append script "tcl::tm::add \{*\}\[list [lreverse $tmlist]\]\n"
append script "set ::auto_path \[list $ap\]\n" append script "set ::auto_path \[list $ap\]\n"
append script "package prefer $prefer\n" append script "package prefer $prefer\n"
#G-058: propagate runtime static/builtin package mappings captured at kit boot
#(see punk_main.tcl) so 'package require' of a statically-linked package (e.g
#Thread/twapi on a tcl-sfe runtime) resolves in the new thread/interp even though
#no pkgIndex for it exists on the (replaced) package search paths.
if {[info exists ::punkboot::static_packages] && [dict size $::punkboot::static_packages]} {
append script "namespace eval ::punkboot {}\n"
append script [list set ::punkboot::static_prefixes $::punkboot::static_prefixes] \n
append script [list set ::punkboot::static_packages $::punkboot::static_packages] \n
dict for {pkgname pinfo} $::punkboot::static_packages {
append script "if \{\[package provide [list $pkgname]\] eq \"\"\} \{[list package ifneeded $pkgname [dict get $pinfo version] [list load {} [dict get $pinfo prefix]]]\}\n"
}
}
if {$do_libunknown} { if {$do_libunknown} {
if {[info exists ::punk::libunknown::epoch]} { if {[info exists ::punk::libunknown::epoch]} {
append script "namespace eval ::punk::libunknown {}\n" append script "namespace eval ::punk::libunknown {}\n"
@ -8299,6 +8317,12 @@ namespace eval punk::lib {
package unknown handler and scan cache as the parent. This is recommended package unknown handler and scan cache as the parent. This is recommended
when the child will do significant package loading. when the child will do significant package loading.
When the kit boot captured runtime static/builtin packages
(::punkboot::static_packages - see punk_main.tcl), the child also receives
that baseline plus 'package ifneeded <name> <ver> {load {} <prefix>}'
seeding so statically-linked packages (e.g Thread/twapi on a tcl-sfe
runtime) resolve in the child.
This is an opt-in helper — call sites that don't use it keep their current This is an opt-in helper — call sites that don't use it keep their current
behavior. It does not load packages, install punk::packagepreference, share behavior. It does not load packages, install punk::packagepreference, share
channels, or configure safe-interp restrictions — those remain caller channels, or configure safe-interp restrictions — those remain caller
@ -8340,6 +8364,20 @@ namespace eval punk::lib {
interp eval $interp {tcl::tm::remove {*}[tcl::tm::list]} interp eval $interp {tcl::tm::remove {*}[tcl::tm::list]}
interp eval $interp [list tcl::tm::add {*}[lreverse [tcl::tm::list]]] interp eval $interp [list tcl::tm::add {*}[lreverse [tcl::tm::list]]]
interp eval $interp [list package prefer [package prefer]] interp eval $interp [list package prefer [package prefer]]
#G-058: propagate runtime static/builtin package mappings captured at kit boot
#(see punk_main.tcl) so 'package require' of a statically-linked package (e.g
#Thread/twapi on a tcl-sfe runtime) resolves in the child interp even though no
#pkgIndex for it exists on the (replaced) package search paths.
if {[info exists ::punkboot::static_packages] && [dict size $::punkboot::static_packages]} {
interp eval $interp [list namespace eval ::punkboot {}]
interp eval $interp [list set ::punkboot::static_prefixes $::punkboot::static_prefixes]
interp eval $interp [list set ::punkboot::static_packages $::punkboot::static_packages]
dict for {pkgname pinfo} $::punkboot::static_packages {
if {[interp eval $interp [list package provide $pkgname]] eq ""} {
interp eval $interp [list package ifneeded $pkgname [dict get $pinfo version] [list load {} [dict get $pinfo prefix]]]
}
}
}
#extended: copy epoch + source libunknown + call init #extended: copy epoch + source libunknown + call init
if {$do_libunknown} { if {$do_libunknown} {
if {[info exists ::punk::libunknown::epoch]} { if {[info exists ::punk::libunknown::epoch]} {
@ -9135,7 +9173,7 @@ namespace eval ::punk::args::register {
package provide punk::lib [tcl::namespace::eval punk::lib { package provide punk::lib [tcl::namespace::eval punk::lib {
variable pkg punk::lib variable pkg punk::lib
variable version variable version
set version 0.3.1 set version 0.4.0
}] }]
return return

31
src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/packagepreference-0.1.1.tm → src/bootsupport/modules/punk/packagepreference-0.2.0.tm

@ -8,7 +8,7 @@
# (C) 2024 # (C) 2024
# #
# @@ Meta Begin # @@ Meta Begin
# Application punk::packagepreference 0.1.1 # Application punk::packagepreference 0.2.0
# Meta platform tcl # Meta platform tcl
# Meta license <unspecified> # Meta license <unspecified>
# @@ Meta End # @@ Meta End
@ -18,7 +18,7 @@
# doctools header # doctools header
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
#*** !doctools #*** !doctools
#[manpage_begin punkshell_module_punk::packagepreference 0 0.1.1] #[manpage_begin punkshell_module_punk::packagepreference 0 0.2.0]
#[copyright "2024"] #[copyright "2024"]
#[titledesc {punkshell package/module loading}] [comment {-- Name section and table of contents description --}] #[titledesc {punkshell package/module loading}] [comment {-- Name section and table of contents description --}]
#[moddesc {package/module load}] [comment {-- Description at end of page heading --}] #[moddesc {package/module load}] [comment {-- Description at end of page heading --}]
@ -171,6 +171,24 @@ tcl::namespace::eval punk::packagepreference {
return [uplevel 1 [list $COMMANDSTACKNEXT {*}$args]] return [uplevel 1 [list $COMMANDSTACKNEXT {*}$args]]
} }
#G-058 static-vs-bundled policy for runtime static/builtin packages
#(baseline captured at kit boot into ::punkboot::static_packages - see punk_main.tcl).
#Ensure the static mapping exists in this interp (seeding is normally done at
#interp/thread creation - this covers stragglers), then trigger the package
#unknown index scan so any bundled vfs/module copies are ALSO registered before
#resolution. With all candidates registered, standard resolution compares
#versions (highest acceptable wins) - a static copy is not blindly masked by an
#older bundled dll, and a genuinely newer bundled copy remains reachable.
#(On identical versions the bundled copy's ifneeded entry, registered by the
# later scan, wins - same version either way.)
if {[info exists ::punkboot::static_packages] && [dict exists $::punkboot::static_packages $pkg]} {
set spinfo [dict get $::punkboot::static_packages $pkg]
if {[dict get $spinfo version] ni [$COMMANDSTACKNEXT_ORIGINAL versions $pkg]} {
$COMMANDSTACKNEXT_ORIGINAL ifneeded $pkg [dict get $spinfo version] [list load {} [dict get $spinfo prefix]]
}
catch {uplevel 1 [list {*}[$COMMANDSTACKNEXT_ORIGINAL unknown] $pkg]}
}
if {!$is_exact && [llength $vwant] <= 1 } { if {!$is_exact && [llength $vwant] <= 1 } {
#required version unspecified - or specified singularly #required version unspecified - or specified singularly
set available_versions [$COMMANDSTACKNEXT_ORIGINAL versions $pkg] set available_versions [$COMMANDSTACKNEXT_ORIGINAL versions $pkg]
@ -179,7 +197,12 @@ tcl::namespace::eval punk::packagepreference {
#An attempt to detect dll/so loaded and try to load same version #An attempt to detect dll/so loaded and try to load same version
#dll/so files are often named with version numbers that don't contain dots or a version number at all #dll/so files are often named with version numbers that don't contain dots or a version number at all
#e.g sqlite3400.dll Thread288.dll #e.g sqlite3400.dll Thread288.dll
set pkgloadedinfo [lsearch -nocase -inline -index 1 [info loaded] $pkg] #G-058: exclude empty-filename entries - those are static REGISTRATIONS
#(process-global, not necessarily loaded anywhere) and forcing their
#version here would defeat the version-aware static-vs-bundled policy
#above (e.g pinning to the static version even when a bundled copy is
#genuinely newer)
set pkgloadedinfo [lsearch -nocase -inline -index 1 [lsearch -all -inline -not -exact -index 0 [info loaded] {}] $pkg]
if {[llength $pkgloadedinfo]} { if {[llength $pkgloadedinfo]} {
if {[llength $available_versions] > 1} { if {[llength $available_versions] > 1} {
@ -489,7 +512,7 @@ namespace eval ::punk::args::register {
package provide punk::packagepreference [tcl::namespace::eval punk::packagepreference { package provide punk::packagepreference [tcl::namespace::eval punk::packagepreference {
variable pkg punk::packagepreference variable pkg punk::packagepreference
variable version variable version
set version 0.1.1 set version 0.2.0
}] }]
return return

18
src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/repl-0.2.2.tm → src/bootsupport/modules/punk/repl-0.3.0.tm

@ -3241,6 +3241,8 @@ namespace eval repl {
} %autopath% [list $::auto_path] {*}{ } %autopath% [list $::auto_path] {*}{
} %lib_epoch% [list $::punk::libunknown::epoch] {*}{ } %lib_epoch% [list $::punk::libunknown::epoch] {*}{
} %packageprefer% [list [package prefer]] {*}{ } %packageprefer% [list [package prefer]] {*}{
} %staticprefixes% [list [expr {[info exists ::punkboot::static_prefixes] ? $::punkboot::static_prefixes : ""}]] {*}{
} %staticpackages% [list [expr {[info exists ::punkboot::static_packages] ? $::punkboot::static_packages : ""}]] {*}{
} }
] ]
#scriptmap applied at end to satisfy silly editor highlighting. #scriptmap applied at end to satisfy silly editor highlighting.
@ -3256,6 +3258,20 @@ namespace eval repl {
#It will also need to be added in that interp #It will also need to be added in that interp
set ::auto_path %autopath% set ::auto_path %autopath%
package prefer %packageprefer% package prefer %packageprefer%
#G-058: runtime static/builtin package baseline captured at kit boot (punk_main.tcl).
#Make it available in this codethread and seed ifneeded mappings so statically-linked
#packages (e.g Thread/twapi on a tcl-sfe runtime) resolve here - and so
#punk::lib::interp_sync_package_paths can propagate the same into the code interp.
namespace eval ::punkboot {}
set ::punkboot::static_prefixes %staticprefixes%
set ::punkboot::static_packages %staticpackages%
if {[dict size $::punkboot::static_packages]} {
dict for {pkgname pinfo} $::punkboot::static_packages {
if {[package provide $pkgname] eq ""} {
package ifneeded $pkgname [dict get $pinfo version] [list load {} [dict get $pinfo prefix]]
}
}
}
set tclmajorv [lindex [split [tcl::info::tclversion] .] 0] set tclmajorv [lindex [split [tcl::info::tclversion] .] 0]
#jmn #jmn
#puts stdout "CODETHREAD tm list" #puts stdout "CODETHREAD tm list"
@ -4215,7 +4231,7 @@ namespace eval repl {
} }
package provide punk::repl [namespace eval punk::repl { package provide punk::repl [namespace eval punk::repl {
variable version variable version
set version 0.2.2 set version 0.3.0
}] }]
#repl::start $program_read_stdin_pipe #repl::start $program_read_stdin_pipe

19
src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/shellthread-1.6.3.tm → src/bootsupport/modules/shellthread-1.7.0.tm

@ -617,7 +617,9 @@ namespace eval shellthread::manager {
#set ts_start [::shellthread::iso8601] #set ts_start [::shellthread::iso8601]
set tidworker [thread::create -preserved] set tidworker [thread::create -preserved]
set init_script [string map [list %ts_start% $ts_start %mp% [tcl::tm::list] %ap% $::auto_path %tidcli% $tidclient %sd% $settingsdict] { set static_prefixes [expr {[info exists ::punkboot::static_prefixes] ? $::punkboot::static_prefixes : ""}]
set static_packages [expr {[info exists ::punkboot::static_packages] ? $::punkboot::static_packages : ""}]
set init_script [string map [list %ts_start% $ts_start %mp% [tcl::tm::list] %ap% $::auto_path %tidcli% $tidclient %sd% $settingsdict %spfx% [list $static_prefixes] %spkg% [list $static_packages]] {
#set tclbase [file dirname [file dirname [info nameofexecutable]]] #set tclbase [file dirname [file dirname [info nameofexecutable]]]
#set tcllib $tclbase/lib #set tcllib $tclbase/lib
#if {$tcllib ni $::auto_path} { #if {$tcllib ni $::auto_path} {
@ -642,6 +644,19 @@ namespace eval shellthread::manager {
set ::auto_path [dict get $::settingsinfo auto_path] set ::auto_path [dict get $::settingsinfo auto_path]
} }
#G-058: runtime static/builtin package baseline captured at kit boot (punk_main.tcl)
#seed ifneeded mappings so statically-linked packages resolve in this worker
namespace eval ::punkboot {}
set ::punkboot::static_prefixes %spfx%
set ::punkboot::static_packages %spkg%
if {[dict size $::punkboot::static_packages]} {
dict for {pkgname pinfo} $::punkboot::static_packages {
if {[package provide $pkgname] eq ""} {
package ifneeded $pkgname [dict get $pinfo version] [list load {} [dict get $pinfo prefix]]
}
}
}
package require punk::packagepreference package require punk::packagepreference
punk::packagepreference::install punk::packagepreference::install
@ -973,7 +988,7 @@ namespace eval shellthread::manager {
package provide shellthread [namespace eval shellthread { package provide shellthread [namespace eval shellthread {
variable version variable version
set version 1.6.3 set version 1.7.0
}] }]

44
src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/lib-0.3.1.tm → src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/lib-0.4.0.tm

@ -8,7 +8,7 @@
# (C) 2024 # (C) 2024
# #
# @@ Meta Begin # @@ Meta Begin
# Application punk::lib 0.3.1 # Application punk::lib 0.4.0
# Meta platform tcl # Meta platform tcl
# Meta license BSD # Meta license BSD
# @@ Meta End # @@ Meta End
@ -18,7 +18,7 @@
# doctools header # doctools header
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
#*** !doctools #*** !doctools
#[manpage_begin punkshell_module_punk::lib 0 0.3.1] #[manpage_begin punkshell_module_punk::lib 0 0.4.0]
#[copyright "2024"] #[copyright "2024"]
#[titledesc {punk general utility functions}] [comment {-- Name section and table of contents description --}] #[titledesc {punk general utility functions}] [comment {-- Name section and table of contents description --}]
#[moddesc {punk library}] [comment {-- Description at end of page heading --}] #[moddesc {punk library}] [comment {-- Description at end of page heading --}]
@ -8197,6 +8197,12 @@ namespace eval punk::lib {
is used, in which case punk::libunknown is sourced from the tm paths that were is used, in which case punk::libunknown is sourced from the tm paths that were
already set up by the earlier part of the script. already set up by the earlier part of the script.
When the kit boot captured runtime static/builtin packages
(::punkboot::static_packages - see punk_main.tcl), the script also copies
that baseline and seeds 'package ifneeded <name> <ver> {load {} <prefix>}'
entries so statically-linked packages (e.g Thread/twapi on a tcl-sfe
runtime) resolve in the target.
See also: punk::lib::interp_sync_package_paths" See also: punk::lib::interp_sync_package_paths"
@opts @opts
-libunknown -type boolean -default 0 -help\ -libunknown -type boolean -default 0 -help\
@ -8235,6 +8241,18 @@ namespace eval punk::lib {
append script "tcl::tm::add \{*\}\[list [lreverse $tmlist]\]\n" append script "tcl::tm::add \{*\}\[list [lreverse $tmlist]\]\n"
append script "set ::auto_path \[list $ap\]\n" append script "set ::auto_path \[list $ap\]\n"
append script "package prefer $prefer\n" append script "package prefer $prefer\n"
#G-058: propagate runtime static/builtin package mappings captured at kit boot
#(see punk_main.tcl) so 'package require' of a statically-linked package (e.g
#Thread/twapi on a tcl-sfe runtime) resolves in the new thread/interp even though
#no pkgIndex for it exists on the (replaced) package search paths.
if {[info exists ::punkboot::static_packages] && [dict size $::punkboot::static_packages]} {
append script "namespace eval ::punkboot {}\n"
append script [list set ::punkboot::static_prefixes $::punkboot::static_prefixes] \n
append script [list set ::punkboot::static_packages $::punkboot::static_packages] \n
dict for {pkgname pinfo} $::punkboot::static_packages {
append script "if \{\[package provide [list $pkgname]\] eq \"\"\} \{[list package ifneeded $pkgname [dict get $pinfo version] [list load {} [dict get $pinfo prefix]]]\}\n"
}
}
if {$do_libunknown} { if {$do_libunknown} {
if {[info exists ::punk::libunknown::epoch]} { if {[info exists ::punk::libunknown::epoch]} {
append script "namespace eval ::punk::libunknown {}\n" append script "namespace eval ::punk::libunknown {}\n"
@ -8299,6 +8317,12 @@ namespace eval punk::lib {
package unknown handler and scan cache as the parent. This is recommended package unknown handler and scan cache as the parent. This is recommended
when the child will do significant package loading. when the child will do significant package loading.
When the kit boot captured runtime static/builtin packages
(::punkboot::static_packages - see punk_main.tcl), the child also receives
that baseline plus 'package ifneeded <name> <ver> {load {} <prefix>}'
seeding so statically-linked packages (e.g Thread/twapi on a tcl-sfe
runtime) resolve in the child.
This is an opt-in helper — call sites that don't use it keep their current This is an opt-in helper — call sites that don't use it keep their current
behavior. It does not load packages, install punk::packagepreference, share behavior. It does not load packages, install punk::packagepreference, share
channels, or configure safe-interp restrictions — those remain caller channels, or configure safe-interp restrictions — those remain caller
@ -8340,6 +8364,20 @@ namespace eval punk::lib {
interp eval $interp {tcl::tm::remove {*}[tcl::tm::list]} interp eval $interp {tcl::tm::remove {*}[tcl::tm::list]}
interp eval $interp [list tcl::tm::add {*}[lreverse [tcl::tm::list]]] interp eval $interp [list tcl::tm::add {*}[lreverse [tcl::tm::list]]]
interp eval $interp [list package prefer [package prefer]] interp eval $interp [list package prefer [package prefer]]
#G-058: propagate runtime static/builtin package mappings captured at kit boot
#(see punk_main.tcl) so 'package require' of a statically-linked package (e.g
#Thread/twapi on a tcl-sfe runtime) resolves in the child interp even though no
#pkgIndex for it exists on the (replaced) package search paths.
if {[info exists ::punkboot::static_packages] && [dict size $::punkboot::static_packages]} {
interp eval $interp [list namespace eval ::punkboot {}]
interp eval $interp [list set ::punkboot::static_prefixes $::punkboot::static_prefixes]
interp eval $interp [list set ::punkboot::static_packages $::punkboot::static_packages]
dict for {pkgname pinfo} $::punkboot::static_packages {
if {[interp eval $interp [list package provide $pkgname]] eq ""} {
interp eval $interp [list package ifneeded $pkgname [dict get $pinfo version] [list load {} [dict get $pinfo prefix]]]
}
}
}
#extended: copy epoch + source libunknown + call init #extended: copy epoch + source libunknown + call init
if {$do_libunknown} { if {$do_libunknown} {
if {[info exists ::punk::libunknown::epoch]} { if {[info exists ::punk::libunknown::epoch]} {
@ -9135,7 +9173,7 @@ namespace eval ::punk::args::register {
package provide punk::lib [tcl::namespace::eval punk::lib { package provide punk::lib [tcl::namespace::eval punk::lib {
variable pkg punk::lib variable pkg punk::lib
variable version variable version
set version 0.3.1 set version 0.4.0
}] }]
return return

31
src/bootsupport/modules/punk/packagepreference-0.1.1.tm → src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/packagepreference-0.2.0.tm

@ -8,7 +8,7 @@
# (C) 2024 # (C) 2024
# #
# @@ Meta Begin # @@ Meta Begin
# Application punk::packagepreference 0.1.1 # Application punk::packagepreference 0.2.0
# Meta platform tcl # Meta platform tcl
# Meta license <unspecified> # Meta license <unspecified>
# @@ Meta End # @@ Meta End
@ -18,7 +18,7 @@
# doctools header # doctools header
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
#*** !doctools #*** !doctools
#[manpage_begin punkshell_module_punk::packagepreference 0 0.1.1] #[manpage_begin punkshell_module_punk::packagepreference 0 0.2.0]
#[copyright "2024"] #[copyright "2024"]
#[titledesc {punkshell package/module loading}] [comment {-- Name section and table of contents description --}] #[titledesc {punkshell package/module loading}] [comment {-- Name section and table of contents description --}]
#[moddesc {package/module load}] [comment {-- Description at end of page heading --}] #[moddesc {package/module load}] [comment {-- Description at end of page heading --}]
@ -171,6 +171,24 @@ tcl::namespace::eval punk::packagepreference {
return [uplevel 1 [list $COMMANDSTACKNEXT {*}$args]] return [uplevel 1 [list $COMMANDSTACKNEXT {*}$args]]
} }
#G-058 static-vs-bundled policy for runtime static/builtin packages
#(baseline captured at kit boot into ::punkboot::static_packages - see punk_main.tcl).
#Ensure the static mapping exists in this interp (seeding is normally done at
#interp/thread creation - this covers stragglers), then trigger the package
#unknown index scan so any bundled vfs/module copies are ALSO registered before
#resolution. With all candidates registered, standard resolution compares
#versions (highest acceptable wins) - a static copy is not blindly masked by an
#older bundled dll, and a genuinely newer bundled copy remains reachable.
#(On identical versions the bundled copy's ifneeded entry, registered by the
# later scan, wins - same version either way.)
if {[info exists ::punkboot::static_packages] && [dict exists $::punkboot::static_packages $pkg]} {
set spinfo [dict get $::punkboot::static_packages $pkg]
if {[dict get $spinfo version] ni [$COMMANDSTACKNEXT_ORIGINAL versions $pkg]} {
$COMMANDSTACKNEXT_ORIGINAL ifneeded $pkg [dict get $spinfo version] [list load {} [dict get $spinfo prefix]]
}
catch {uplevel 1 [list {*}[$COMMANDSTACKNEXT_ORIGINAL unknown] $pkg]}
}
if {!$is_exact && [llength $vwant] <= 1 } { if {!$is_exact && [llength $vwant] <= 1 } {
#required version unspecified - or specified singularly #required version unspecified - or specified singularly
set available_versions [$COMMANDSTACKNEXT_ORIGINAL versions $pkg] set available_versions [$COMMANDSTACKNEXT_ORIGINAL versions $pkg]
@ -179,7 +197,12 @@ tcl::namespace::eval punk::packagepreference {
#An attempt to detect dll/so loaded and try to load same version #An attempt to detect dll/so loaded and try to load same version
#dll/so files are often named with version numbers that don't contain dots or a version number at all #dll/so files are often named with version numbers that don't contain dots or a version number at all
#e.g sqlite3400.dll Thread288.dll #e.g sqlite3400.dll Thread288.dll
set pkgloadedinfo [lsearch -nocase -inline -index 1 [info loaded] $pkg] #G-058: exclude empty-filename entries - those are static REGISTRATIONS
#(process-global, not necessarily loaded anywhere) and forcing their
#version here would defeat the version-aware static-vs-bundled policy
#above (e.g pinning to the static version even when a bundled copy is
#genuinely newer)
set pkgloadedinfo [lsearch -nocase -inline -index 1 [lsearch -all -inline -not -exact -index 0 [info loaded] {}] $pkg]
if {[llength $pkgloadedinfo]} { if {[llength $pkgloadedinfo]} {
if {[llength $available_versions] > 1} { if {[llength $available_versions] > 1} {
@ -489,7 +512,7 @@ namespace eval ::punk::args::register {
package provide punk::packagepreference [tcl::namespace::eval punk::packagepreference { package provide punk::packagepreference [tcl::namespace::eval punk::packagepreference {
variable pkg punk::packagepreference variable pkg punk::packagepreference
variable version variable version
set version 0.1.1 set version 0.2.0
}] }]
return return

18
src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/repl-0.2.2.tm → src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/punk/repl-0.3.0.tm

@ -3241,6 +3241,8 @@ namespace eval repl {
} %autopath% [list $::auto_path] {*}{ } %autopath% [list $::auto_path] {*}{
} %lib_epoch% [list $::punk::libunknown::epoch] {*}{ } %lib_epoch% [list $::punk::libunknown::epoch] {*}{
} %packageprefer% [list [package prefer]] {*}{ } %packageprefer% [list [package prefer]] {*}{
} %staticprefixes% [list [expr {[info exists ::punkboot::static_prefixes] ? $::punkboot::static_prefixes : ""}]] {*}{
} %staticpackages% [list [expr {[info exists ::punkboot::static_packages] ? $::punkboot::static_packages : ""}]] {*}{
} }
] ]
#scriptmap applied at end to satisfy silly editor highlighting. #scriptmap applied at end to satisfy silly editor highlighting.
@ -3256,6 +3258,20 @@ namespace eval repl {
#It will also need to be added in that interp #It will also need to be added in that interp
set ::auto_path %autopath% set ::auto_path %autopath%
package prefer %packageprefer% package prefer %packageprefer%
#G-058: runtime static/builtin package baseline captured at kit boot (punk_main.tcl).
#Make it available in this codethread and seed ifneeded mappings so statically-linked
#packages (e.g Thread/twapi on a tcl-sfe runtime) resolve here - and so
#punk::lib::interp_sync_package_paths can propagate the same into the code interp.
namespace eval ::punkboot {}
set ::punkboot::static_prefixes %staticprefixes%
set ::punkboot::static_packages %staticpackages%
if {[dict size $::punkboot::static_packages]} {
dict for {pkgname pinfo} $::punkboot::static_packages {
if {[package provide $pkgname] eq ""} {
package ifneeded $pkgname [dict get $pinfo version] [list load {} [dict get $pinfo prefix]]
}
}
}
set tclmajorv [lindex [split [tcl::info::tclversion] .] 0] set tclmajorv [lindex [split [tcl::info::tclversion] .] 0]
#jmn #jmn
#puts stdout "CODETHREAD tm list" #puts stdout "CODETHREAD tm list"
@ -4215,7 +4231,7 @@ namespace eval repl {
} }
package provide punk::repl [namespace eval punk::repl { package provide punk::repl [namespace eval punk::repl {
variable version variable version
set version 0.2.2 set version 0.3.0
}] }]
#repl::start $program_read_stdin_pipe #repl::start $program_read_stdin_pipe

19
src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/shellthread-1.6.3.tm → src/project_layouts/custom/_project/punk.project-0.1/src/bootsupport/modules/shellthread-1.7.0.tm

@ -617,7 +617,9 @@ namespace eval shellthread::manager {
#set ts_start [::shellthread::iso8601] #set ts_start [::shellthread::iso8601]
set tidworker [thread::create -preserved] set tidworker [thread::create -preserved]
set init_script [string map [list %ts_start% $ts_start %mp% [tcl::tm::list] %ap% $::auto_path %tidcli% $tidclient %sd% $settingsdict] { set static_prefixes [expr {[info exists ::punkboot::static_prefixes] ? $::punkboot::static_prefixes : ""}]
set static_packages [expr {[info exists ::punkboot::static_packages] ? $::punkboot::static_packages : ""}]
set init_script [string map [list %ts_start% $ts_start %mp% [tcl::tm::list] %ap% $::auto_path %tidcli% $tidclient %sd% $settingsdict %spfx% [list $static_prefixes] %spkg% [list $static_packages]] {
#set tclbase [file dirname [file dirname [info nameofexecutable]]] #set tclbase [file dirname [file dirname [info nameofexecutable]]]
#set tcllib $tclbase/lib #set tcllib $tclbase/lib
#if {$tcllib ni $::auto_path} { #if {$tcllib ni $::auto_path} {
@ -642,6 +644,19 @@ namespace eval shellthread::manager {
set ::auto_path [dict get $::settingsinfo auto_path] set ::auto_path [dict get $::settingsinfo auto_path]
} }
#G-058: runtime static/builtin package baseline captured at kit boot (punk_main.tcl)
#seed ifneeded mappings so statically-linked packages resolve in this worker
namespace eval ::punkboot {}
set ::punkboot::static_prefixes %spfx%
set ::punkboot::static_packages %spkg%
if {[dict size $::punkboot::static_packages]} {
dict for {pkgname pinfo} $::punkboot::static_packages {
if {[package provide $pkgname] eq ""} {
package ifneeded $pkgname [dict get $pinfo version] [list load {} [dict get $pinfo prefix]]
}
}
}
package require punk::packagepreference package require punk::packagepreference
punk::packagepreference::install punk::packagepreference::install
@ -973,7 +988,7 @@ namespace eval shellthread::manager {
package provide shellthread [namespace eval shellthread { package provide shellthread [namespace eval shellthread {
variable version variable version
set version 1.6.3 set version 1.7.0
}] }]

44
src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/lib-0.3.1.tm → src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/lib-0.4.0.tm

@ -8,7 +8,7 @@
# (C) 2024 # (C) 2024
# #
# @@ Meta Begin # @@ Meta Begin
# Application punk::lib 0.3.1 # Application punk::lib 0.4.0
# Meta platform tcl # Meta platform tcl
# Meta license BSD # Meta license BSD
# @@ Meta End # @@ Meta End
@ -18,7 +18,7 @@
# doctools header # doctools header
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
#*** !doctools #*** !doctools
#[manpage_begin punkshell_module_punk::lib 0 0.3.1] #[manpage_begin punkshell_module_punk::lib 0 0.4.0]
#[copyright "2024"] #[copyright "2024"]
#[titledesc {punk general utility functions}] [comment {-- Name section and table of contents description --}] #[titledesc {punk general utility functions}] [comment {-- Name section and table of contents description --}]
#[moddesc {punk library}] [comment {-- Description at end of page heading --}] #[moddesc {punk library}] [comment {-- Description at end of page heading --}]
@ -8197,6 +8197,12 @@ namespace eval punk::lib {
is used, in which case punk::libunknown is sourced from the tm paths that were is used, in which case punk::libunknown is sourced from the tm paths that were
already set up by the earlier part of the script. already set up by the earlier part of the script.
When the kit boot captured runtime static/builtin packages
(::punkboot::static_packages - see punk_main.tcl), the script also copies
that baseline and seeds 'package ifneeded <name> <ver> {load {} <prefix>}'
entries so statically-linked packages (e.g Thread/twapi on a tcl-sfe
runtime) resolve in the target.
See also: punk::lib::interp_sync_package_paths" See also: punk::lib::interp_sync_package_paths"
@opts @opts
-libunknown -type boolean -default 0 -help\ -libunknown -type boolean -default 0 -help\
@ -8235,6 +8241,18 @@ namespace eval punk::lib {
append script "tcl::tm::add \{*\}\[list [lreverse $tmlist]\]\n" append script "tcl::tm::add \{*\}\[list [lreverse $tmlist]\]\n"
append script "set ::auto_path \[list $ap\]\n" append script "set ::auto_path \[list $ap\]\n"
append script "package prefer $prefer\n" append script "package prefer $prefer\n"
#G-058: propagate runtime static/builtin package mappings captured at kit boot
#(see punk_main.tcl) so 'package require' of a statically-linked package (e.g
#Thread/twapi on a tcl-sfe runtime) resolves in the new thread/interp even though
#no pkgIndex for it exists on the (replaced) package search paths.
if {[info exists ::punkboot::static_packages] && [dict size $::punkboot::static_packages]} {
append script "namespace eval ::punkboot {}\n"
append script [list set ::punkboot::static_prefixes $::punkboot::static_prefixes] \n
append script [list set ::punkboot::static_packages $::punkboot::static_packages] \n
dict for {pkgname pinfo} $::punkboot::static_packages {
append script "if \{\[package provide [list $pkgname]\] eq \"\"\} \{[list package ifneeded $pkgname [dict get $pinfo version] [list load {} [dict get $pinfo prefix]]]\}\n"
}
}
if {$do_libunknown} { if {$do_libunknown} {
if {[info exists ::punk::libunknown::epoch]} { if {[info exists ::punk::libunknown::epoch]} {
append script "namespace eval ::punk::libunknown {}\n" append script "namespace eval ::punk::libunknown {}\n"
@ -8299,6 +8317,12 @@ namespace eval punk::lib {
package unknown handler and scan cache as the parent. This is recommended package unknown handler and scan cache as the parent. This is recommended
when the child will do significant package loading. when the child will do significant package loading.
When the kit boot captured runtime static/builtin packages
(::punkboot::static_packages - see punk_main.tcl), the child also receives
that baseline plus 'package ifneeded <name> <ver> {load {} <prefix>}'
seeding so statically-linked packages (e.g Thread/twapi on a tcl-sfe
runtime) resolve in the child.
This is an opt-in helper — call sites that don't use it keep their current This is an opt-in helper — call sites that don't use it keep their current
behavior. It does not load packages, install punk::packagepreference, share behavior. It does not load packages, install punk::packagepreference, share
channels, or configure safe-interp restrictions — those remain caller channels, or configure safe-interp restrictions — those remain caller
@ -8340,6 +8364,20 @@ namespace eval punk::lib {
interp eval $interp {tcl::tm::remove {*}[tcl::tm::list]} interp eval $interp {tcl::tm::remove {*}[tcl::tm::list]}
interp eval $interp [list tcl::tm::add {*}[lreverse [tcl::tm::list]]] interp eval $interp [list tcl::tm::add {*}[lreverse [tcl::tm::list]]]
interp eval $interp [list package prefer [package prefer]] interp eval $interp [list package prefer [package prefer]]
#G-058: propagate runtime static/builtin package mappings captured at kit boot
#(see punk_main.tcl) so 'package require' of a statically-linked package (e.g
#Thread/twapi on a tcl-sfe runtime) resolves in the child interp even though no
#pkgIndex for it exists on the (replaced) package search paths.
if {[info exists ::punkboot::static_packages] && [dict size $::punkboot::static_packages]} {
interp eval $interp [list namespace eval ::punkboot {}]
interp eval $interp [list set ::punkboot::static_prefixes $::punkboot::static_prefixes]
interp eval $interp [list set ::punkboot::static_packages $::punkboot::static_packages]
dict for {pkgname pinfo} $::punkboot::static_packages {
if {[interp eval $interp [list package provide $pkgname]] eq ""} {
interp eval $interp [list package ifneeded $pkgname [dict get $pinfo version] [list load {} [dict get $pinfo prefix]]]
}
}
}
#extended: copy epoch + source libunknown + call init #extended: copy epoch + source libunknown + call init
if {$do_libunknown} { if {$do_libunknown} {
if {[info exists ::punk::libunknown::epoch]} { if {[info exists ::punk::libunknown::epoch]} {
@ -9135,7 +9173,7 @@ namespace eval ::punk::args::register {
package provide punk::lib [tcl::namespace::eval punk::lib { package provide punk::lib [tcl::namespace::eval punk::lib {
variable pkg punk::lib variable pkg punk::lib
variable version variable version
set version 0.3.1 set version 0.4.0
}] }]
return return

31
src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/packagepreference-0.1.1.tm → src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/packagepreference-0.2.0.tm

@ -8,7 +8,7 @@
# (C) 2024 # (C) 2024
# #
# @@ Meta Begin # @@ Meta Begin
# Application punk::packagepreference 0.1.1 # Application punk::packagepreference 0.2.0
# Meta platform tcl # Meta platform tcl
# Meta license <unspecified> # Meta license <unspecified>
# @@ Meta End # @@ Meta End
@ -18,7 +18,7 @@
# doctools header # doctools header
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ # ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++
#*** !doctools #*** !doctools
#[manpage_begin punkshell_module_punk::packagepreference 0 0.1.1] #[manpage_begin punkshell_module_punk::packagepreference 0 0.2.0]
#[copyright "2024"] #[copyright "2024"]
#[titledesc {punkshell package/module loading}] [comment {-- Name section and table of contents description --}] #[titledesc {punkshell package/module loading}] [comment {-- Name section and table of contents description --}]
#[moddesc {package/module load}] [comment {-- Description at end of page heading --}] #[moddesc {package/module load}] [comment {-- Description at end of page heading --}]
@ -171,6 +171,24 @@ tcl::namespace::eval punk::packagepreference {
return [uplevel 1 [list $COMMANDSTACKNEXT {*}$args]] return [uplevel 1 [list $COMMANDSTACKNEXT {*}$args]]
} }
#G-058 static-vs-bundled policy for runtime static/builtin packages
#(baseline captured at kit boot into ::punkboot::static_packages - see punk_main.tcl).
#Ensure the static mapping exists in this interp (seeding is normally done at
#interp/thread creation - this covers stragglers), then trigger the package
#unknown index scan so any bundled vfs/module copies are ALSO registered before
#resolution. With all candidates registered, standard resolution compares
#versions (highest acceptable wins) - a static copy is not blindly masked by an
#older bundled dll, and a genuinely newer bundled copy remains reachable.
#(On identical versions the bundled copy's ifneeded entry, registered by the
# later scan, wins - same version either way.)
if {[info exists ::punkboot::static_packages] && [dict exists $::punkboot::static_packages $pkg]} {
set spinfo [dict get $::punkboot::static_packages $pkg]
if {[dict get $spinfo version] ni [$COMMANDSTACKNEXT_ORIGINAL versions $pkg]} {
$COMMANDSTACKNEXT_ORIGINAL ifneeded $pkg [dict get $spinfo version] [list load {} [dict get $spinfo prefix]]
}
catch {uplevel 1 [list {*}[$COMMANDSTACKNEXT_ORIGINAL unknown] $pkg]}
}
if {!$is_exact && [llength $vwant] <= 1 } { if {!$is_exact && [llength $vwant] <= 1 } {
#required version unspecified - or specified singularly #required version unspecified - or specified singularly
set available_versions [$COMMANDSTACKNEXT_ORIGINAL versions $pkg] set available_versions [$COMMANDSTACKNEXT_ORIGINAL versions $pkg]
@ -179,7 +197,12 @@ tcl::namespace::eval punk::packagepreference {
#An attempt to detect dll/so loaded and try to load same version #An attempt to detect dll/so loaded and try to load same version
#dll/so files are often named with version numbers that don't contain dots or a version number at all #dll/so files are often named with version numbers that don't contain dots or a version number at all
#e.g sqlite3400.dll Thread288.dll #e.g sqlite3400.dll Thread288.dll
set pkgloadedinfo [lsearch -nocase -inline -index 1 [info loaded] $pkg] #G-058: exclude empty-filename entries - those are static REGISTRATIONS
#(process-global, not necessarily loaded anywhere) and forcing their
#version here would defeat the version-aware static-vs-bundled policy
#above (e.g pinning to the static version even when a bundled copy is
#genuinely newer)
set pkgloadedinfo [lsearch -nocase -inline -index 1 [lsearch -all -inline -not -exact -index 0 [info loaded] {}] $pkg]
if {[llength $pkgloadedinfo]} { if {[llength $pkgloadedinfo]} {
if {[llength $available_versions] > 1} { if {[llength $available_versions] > 1} {
@ -489,7 +512,7 @@ namespace eval ::punk::args::register {
package provide punk::packagepreference [tcl::namespace::eval punk::packagepreference { package provide punk::packagepreference [tcl::namespace::eval punk::packagepreference {
variable pkg punk::packagepreference variable pkg punk::packagepreference
variable version variable version
set version 0.1.1 set version 0.2.0
}] }]
return return

18
src/bootsupport/modules/punk/repl-0.2.2.tm → src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/punk/repl-0.3.0.tm

@ -3241,6 +3241,8 @@ namespace eval repl {
} %autopath% [list $::auto_path] {*}{ } %autopath% [list $::auto_path] {*}{
} %lib_epoch% [list $::punk::libunknown::epoch] {*}{ } %lib_epoch% [list $::punk::libunknown::epoch] {*}{
} %packageprefer% [list [package prefer]] {*}{ } %packageprefer% [list [package prefer]] {*}{
} %staticprefixes% [list [expr {[info exists ::punkboot::static_prefixes] ? $::punkboot::static_prefixes : ""}]] {*}{
} %staticpackages% [list [expr {[info exists ::punkboot::static_packages] ? $::punkboot::static_packages : ""}]] {*}{
} }
] ]
#scriptmap applied at end to satisfy silly editor highlighting. #scriptmap applied at end to satisfy silly editor highlighting.
@ -3256,6 +3258,20 @@ namespace eval repl {
#It will also need to be added in that interp #It will also need to be added in that interp
set ::auto_path %autopath% set ::auto_path %autopath%
package prefer %packageprefer% package prefer %packageprefer%
#G-058: runtime static/builtin package baseline captured at kit boot (punk_main.tcl).
#Make it available in this codethread and seed ifneeded mappings so statically-linked
#packages (e.g Thread/twapi on a tcl-sfe runtime) resolve here - and so
#punk::lib::interp_sync_package_paths can propagate the same into the code interp.
namespace eval ::punkboot {}
set ::punkboot::static_prefixes %staticprefixes%
set ::punkboot::static_packages %staticpackages%
if {[dict size $::punkboot::static_packages]} {
dict for {pkgname pinfo} $::punkboot::static_packages {
if {[package provide $pkgname] eq ""} {
package ifneeded $pkgname [dict get $pinfo version] [list load {} [dict get $pinfo prefix]]
}
}
}
set tclmajorv [lindex [split [tcl::info::tclversion] .] 0] set tclmajorv [lindex [split [tcl::info::tclversion] .] 0]
#jmn #jmn
#puts stdout "CODETHREAD tm list" #puts stdout "CODETHREAD tm list"
@ -4215,7 +4231,7 @@ namespace eval repl {
} }
package provide punk::repl [namespace eval punk::repl { package provide punk::repl [namespace eval punk::repl {
variable version variable version
set version 0.2.2 set version 0.3.0
}] }]
#repl::start $program_read_stdin_pipe #repl::start $program_read_stdin_pipe

19
src/bootsupport/modules/shellthread-1.6.3.tm → src/project_layouts/custom/_project/punk.shell-0.1/src/bootsupport/modules/shellthread-1.7.0.tm

@ -617,7 +617,9 @@ namespace eval shellthread::manager {
#set ts_start [::shellthread::iso8601] #set ts_start [::shellthread::iso8601]
set tidworker [thread::create -preserved] set tidworker [thread::create -preserved]
set init_script [string map [list %ts_start% $ts_start %mp% [tcl::tm::list] %ap% $::auto_path %tidcli% $tidclient %sd% $settingsdict] { set static_prefixes [expr {[info exists ::punkboot::static_prefixes] ? $::punkboot::static_prefixes : ""}]
set static_packages [expr {[info exists ::punkboot::static_packages] ? $::punkboot::static_packages : ""}]
set init_script [string map [list %ts_start% $ts_start %mp% [tcl::tm::list] %ap% $::auto_path %tidcli% $tidclient %sd% $settingsdict %spfx% [list $static_prefixes] %spkg% [list $static_packages]] {
#set tclbase [file dirname [file dirname [info nameofexecutable]]] #set tclbase [file dirname [file dirname [info nameofexecutable]]]
#set tcllib $tclbase/lib #set tcllib $tclbase/lib
#if {$tcllib ni $::auto_path} { #if {$tcllib ni $::auto_path} {
@ -642,6 +644,19 @@ namespace eval shellthread::manager {
set ::auto_path [dict get $::settingsinfo auto_path] set ::auto_path [dict get $::settingsinfo auto_path]
} }
#G-058: runtime static/builtin package baseline captured at kit boot (punk_main.tcl)
#seed ifneeded mappings so statically-linked packages resolve in this worker
namespace eval ::punkboot {}
set ::punkboot::static_prefixes %spfx%
set ::punkboot::static_packages %spkg%
if {[dict size $::punkboot::static_packages]} {
dict for {pkgname pinfo} $::punkboot::static_packages {
if {[package provide $pkgname] eq ""} {
package ifneeded $pkgname [dict get $pinfo version] [list load {} [dict get $pinfo prefix]]
}
}
}
package require punk::packagepreference package require punk::packagepreference
punk::packagepreference::install punk::packagepreference::install
@ -973,7 +988,7 @@ namespace eval shellthread::manager {
package provide shellthread [namespace eval shellthread { package provide shellthread [namespace eval shellthread {
variable version variable version
set version 1.6.3 set version 1.7.0
}] }]
Loading…
Cancel
Save