#! /usr/bin/env tclkit source [file join [file dirname [info script]] util.tcl] proc submitpart {type path data} { set md [md5c $data] set ams [amspath $md [string length $data] 1] if {![file exists $ams]} { puts " $ams $type [file tail $path] ([string length $data]b)" set cdata [vfs::zip -mode compress $data] if {[string length $cdata] < [string length $data]} { set data $cdata } set fd [open $ams w] fconfigure $fd -translation binary puts -nonewline $fd $data close $fd } return $md } proc submitsk {path go} { puts $path: if {![file readable $path]} { puts "\tnot readable, skipped" return } if {[file isdir $path]} { puts "\tdirectory, skipped" return } set e [catch { mkheader $path } start] if {$e} { puts "\t$start" set db [vfs::mk4::Mount "" $path -readonly] } else { set db [vfs::mk4::Mount $path $path -readonly] } lassign [traverse $path] sig mod #version_id $path $path mk::view layout $db.dirs {name parent:I {files {name size:I date:I md5:B}}} set paths(0) "" mk::loop d $db.dirs { set n [mk::cursor position d] if {$n > 0} { # why does this fail with -99 parents in some tclkits? catch { set paths($n) $paths([mk::get $d parent])[mk::get $d name]/ } } mk::loop f $d.files { array set fr [mk::get $f] set data $fr(contents) if {[string length $data] != $fr(size)} { set data [vfs::zip -mode decompress $data] } set md [md5c $data] mk::set $f md5 $md set ams [amspath $md $fr(size) $go] if {![file exists $ams]} { puts " $ams $paths($n)$fr(name)" if {$go} { set fd [open $ams w] fconfigure $fd -translation binary puts -nonewline $fd $fr(contents) close $fd } } if {$go && $fr(date) < [file mtime $ams]} { file mtime $ams $fr(date) } } } if {$go} { file mkdir kits set vid [format %d-%d [expr {(($sig>>16) & 0xFFFF) + 10000}] \ [expr {($sig & 0xFFFF) + 10000}]] #set ftail [file root [file tail $path]] set ftail [file tail $path] set kpath [file join kits $ftail-$vid] if {![file exists $kpath]} { set fd [open $kpath w] if {$e == 0} { mk::file save $db $fd } close $fd file mtime $kpath $mod puts "[file tail $kpath] stored: $path" } } vfs::unmount $path if {$go} { if {$e} { set start [file size $path] } set fd [open $path] fconfigure $fd -translation binary set head [read $fd $start] close $fd set fd [open $kpath] fconfigure $fd -translation binary set tail [read $fd] close $fd set hmd5 [submitpart h $path $head] set tmd5 [submitpart t $path $tail] set hlen [string length $head] set hams [file tail [amspath $hmd5 $hlen]] set tlen [string length $tail] set tams [file tail [amspath $tmd5 $tlen]] set p [file tail $path] set t [file mtime $path] set x [mk::row append idb.logs name $p vid $sig date $t \ hmd $hmd5 hsz [string length $head] \ tmd $tmd5 tsz [string length $tail]] set x [lindex [split $x !] end] puts $::ifd [list $x $p $vid $t $hams $hlen $tams $tlen] } } set go 1 switch -- [lindex $argv 0] { "" { puts "Usage: submit ?-n? starkit ..." exit } -n { set go 0 set argv [lrange $argv 1 end] } } if {$go} { set ifd [open info.txt a] mk::file open idb info.mk if {[catch { mk::view layout idb.logs }]} { # only set if not defined, to avoid losing columns added later mk::view layout idb.logs {name vid:I date:I hmd:B hsz:I tmd:B tsz:I} } } foreach sk $argv { if {[catch { submitsk $sk $go } err]} { puts $errorInfo } } if {$go} { mk::file close idb close $ifd }