@ -1,5 +1,10 @@
# f a m i l y _ a r t i f a c t s . t c l ( G - 1 0 3 ) : e m i t p u n k b i n - l a y o u t a r t i f a c t c o p i e s + p e r - a r t i f a c t
# t o m l m e t a d a t a + s h a 1 s u m s f o r t h e v e r i f i e d r u n t i m e k i t f a m i l y m e m b e r s .
# f a m i l y _ a r t i f a c t s . t c l ( G - 1 0 3 , s c h e m a v 1 p e r G - 1 1 7 ) : e m i t p u n k b i n - l a y o u t a r t i f a c t
# c o p i e s + p e r - a r t i f a c t t o m l m e t a d a t a + s h a 1 s u m s f o r t h e v e r i f i e d r u n t i m e k i t
# f a m i l y m e m b e r s . T h e s i d e c a r ' s i d e n t i t y f i e l d s ( s c h e m a , b u i l d _ i d , o r i g i n ,
# p a c k a g e r , p r o j e c t , l i c e n s e , b u i l d _ h o s t _ p l a t f o r m ) a r e D E R I V E D f r o m t h e r e c o r d
# e m b e d d e d i n e a c h k i t ' s a t t a c h e d i m a g e a t s t a g i n g ( r e a d b a c k b y e x e c u t i n g t h e
# k i t ) - s i n g l e s o u r c e o f t r u t h ; t h e s i d e c a r a d d s t h e f i n i s h e d - b i n a r y f a c t s
# ( s h a 1 , s i z e , b u i l t ) p e r t h e e m b e d - t h e n - h a s h o r d e r i n g .
#
# D e l i b e r a t e l y r u n U N D E R T H E P L A I N F A M I L Y K I T i t s e l f ( n o t t h e b u i l d e r s h e l l ) : t h e
# s h a 1 d i g e s t s c o m e f r o m t h e k i t ' s a t t a c h e d t c l l i b / t c l l i b c , s o e v e r y e m i s s i o n r u n
@ -57,6 +62,43 @@ proc exe_split {name} {
return [ list $name " " ]
}
proc read_embedded { kitpath } {
# G - 1 1 7 : e x e c t h e k i t i t s e l f w i t h a p i p e d r e a d e r s c r i p t - i t s a t t a c h e d i m a g e
# m o u n t s a t / / z i p f s : / a p p , s o t h e e m b e d d e d r e c o r d i s a p l a i n f i l e r e a d . T r u s t e d
# j u s t - b u i l t k i t s o n l y ; i d e n t i f y i n g S T R A Y b i n a r i e s w i t h o u t e x e c u t i o n i s t h e
# p u n k - r u n t i m e ' i n f o ' z i p - c e n t r a l - d i r e c t o r y r e a d .
set reader {
fconfigure stdout - translation binary
if { [ catch {
set f [ open / / zipfs:/ app/ punkbin-artifact.toml r]
fconfigure $f - translation binary
puts - nonewline [ read $f ]
close $f
} errM ] } {
puts - nonewline " P U N K B I N - E M B E D - M I S S I N G : $ e r r M "
}
exit 0
}
if { [ catch { exec $kitpath << $reader } out] } {
fail " e m b e d d e d - r e c o r d r e a d f a i l e d f o r $ k i t p a t h : $ o u t "
}
if { [ string match " P U N K B I N - E M B E D - M I S S I N G * " $out ] } {
fail " n o e m b e d d e d r e c o r d i n $ k i t p a t h ( [ s t r i n g r a n g e $ o u t 0 2 0 0 ] ) - k i t p r e d a t e s t h e G - 1 1 7 s t a g i n g e m b e d ? "
}
return [ string map [ list \ r " " ] $out ]
}
proc record_field { recordtext key} {
# l i n e - b a s e d t o l e r a n t l o o k u p ( s a m e c o n s u m e r s t y l e a s p u n k - r u n t i m e ) : q u o t e d
# s t r i n g o r b a r e i n t e g e r v a l u e s ; ' # ' c o m m e n t l i n e s n e v e r m a t c h
foreach line [ split $recordtext \ n] {
set line [ string trim $line ]
if { [ regexp - - [ format { ^ % s \ s* = \ s* " ( . * ) " \ s* $ } $key ] $line - > v] } { return $v }
if { [ regexp - - [ format { ^ % s \ s* = \ s* ( [ 0-9 ] + ) \ s* $ } $key ] $line - > v] } { return $v }
}
return " "
}
file mkdir $opt ( -outdir )
set built [ clock format [ clock seconds] - format % Y-% m-% dT% H:% M:% SZ - timezone : UTC]
set sha1lines { }
@ -79,9 +121,36 @@ foreach {variant kitpath} $opt(-kits) {
if { $variant eq " p u n k - b i " } { lappend components { * } $opt ( -bicomponents ) }
set batteries { }
foreach { n v} $components { lappend batteries [ toml_str " $ n $ v " ] }
set batteries_line " a t t a c h e d _ b a t t e r i e s = \[ [ j o i n $ b a t t e r i e s { , } ] \] "
# G - 1 1 7 : r e a d t h e E M B E D D E D r e c o r d b a c k o u t o f t h e f i n i s h e d k i t a n d d e r i v e t h e
# s i d e c a r ' s s h a r e d i d e n t i t y f i e l d s f r o m i t - s i n g l e s o u r c e o f t r u t h , i d e n t i c a l
# b u i l d _ i d b y c o n s t r u c t i o n ; e v e r y e m i s s i o n i n h e r e n t l y v e r i f i e s t h e e m b e d e x i s t s
# a n d m a t c h e s t h i s i n v o c a t i o n ( s t a l e - s t a g i n g t r i p w i r e ) .
set embedded [ read_embedded $kitpath ]
foreach { ekey expect} [ list schema 1 name $artifact variant $variant working_name $working revision $opt ( -rev ) target $opt ( -target ) tcl_patchlevel $opt ( -tclpatch ) ] {
set got [ record_field $embedded $ekey ]
if { $got ne $expect } { fail " $ a r t i f a c t e m b e d d e d r e c o r d m i s m a t c h : $ e k e y = ' $ g o t ' , e x p e c t e d ' $ e x p e c t ' ( s t a l e s t a g i n g ? ) " }
}
if { [ string first $batteries_line $embedded ] < 0 } {
fail " $ a r t i f a c t e m b e d d e d r e c o r d a t t a c h e d _ b a t t e r i e s d o e s n o t m a t c h t h e e m i s s i o n c o m p o n e n t s "
}
set e_build_id [ record_field $embedded build_id]
if { $e_build_id eq " " } { fail " $ a r t i f a c t e m b e d d e d r e c o r d h a s n o b u i l d _ i d " }
set evars [ dict create]
foreach k { origin packager project project_url license build_host_platform} {
set v [ record_field $embedded $k ]
if { $v eq " " } { fail " $ a r t i f a c t e m b e d d e d r e c o r d m i s s i n g v 1 f i e l d ' $ k ' " }
dict set evars $k $v
}
set m { }
lappend m " # p u n k s h e l l r u n t i m e a r t i f a c t m e t a d a t a ( G - 1 0 3 ) - g e n e r a t e d b y f a m i l y _ a r t i f a c t s . t c l "
lappend m " # p u n k s h e l l r u n t i m e a r t i f a c t m e t a d a t a ( G - 1 1 7 s c h e m a v 1 ) - g e n e r a t e d b y f a m i l y _ a r t i f a c t s . t c l "
lappend m " # s i d e c a r c o p y : t h e e m b e d d e d r e c o r d c a r r i e d i n s i d e t h e a r t i f a c t ' s a t t a c h e d i m a g e "
lappend m " # ( p u n k b i n - a r t i f a c t . t o m l ) p l u s t h e f i n i s h e d - b i n a r y f a c t s ( s h a 1 , s i z e , b u i l t ) . "
lappend m " # T h e s i d e c a r + s h a 1 s u m s . t x t r e m a i n t h e i n t e g r i t y a u t h o r i t y . "
lappend m " s c h e m a = 1 "
lappend m " "
lappend m " \[ a r t i f a c t \] "
lappend m " n a m e = [ t o m l _ s t r $ a r t i f a c t ] "
lappend m " c l a s s = \" r u n t i m e \" "
@ -92,6 +161,22 @@ foreach {variant kitpath} $opt(-kits) {
lappend m " s h a 1 = [ t o m l _ s t r $ s h a 1 ] "
lappend m " s i z e = $ s i z e "
lappend m " b u i l t = [ t o m l _ s t r $ b u i l t ] "
lappend m " # b u i l d _ i d : o f f l i n e c o r r e l a t i o n k e y r e - j o i n i n g a r e n a m e d c o p y t o i t s r e c o r d ; "
lappend m " # i d e n t i c a l i n t h e e m b e d d e d a n d s i d e c a r c o p i e s ( a d e t e r m i n i s t i c i d e n t i t y d i g e s t , "
lappend m " # n o t a n i n t e g r i t y k e y - s h a 1 a b o v e i s t h e i n t e g r i t y f a c t ) . "
lappend m " b u i l d _ i d = [ t o m l _ s t r $ e _ b u i l d _ i d ] "
lappend m " # o r i g i n : c a n o n i c a l a r t i f a c t r e p o t h i s a r t i f a c t w a s B U I L T F O R - n o t n e c e s s a r i l y "
lappend m " # w h e r e i t i s h o s t e d ; m i r r o r s p r e s e r v e i t . "
lappend m " o r i g i n = [ t o m l _ s t r [ d i c t g e t $ e v a r s o r i g i n ] ] "
lappend m " # p a c k a g e r : d e c l a r e d i d e n t i t y , n o t p r o o f - s i g n i n g ( m i n i s i g n s i d e c a r s ) i s t h e "
lappend m " # v e r i f i c a t i o n l a y e r . "
lappend m " p a c k a g e r = [ t o m l _ s t r [ d i c t g e t $ e v a r s p a c k a g e r ] ] "
lappend m " p r o j e c t = [ t o m l _ s t r [ d i c t g e t $ e v a r s p r o j e c t ] ] "
lappend m " p r o j e c t _ u r l = [ t o m l _ s t r [ d i c t g e t $ e v a r s p r o j e c t _ u r l ] ] "
lappend m " # l i c e n s e : s u m m a r y f o r t h e d i s t r i b u t e d a r t i f a c t ; c o m p o n e n t l i c e n s e t e x t s r i d e "
lappend m " # i n s i d e t h e a t t a c h e d i m a g e ( t c l _ l i b r a r y / l i c e n s e . t e r m s e t c ) . "
lappend m " l i c e n s e = [ t o m l _ s t r [ d i c t g e t $ e v a r s l i c e n s e ] ] "
lappend m " b u i l d _ h o s t _ p l a t f o r m = [ t o m l _ s t r [ d i c t g e t $ e v a r s b u i l d _ h o s t _ p l a t f o r m ] ] "
lappend m " "
lappend m " \[ r u n t i m e \] "
lappend m " t c l _ p a t c h l e v e l = [ t o m l _ s t r $ o p t ( - t c l p a t c h ) ] "
@ -101,7 +186,7 @@ foreach {variant kitpath} $opt(-kits) {
lappend m " p i p e r e p l _ d e f a u l t = \" o n \" "
lappend m " p i p e r e p l _ o p t _ o u t = \" T C L S H _ P I P E R E P L = 0 \" "
}
lappend m " a t t a c h e d _ b a t t e r i e s = \[ [ j o i n $ b a t t e r i e s { , } ] \] "
lappend m $batteries_line
lappend m " "
lappend m " \[ p r o v e n a n c e \] "
lappend m " s u i t e = [ t o m l _ s t r $ o p t ( - s u i t e ) ] "