You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
6.4 KiB
185 lines
6.4 KiB
# -*- tcl -*- |
|
# Maintenance Instruction: leave the 999999.xxx.x as is and use 'pmix make' or src/make.tcl to update from <pkg>-buildversion.txt |
|
# |
|
# Please consider using a BSD or MIT style license for greatest compatibility with the Tcl ecosystem. |
|
# Code using preferred Tcl licenses can be eligible for inclusion in Tcllib, Tklib and the punk package repository. |
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
|
# (C) 2023 |
|
# |
|
# @@ Meta Begin |
|
# Application punk::mix::commandset::layout 999999.0a1.0 |
|
# Meta platform tcl |
|
# Meta license <unspecified> |
|
# @@ Meta End |
|
|
|
|
|
|
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
|
## Requirements |
|
##e.g package require frobz |
|
|
|
#sort of a circular dependency when commandset loaded by punk::mix::cli - that's ok, but this could theoretically be loaded by another cli and with another base |
|
package require punk::mix |
|
package require punk::mix::base |
|
|
|
|
|
|
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
|
namespace eval punk::mix::commandset::layout { |
|
namespace export * |
|
|
|
#per layout functions |
|
proc files {layout} { |
|
set allfiles [lib::layout_all_files $layout] |
|
return [join $allfiles \n] |
|
} |
|
proc templatefiles {layout} { |
|
set templatefiles [lib::layout_scan_for_template_files $layout] |
|
return [join $templatefiles \n] |
|
} |
|
proc templatefiles.relative {layout} { |
|
set template_base_dict [punk::mix::base::lib::get_template_basefolders] |
|
|
|
set bases_containing_layout [list] |
|
dict for {tbase folderinfo} $template_base_dict { |
|
if {[file exists $tbase/layouts/$layout]} { |
|
lappend bases_containing_layout $tbase |
|
} |
|
} |
|
if {![llength $bases_containing_layout]} { |
|
puts stderr "Unable to locate folder for layout '$layout'" |
|
puts stderr "searched [dict size $template_base_dict] template folders" |
|
return |
|
} |
|
set tpldir [lindex $bases_containing_layout end] |
|
|
|
set layout_base $tpldir/layouts |
|
set layout_dir [file join $layout_base $layout] |
|
|
|
set stripprefix [file normalize $layout_dir] |
|
set templatefiles [lib::layout_scan_for_template_files $layout] |
|
set tails [list] |
|
foreach templatefullpath $templatefiles { |
|
lappend tails [punk::repo::path_strip_alreadynormalized_prefixdepth $templatefullpath $stripprefix] |
|
} |
|
return [join $tails \n] |
|
} |
|
|
|
#layout collection functions - to be imported with punk::overlay::import_commandset separately |
|
namespace eval collection { |
|
namespace export * |
|
proc _default {{glob {}}} { |
|
if {![string length $glob]} { |
|
set glob * |
|
} |
|
set layouts [list] |
|
#set tplfolderdict [punk::cap::templates::folders] |
|
set tplfolderdict [punk::mix::base::lib::get_template_basefolders] |
|
dict for {tdir folderinfo} $tplfolderdict { |
|
set layout_base $tdir/layouts |
|
#collect all layouts and use lsearch glob rather than the filesystem glob (avoid issues with dotted folder names) |
|
set all_layouts [lsort [glob -nocomplain -dir $layout_base -type d -tail *]] |
|
foreach match [lsearch -all -inline $all_layouts $glob] { |
|
lappend layouts [list $match $folderinfo] |
|
} |
|
} |
|
return [join [lsort -index 0 $layouts] \n] |
|
} |
|
|
|
} |
|
namespace eval lib { |
|
proc layout_all_files {layout} { |
|
set tplbasedict [punk::mix::base::lib::get_template_basefolders] |
|
set layouts_found [list] |
|
dict for {tplbase folderinfo} $tplbasedict { |
|
if {[file isdirectory $tplbase/layouts/$layout]} { |
|
lappend layouts_found $tplbase/layouts/$layout |
|
} |
|
} |
|
if {![llength $layouts_found]} { |
|
puts stderr "layout '$layout' not found." |
|
puts stderr "searched [dict size $tplbasedict] template folders" |
|
dict for {tplbase pkg} $tplbasedict { |
|
puts stderr " - $tplbase $pkg" |
|
} |
|
return |
|
} |
|
set layoutfolder [lindex $layouts_found end] |
|
|
|
if {![file isdirectory $layoutfolder]} { |
|
puts stderr "layout '$layout' not found in /layouts within one of template_folders. (get_template_folder returned: $tplbasedict)" |
|
} |
|
set file_list [list] |
|
util::foreach-file $layoutfolder path { |
|
lappend file_list $path |
|
} |
|
|
|
return $file_list |
|
} |
|
|
|
# |
|
#todo - allow specifying which package the layout is from: e.g "punk::mix::templates project" ?? |
|
proc layout_scan_for_template_files {layout {tags {}}} { |
|
#equivalent for projects? punk::mix::commandset::module::lib::templates_dict -scriptpath "" |
|
set tplbasedict [punk::mix::base::lib::get_template_basefolders] |
|
set layouts_found [list] |
|
dict for {tpldir pkg} $tplbasedict { |
|
if {[file isdirectory $tpldir/layouts/$layout]} { |
|
lappend layouts_found $tpldir/layouts/$layout |
|
} |
|
} |
|
if {![llength $layouts_found]} { |
|
puts stderr "layout '$layout' not found." |
|
puts stderr "searched [dict size $tplbasedict] template folders" |
|
dict for {tpldir pkg} $tplbasedict { |
|
puts stderr " - $tpldir $pkg" |
|
} |
|
return |
|
} |
|
set layoutfolder [lindex $layouts_found end] |
|
|
|
#use last matching layout found. review silent if multiple? |
|
if {![llength $tags]} { |
|
#todo - get standard tags from somewhere |
|
set tags [list %project%] |
|
} |
|
set file_list [list] |
|
util::foreach-file $layoutfolder path { |
|
set fd [open $path r] |
|
fconfigure $fd -translation binary |
|
set data [read $fd] |
|
close $fd |
|
foreach tag $tags { |
|
if {[string match "*$tag*" $data]} { |
|
lappend file_list $path |
|
} |
|
} |
|
} |
|
|
|
return $file_list |
|
} |
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ |
|
## Ready |
|
package provide punk::mix::commandset::layout [namespace eval punk::mix::commandset::layout { |
|
variable version |
|
set version 999999.0a1.0 |
|
}] |
|
return
|
|
|