@ -507,6 +507,7 @@ namespace eval punk::mix::cli {
-punkcheck_eventobj "\uFFFF"\
-punkcheck_eventobj "\uFFFF"\
-glob *.tm\
-glob *.tm\
-podglob #modpod-*\
-podglob #modpod-*\
-tarjarglob #tarjar-*\
]
]
set opts [dict merge $defaults $args]
set opts [dict merge $defaults $args]
@ -519,6 +520,7 @@ namespace eval punk::mix::cli {
# -- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
# -- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
set fileglob [dict get $opts -glob]
set fileglob [dict get $opts -glob]
set podglob [dict get $opts -podglob]
set podglob [dict get $opts -podglob]
set tarjarglob [dict get $opts -tarjarglob]
if {![string match "*.tm" $fileglob]} {
if {![string match "*.tm" $fileglob]} {
error "build_modules_from_source_to_base -glob '$fileglob' doesn't seem to target tcl modules."
error "build_modules_from_source_to_base -glob '$fileglob' doesn't seem to target tcl modules."
}
}
@ -580,6 +582,10 @@ namespace eval punk::mix::cli {
foreach podpath $src_pods {
foreach podpath $src_pods {
dict set process_modules $podpath [dict create -type pod]
dict set process_modules $podpath [dict create -type pod]
}
}
set src_tarjars [glob -nocomplain -dir $current_source_dir -type d -tail $tarjarglob]
foreach tarjarpath $src_tarjars {
dict set process_modules $tarjarpath [dict create -type tarjar]
}
set src_modules [glob -nocomplain -dir $current_source_dir -type f -tail $fileglob]
set src_modules [glob -nocomplain -dir $current_source_dir -type f -tail $fileglob]
foreach modulepath $src_modules {
foreach modulepath $src_modules {
dict set process_modules $modulepath [dict create -type file]
dict set process_modules $modulepath [dict create -type file]
@ -801,8 +807,173 @@ namespace eval punk::mix::cli {
}
}
}
}
tarjar {
tarjar {
#maint - overall code structure same as pod - refactor?
#basename may still contain #tarjar-
#basename may still contain #tarjar-
#to be obsoleted - update modpod to (optionally) use vfs::tar ?
#to be obsoleted - update modpod to (optionally) use vfs::tar ?
if {[string match #tarjar-* $basename]} {
set basename [string range $basename 8 end]
} else {
error "build_modules_from_source_to_base, tarjar, unexpected basename $basename" ;#shouldn't be possible with default tarjarglob - review - why is tarjarglob configurable?
}
set versionfile $current_source_dir/$basename-buildversion.txt ;#needs to be added in targetset_addsource to trigger rebuild if changed (only when magicversion in use)
if {$tmfile_versionsegment eq $magicversion} {
set versionfiledata ""
if {![file exists $versionfile]} {
puts stderr "\nWARNING: Missing buildversion text file: $versionfile"
puts stderr "Using version 0.1 - create $versionfile containing the desired version number as the top line to avoid this warning\n"
set module_build_version "0.1"
} else {
set fd [open $versionfile r]
set versionfiledata [read $fd]; close $fd
set ln0 [lindex [split $versionfiledata \n] 0]
set ln0 [string trim $ln0]; set ln0 [string trim $ln0 \r]
if {![util::is_valid_tm_version $ln0]} {
puts stderr "ERROR: build version '$ln0' specified in $versionfile is not suitable. Please ensure a proper version number is at first line of file"
exit 3
}
set module_build_version $ln0
}
} else {
set module_build_version $tmfile_versionsegment
}
set buildfolder $current_source_dir/_build
file mkdir $buildfolder
# -- ---
set config [dict create\
-glob *\
-max_depth 100\
]
set had_error 0
# -max_depth -1 for no limit
set build_installername tarjars_in_$current_source_dir
set build_installer [punkcheck::installtrack new $build_installername $buildfolder/.punkcheck]
$build_installer set_source_target $current_source_dir/$modpath $buildfolder
set build_event [$build_installer start_event $config]
# -- ---
set podtree_copy $buildfolder/#tarjar-$basename-$module_build_version
set modulefile $buildfolder/$basename-$module_build_version.tm
$build_event targetset_init INSTALL $podtree_copy
$build_event targetset_addsource $current_source_dir/$modpath
if {$tmfile_versionsegment eq $magicversion} {
$build_event targetset_addsource $versionfile
}
if {\
[llength [dict get [$build_event targetset_source_changes] changed]]\
|| [llength [$build_event get_targets_exist]] < [llength [$build_event get_targets]]\
} {
$build_event targetset_started
if {$did_skip} {set did_skip 0; puts -nonewline stdout \n}
set delete_failed 0
if {[file exists $buildfolder/]} {
puts stderr "deleting existing _build copy at $podtree_copy"
if {[catch {
file delete -force $podtree_copy
} errMsg]} {
puts stderr "[punk::ansi::a+ red]deletion of _build copy at $podtree_copy failed: $errMsg[punk::ansi::a]"
set delete_failed 1
}
}
if {!$delete_failed} {
puts stdout "copying.."
puts stdout "$current_source_dir/$modpath"
puts stdout "to:"
puts stdout "$podtree_copy"
file copy $current_source_dir/$modpath $podtree_copy
if {$tmfile_versionsegment eq $magicversion} {
set tmfile $buildfolder/#tarjar-$basename-$module_build_version/#tarjar-loadscript-$basename.tcl
#we don't need to modify version or name of the loadscript
#just do basic sanity check that the file exists
if {![file exists $tmfile]} {
set had_error 1
lappend notes "tarjar_loadscript_missing"
}
}
#delete and regenerate .tm
set notes [list]
if {[catch {
file delete $buildfolder/$basename-$module_build_version.tm
} err]} {
set had_error 1
lappend notes "tm_delete_failed"
}
#create ordinary tar file without using external executable
package require tar ;#tcllib
set tarfile $buildfolder/$basename-$module_build_version.tm ;#ordinary tar file (no compression - store)
set wd [pwd]
cd $buildfolder
puts "tar::create $tarfile #tarjar-$basename-$module_build_version"
if {[catch {
tar::create $tarfile #tarjar-$basename-$module_build_version
} errMsg]} {
set had_error 1
puts stderr "tar::create $tarfile failed with msg\n $errMsg"
lappend notes "tar_create_failed"
}
cd $wd
if {![file exists $tarfile]} {
set had_error 1
lappend notes "tar_result_missing"
}
if {$had_error} {
$build_event targetset_end FAILED -note [join $notes ,]
} else {
# -- ----------
$build_event targetset_end OK
# -- ----------
}
} else {
$build_event targetset_end FAILED -note "could not delete $podtree_copy"
}
} else {
puts -nonewline stderr "T"
set did_skip 1
#set file_record [punkcheck::installfile_skipped_install $basedir $file_record]
$build_event targetset_end SKIPPED
}
$build_event destroy
$build_installer destroy
#JMN - review
if {!$had_error} {
$event targetset_init INSTALL $target_module_dir/$basename-$module_build_version.tm
$event targetset_addsource $modulefile
if {\
[llength [dict get [$event targetset_source_changes] changed]]\
|| [llength [$event get_targets_exist]] < [llength [$event get_targets]]\
} {
$event targetset_started
# -- --- --- --- --- ---
if {$did_skip} {set did_skip 0; puts -nonewline stdout \n}
lappend module_list $modulefile
if {[catch {
file copy -force $modulefile $target_module_dir
} errMsg]} {
puts stderr "FAILED to copy tarjar module $modulefile to $target_module_dir"
$event targetset_end FAILED -note "could not copy $modulefile"
} else {
puts stderr "Copied tarjar module $modulefile to $target_module_dir"
# -- --- --- --- --- ---
$event targetset_end OK -note "tarjar"
}
} else {
puts -nonewline stderr "t"
set did_skip 1
if {$is_interesting} {
puts stderr "$modulefile [$event targetset_source_changes]"
}
$event targetset_end SKIPPED
}
}
}
}
file {
file {
@ -829,39 +1000,40 @@ namespace eval punk::mix::cli {
if {[file exists $current_source_dir/#tarjar-$basename-$magicversion]} {
if {[file exists $current_source_dir/#tarjar-$basename-$magicversion]} {
#rebuild the .tm from the #tarjar
#rebuilding the .tm from the #tarjar already handled above
puts -nonewline stderr "-"
if {[file exists $current_source_dir/#tarjar-$basename-$magicversion/DESCRIPTION.txt]} {
# if {[file exists $current_source_dir/#tarjar-$basename-$magicversion/DESCRIPTION.txt]} {
} else {
# } else {
}
# }
#REVIEW - should be in same structure/depth as $target_module_dir in _build?
## REVIEW - should be in same structure/depth as $target_module_dir in _build?
#TODO
## TODO
set buildfolder $current_sourcedir/_build
# set buildfolder $current_sourcedir/_build
file mkdir $buildfolder
# file mkdir $buildfolder
set tmfile $buildfolder/$basename-$module_build_version.tm
# set tmfile $buildfolder/$basename-$module_build_version.tm
file delete -force $buildfolder/#tarjar-$basename-$module_build_version
# file delete -force $buildfolder/#tarjar-$basename-$module_build_version
file delete -force $tmfile
# file delete -force $tmfile
file copy -force $current_source_dir/#tarjar-$basename-$magicversion $buildfolder/#tarjar-$basename-$module_build_version
# file copy -force $current_source_dir/#tarjar-$basename-$magicversion $buildfolder/#tarjar-$basename-$module_build_version
#
##
#bsdtar doesn't seem to work.. or I haven't worked out the right options?
## bsdtar doesn't seem to work.. or I haven't worked out the right options?
#exec tar -cvf $buildfolder/$basename-$module_build_version.tm $buildfolder/#tarjar-$basename-$module_build_version
## exec tar -cvf $buildfolder/$basename-$module_build_version.tm $buildfolder/#tarjar-$basename-$module_build_version
package require tar
# package require tar
tar::create $tmfile $buildfolder/#tarjar-$basename-$module_build_version
# tar::create $tmfile $buildfolder/#tarjar-$basename-$module_build_version
if {![file exists $tmfile]} {
# if {![file exists $tmfile]} {
puts stdout "ERROR: failed to build tarjar file $tmfile"
# puts stdout "ERROR: failed to build tarjar file $tmfile"
exit 4
# exit 4
}
# }
#copy the file?
## copy the file?
#set target $target_module_dir/$basename-$module_build_version.tm
## set target $target_module_dir/$basename-$module_build_version.tm
#file copy -force $tmfile $target
## file copy -force $tmfile $target
lappend module_list $tmfile
# lappend module_list $tmfile
} else {
} else {
#assume that either the .tm is not a tarjar - or the tarjar dir is capped (trailing #) and the .tm has been manually tarred.
#assume that either the .tm is not a tarjar - or the tarjar dir is capped (trailing #) and the .tm has been manually tarred.
if {[file exists $current_source_dir/#tarjar-$basename-${magicversion}#]} {
if {[file exists $current_source_dir/#tarjar-$basename-${magicversion}#]} {