Hex Artifact Content

Artifact 18e199e0c9f666148a52fbc995cee75c59e05a4e:


0000: 23 21 20 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20  #! /usr/bin/env 
0010: 74 63 6c 73 68 0a 0a 69 66 20 7b 5b 6c 6c 65 6e  tclsh..if {[llen
0020: 67 74 68 20 24 61 72 67 76 5d 20 21 3d 20 22 32  gth $argv] != "2
0030: 22 7d 20 7b 0a 09 70 75 74 73 20 73 74 64 65 72  "} {..puts stder
0040: 72 20 22 55 73 61 67 65 3a 20 74 65 61 70 6f 74  r "Usage: teapot
0050: 5f 69 6e 64 65 78 20 3c 73 72 63 64 69 72 3e 20  _index <srcdir> 
0060: 3c 64 65 73 74 64 69 72 3e 22 0a 09 65 78 69 74  <destdir>"..exit
0070: 20 31 0a 7d 0a 0a 73 65 74 20 73 72 63 64 69 72   1.}..set srcdir
0080: 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65   [file normalize
0090: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20 30   [lindex $argv 0
00a0: 5d 5d 0a 73 65 74 20 64 73 74 64 69 72 20 5b 66  ]].set dstdir [f
00b0: 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 6c  ile normalize [l
00c0: 69 6e 64 65 78 20 24 61 72 67 76 20 31 5d 5d 0a  index $argv 1]].
00d0: 0a 23 20 44 65 66 69 6e 65 20 72 65 71 75 69 72  .# Define requir
00e0: 65 6d 65 6e 74 73 20 66 6f 72 20 65 6e 74 69 74  ements for entit
00f0: 69 65 73 0a 23 23 20 4d 75 73 74 20 62 65 20 73  ies.## Must be s
0100: 79 6e 63 27 64 20 77 69 74 68 20 5b 74 65 61 70  ync'd with [teap
0110: 6f 74 5f 69 6e 64 65 78 5d 0a 73 65 74 20 65 6e  ot_index].set en
0120: 74 69 74 79 5f 64 65 66 69 6e 69 74 69 6f 6e 28  tity_definition(
0130: 70 61 63 6b 61 67 65 29 20 5b 6c 69 73 74 20 6e  package) [list n
0140: 61 6d 65 20 76 65 72 20 61 72 63 68 5d 0a 0a 23  ame ver arch]..#
0150: 20 44 65 66 69 6e 65 20 6d 61 70 69 6e 67 20 6f   Define maping o
0160: 66 20 66 69 65 6c 64 20 6e 61 6d 65 20 74 6f 20  f field name to 
0170: 74 65 78 74 0a 73 65 74 20 65 6e 74 69 74 79 5f  text.set entity_
0180: 66 69 65 6c 64 6e 61 6d 65 73 28 5b 6c 69 73 74  fieldnames([list
0190: 20 70 61 63 6b 61 67 65 20 6e 61 6d 65 5d 29 20   package name]) 
01a0: 22 4e 61 6d 65 22 0a 73 65 74 20 65 6e 74 69 74  "Name".set entit
01b0: 79 5f 66 69 65 6c 64 6e 61 6d 65 73 28 5b 6c 69  y_fieldnames([li
01c0: 73 74 20 70 61 63 6b 61 67 65 20 76 65 72 5d 29  st package ver])
01d0: 20 22 56 65 72 73 69 6f 6e 22 0a 73 65 74 20 65   "Version".set e
01e0: 6e 74 69 74 79 5f 66 69 65 6c 64 6e 61 6d 65 73  ntity_fieldnames
01f0: 28 5b 6c 69 73 74 20 70 61 63 6b 61 67 65 20 61  ([list package a
0200: 72 63 68 5d 29 20 22 50 6c 61 74 66 6f 72 6d 22  rch]) "Platform"
0210: 0a 73 65 74 20 65 6e 74 69 74 79 5f 66 69 65 6c  .set entity_fiel
0220: 64 6e 61 6d 65 73 28 5b 6c 69 73 74 20 65 6e 74  dnames([list ent
0230: 69 74 79 5d 29 20 22 57 68 61 74 22 0a 0a 23 20  ity]) "What"..# 
0240: 49 6e 64 65 78 20 61 6c 6c 20 70 61 63 6b 61 67  Index all packag
0250: 65 73 0a 70 72 6f 63 20 74 65 61 70 6f 74 5f 69  es.proc teapot_i
0260: 6e 64 65 78 20 7b 73 72 63 64 69 72 7d 20 7b 0a  ndex {srcdir} {.
0270: 09 61 72 72 61 79 20 73 65 74 20 70 6b 67 69 6e  .array set pkgin
0280: 66 6f 20 5b 6c 69 73 74 5d 0a 0a 09 66 6f 72 65  fo [list]...fore
0290: 61 63 68 20 70 6b 67 64 69 72 20 5b 67 6c 6f 62  ach pkgdir [glob
02a0: 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 2d 64 69   -nocomplain -di
02b0: 72 65 63 74 6f 72 79 20 24 73 72 63 64 69 72 20  rectory $srcdir 
02c0: 2d 74 79 70 65 20 64 20 2a 2f 2a 2f 2a 5d 20 7b  -type d */*/*] {
02d0: 0a 09 09 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70  ...unset -nocomp
02e0: 6c 61 69 6e 20 63 75 72 72 70 6b 67 69 6e 66 6f  lain currpkginfo
02f0: 0a 09 09 73 65 74 20 63 75 72 72 70 6b 67 69 6e  ...set currpkgin
0300: 66 6f 28 70 6b 67 64 69 72 29 20 24 70 6b 67 64  fo(pkgdir) $pkgd
0310: 69 72 0a 0a 09 09 73 65 74 20 74 65 61 70 6f 74  ir....set teapot
0320: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 6b 67   [file join $pkg
0330: 64 69 72 20 74 65 61 70 6f 74 2e 74 78 74 5d 0a  dir teapot.txt].
0340: 0a 09 09 73 65 74 20 6d 75 6c 74 69 66 69 6c 65  ...set multifile
0350: 20 31 0a 09 09 69 66 20 7b 21 5b 66 69 6c 65 20   1...if {![file 
0360: 65 78 69 73 74 73 20 24 74 65 61 70 6f 74 5d 7d  exists $teapot]}
0370: 20 7b 0a 09 09 09 73 65 74 20 66 69 6c 65 73 20   {....set files 
0380: 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69  [glob -nocomplai
0390: 6e 20 2d 64 69 72 65 63 74 6f 72 79 20 24 70 6b  n -directory $pk
03a0: 67 64 69 72 20 2a 5d 0a 09 09 09 69 66 20 7b 5b  gdir *]....if {[
03b0: 6c 6c 65 6e 67 74 68 20 24 66 69 6c 65 73 5d 20  llength $files] 
03c0: 3d 3d 20 31 7d 20 7b 0a 09 09 09 09 73 65 74 20  == 1} {.....set 
03d0: 74 65 61 70 6f 74 20 5b 6c 69 6e 64 65 78 20 24  teapot [lindex $
03e0: 66 69 6c 65 73 20 30 5d 0a 09 09 09 09 73 65 74  files 0].....set
03f0: 20 6d 75 6c 74 69 66 69 6c 65 20 30 0a 09 09 09   multifile 0....
0400: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 63 6f 6e  } else {.....con
0410: 74 69 6e 75 65 0a 09 09 09 7d 0a 09 09 7d 0a 0a  tinue....}...}..
0420: 09 09 73 65 74 20 63 75 72 72 70 6b 67 69 6e 66  ..set currpkginf
0430: 6f 28 6d 75 6c 74 69 66 69 6c 65 29 20 24 6d 75  o(multifile) $mu
0440: 6c 74 69 66 69 6c 65 0a 09 09 69 66 20 7b 24 6d  ltifile...if {$m
0450: 75 6c 74 69 66 69 6c 65 7d 20 7b 0a 09 09 09 73  ultifile} {....s
0460: 65 74 20 63 75 72 72 70 6b 67 69 6e 66 6f 28 65  et currpkginfo(e
0470: 78 74 66 69 6c 65 29 20 66 69 6c 65 2e 7a 69 70  xtfile) file.zip
0480: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 73  ...} else {....s
0490: 65 74 20 63 75 72 72 70 6b 67 69 6e 66 6f 28 65  et currpkginfo(e
04a0: 78 74 66 69 6c 65 29 20 66 69 6c 65 2e 74 6d 0a  xtfile) file.tm.
04b0: 09 09 7d 0a 0a 09 09 73 65 74 20 66 64 20 5b 6f  ..}....set fd [o
04c0: 70 65 6e 20 24 74 65 61 70 6f 74 20 72 5d 0a 09  pen $teapot r]..
04d0: 09 73 65 74 20 64 61 74 61 20 5b 72 65 61 64 20  .set data [read 
04e0: 24 66 64 5d 0a 09 09 63 6c 6f 73 65 20 24 66 64  $fd]...close $fd
04f0: 0a 0a 09 09 73 65 74 20 70 72 6f 63 65 73 73 6c  ....set processl
0500: 69 6e 65 20 24 6d 75 6c 74 69 66 69 6c 65 0a 09  ine $multifile..
0510: 09 66 6f 72 65 61 63 68 20 6c 69 6e 65 20 5b 73  .foreach line [s
0520: 70 6c 69 74 20 24 64 61 74 61 20 5c 6e 5d 20 7b  plit $data \n] {
0530: 0a 09 09 09 73 65 74 20 6c 69 6e 65 20 5b 73 74  ....set line [st
0540: 72 69 6e 67 20 74 72 69 6d 20 24 6c 69 6e 65 5d  ring trim $line]
0550: 0a 09 09 09 69 66 20 7b 21 24 6d 75 6c 74 69 66  ....if {!$multif
0560: 69 6c 65 7d 20 7b 0a 09 09 09 09 69 66 20 7b 24  ile} {.....if {$
0570: 6c 69 6e 65 20 3d 3d 20 22 23 20 40 40 20 4d 65  line == "# @@ Me
0580: 74 61 20 42 65 67 69 6e 22 7d 20 7b 0a 09 09 09  ta Begin"} {....
0590: 09 09 73 65 74 20 70 72 6f 63 65 73 73 6c 69 6e  ..set processlin
05a0: 65 20 31 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75  e 1......continu
05b0: 65 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  e.....}......if 
05c0: 7b 24 6c 69 6e 65 20 3d 3d 20 22 23 20 40 40 20  {$line == "# @@ 
05d0: 4d 65 74 61 20 45 6e 64 22 7d 20 7b 0a 09 09 09  Meta End"} {....
05e0: 09 09 62 72 65 61 6b 0a 09 09 09 09 7d 0a 0a 09  ..break.....}...
05f0: 09 09 09 73 65 74 20 6c 69 6e 65 20 5b 72 65 67  ...set line [reg
0600: 73 75 62 20 7b 5e 20 2a 23 20 2a 7d 20 24 6c 69  sub {^ *# *} $li
0610: 6e 65 20 7b 7d 5d 0a 09 09 09 7d 0a 0a 09 09 09  ne {}]....}.....
0620: 69 66 20 7b 21 24 70 72 6f 63 65 73 73 6c 69 6e  if {!$processlin
0630: 65 7d 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75  e} {.....continu
0640: 65 0a 09 09 09 7d 0a 0a 09 09 09 73 65 74 20 63  e....}.....set c
0650: 6d 64 20 22 49 4e 56 41 4c 49 44 22 0a 09 09 09  md "INVALID"....
0660: 63 61 74 63 68 20 7b 0a 09 09 09 09 73 65 74 20  catch {.....set 
0670: 63 6d 64 20 5b 73 74 72 69 6e 67 20 74 6f 75 70  cmd [string toup
0680: 70 65 72 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e  per [lindex $lin
0690: 65 20 30 5d 5d 0a 09 09 09 7d 0a 0a 09 09 09 73  e 0]]....}.....s
06a0: 77 69 74 63 68 20 2d 2d 20 24 63 6d 64 20 7b 0a  witch -- $cmd {.
06b0: 09 09 09 09 22 50 41 43 4b 41 47 45 22 20 7b 0a  ...."PACKAGE" {.
06c0: 09 09 09 09 09 73 65 74 20 6e 61 6d 65 20 5b 6c  .....set name [l
06d0: 69 6e 64 65 78 20 24 6c 69 6e 65 20 31 5d 0a 09  index $line 1]..
06e0: 09 09 09 09 73 65 74 20 76 65 72 73 20 5b 6c 69  ....set vers [li
06f0: 6e 64 65 78 20 24 6c 69 6e 65 20 32 5d 0a 0a 09  ndex $line 2]...
0700: 09 09 09 09 73 65 74 20 63 75 72 72 70 6b 67 69  ....set currpkgi
0710: 6e 66 6f 28 6e 61 6d 65 29 20 24 6e 61 6d 65 0a  nfo(name) $name.
0720: 09 09 09 09 09 73 65 74 20 63 75 72 72 70 6b 67  .....set currpkg
0730: 69 6e 66 6f 28 76 65 72 73 29 20 24 76 65 72 73  info(vers) $vers
0740: 0a 09 09 09 09 7d 0a 09 09 09 09 22 4d 45 54 41  .....}....."META
0750: 22 20 7b 0a 09 09 09 09 09 73 65 74 20 76 61 72  " {......set var
0760: 20 5b 73 74 72 69 6e 67 20 74 6f 6c 6f 77 65 72   [string tolower
0770: 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 20 31   [lindex $line 1
0780: 5d 5d 0a 09 09 09 09 09 73 65 74 20 76 61 6c 20  ]]......set val 
0790: 5b 6c 72 61 6e 67 65 20 24 6c 69 6e 65 20 32 20  [lrange $line 2 
07a0: 65 6e 64 5d 0a 0a 09 09 09 09 09 69 66 20 7b 21  end].......if {!
07b0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 75 72  [info exists cur
07c0: 72 70 6b 67 69 6e 66 6f 28 24 76 61 72 29 5d 7d  rpkginfo($var)]}
07d0: 20 7b 0a 09 09 09 09 09 09 73 65 74 20 63 75 72   {.......set cur
07e0: 72 70 6b 67 69 6e 66 6f 28 24 76 61 72 29 20 22  rpkginfo($var) "
07f0: 22 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69  "......}.......i
0800: 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61  f {[lsearch -exa
0810: 63 74 20 24 63 75 72 72 70 6b 67 69 6e 66 6f 28  ct $currpkginfo(
0820: 24 76 61 72 29 20 24 76 61 6c 5d 20 3d 3d 20 2d  $var) $val] == -
0830: 31 7d 20 7b 0a 09 09 09 09 09 09 6c 61 70 70 65  1} {.......lappe
0840: 6e 64 20 63 75 72 72 70 6b 67 69 6e 66 6f 28 24  nd currpkginfo($
0850: 76 61 72 29 20 24 76 61 6c 0a 09 09 09 09 09 7d  var) $val......}
0860: 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a  .....}....}...}.
0870: 0a 09 09 73 65 74 20 70 6b 67 69 6e 66 6f 28 5b  ...set pkginfo([
0880: 6c 69 73 74 20 24 63 75 72 72 70 6b 67 69 6e 66  list $currpkginf
0890: 6f 28 6e 61 6d 65 29 20 24 63 75 72 72 70 6b 67  o(name) $currpkg
08a0: 69 6e 66 6f 28 76 65 72 73 29 20 24 63 75 72 72  info(vers) $curr
08b0: 70 6b 67 69 6e 66 6f 28 70 6c 61 74 66 6f 72 6d  pkginfo(platform
08c0: 29 5d 29 20 5b 61 72 72 61 79 20 67 65 74 20 63  )]) [array get c
08d0: 75 72 72 70 6b 67 69 6e 66 6f 5d 0a 09 7d 0a 0a  urrpkginfo]..}..
08e0: 09 72 65 74 75 72 6e 20 5b 61 72 72 61 79 20 67  .return [array g
08f0: 65 74 20 70 6b 67 69 6e 66 6f 5d 0a 7d 0a 0a 70  et pkginfo].}..p
0900: 72 6f 63 20 63 6f 6d 70 6c 65 74 65 5f 65 6e 74  roc complete_ent
0910: 70 61 74 68 20 7b 74 79 70 65 20 65 6e 74 69 6e  path {type entin
0920: 66 6f 5f 61 72 72 6c 69 73 74 7d 20 7b 0a 09 61  fo_arrlist} {..a
0930: 72 72 61 79 20 73 65 74 20 65 6e 74 69 6e 66 6f  rray set entinfo
0940: 20 24 65 6e 74 69 6e 66 6f 5f 61 72 72 6c 69 73   $entinfo_arrlis
0950: 74 0a 0a 09 73 65 74 20 72 65 71 5f 66 69 65 6c  t...set req_fiel
0960: 64 73 20 24 3a 3a 65 6e 74 69 74 79 5f 64 65 66  ds $::entity_def
0970: 69 6e 69 74 69 6f 6e 28 24 74 79 70 65 29 0a 0a  inition($type)..
0980: 09 73 65 74 20 72 65 74 76 61 6c 20 5b 6c 69 73  .set retval [lis
0990: 74 20 24 74 79 70 65 5d 0a 0a 09 66 6f 72 65 61  t $type]...forea
09a0: 63 68 20 72 65 71 5f 66 69 65 6c 64 20 24 72 65  ch req_field $re
09b0: 71 5f 66 69 65 6c 64 73 20 7b 0a 09 09 69 66 20  q_fields {...if 
09c0: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 65  {![info exists e
09d0: 6e 74 69 6e 66 6f 28 24 72 65 71 5f 66 69 65 6c  ntinfo($req_fiel
09e0: 64 29 5d 7d 20 7b 0a 09 09 09 72 65 74 75 72 6e  d)]} {....return
09f0: 20 22 22 0a 09 09 7d 0a 0a 09 09 6c 61 70 70 65   ""...}....lappe
0a00: 6e 64 20 72 65 74 76 61 6c 20 24 72 65 71 5f 66  nd retval $req_f
0a10: 69 65 6c 64 20 24 65 6e 74 69 6e 66 6f 28 24 72  ield $entinfo($r
0a20: 65 71 5f 66 69 65 6c 64 29 0a 09 7d 0a 0a 09 72  eq_field)..}...r
0a30: 65 74 75 72 6e 20 24 72 65 74 76 61 6c 0a 7d 0a  eturn $retval.}.
0a40: 0a 70 72 6f 63 20 67 65 6e 65 72 61 74 65 5f 74  .proc generate_t
0a50: 70 6d 20 7b 65 6e 74 6c 69 73 74 7d 20 7b 0a 09  pm {entlist} {..
0a60: 73 65 74 20 65 6e 74 73 20 5b 6c 69 73 74 5d 0a  set ents [list].
0a70: 09 66 6f 72 65 61 63 68 20 70 61 72 74 20 24 65  .foreach part $e
0a80: 6e 74 6c 69 73 74 20 7b 0a 09 09 73 65 74 20 65  ntlist {...set e
0a90: 6e 74 69 6e 66 6f 20 5b 6c 69 73 74 5d 0a 0a 09  ntinfo [list]...
0aa0: 09 66 6f 72 65 61 63 68 20 65 6e 74 74 79 70 65  .foreach enttype
0ab0: 20 24 70 61 72 74 20 7b 0a 09 09 09 73 65 74 20   $part {....set 
0ac0: 74 79 70 65 20 5b 6c 69 6e 64 65 78 20 24 65 6e  type [lindex $en
0ad0: 74 74 79 70 65 20 30 5d 0a 09 09 09 73 65 74 20  ttype 0]....set 
0ae0: 65 6e 74 20 5b 6c 69 6e 64 65 78 20 24 65 6e 74  ent [lindex $ent
0af0: 74 79 70 65 20 31 5d 0a 0a 09 09 09 69 66 20 7b  type 1].....if {
0b00: 24 74 79 70 65 20 3d 3d 20 22 65 6e 74 69 74 79  $type == "entity
0b10: 22 7d 20 7b 0a 09 09 09 09 23 20 4f 6e 6c 79 20  "} {.....# Only 
0b20: 69 6e 63 6c 75 64 65 20 74 68 65 20 65 6e 74 69  include the enti
0b30: 74 79 20 74 79 70 65 20 69 66 20 69 74 20 69 73  ty type if it is
0b40: 20 63 6f 6d 70 6c 65 74 65 2e 2e 2e 0a 09 09 09   complete.......
0b50: 09 73 65 74 20 77 6f 72 6b 20 5b 63 6f 6d 70 6c  .set work [compl
0b60: 65 74 65 5f 65 6e 74 70 61 74 68 20 24 65 6e 74  ete_entpath $ent
0b70: 20 5b 6a 6f 69 6e 20 24 70 61 72 74 5d 5d 0a 0a   [join $part]]..
0b80: 09 09 09 09 69 66 20 7b 24 77 6f 72 6b 20 3d 3d  ....if {$work ==
0b90: 20 22 22 7d 20 7b 0a 09 09 09 09 09 63 6f 6e 74   ""} {......cont
0ba0: 69 6e 75 65 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  inue.....}....}.
0bb0: 0a 09 09 09 6c 61 70 70 65 6e 64 20 65 6e 74 69  ....lappend enti
0bc0: 6e 66 6f 20 24 65 6e 74 0a 09 09 7d 0a 0a 09 09  nfo $ent...}....
0bd0: 6c 61 70 70 65 6e 64 20 65 6e 74 73 20 24 65 6e  lappend ents $en
0be0: 74 69 6e 66 6f 0a 09 7d 0a 0a 09 73 65 74 20 72  tinfo..}...set r
0bf0: 65 74 20 7b 3c 21 2d 2d 20 5b 5b 54 50 4d 5b 5b  et {<!-- [[TPM[[
0c00: 7d 0a 09 61 70 70 65 6e 64 20 72 65 74 20 24 65  }..append ret $e
0c10: 6e 74 73 0a 09 61 70 70 65 6e 64 20 72 65 74 20  nts..append ret 
0c20: 7b 5d 5d 4d 50 54 5d 5d 20 2d 2d 3e 7d 0a 0a 09  {]]MPT]] -->}...
0c30: 72 65 74 75 72 6e 20 24 72 65 74 0a 7d 0a 0a 70  return $ret.}..p
0c40: 72 6f 63 20 67 65 6e 65 72 61 74 65 5f 74 61 62  roc generate_tab
0c50: 6c 65 20 7b 66 69 65 6c 64 73 20 6e 75 6d 69 74  le {fields numit
0c60: 65 6d 73 7d 20 7b 0a 09 73 65 74 20 72 65 74 20  ems} {..set ret 
0c70: 22 22 0a 0a 09 66 6f 72 65 61 63 68 20 66 69 65  ""...foreach fie
0c80: 6c 64 20 24 66 69 65 6c 64 73 20 7b 0a 09 09 61  ld $fields {...a
0c90: 70 70 65 6e 64 20 72 65 74 20 22 20 20 20 20 20  ppend ret "     
0ca0: 20 3c 74 72 3e 5c 6e 22 0a 0a 09 09 75 6e 73 65   <tr>\n"....unse
0cb0: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 65 6e  t -nocomplain en
0cc0: 74 69 6e 66 6f 0a 09 09 66 6f 72 65 61 63 68 20  tinfo...foreach 
0cd0: 65 6e 74 74 79 70 65 20 5b 6c 72 61 6e 67 65 20  enttype [lrange 
0ce0: 24 66 69 65 6c 64 20 30 20 5b 65 78 70 72 20 24  $field 0 [expr $
0cf0: 6e 75 6d 69 74 65 6d 73 20 2d 20 31 5d 5d 20 7b  numitems - 1]] {
0d00: 0a 09 09 09 73 65 74 20 74 79 70 65 20 5b 6c 69  ....set type [li
0d10: 6e 64 65 78 20 24 65 6e 74 74 79 70 65 20 30 5d  ndex $enttype 0]
0d20: 0a 09 09 09 73 65 74 20 69 74 65 6d 20 5b 6c 69  ....set item [li
0d30: 6e 64 65 78 20 24 65 6e 74 74 79 70 65 20 31 5d  ndex $enttype 1]
0d40: 0a 0a 09 09 09 73 65 74 20 65 6e 74 69 6e 66 6f  .....set entinfo
0d50: 28 24 74 79 70 65 29 20 24 69 74 65 6d 0a 09 09  ($type) $item...
0d60: 7d 0a 0a 09 09 69 66 20 7b 5b 69 6e 66 6f 20 65  }....if {[info e
0d70: 78 69 73 74 73 20 65 6e 74 69 6e 66 6f 28 65 6e  xists entinfo(en
0d80: 74 69 74 79 29 5d 7d 20 7b 0a 09 09 09 73 65 74  tity)]} {....set
0d90: 20 65 6e 74 69 74 79 5f 74 79 70 65 20 24 65 6e   entity_type $en
0da0: 74 69 6e 66 6f 28 65 6e 74 69 74 79 29 0a 0a 09  tinfo(entity)...
0db0: 09 09 73 65 74 20 72 65 71 5f 66 69 65 6c 64 73  ..set req_fields
0dc0: 20 24 3a 3a 65 6e 74 69 74 79 5f 64 65 66 69 6e   $::entity_defin
0dd0: 69 74 69 6f 6e 28 24 65 6e 74 69 74 79 5f 74 79  ition($entity_ty
0de0: 70 65 29 0a 09 09 7d 0a 0a 09 09 73 65 74 20 65  pe)...}....set e
0df0: 6e 74 70 61 74 68 5f 70 61 72 74 73 20 5b 6c 69  ntpath_parts [li
0e00: 73 74 5d 0a 0a 09 09 66 6f 72 65 61 63 68 20 65  st]....foreach e
0e10: 6e 74 74 79 70 65 20 5b 6c 72 61 6e 67 65 20 24  nttype [lrange $
0e20: 66 69 65 6c 64 20 30 20 5b 65 78 70 72 20 24 6e  field 0 [expr $n
0e30: 75 6d 69 74 65 6d 73 20 2d 20 31 5d 5d 20 7b 0a  umitems - 1]] {.
0e40: 09 09 09 73 65 74 20 74 79 70 65 20 5b 6c 69 6e  ...set type [lin
0e50: 64 65 78 20 24 65 6e 74 74 79 70 65 20 30 5d 0a  dex $enttype 0].
0e60: 09 09 09 73 65 74 20 69 74 65 6d 20 5b 6c 69 6e  ...set item [lin
0e70: 64 65 78 20 24 65 6e 74 74 79 70 65 20 31 5d 0a  dex $enttype 1].
0e80: 0a 09 09 09 69 66 20 7b 24 74 79 70 65 20 21 3d  ....if {$type !=
0e90: 20 22 65 6e 74 69 74 79 22 7d 20 7b 0a 09 09 09   "entity"} {....
0ea0: 09 6c 61 70 70 65 6e 64 20 65 6e 74 70 61 74 68  .lappend entpath
0eb0: 5f 70 61 72 74 73 20 24 74 79 70 65 20 24 69 74  _parts $type $it
0ec0: 65 6d 0a 09 09 09 7d 0a 0a 09 09 09 73 65 74 20  em....}.....set 
0ed0: 63 6f 6d 70 6c 65 74 65 5f 65 6e 74 70 61 74 68  complete_entpath
0ee0: 5f 70 61 72 74 73 20 22 22 0a 09 09 09 69 66 20  _parts ""....if 
0ef0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 65 6e  {[info exists en
0f00: 74 69 74 79 5f 74 79 70 65 5d 7d 20 7b 0a 09 09  tity_type]} {...
0f10: 09 09 73 65 74 20 63 6f 6d 70 6c 65 74 65 5f 65  ..set complete_e
0f20: 6e 74 70 61 74 68 5f 70 61 72 74 73 20 5b 63 6f  ntpath_parts [co
0f30: 6d 70 6c 65 74 65 5f 65 6e 74 70 61 74 68 20 24  mplete_entpath $
0f40: 65 6e 74 69 74 79 5f 74 79 70 65 20 24 65 6e 74  entity_type $ent
0f50: 70 61 74 68 5f 70 61 72 74 73 5d 0a 09 09 09 7d  path_parts]....}
0f60: 0a 0a 09 09 09 69 66 20 7b 24 63 6f 6d 70 6c 65  .....if {$comple
0f70: 74 65 5f 65 6e 74 70 61 74 68 5f 70 61 72 74 73  te_entpath_parts
0f80: 20 3d 3d 20 22 22 7d 20 7b 0a 09 09 09 09 73 65   == ""} {.....se
0f90: 74 20 65 6e 74 70 61 74 68 20 5b 6a 6f 69 6e 20  t entpath [join 
0fa0: 5b 6a 6f 69 6e 20 5b 6c 69 73 74 20 65 6e 74 69  [join [list enti
0fb0: 74 79 20 24 65 6e 74 70 61 74 68 5f 70 61 72 74  ty $entpath_part
0fc0: 73 5d 5d 20 2f 5d 0a 09 09 09 7d 20 65 6c 73 65  s]] /]....} else
0fd0: 20 7b 0a 09 09 09 09 73 65 74 20 65 6e 74 70 61   {.....set entpa
0fe0: 74 68 20 5b 6a 6f 69 6e 20 24 63 6f 6d 70 6c 65  th [join $comple
0ff0: 74 65 5f 65 6e 74 70 61 74 68 5f 70 61 72 74 73  te_entpath_parts
1000: 20 2f 5d 0a 09 09 09 7d 0a 0a 09 09 09 61 70 70   /]....}.....app
1010: 65 6e 64 20 72 65 74 20 22 20 20 20 20 20 20 20  end ret "       
1020: 20 3c 74 64 3e 3c 61 20 68 72 65 66 3d 5c 22 2f   <td><a href=\"/
1030: 24 65 6e 74 70 61 74 68 5c 22 3e 24 69 74 65 6d  $entpath\">$item
1040: 3c 2f 61 3e 3c 2f 74 64 3e 5c 6e 22 0a 09 09 7d  </a></td>\n"...}
1050: 0a 0a 09 09 61 70 70 65 6e 64 20 72 65 74 20 22  ....append ret "
1060: 20 20 20 20 20 20 3c 2f 74 72 3e 5c 6e 22 0a 09        </tr>\n"..
1070: 7d 0a 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 69  }...return [stri
1080: 6e 67 20 72 61 6e 67 65 20 24 72 65 74 20 30 20  ng range $ret 0 
1090: 65 6e 64 2d 31 5d 0a 7d 0a 0a 23 20 43 72 65 61  end-1].}..# Crea
10a0: 74 65 20 22 69 6e 64 65 78 2e 68 74 6d 6c 22 0a  te "index.html".
10b0: 70 72 6f 63 20 63 72 65 61 74 65 5f 6f 75 74 70  proc create_outp
10c0: 75 74 5f 69 6e 64 65 78 20 7b 64 73 74 64 69 72  ut_index {dstdir
10d0: 20 70 6b 67 69 6e 66 6f 5f 61 72 72 6c 69 73 74   pkginfo_arrlist
10e0: 7d 20 7b 0a 09 61 72 72 61 79 20 73 65 74 20 70  } {..array set p
10f0: 6b 67 69 6e 66 6f 20 24 70 6b 67 69 6e 66 6f 5f  kginfo $pkginfo_
1100: 61 72 72 6c 69 73 74 0a 0a 09 73 65 74 20 69 6e  arrlist...set in
1110: 64 65 78 66 69 6c 65 20 5b 66 69 6c 65 20 6a 6f  dexfile [file jo
1120: 69 6e 20 24 64 73 74 64 69 72 20 69 6e 64 65 78  in $dstdir index
1130: 2e 68 74 6d 6c 5d 0a 09 73 65 74 20 61 6c 74 69  .html]..set alti
1140: 6e 64 65 78 66 69 6c 65 20 5b 66 69 6c 65 20 6a  ndexfile [file j
1150: 6f 69 6e 20 24 64 73 74 64 69 72 20 65 6e 74 69  oin $dstdir enti
1160: 74 79 20 69 6e 64 65 78 2e 68 74 6d 6c 5d 0a 0a  ty index.html]..
1170: 09 73 65 74 20 70 6b 67 6c 69 73 74 20 5b 6c 69  .set pkglist [li
1180: 73 74 5d 0a 09 66 6f 72 65 61 63 68 20 65 6e 74  st]..foreach ent
1190: 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 70 6b   [array names pk
11a0: 67 69 6e 66 6f 5d 20 7b 0a 09 09 73 65 74 20 70  ginfo] {...set p
11b0: 6b 67 20 5b 6c 69 6e 64 65 78 20 24 65 6e 74 20  kg [lindex $ent 
11c0: 30 5d 0a 09 09 73 65 74 20 61 64 64 65 6e 74 20  0]...set addent 
11d0: 5b 6c 69 73 74 20 5b 6c 69 73 74 20 6e 61 6d 65  [list [list name
11e0: 20 24 70 6b 67 5d 5d 0a 09 09 69 66 20 7b 5b 6c   $pkg]]...if {[l
11f0: 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24 70  search -exact $p
1200: 6b 67 6c 69 73 74 20 24 61 64 64 65 6e 74 5d 20  kglist $addent] 
1210: 21 3d 20 2d 31 7d 20 7b 0a 09 09 09 63 6f 6e 74  != -1} {....cont
1220: 69 6e 75 65 0a 09 09 7d 0a 0a 09 09 6c 61 70 70  inue...}....lapp
1230: 65 6e 64 20 70 6b 67 6c 69 73 74 20 24 61 64 64  end pkglist $add
1240: 65 6e 74 0a 09 7d 0a 0a 09 73 65 74 20 70 6b 67  ent..}...set pkg
1250: 6c 69 73 74 20 5b 6c 73 6f 72 74 20 2d 64 69 63  list [lsort -dic
1260: 74 69 6f 6e 61 72 79 20 24 70 6b 67 6c 69 73 74  tionary $pkglist
1270: 5d 0a 0a 09 66 69 6c 65 20 6d 6b 64 69 72 20 5b  ]...file mkdir [
1280: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 69 6e  file dirname $in
1290: 64 65 78 66 69 6c 65 5d 0a 09 73 65 74 20 66 64  dexfile]..set fd
12a0: 20 5b 6f 70 65 6e 20 24 69 6e 64 65 78 66 69 6c   [open $indexfil
12b0: 65 20 77 5d 0a 09 70 75 74 73 20 24 66 64 20 22  e w]..puts $fd "
12c0: 3c 68 74 6d 6c 3e 22 0a 09 70 75 74 73 20 24 66  <html>"..puts $f
12d0: 64 20 22 20 20 3c 68 65 61 64 3e 22 0a 09 70 75  d "  <head>"..pu
12e0: 74 73 20 24 66 64 20 22 20 20 20 20 3c 74 69 74  ts $fd "    <tit
12f0: 6c 65 3e 4c 69 73 74 20 6f 66 20 61 6c 6c 20 65  le>List of all e
1300: 6e 74 69 74 69 65 73 3c 2f 74 69 74 6c 65 3e 22  ntities</title>"
1310: 0a 09 70 75 74 73 20 24 66 64 20 22 20 20 3c 2f  ..puts $fd "  </
1320: 68 65 61 64 3e 22 0a 09 70 75 74 73 20 24 66 64  head>"..puts $fd
1330: 20 22 20 20 3c 62 6f 64 79 3e 22 0a 09 70 75 74   "  <body>"..put
1340: 73 20 24 66 64 20 5b 67 65 6e 65 72 61 74 65 5f  s $fd [generate_
1350: 74 70 6d 20 24 70 6b 67 6c 69 73 74 5d 0a 09 70  tpm $pkglist]..p
1360: 75 74 73 20 24 66 64 20 22 20 20 20 20 3c 68 31  uts $fd "    <h1
1370: 3e 4c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74  >List of all ent
1380: 69 74 69 65 73 3c 2f 68 31 3e 22 0a 09 70 75 74  ities</h1>"..put
1390: 73 20 24 66 64 20 22 20 20 20 20 3c 74 61 62 6c  s $fd "    <tabl
13a0: 65 3e 22 0a 09 70 75 74 73 20 24 66 64 20 5b 67  e>"..puts $fd [g
13b0: 65 6e 65 72 61 74 65 5f 74 61 62 6c 65 20 24 70  enerate_table $p
13c0: 6b 67 6c 69 73 74 20 31 5d 0a 09 70 75 74 73 20  kglist 1]..puts 
13d0: 24 66 64 20 22 20 20 20 20 3c 2f 74 61 62 6c 65  $fd "    </table
13e0: 3e 22 0a 09 70 75 74 73 20 24 66 64 20 22 20 20  >"..puts $fd "  
13f0: 3c 2f 62 6f 64 79 3e 22 0a 09 70 75 74 73 20 24  </body>"..puts $
1400: 66 64 20 22 3c 2f 68 74 6d 6c 3e 22 0a 09 63 6c  fd "</html>"..cl
1410: 6f 73 65 20 24 66 64 0a 0a 09 66 69 6c 65 20 6d  ose $fd...file m
1420: 6b 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61  kdir [file dirna
1430: 6d 65 20 24 61 6c 74 69 6e 64 65 78 66 69 6c 65  me $altindexfile
1440: 5d 0a 09 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  ]..file delete -
1450: 66 6f 72 63 65 20 2d 2d 20 24 61 6c 74 69 6e 64  force -- $altind
1460: 65 78 66 69 6c 65 0a 09 66 69 6c 65 20 6c 69 6e  exfile..file lin
1470: 6b 20 2d 68 61 72 64 20 24 61 6c 74 69 6e 64 65  k -hard $altinde
1480: 78 66 69 6c 65 20 24 69 6e 64 65 78 66 69 6c 65  xfile $indexfile
1490: 0a 7d 0a 0a 23 20 43 72 65 61 74 65 20 22 70 61  .}..# Create "pa
14a0: 63 6b 61 67 65 2f 6c 69 73 74 22 0a 70 72 6f 63  ckage/list".proc
14b0: 20 63 72 65 61 74 65 5f 6f 75 74 70 75 74 5f 70   create_output_p
14c0: 6b 67 6c 69 73 74 20 7b 64 73 74 64 69 72 20 70  kglist {dstdir p
14d0: 6b 67 69 6e 66 6f 5f 61 72 72 6c 69 73 74 7d 20  kginfo_arrlist} 
14e0: 7b 0a 09 61 72 72 61 79 20 73 65 74 20 70 6b 67  {..array set pkg
14f0: 69 6e 66 6f 20 24 70 6b 67 69 6e 66 6f 5f 61 72  info $pkginfo_ar
1500: 72 6c 69 73 74 0a 0a 09 73 65 74 20 70 6b 67 64  rlist...set pkgd
1510: 69 72 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  ir [file join $d
1520: 73 74 64 69 72 20 70 61 63 6b 61 67 65 5d 0a 09  stdir package]..
1530: 63 61 74 63 68 20 7b 0a 09 09 66 69 6c 65 20 6d  catch {...file m
1540: 6b 64 69 72 20 24 70 6b 67 64 69 72 0a 09 7d 0a  kdir $pkgdir..}.
1550: 09 73 65 74 20 69 6e 64 65 78 66 69 6c 65 20 5b  .set indexfile [
1560: 66 69 6c 65 20 6a 6f 69 6e 20 24 70 6b 67 64 69  file join $pkgdi
1570: 72 20 6c 69 73 74 2e 68 74 6d 6c 5d 0a 09 73 65  r list.html]..se
1580: 74 20 61 6c 74 69 6e 64 65 78 66 69 6c 65 20 5b  t altindexfile [
1590: 66 69 6c 65 20 6a 6f 69 6e 20 24 70 6b 67 64 69  file join $pkgdi
15a0: 72 20 6c 69 73 74 5d 0a 0a 09 73 65 74 20 70 6b  r list]...set pk
15b0: 67 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 09 66 6f  glist [list]..fo
15c0: 72 65 61 63 68 20 65 6e 74 20 5b 61 72 72 61 79  reach ent [array
15d0: 20 6e 61 6d 65 73 20 70 6b 67 69 6e 66 6f 5d 20   names pkginfo] 
15e0: 7b 0a 09 09 73 65 74 20 70 6b 67 20 5b 6c 69 6e  {...set pkg [lin
15f0: 64 65 78 20 24 65 6e 74 20 30 5d 0a 09 09 73 65  dex $ent 0]...se
1600: 74 20 76 65 72 20 5b 6c 69 6e 64 65 78 20 24 65  t ver [lindex $e
1610: 6e 74 20 31 5d 0a 09 09 73 65 74 20 61 72 63 68  nt 1]...set arch
1620: 20 5b 6c 69 6e 64 65 78 20 24 65 6e 74 20 32 5d   [lindex $ent 2]
1630: 0a 0a 09 09 6c 61 70 70 65 6e 64 20 70 6b 67 6c  ....lappend pkgl
1640: 69 73 74 20 5b 6c 69 73 74 20 5b 6c 69 73 74 20  ist [list [list 
1650: 65 6e 74 69 74 79 20 70 61 63 6b 61 67 65 5d 20  entity package] 
1660: 5b 6c 69 73 74 20 6e 61 6d 65 20 24 70 6b 67 5d  [list name $pkg]
1670: 20 5b 6c 69 73 74 20 76 65 72 20 24 76 65 72 5d   [list ver $ver]
1680: 20 5b 6c 69 73 74 20 61 72 63 68 20 24 61 72 63   [list arch $arc
1690: 68 5d 20 5b 6c 69 73 74 20 75 6e 6b 6e 6f 77 6e  h] [list unknown
16a0: 20 30 5d 5d 0a 09 7d 0a 0a 09 73 65 74 20 70 6b   0]]..}...set pk
16b0: 67 6c 69 73 74 20 5b 6c 73 6f 72 74 20 2d 64 69  glist [lsort -di
16c0: 63 74 69 6f 6e 61 72 79 20 24 70 6b 67 6c 69 73  ctionary $pkglis
16d0: 74 5d 0a 0a 09 73 65 74 20 66 64 20 5b 6f 70 65  t]...set fd [ope
16e0: 6e 20 24 69 6e 64 65 78 66 69 6c 65 20 77 5d 0a  n $indexfile w].
16f0: 09 70 75 74 73 20 24 66 64 20 22 3c 68 74 6d 6c  .puts $fd "<html
1700: 3e 22 0a 09 70 75 74 73 20 24 66 64 20 22 20 20  >"..puts $fd "  
1710: 3c 68 65 61 64 3e 22 0a 09 70 75 74 73 20 24 66  <head>"..puts $f
1720: 64 20 22 20 20 20 20 3c 74 69 74 6c 65 3e 4c 69  d "    <title>Li
1730: 73 74 20 6f 66 20 61 6c 6c 20 70 61 63 6b 61 67  st of all packag
1740: 65 73 3c 2f 74 69 74 6c 65 3e 22 0a 09 70 75 74  es</title>"..put
1750: 73 20 24 66 64 20 22 20 20 3c 2f 68 65 61 64 3e  s $fd "  </head>
1760: 22 0a 09 70 75 74 73 20 24 66 64 20 22 20 20 3c  "..puts $fd "  <
1770: 62 6f 64 79 3e 22 0a 09 70 75 74 73 20 24 66 64  body>"..puts $fd
1780: 20 5b 67 65 6e 65 72 61 74 65 5f 74 70 6d 20 24   [generate_tpm $
1790: 70 6b 67 6c 69 73 74 5d 0a 09 70 75 74 73 20 24  pkglist]..puts $
17a0: 66 64 20 22 20 20 20 20 3c 68 31 3e 4c 69 73 74  fd "    <h1>List
17b0: 20 6f 66 20 61 6c 6c 20 70 61 63 6b 61 67 65 73   of all packages
17c0: 3c 2f 68 31 3e 22 0a 09 70 75 74 73 20 24 66 64  </h1>"..puts $fd
17d0: 20 22 20 20 20 20 3c 74 61 62 6c 65 3e 22 0a 09   "    <table>"..
17e0: 70 75 74 73 20 24 66 64 20 22 20 20 20 20 20 20  puts $fd "      
17f0: 3c 74 72 3e 22 0a 09 70 75 74 73 20 24 66 64 20  <tr>"..puts $fd 
1800: 22 20 20 20 20 20 20 20 20 3c 74 68 3e 57 68 61  "        <th>Wha
1810: 74 3c 2f 74 68 3e 22 0a 09 70 75 74 73 20 24 66  t</th>"..puts $f
1820: 64 20 22 20 20 20 20 20 20 20 20 3c 74 68 3e 4e  d "        <th>N
1830: 61 6d 65 3c 2f 74 68 3e 22 0a 09 70 75 74 73 20  ame</th>"..puts 
1840: 24 66 64 20 22 20 20 20 20 20 20 20 20 3c 74 68  $fd "        <th
1850: 3e 56 65 72 73 69 6f 6e 3c 2f 74 68 3e 22 0a 09  >Version</th>"..
1860: 70 75 74 73 20 24 66 64 20 22 20 20 20 20 20 20  puts $fd "      
1870: 20 20 3c 74 68 3e 50 6c 61 74 66 6f 72 6d 3c 2f    <th>Platform</
1880: 74 68 3e 22 0a 09 70 75 74 73 20 24 66 64 20 22  th>"..puts $fd "
1890: 20 20 20 20 20 20 3c 2f 74 72 3e 22 0a 09 70 75        </tr>"..pu
18a0: 74 73 20 24 66 64 20 5b 67 65 6e 65 72 61 74 65  ts $fd [generate
18b0: 5f 74 61 62 6c 65 20 24 70 6b 67 6c 69 73 74 20  _table $pkglist 
18c0: 34 5d 0a 09 70 75 74 73 20 24 66 64 20 22 20 20  4]..puts $fd "  
18d0: 20 20 3c 2f 74 61 62 6c 65 3e 22 0a 09 70 75 74    </table>"..put
18e0: 73 20 24 66 64 20 22 20 20 3c 2f 62 6f 64 79 3e  s $fd "  </body>
18f0: 22 0a 09 70 75 74 73 20 24 66 64 20 22 3c 2f 68  "..puts $fd "</h
1900: 74 6d 6c 3e 22 0a 09 63 6c 6f 73 65 20 24 66 64  tml>"..close $fd
1910: 0a 0a 09 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  ...file delete -
1920: 2d 20 24 61 6c 74 69 6e 64 65 78 66 69 6c 65 0a  - $altindexfile.
1930: 09 66 69 6c 65 20 6c 69 6e 6b 20 2d 68 61 72 64  .file link -hard
1940: 20 24 61 6c 74 69 6e 64 65 78 66 69 6c 65 20 24   $altindexfile $
1950: 69 6e 64 65 78 66 69 6c 65 0a 7d 0a 0a 23 20 43  indexfile.}..# C
1960: 72 65 61 74 65 20 22 70 61 63 6b 61 67 65 2f 6e  reate "package/n
1970: 61 6d 65 2f 3c 70 6b 67 3e 2f 76 65 72 2f 3c 76  ame/<pkg>/ver/<v
1980: 65 72 3e 2f 61 72 63 68 2f 3c 61 72 63 68 3e 2f  er>/arch/<arch>/
1990: 66 69 6c 65 22 0a 70 72 6f 63 20 63 72 65 61 74  file".proc creat
19a0: 65 5f 6f 75 74 70 75 74 5f 66 69 6c 65 73 20 7b  e_output_files {
19b0: 64 73 74 64 69 72 20 70 6b 67 69 6e 66 6f 5f 61  dstdir pkginfo_a
19c0: 72 72 6c 69 73 74 20 7b 66 6f 72 63 65 20 30 7d  rrlist {force 0}
19d0: 7d 20 7b 0a 09 61 72 72 61 79 20 73 65 74 20 70  } {..array set p
19e0: 6b 67 69 6e 66 6f 20 24 70 6b 67 69 6e 66 6f 5f  kginfo $pkginfo_
19f0: 61 72 72 6c 69 73 74 0a 0a 09 66 6f 72 65 61 63  arrlist...foreac
1a00: 68 20 65 6e 74 20 5b 61 72 72 61 79 20 6e 61 6d  h ent [array nam
1a10: 65 73 20 70 6b 67 69 6e 66 6f 5d 20 7b 0a 09 09  es pkginfo] {...
1a20: 73 65 74 20 70 6b 67 20 5b 6c 69 6e 64 65 78 20  set pkg [lindex 
1a30: 24 65 6e 74 20 30 5d 0a 09 09 73 65 74 20 76 65  $ent 0]...set ve
1a40: 72 20 5b 6c 69 6e 64 65 78 20 24 65 6e 74 20 31  r [lindex $ent 1
1a50: 5d 0a 09 09 73 65 74 20 61 72 63 68 20 5b 6c 69  ]...set arch [li
1a60: 6e 64 65 78 20 24 65 6e 74 20 32 5d 0a 0a 09 09  ndex $ent 2]....
1a70: 61 72 72 61 79 20 73 65 74 20 63 75 72 72 70 6b  array set currpk
1a80: 67 69 6e 66 6f 20 24 70 6b 67 69 6e 66 6f 28 24  ginfo $pkginfo($
1a90: 65 6e 74 29 0a 09 09 73 65 74 20 70 6b 67 64 69  ent)...set pkgdi
1aa0: 72 20 24 63 75 72 72 70 6b 67 69 6e 66 6f 28 70  r $currpkginfo(p
1ab0: 6b 67 64 69 72 29 0a 09 09 73 65 74 20 6d 75 6c  kgdir)...set mul
1ac0: 74 69 66 69 6c 65 20 24 63 75 72 72 70 6b 67 69  tifile $currpkgi
1ad0: 6e 66 6f 28 6d 75 6c 74 69 66 69 6c 65 29 0a 09  nfo(multifile)..
1ae0: 09 73 65 74 20 65 78 74 66 69 6c 65 74 61 69 6c  .set extfiletail
1af0: 20 24 63 75 72 72 70 6b 67 69 6e 66 6f 28 65 78   $currpkginfo(ex
1b00: 74 66 69 6c 65 29 0a 0a 09 09 73 65 74 20 77 6f  tfile)....set wo
1b10: 72 6b 64 69 72 20 5b 66 69 6c 65 20 6a 6f 69 6e  rkdir [file join
1b20: 20 24 64 73 74 64 69 72 20 70 61 63 6b 61 67 65   $dstdir package
1b30: 20 6e 61 6d 65 20 24 70 6b 67 20 76 65 72 20 24   name $pkg ver $
1b40: 76 65 72 20 61 72 63 68 20 24 61 72 63 68 5d 0a  ver arch $arch].
1b50: 09 09 73 65 74 20 72 65 67 66 69 6c 65 20 5b 66  ..set regfile [f
1b60: 69 6c 65 20 6a 6f 69 6e 20 24 77 6f 72 6b 64 69  ile join $workdi
1b70: 72 20 66 69 6c 65 5d 0a 09 09 73 65 74 20 65 78  r file]...set ex
1b80: 74 66 69 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  tfile [file join
1b90: 20 24 77 6f 72 6b 64 69 72 20 24 65 78 74 66 69   $workdir $extfi
1ba0: 6c 65 74 61 69 6c 5d 0a 0a 09 09 69 66 20 7b 5b  letail]....if {[
1bb0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 65 78 74  file exists $ext
1bc0: 66 69 6c 65 5d 20 26 26 20 21 24 66 6f 72 63 65  file] && !$force
1bd0: 7d 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 0a  } {....continue.
1be0: 09 09 7d 0a 0a 09 09 63 61 74 63 68 20 7b 0a 09  ..}....catch {..
1bf0: 09 09 66 69 6c 65 20 6d 6b 64 69 72 20 24 77 6f  ..file mkdir $wo
1c00: 72 6b 64 69 72 0a 09 09 7d 0a 0a 09 09 69 66 20  rkdir...}....if 
1c10: 7b 24 6d 75 6c 74 69 66 69 6c 65 7d 20 7b 0a 09  {$multifile} {..
1c20: 09 09 69 66 20 7b 5b 63 61 74 63 68 20 7b 0a 09  ..if {[catch {..
1c30: 09 09 09 63 64 20 24 70 6b 67 64 69 72 0a 0a 09  ...cd $pkgdir...
1c40: 09 09 09 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  ...file delete -
1c50: 2d 20 24 65 78 74 66 69 6c 65 0a 09 09 09 09 65  - $extfile.....e
1c60: 78 65 63 20 7a 69 70 20 2d 72 20 24 65 78 74 66  xec zip -r $extf
1c70: 69 6c 65 20 2e 20 2d 78 20 62 75 69 6c 64 2e 6c  ile . -x build.l
1c80: 6f 67 0a 09 09 09 7d 20 65 72 72 5d 7d 20 7b 0a  og....} err]} {.
1c90: 09 09 09 09 70 75 74 73 20 22 45 72 72 6f 72 20  ....puts "Error 
1ca0: 77 68 69 6c 65 20 7a 69 70 70 69 6e 67 3a 20 24  while zipping: $
1cb0: 65 72 72 22 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  err"....}...} el
1cc0: 73 65 20 7b 0a 09 09 09 73 65 74 20 6f 72 69 67  se {....set orig
1cd0: 66 69 6c 65 20 5b 6c 69 6e 64 65 78 20 5b 67 6c  file [lindex [gl
1ce0: 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 2d  ob -nocomplain -
1cf0: 64 69 72 65 63 74 6f 72 79 20 24 70 6b 67 64 69  directory $pkgdi
1d00: 72 20 2a 5d 20 30 5d 0a 0a 09 09 09 66 69 6c 65  r *] 0].....file
1d10: 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 2d 2d 20   copy -force -- 
1d20: 24 6f 72 69 67 66 69 6c 65 20 24 65 78 74 66 69  $origfile $extfi
1d30: 6c 65 0a 09 09 7d 0a 0a 09 09 66 69 6c 65 20 64  le...}....file d
1d40: 65 6c 65 74 65 20 2d 2d 20 24 72 65 67 66 69 6c  elete -- $regfil
1d50: 65 0a 09 09 66 69 6c 65 20 6c 69 6e 6b 20 2d 68  e...file link -h
1d60: 61 72 64 20 24 72 65 67 66 69 6c 65 20 24 65 78  ard $regfile $ex
1d70: 74 66 69 6c 65 0a 09 09 66 69 6c 65 20 61 74 74  tfile...file att
1d80: 72 69 62 75 74 65 73 20 24 72 65 67 66 69 6c 65  ributes $regfile
1d90: 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 2d 78   -permissions -x
1da0: 0a 09 09 66 69 6c 65 20 61 74 74 72 69 62 75 74  ...file attribut
1db0: 65 73 20 24 65 78 74 66 69 6c 65 20 2d 70 65 72  es $extfile -per
1dc0: 6d 69 73 73 69 6f 6e 73 20 2d 78 0a 09 7d 0a 7d  missions -x..}.}
1dd0: 0a 0a 70 72 6f 63 20 63 72 65 61 74 65 5f 65 6e  ..proc create_en
1de0: 74 69 74 79 5f 66 69 6c 65 20 7b 65 6e 74 69 74  tity_file {entit
1df0: 79 20 64 73 74 64 69 72 20 70 6b 67 69 6e 66 6f  y dstdir pkginfo
1e00: 5f 61 72 72 6c 69 73 74 7d 20 7b 0a 09 61 72 72  _arrlist} {..arr
1e10: 61 79 20 73 65 74 20 70 6b 67 69 6e 66 6f 20 24  ay set pkginfo $
1e20: 70 6b 67 69 6e 66 6f 5f 61 72 72 6c 69 73 74 0a  pkginfo_arrlist.
1e30: 09 61 72 72 61 79 20 73 65 74 20 65 6e 74 69 6e  .array set entin
1e40: 66 6f 20 24 65 6e 74 69 74 79 0a 0a 09 69 66 20  fo $entity...if 
1e50: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 65  {![info exists e
1e60: 6e 74 69 6e 66 6f 28 65 6e 74 69 74 79 29 5d 7d  ntinfo(entity)]}
1e70: 20 7b 0a 09 09 72 65 74 75 72 6e 0a 09 7d 0a 0a   {...return..}..
1e80: 09 73 65 74 20 65 6e 74 69 74 79 5f 74 79 70 65  .set entity_type
1e90: 20 24 65 6e 74 69 6e 66 6f 28 65 6e 74 69 74 79   $entinfo(entity
1ea0: 29 0a 09 73 65 74 20 72 65 71 5f 66 69 65 6c 64  )..set req_field
1eb0: 73 20 24 3a 3a 65 6e 74 69 74 79 5f 64 65 66 69  s $::entity_defi
1ec0: 6e 69 74 69 6f 6e 28 24 65 6e 74 69 74 79 5f 74  nition($entity_t
1ed0: 79 70 65 29 0a 0a 09 73 65 74 20 63 6f 6d 70 6c  ype)...set compl
1ee0: 65 74 65 20 31 0a 09 73 65 74 20 70 6b 67 70 61  ete 1..set pkgpa
1ef0: 74 20 5b 6c 69 73 74 5d 0a 09 73 65 74 20 64 69  t [list]..set di
1f00: 73 70 66 69 65 6c 64 73 20 5b 6c 69 73 74 5d 0a  spfields [list].
1f10: 09 66 6f 72 65 61 63 68 20 72 65 71 5f 66 69 65  .foreach req_fie
1f20: 6c 64 20 24 72 65 71 5f 66 69 65 6c 64 73 20 7b  ld $req_fields {
1f30: 0a 09 09 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  ...if {![info ex
1f40: 69 73 74 73 20 65 6e 74 69 6e 66 6f 28 24 72 65  ists entinfo($re
1f50: 71 5f 66 69 65 6c 64 29 5d 7d 20 7b 0a 09 09 09  q_field)]} {....
1f60: 73 65 74 20 63 6f 6d 70 6c 65 74 65 20 30 0a 0a  set complete 0..
1f70: 09 09 09 6c 61 70 70 65 6e 64 20 70 6b 67 70 61  ...lappend pkgpa
1f80: 74 20 22 2a 22 0a 09 09 09 09 69 66 20 7b 21 5b  t "*".....if {![
1f90: 69 6e 66 6f 20 65 78 69 73 74 73 20 70 6b 67 6e  info exists pkgn
1fa0: 65 78 74 6c 65 76 65 6c 5d 7d 20 7b 0a 09 09 09  extlevel]} {....
1fb0: 09 73 65 74 20 70 6b 67 6e 65 78 74 6c 65 76 65  .set pkgnextleve
1fc0: 6c 20 24 72 65 71 5f 66 69 65 6c 64 0a 09 09 09  l $req_field....
1fd0: 09 6c 61 70 70 65 6e 64 20 64 69 73 70 66 69 65  .lappend dispfie
1fe0: 6c 64 73 20 24 72 65 71 5f 66 69 65 6c 64 0a 09  lds $req_field..
1ff0: 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ..}...} else {..
2000: 09 09 6c 61 70 70 65 6e 64 20 70 6b 67 70 61 74  ..lappend pkgpat
2010: 20 24 65 6e 74 69 6e 66 6f 28 24 72 65 71 5f 66   $entinfo($req_f
2020: 69 65 6c 64 29 0a 09 09 09 6c 61 70 70 65 6e 64  ield)....lappend
2030: 20 64 69 73 70 66 69 65 6c 64 73 20 24 72 65 71   dispfields $req
2040: 5f 66 69 65 6c 64 0a 09 09 7d 0a 09 7d 0a 0a 09  _field...}..}...
2050: 69 66 20 7b 24 63 6f 6d 70 6c 65 74 65 7d 20 7b  if {$complete} {
2060: 0a 09 09 73 65 74 20 65 6e 74 70 61 74 68 5f 70  ...set entpath_p
2070: 61 72 74 73 20 5b 6c 69 73 74 20 24 65 6e 74 69  arts [list $enti
2080: 74 79 5f 74 79 70 65 5d 0a 0a 09 09 66 6f 72 65  ty_type]....fore
2090: 61 63 68 20 72 65 71 5f 66 69 65 6c 64 20 24 72  ach req_field $r
20a0: 65 71 5f 66 69 65 6c 64 73 20 7b 0a 09 09 09 6c  eq_fields {....l
20b0: 61 70 70 65 6e 64 20 65 6e 74 70 61 74 68 5f 70  append entpath_p
20c0: 61 72 74 73 20 24 72 65 71 5f 66 69 65 6c 64 20  arts $req_field 
20d0: 24 65 6e 74 69 6e 66 6f 28 24 72 65 71 5f 66 69  $entinfo($req_fi
20e0: 65 6c 64 29 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  eld)...}..} else
20f0: 20 7b 0a 09 09 73 65 74 20 65 6e 74 70 61 74 68   {...set entpath
2100: 5f 70 61 72 74 73 20 5b 6c 69 73 74 20 65 6e 74  _parts [list ent
2110: 69 74 79 5d 0a 0a 09 09 66 6f 72 65 61 63 68 20  ity]....foreach 
2120: 72 65 71 5f 66 69 65 6c 64 20 24 72 65 71 5f 66  req_field $req_f
2130: 69 65 6c 64 73 20 7b 0a 09 09 09 69 66 20 7b 5b  ields {....if {[
2140: 69 6e 66 6f 20 65 78 69 73 74 73 20 65 6e 74 69  info exists enti
2150: 6e 66 6f 28 24 72 65 71 5f 66 69 65 6c 64 29 5d  nfo($req_field)]
2160: 7d 20 7b 0a 09 09 09 09 6c 61 70 70 65 6e 64 20  } {.....lappend 
2170: 65 6e 74 70 61 74 68 5f 70 61 72 74 73 20 24 72  entpath_parts $r
2180: 65 71 5f 66 69 65 6c 64 20 24 65 6e 74 69 6e 66  eq_field $entinf
2190: 6f 28 24 72 65 71 5f 66 69 65 6c 64 29 0a 09 09  o($req_field)...
21a0: 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 73 65 74 20  .}...}..}...set 
21b0: 65 6e 74 70 61 74 68 20 5b 6a 6f 69 6e 20 24 65  entpath [join $e
21c0: 6e 74 70 61 74 68 5f 70 61 72 74 73 20 2f 5d 0a  ntpath_parts /].
21d0: 0a 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61  ..if {[string ma
21e0: 74 63 68 20 22 2f 2a 22 20 24 65 6e 74 70 61 74  tch "/*" $entpat
21f0: 68 5d 7d 20 7b 0a 09 09 72 65 74 75 72 6e 0a 09  h]} {...return..
2200: 7d 0a 0a 09 73 65 74 20 69 6e 64 65 78 66 69 6c  }...set indexfil
2210: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 73  e [file join $ds
2220: 74 64 69 72 20 24 65 6e 74 70 61 74 68 20 69 6e  tdir $entpath in
2230: 64 65 78 2e 68 74 6d 6c 5d 0a 09 73 65 74 20 74  dex.html]..set t
2240: 6d 70 69 6e 64 65 78 66 69 6c 65 20 5b 66 69 6c  mpindexfile [fil
2250: 65 20 6a 6f 69 6e 20 24 64 73 74 64 69 72 20 24  e join $dstdir $
2260: 65 6e 74 70 61 74 68 20 69 6e 64 65 78 2e 68 74  entpath index.ht
2270: 6d 6c 2e 74 6d 70 5d 0a 0a 09 63 61 74 63 68 20  ml.tmp]...catch 
2280: 7b 0a 09 09 66 69 6c 65 20 6d 6b 64 69 72 20 5b  {...file mkdir [
2290: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 69 6e  file dirname $in
22a0: 64 65 78 66 69 6c 65 5d 0a 09 7d 0a 0a 09 73 65  dexfile]..}...se
22b0: 74 20 66 64 20 5b 6f 70 65 6e 20 24 74 6d 70 69  t fd [open $tmpi
22c0: 6e 64 65 78 66 69 6c 65 20 77 5d 0a 0a 09 70 75  ndexfile w]...pu
22d0: 74 73 20 24 66 64 20 22 3c 68 74 6d 6c 3e 22 0a  ts $fd "<html>".
22e0: 09 70 75 74 73 20 24 66 64 20 22 20 20 3c 68 65  .puts $fd "  <he
22f0: 61 64 3e 22 0a 09 70 75 74 73 20 24 66 64 20 22  ad>"..puts $fd "
2300: 20 20 20 20 3c 74 69 74 6c 65 3e 22 0a 09 70 75      <title>"..pu
2310: 74 73 20 24 66 64 20 22 20 20 20 20 3c 2f 74 69  ts $fd "    </ti
2320: 74 6c 65 3e 22 0a 09 70 75 74 73 20 24 66 64 20  tle>"..puts $fd 
2330: 22 20 20 3c 2f 68 65 61 64 3e 22 0a 09 70 75 74  "  </head>"..put
2340: 73 20 24 66 64 20 22 20 20 3c 62 6f 64 79 3e 22  s $fd "  <body>"
2350: 0a 0a 09 73 65 74 20 70 6b 67 6c 69 73 74 20 5b  ...set pkglist [
2360: 6c 69 73 74 5d 0a 09 69 66 20 7b 21 24 63 6f 6d  list]..if {!$com
2370: 70 6c 65 74 65 7d 20 7b 0a 09 09 66 6f 72 65 61  plete} {...forea
2380: 63 68 20 70 6b 67 65 6e 74 20 5b 61 72 72 61 79  ch pkgent [array
2390: 20 6e 61 6d 65 73 20 70 6b 67 69 6e 66 6f 20 24   names pkginfo $
23a0: 70 6b 67 70 61 74 5d 20 7b 0a 09 09 09 75 6e 73  pkgpat] {....uns
23b0: 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 63  et -nocomplain c
23c0: 75 72 72 70 6b 67 69 6e 66 6f 0a 09 09 09 66 6f  urrpkginfo....fo
23d0: 72 20 7b 73 65 74 20 69 64 78 20 30 7d 20 7b 24  r {set idx 0} {$
23e0: 69 64 78 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24  idx < [llength $
23f0: 72 65 71 5f 66 69 65 6c 64 73 5d 7d 20 7b 69 6e  req_fields]} {in
2400: 63 72 20 69 64 78 7d 20 7b 0a 09 09 09 09 73 65  cr idx} {.....se
2410: 74 20 66 69 65 6c 64 20 5b 6c 69 6e 64 65 78 20  t field [lindex 
2420: 24 72 65 71 5f 66 69 65 6c 64 73 20 24 69 64 78  $req_fields $idx
2430: 5d 0a 09 09 09 09 73 65 74 20 76 61 6c 75 65 20  ].....set value 
2440: 5b 6c 69 6e 64 65 78 20 24 70 6b 67 65 6e 74 20  [lindex $pkgent 
2450: 24 69 64 78 5d 0a 09 09 09 09 73 65 74 20 63 75  $idx].....set cu
2460: 72 72 70 6b 67 69 6e 66 6f 28 24 66 69 65 6c 64  rrpkginfo($field
2470: 29 20 24 76 61 6c 75 65 0a 09 09 09 7d 0a 0a 09  ) $value....}...
2480: 09 09 73 65 74 20 63 75 72 72 70 6b 67 64 61 74  ..set currpkgdat
2490: 61 20 5b 6c 69 73 74 20 5b 6c 69 73 74 20 65 6e  a [list [list en
24a0: 74 69 74 79 20 24 65 6e 74 69 74 79 5f 74 79 70  tity $entity_typ
24b0: 65 5d 5d 0a 09 09 09 66 6f 72 65 61 63 68 20 64  e]]....foreach d
24c0: 69 73 70 66 69 65 6c 64 20 24 64 69 73 70 66 69  ispfield $dispfi
24d0: 65 6c 64 73 20 7b 0a 09 09 09 09 6c 61 70 70 65  elds {.....lappe
24e0: 6e 64 20 63 75 72 72 70 6b 67 64 61 74 61 20 5b  nd currpkgdata [
24f0: 6c 69 73 74 20 24 64 69 73 70 66 69 65 6c 64 20  list $dispfield 
2500: 24 63 75 72 72 70 6b 67 69 6e 66 6f 28 24 64 69  $currpkginfo($di
2510: 73 70 66 69 65 6c 64 29 5d 0a 09 09 09 7d 0a 0a  spfield)]....}..
2520: 09 09 09 69 66 20 7b 5b 6c 73 65 61 72 63 68 20  ...if {[lsearch 
2530: 2d 65 78 61 63 74 20 24 70 6b 67 6c 69 73 74 20  -exact $pkglist 
2540: 24 63 75 72 72 70 6b 67 64 61 74 61 5d 20 21 3d  $currpkgdata] !=
2550: 20 2d 31 7d 20 7b 0a 09 09 09 09 63 6f 6e 74 69   -1} {.....conti
2560: 6e 75 65 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 70  nue....}.....lap
2570: 70 65 6e 64 20 70 6b 67 6c 69 73 74 20 24 63 75  pend pkglist $cu
2580: 72 72 70 6b 67 64 61 74 61 0a 09 09 7d 0a 0a 09  rrpkgdata...}...
2590: 09 73 65 74 20 70 6b 67 6c 69 73 74 20 5b 6c 73  .set pkglist [ls
25a0: 6f 72 74 20 2d 64 69 63 74 69 6f 6e 61 72 79 20  ort -dictionary 
25b0: 24 70 6b 67 6c 69 73 74 5d 0a 0a 09 09 70 75 74  $pkglist]....put
25c0: 73 20 24 66 64 20 5b 67 65 6e 65 72 61 74 65 5f  s $fd [generate_
25d0: 74 70 6d 20 24 70 6b 67 6c 69 73 74 5d 0a 0a 09  tpm $pkglist]...
25e0: 09 70 75 74 73 20 24 66 64 20 22 20 20 20 20 3c  .puts $fd "    <
25f0: 68 31 3e 24 70 6b 67 6e 65 78 74 6c 65 76 65 6c  h1>$pkgnextlevel
2600: 3c 2f 68 31 3e 22 0a 09 09 70 75 74 73 20 24 66  </h1>"...puts $f
2610: 64 20 22 20 20 20 20 3c 74 61 62 6c 65 3e 22 0a  d "    <table>".
2620: 09 09 70 75 74 73 20 24 66 64 20 22 20 20 20 20  ..puts $fd "    
2630: 3c 74 72 3e 22 0a 09 09 66 6f 72 65 61 63 68 20  <tr>"...foreach 
2640: 64 69 73 70 66 69 65 6c 64 20 5b 6a 6f 69 6e 20  dispfield [join 
2650: 5b 6c 69 73 74 20 65 6e 74 69 74 79 20 24 64 69  [list entity $di
2660: 73 70 66 69 65 6c 64 73 5d 5d 20 7b 0a 09 09 09  spfields]] {....
2670: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2680: 20 3a 3a 65 6e 74 69 74 79 5f 66 69 65 6c 64 6e   ::entity_fieldn
2690: 61 6d 65 73 28 5b 6c 69 73 74 20 24 65 6e 74 69  ames([list $enti
26a0: 74 79 5f 74 79 70 65 20 24 64 69 73 70 66 69 65  ty_type $dispfie
26b0: 6c 64 5d 29 5d 7d 20 7b 0a 09 09 09 09 73 65 74  ld])]} {.....set
26c0: 20 64 69 73 70 66 69 65 6c 64 68 65 61 64 65 72   dispfieldheader
26d0: 20 24 3a 3a 65 6e 74 69 74 79 5f 66 69 65 6c 64   $::entity_field
26e0: 6e 61 6d 65 73 28 5b 6c 69 73 74 20 24 65 6e 74  names([list $ent
26f0: 69 74 79 5f 74 79 70 65 20 24 64 69 73 70 66 69  ity_type $dispfi
2700: 65 6c 64 5d 29 0a 09 09 09 7d 20 65 6c 73 65 20  eld])....} else 
2710: 7b 0a 09 09 09 09 73 65 74 20 64 69 73 70 66 69  {.....set dispfi
2720: 65 6c 64 68 65 61 64 65 72 20 24 3a 3a 65 6e 74  eldheader $::ent
2730: 69 74 79 5f 66 69 65 6c 64 6e 61 6d 65 73 28 5b  ity_fieldnames([
2740: 6c 69 73 74 20 24 64 69 73 70 66 69 65 6c 64 5d  list $dispfield]
2750: 29 0a 09 09 09 7d 0a 09 09 09 70 75 74 73 20 24  )....}....puts $
2760: 66 64 20 22 20 20 20 20 20 20 3c 74 68 3e 24 64  fd "      <th>$d
2770: 69 73 70 66 69 65 6c 64 68 65 61 64 65 72 3c 2f  ispfieldheader</
2780: 74 68 3e 22 0a 09 09 7d 0a 09 09 70 75 74 73 20  th>"...}...puts 
2790: 24 66 64 20 22 20 20 20 20 3c 2f 74 72 3e 22 0a  $fd "    </tr>".
27a0: 0a 09 09 70 75 74 73 20 24 66 64 20 5b 67 65 6e  ...puts $fd [gen
27b0: 65 72 61 74 65 5f 74 61 62 6c 65 20 24 70 6b 67  erate_table $pkg
27c0: 6c 69 73 74 20 31 30 5d 0a 0a 09 09 70 75 74 73  list 10]....puts
27d0: 20 24 66 64 20 22 20 20 20 20 3c 2f 74 61 62 6c   $fd "    </tabl
27e0: 65 3e 22 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  e>"..} else {...
27f0: 73 65 74 20 64 69 73 70 6e 61 6d 65 5f 6c 69 73  set dispname_lis
2800: 74 20 5b 6c 69 73 74 5d 0a 09 09 73 65 74 20 70  t [list]...set p
2810: 61 74 68 6e 61 6d 65 5f 6c 69 73 74 20 5b 6c 69  athname_list [li
2820: 73 74 20 24 65 6e 74 69 74 79 5f 74 79 70 65 5d  st $entity_type]
2830: 0a 09 09 66 6f 72 65 61 63 68 20 66 69 65 6c 64  ...foreach field
2840: 20 24 72 65 71 5f 66 69 65 6c 64 73 20 7b 0a 09   $req_fields {..
2850: 09 09 6c 61 70 70 65 6e 64 20 64 69 73 70 6e 61  ..lappend dispna
2860: 6d 65 5f 6c 69 73 74 20 24 65 6e 74 69 6e 66 6f  me_list $entinfo
2870: 28 24 66 69 65 6c 64 29 0a 09 09 09 6c 61 70 70  ($field)....lapp
2880: 65 6e 64 20 70 61 74 68 6e 61 6d 65 5f 6c 69 73  end pathname_lis
2890: 74 20 24 66 69 65 6c 64 20 24 65 6e 74 69 6e 66  t $field $entinf
28a0: 6f 28 24 66 69 65 6c 64 29 0a 09 09 7d 0a 09 09  o($field)...}...
28b0: 73 65 74 20 6b 65 79 20 24 64 69 73 70 6e 61 6d  set key $dispnam
28c0: 65 5f 6c 69 73 74 0a 09 09 61 72 72 61 79 20 73  e_list...array s
28d0: 65 74 20 63 75 72 72 70 6b 67 69 6e 66 6f 20 24  et currpkginfo $
28e0: 70 6b 67 69 6e 66 6f 28 24 6b 65 79 29 0a 0a 09  pkginfo($key)...
28f0: 09 73 65 74 20 70 61 74 68 6e 61 6d 65 5f 64 69  .set pathname_di
2900: 72 20 22 5b 6a 6f 69 6e 20 24 70 61 74 68 6e 61  r "[join $pathna
2910: 6d 65 5f 6c 69 73 74 20 2f 5d 22 0a 09 09 73 65  me_list /]"...se
2920: 74 20 70 61 74 68 6e 61 6d 65 5f 64 69 72 6c 6f  t pathname_dirlo
2930: 63 61 6c 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  cal [file join $
2940: 64 73 74 64 69 72 20 24 70 61 74 68 6e 61 6d 65  dstdir $pathname
2950: 5f 64 69 72 5d 0a 09 09 73 65 74 20 70 61 74 68  _dir]...set path
2960: 6e 61 6d 65 5f 74 61 69 6c 20 24 63 75 72 72 70  name_tail $currp
2970: 6b 67 69 6e 66 6f 28 65 78 74 66 69 6c 65 29 0a  kginfo(extfile).
2980: 09 09 69 66 20 7b 24 70 61 74 68 6e 61 6d 65 5f  ..if {$pathname_
2990: 74 61 69 6c 20 3d 3d 20 22 22 7d 20 7b 0a 09 09  tail == ""} {...
29a0: 09 73 65 74 20 70 61 74 68 6e 61 6d 65 5f 74 61  .set pathname_ta
29b0: 69 6c 20 22 66 69 6c 65 22 0a 09 09 7d 0a 09 09  il "file"...}...
29c0: 73 65 74 20 70 61 74 68 6e 61 6d 65 5f 75 72 69  set pathname_uri
29d0: 20 22 2f 24 70 61 74 68 6e 61 6d 65 5f 64 69 72   "/$pathname_dir
29e0: 2f 24 70 61 74 68 6e 61 6d 65 5f 74 61 69 6c 22  /$pathname_tail"
29f0: 0a 0a 09 09 70 75 74 73 20 24 66 64 20 22 20 20  ....puts $fd "  
2a00: 20 20 3c 68 31 3e 44 65 74 61 69 6c 73 20 6f 66    <h1>Details of
2a10: 20 24 65 6e 74 69 74 79 5f 74 79 70 65 20 5b 6a   $entity_type [j
2a20: 6f 69 6e 20 24 64 69 73 70 6e 61 6d 65 5f 6c 69  oin $dispname_li
2a30: 73 74 5d 3c 2f 68 31 3e 22 0a 09 09 70 75 74 73  st]</h1>"...puts
2a40: 20 24 66 64 20 22 20 20 20 20 3c 70 3e 3c 61 20   $fd "    <p><a 
2a50: 68 72 65 66 3d 5c 22 24 70 61 74 68 6e 61 6d 65  href=\"$pathname
2a60: 5f 75 72 69 5c 22 3e 50 61 63 6b 61 67 65 20 61  _uri\">Package a
2a70: 72 63 68 69 76 65 3c 2f 61 3e 3c 2f 70 3e 22 0a  rchive</a></p>".
2a80: 09 09 70 75 74 73 20 24 66 64 20 22 20 20 20 20  ..puts $fd "    
2a90: 3c 70 3e 44 65 74 61 69 6c 73 3c 2f 70 3e 22 0a  <p>Details</p>".
2aa0: 09 09 70 75 74 73 20 24 66 64 20 22 20 20 20 20  ..puts $fd "    
2ab0: 3c 74 61 62 6c 65 20 62 6f 72 64 65 72 3d 5c 22  <table border=\"
2ac0: 31 5c 22 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d  1\" cellpadding=
2ad0: 5c 22 35 5c 22 3e 22 0a 09 09 70 75 74 73 20 24  \"5\">"...puts $
2ae0: 66 64 20 22 20 20 20 20 20 20 3c 74 72 3e 22 0a  fd "      <tr>".
2af0: 09 09 70 75 74 73 20 24 66 64 20 22 20 20 20 20  ..puts $fd "    
2b00: 20 20 20 20 3c 74 68 3e 4b 65 79 3c 2f 74 68 3e      <th>Key</th>
2b10: 22 0a 09 09 70 75 74 73 20 24 66 64 20 22 20 20  "...puts $fd "  
2b20: 20 20 20 20 20 20 3c 74 68 3e 56 61 6c 75 65 3c        <th>Value<
2b30: 2f 74 68 3e 22 0a 09 09 70 75 74 73 20 24 66 64  /th>"...puts $fd
2b40: 20 22 20 20 20 20 20 20 3c 2f 74 72 3e 22 0a 0a   "      </tr>"..
2b50: 09 09 66 6f 72 65 61 63 68 20 64 65 73 63 66 69  ..foreach descfi
2b60: 65 6c 64 20 5b 6c 69 73 74 20 72 73 6b 3a 3a 62  eld [list rsk::b
2b70: 75 69 6c 64 3a 3a 64 61 74 65 20 61 73 3a 3a 61  uild::date as::a
2b80: 75 74 68 6f 72 20 61 73 3a 3a 62 75 69 6c 64 3a  uthor as::build:
2b90: 3a 64 61 74 65 20 61 73 3a 3a 6f 72 69 67 69 6e  :date as::origin
2ba0: 20 63 61 74 65 67 6f 72 79 20 64 65 73 63 72 69   category descri
2bb0: 70 74 69 6f 6e 20 6c 69 63 65 6e 73 65 20 70 6c  ption license pl
2bc0: 61 74 66 6f 72 6d 20 72 65 71 75 69 72 65 20 73  atform require s
2bd0: 75 6d 6d 61 72 79 5d 20 7b 0a 09 09 09 69 66 20  ummary] {....if 
2be0: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63  {![info exists c
2bf0: 75 72 72 70 6b 67 69 6e 66 6f 28 24 64 65 73 63  urrpkginfo($desc
2c00: 66 69 65 6c 64 29 5d 7d 20 7b 0a 09 09 09 09 63  field)]} {.....c
2c10: 6f 6e 74 69 6e 75 65 0a 09 09 09 7d 0a 09 09 09  ontinue....}....
2c20: 73 65 74 20 64 65 73 63 76 61 6c 20 24 63 75 72  set descval $cur
2c30: 72 70 6b 67 69 6e 66 6f 28 24 64 65 73 63 66 69  rpkginfo($descfi
2c40: 65 6c 64 29 0a 09 09 09 73 77 69 74 63 68 20 2d  eld)....switch -
2c50: 2d 20 24 64 65 73 63 66 69 65 6c 64 20 7b 0a 09  - $descfield {..
2c60: 09 09 09 22 72 65 71 75 69 72 65 22 20 2d 20 22  ..."require" - "
2c70: 61 73 3a 3a 61 75 74 68 6f 72 22 20 2d 20 22 61  as::author" - "a
2c80: 73 3a 3a 6f 72 69 67 69 6e 22 20 7b 0a 09 09 09  s::origin" {....
2c90: 09 09 63 61 74 63 68 20 7b 0a 09 09 09 09 09 09  ..catch {.......
2ca0: 73 65 74 20 64 65 73 63 76 61 6c 20 5b 6a 6f 69  set descval [joi
2cb0: 6e 20 24 64 65 73 63 76 61 6c 5d 0a 09 09 09 09  n $descval].....
2cc0: 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  .}.....}....}...
2cd0: 09 09 70 75 74 73 20 24 66 64 20 22 20 20 20 20  ..puts $fd "    
2ce0: 20 20 3c 74 72 3e 22 0a 09 09 09 70 75 74 73 20    <tr>"....puts 
2cf0: 24 66 64 20 22 20 20 20 20 20 20 20 20 3c 74 64  $fd "        <td
2d00: 3e 24 64 65 73 63 66 69 65 6c 64 3c 2f 74 64 3e  >$descfield</td>
2d10: 22 0a 09 09 09 70 75 74 73 20 24 66 64 20 22 20  "....puts $fd " 
2d20: 20 20 20 20 20 20 20 3c 74 64 3e 5b 6a 6f 69 6e         <td>[join
2d30: 20 24 64 65 73 63 76 61 6c 20 22 3c 62 72 3e 22   $descval "<br>"
2d40: 5d 3c 2f 74 64 3e 22 0a 09 09 09 70 75 74 73 20  ]</td>"....puts 
2d50: 24 66 64 20 22 20 20 20 20 20 20 3c 2f 74 72 3e  $fd "      </tr>
2d60: 22 0a 09 09 7d 0a 09 09 70 75 74 73 20 24 66 64  "...}...puts $fd
2d70: 20 22 20 20 20 20 3c 2f 74 61 62 6c 65 3e 22 0a   "    </table>".
2d80: 09 7d 0a 0a 09 70 75 74 73 20 24 66 64 20 22 20  .}...puts $fd " 
2d90: 20 3c 2f 62 6f 64 79 3e 22 0a 09 70 75 74 73 20   </body>"..puts 
2da0: 24 66 64 20 22 3c 2f 68 74 6d 6c 3e 22 0a 0a 09  $fd "</html>"...
2db0: 63 6c 6f 73 65 20 24 66 64 0a 0a 09 66 69 6c 65  close $fd...file
2dc0: 20 72 65 6e 61 6d 65 20 2d 66 6f 72 63 65 20 2d   rename -force -
2dd0: 2d 20 24 74 6d 70 69 6e 64 65 78 66 69 6c 65 20  - $tmpindexfile 
2de0: 24 69 6e 64 65 78 66 69 6c 65 0a 7d 0a 0a 70 72  $indexfile.}..pr
2df0: 6f 63 20 63 72 65 61 74 65 5f 61 6c 6c 5f 65 6e  oc create_all_en
2e00: 74 69 74 79 5f 66 69 6c 65 73 20 7b 64 73 74 64  tity_files {dstd
2e10: 69 72 20 70 6b 67 69 6e 66 6f 5f 61 72 72 6c 69  ir pkginfo_arrli
2e20: 73 74 7d 20 7b 0a 09 73 65 74 20 65 6e 74 66 69  st} {..set entfi
2e30: 65 6c 64 73 20 24 3a 3a 65 6e 74 69 74 79 5f 64  elds $::entity_d
2e40: 65 66 69 6e 69 74 69 6f 6e 28 70 61 63 6b 61 67  efinition(packag
2e50: 65 29 0a 0a 09 66 6f 72 20 7b 73 65 74 20 69 64  e)...for {set id
2e60: 78 20 30 7d 20 7b 24 69 64 78 20 3c 20 5b 6c 6c  x 0} {$idx < [ll
2e70: 65 6e 67 74 68 20 24 65 6e 74 66 69 65 6c 64 73  ength $entfields
2e80: 5d 7d 20 7b 69 6e 63 72 20 69 64 78 7d 20 7b 0a  ]} {incr idx} {.
2e90: 09 09 73 65 74 20 66 69 65 6c 64 6e 61 6d 65 20  ..set fieldname 
2ea0: 5b 6c 69 6e 64 65 78 20 24 65 6e 74 66 69 65 6c  [lindex $entfiel
2eb0: 64 73 20 24 69 64 78 5d 0a 09 09 73 65 74 20 66  ds $idx]...set f
2ec0: 69 65 6c 64 6e 61 6d 65 5f 74 6f 5f 69 64 78 28  ieldname_to_idx(
2ed0: 24 66 69 65 6c 64 6e 61 6d 65 29 20 24 69 64 78  $fieldname) $idx
2ee0: 0a 09 7d 0a 0a 09 73 65 74 20 65 6e 74 74 79 70  ..}...set enttyp
2ef0: 65 73 5f 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 09  es_list [list]..
2f00: 66 6f 72 20 7b 73 65 74 20 69 64 78 20 31 7d 20  for {set idx 1} 
2f10: 7b 24 69 64 78 20 3c 20 69 6e 74 28 70 6f 77 28  {$idx < int(pow(
2f20: 32 2c 20 5b 6c 6c 65 6e 67 74 68 20 24 65 6e 74  2, [llength $ent
2f30: 66 69 65 6c 64 73 5d 29 29 7d 20 7b 69 6e 63 72  fields]))} {incr
2f40: 20 69 64 78 7d 20 7b 0a 09 09 73 65 74 20 65 6e   idx} {...set en
2f50: 74 74 79 70 65 73 5f 6c 69 73 74 5f 63 75 72 20  ttypes_list_cur 
2f60: 5b 6c 69 73 74 5d 0a 0a 09 09 66 6f 72 20 7b 73  [list]....for {s
2f70: 65 74 20 73 75 62 69 64 78 20 30 7d 20 7b 24 73  et subidx 0} {$s
2f80: 75 62 69 64 78 20 3c 20 5b 6c 6c 65 6e 67 74 68  ubidx < [llength
2f90: 20 24 65 6e 74 66 69 65 6c 64 73 5d 7d 20 7b 69   $entfields]} {i
2fa0: 6e 63 72 20 73 75 62 69 64 78 7d 20 7b 0a 09 09  ncr subidx} {...
2fb0: 09 69 66 20 7b 24 69 64 78 20 26 20 28 31 20 3c  .if {$idx & (1 <
2fc0: 3c 20 24 73 75 62 69 64 78 29 7d 20 7b 0a 09 09  < $subidx)} {...
2fd0: 09 09 6c 61 70 70 65 6e 64 20 65 6e 74 74 79 70  ..lappend enttyp
2fe0: 65 73 5f 6c 69 73 74 5f 63 75 72 20 5b 6c 69 6e  es_list_cur [lin
2ff0: 64 65 78 20 24 65 6e 74 66 69 65 6c 64 73 20 24  dex $entfields $
3000: 73 75 62 69 64 78 5d 0a 09 09 09 7d 0a 09 09 7d  subidx]....}...}
3010: 0a 0a 09 09 6c 61 70 70 65 6e 64 20 65 6e 74 74  ....lappend entt
3020: 79 70 65 73 5f 6c 69 73 74 20 24 65 6e 74 74 79  ypes_list $entty
3030: 70 65 73 5f 6c 69 73 74 5f 63 75 72 0a 09 7d 0a  pes_list_cur..}.
3040: 0a 09 61 72 72 61 79 20 73 65 74 20 70 6b 67 69  ..array set pkgi
3050: 6e 66 6f 20 24 70 6b 67 69 6e 66 6f 5f 61 72 72  nfo $pkginfo_arr
3060: 6c 69 73 74 0a 0a 09 73 65 74 20 73 65 65 6e 5f  list...set seen_
3070: 65 6e 74 69 74 69 65 73 20 5b 6c 69 73 74 5d 0a  entities [list].
3080: 09 66 6f 72 65 61 63 68 20 70 6b 67 64 61 74 61  .foreach pkgdata
3090: 20 5b 6c 73 6f 72 74 20 2d 64 69 63 74 69 6f 6e   [lsort -diction
30a0: 61 72 79 20 5b 61 72 72 61 79 20 6e 61 6d 65 73  ary [array names
30b0: 20 70 6b 67 69 6e 66 6f 5d 5d 20 7b 0a 09 09 66   pkginfo]] {...f
30c0: 6f 72 65 61 63 68 20 65 6e 74 74 79 70 65 73 20  oreach enttypes 
30d0: 24 65 6e 74 74 79 70 65 73 5f 6c 69 73 74 20 7b  $enttypes_list {
30e0: 0a 09 09 09 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d  ....unset -nocom
30f0: 70 6c 61 69 6e 20 65 6e 74 69 74 79 0a 09 09 09  plain entity....
3100: 6c 61 70 70 65 6e 64 20 65 6e 74 69 74 79 20 65  lappend entity e
3110: 6e 74 69 74 79 20 70 61 63 6b 61 67 65 0a 0a 09  ntity package...
3120: 09 09 66 6f 72 65 61 63 68 20 65 6e 74 74 79 70  ..foreach enttyp
3130: 65 20 24 65 6e 74 74 79 70 65 73 20 7b 0a 09 09  e $enttypes {...
3140: 09 09 73 65 74 20 65 6e 74 76 61 6c 20 5b 6c 69  ..set entval [li
3150: 6e 64 65 78 20 24 70 6b 67 64 61 74 61 20 24 66  ndex $pkgdata $f
3160: 69 65 6c 64 6e 61 6d 65 5f 74 6f 5f 69 64 78 28  ieldname_to_idx(
3170: 24 65 6e 74 74 79 70 65 29 5d 0a 09 09 09 09 6c  $enttype)].....l
3180: 61 70 70 65 6e 64 20 65 6e 74 69 74 79 20 24 65  append entity $e
3190: 6e 74 74 79 70 65 0a 09 09 09 09 6c 61 70 70 65  nttype.....lappe
31a0: 6e 64 20 65 6e 74 69 74 79 20 24 65 6e 74 76 61  nd entity $entva
31b0: 6c 0a 0a 09 09 09 09 69 66 20 7b 5b 6c 73 65 61  l......if {[lsea
31c0: 72 63 68 20 2d 65 78 61 63 74 20 24 73 65 65 6e  rch -exact $seen
31d0: 5f 65 6e 74 69 74 69 65 73 20 24 65 6e 74 69 74  _entities $entit
31e0: 79 5d 20 21 3d 20 2d 31 7d 20 7b 0a 09 09 09 09  y] != -1} {.....
31f0: 09 63 6f 6e 74 69 6e 75 65 0a 09 09 09 09 7d 0a  .continue.....}.
3200: 09 09 09 09 6c 61 70 70 65 6e 64 20 73 65 65 6e  ....lappend seen
3210: 5f 65 6e 74 69 74 69 65 73 20 24 65 6e 74 69 74  _entities $entit
3220: 79 0a 0a 09 09 09 09 63 72 65 61 74 65 5f 65 6e  y......create_en
3230: 74 69 74 79 5f 66 69 6c 65 20 24 65 6e 74 69 74  tity_file $entit
3240: 79 20 24 64 73 74 64 69 72 20 24 70 6b 67 69 6e  y $dstdir $pkgin
3250: 66 6f 5f 61 72 72 6c 69 73 74 0a 09 09 09 7d 0a  fo_arrlist....}.
3260: 09 09 7d 0a 09 7d 0a 7d 0a 0a 73 65 74 20 70 6b  ..}..}.}..set pk
3270: 67 69 6e 66 6f 20 5b 74 65 61 70 6f 74 5f 69 6e  ginfo [teapot_in
3280: 64 65 78 20 24 73 72 63 64 69 72 5d 0a 63 72 65  dex $srcdir].cre
3290: 61 74 65 5f 6f 75 74 70 75 74 5f 69 6e 64 65 78  ate_output_index
32a0: 20 24 64 73 74 64 69 72 20 24 70 6b 67 69 6e 66   $dstdir $pkginf
32b0: 6f 0a 63 72 65 61 74 65 5f 6f 75 74 70 75 74 5f  o.create_output_
32c0: 70 6b 67 6c 69 73 74 20 24 64 73 74 64 69 72 20  pkglist $dstdir 
32d0: 24 70 6b 67 69 6e 66 6f 0a 63 72 65 61 74 65 5f  $pkginfo.create_
32e0: 6f 75 74 70 75 74 5f 66 69 6c 65 73 20 24 64 73  output_files $ds
32f0: 74 64 69 72 20 24 70 6b 67 69 6e 66 6f 0a 63 72  tdir $pkginfo.cr
3300: 65 61 74 65 5f 61 6c 6c 5f 65 6e 74 69 74 79 5f  eate_all_entity_
3310: 66 69 6c 65 73 20 24 64 73 74 64 69 72 20 24 70  files $dstdir $p
3320: 6b 67 69 6e 66 6f 0a                             kginfo.