Hex Artifact Content

Artifact 32a86c72c63360849296c1599331e80a655dbec1:


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 2f 5c 22 3e 24 69 74 65  $entpath/\">$ite
1040: 6d 3c 2f 61 3e 3c 2f 74 64 3e 5c 6e 22 0a 09 09  m</a></td>\n"...
1050: 7d 0a 0a 09 09 61 70 70 65 6e 64 20 72 65 74 20  }....append ret 
1060: 22 20 20 20 20 20 20 3c 2f 74 72 3e 5c 6e 22 0a  "      </tr>\n".
1070: 09 7d 0a 0a 09 72 65 74 75 72 6e 20 5b 73 74 72  .}...return [str
1080: 69 6e 67 20 72 61 6e 67 65 20 24 72 65 74 20 30  ing range $ret 0
1090: 20 65 6e 64 2d 31 5d 0a 7d 0a 0a 23 20 43 72 65   end-1].}..# Cre
10a0: 61 74 65 20 22 69 6e 64 65 78 2e 68 74 6d 6c 22  ate "index.html"
10b0: 0a 70 72 6f 63 20 63 72 65 61 74 65 5f 6f 75 74  .proc create_out
10c0: 70 75 74 5f 69 6e 64 65 78 20 7b 64 73 74 64 69  put_index {dstdi
10d0: 72 20 70 6b 67 69 6e 66 6f 5f 61 72 72 6c 69 73  r pkginfo_arrlis
10e0: 74 7d 20 7b 0a 09 61 72 72 61 79 20 73 65 74 20  t} {..array set 
10f0: 70 6b 67 69 6e 66 6f 20 24 70 6b 67 69 6e 66 6f  pkginfo $pkginfo
1100: 5f 61 72 72 6c 69 73 74 0a 0a 09 73 65 74 20 69  _arrlist...set i
1110: 6e 64 65 78 66 69 6c 65 20 5b 66 69 6c 65 20 6a  ndexfile [file j
1120: 6f 69 6e 20 24 64 73 74 64 69 72 20 69 6e 64 65  oin $dstdir inde
1130: 78 2e 68 74 6d 6c 5d 0a 09 73 65 74 20 61 6c 74  x.html]..set alt
1140: 69 6e 64 65 78 66 69 6c 65 20 5b 66 69 6c 65 20  indexfile [file 
1150: 6a 6f 69 6e 20 24 64 73 74 64 69 72 20 65 6e 74  join $dstdir ent
1160: 69 74 79 20 69 6e 64 65 78 2e 68 74 6d 6c 5d 0a  ity index.html].
1170: 0a 09 73 65 74 20 70 6b 67 6c 69 73 74 20 5b 6c  ..set pkglist [l
1180: 69 73 74 5d 0a 09 66 6f 72 65 61 63 68 20 65 6e  ist]..foreach en
1190: 74 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 70  t [array names p
11a0: 6b 67 69 6e 66 6f 5d 20 7b 0a 09 09 73 65 74 20  kginfo] {...set 
11b0: 70 6b 67 20 5b 6c 69 6e 64 65 78 20 24 65 6e 74  pkg [lindex $ent
11c0: 20 30 5d 0a 09 09 73 65 74 20 61 64 64 65 6e 74   0]...set addent
11d0: 20 5b 6c 69 73 74 20 5b 6c 69 73 74 20 6e 61 6d   [list [list nam
11e0: 65 20 24 70 6b 67 5d 5d 0a 09 09 69 66 20 7b 5b  e $pkg]]...if {[
11f0: 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24  lsearch -exact $
1200: 70 6b 67 6c 69 73 74 20 24 61 64 64 65 6e 74 5d  pkglist $addent]
1210: 20 21 3d 20 2d 31 7d 20 7b 0a 09 09 09 63 6f 6e   != -1} {....con
1220: 74 69 6e 75 65 0a 09 09 7d 0a 0a 09 09 6c 61 70  tinue...}....lap
1230: 70 65 6e 64 20 70 6b 67 6c 69 73 74 20 24 61 64  pend pkglist $ad
1240: 64 65 6e 74 0a 09 7d 0a 0a 09 73 65 74 20 70 6b  dent..}...set pk
1250: 67 6c 69 73 74 20 5b 6c 73 6f 72 74 20 2d 64 69  glist [lsort -di
1260: 63 74 69 6f 6e 61 72 79 20 24 70 6b 67 6c 69 73  ctionary $pkglis
1270: 74 5d 0a 0a 09 66 69 6c 65 20 6d 6b 64 69 72 20  t]...file mkdir 
1280: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 69  [file dirname $i
1290: 6e 64 65 78 66 69 6c 65 5d 0a 09 73 65 74 20 66  ndexfile]..set f
12a0: 64 20 5b 6f 70 65 6e 20 24 69 6e 64 65 78 66 69  d [open $indexfi
12b0: 6c 65 20 77 5d 0a 09 70 75 74 73 20 24 66 64 20  le w]..puts $fd 
12c0: 22 3c 68 74 6d 6c 3e 22 0a 09 70 75 74 73 20 24  "<html>"..puts $
12d0: 66 64 20 22 20 20 3c 68 65 61 64 3e 22 0a 09 70  fd "  <head>"..p
12e0: 75 74 73 20 24 66 64 20 22 20 20 20 20 3c 74 69  uts $fd "    <ti
12f0: 74 6c 65 3e 4c 69 73 74 20 6f 66 20 61 6c 6c 20  tle>List of all 
1300: 65 6e 74 69 74 69 65 73 3c 2f 74 69 74 6c 65 3e  entities</title>
1310: 22 0a 09 70 75 74 73 20 24 66 64 20 22 20 20 3c  "..puts $fd "  <
1320: 2f 68 65 61 64 3e 22 0a 09 70 75 74 73 20 24 66  /head>"..puts $f
1330: 64 20 22 20 20 3c 62 6f 64 79 3e 22 0a 09 70 75  d "  <body>"..pu
1340: 74 73 20 24 66 64 20 5b 67 65 6e 65 72 61 74 65  ts $fd [generate
1350: 5f 74 70 6d 20 24 70 6b 67 6c 69 73 74 5d 0a 09  _tpm $pkglist]..
1360: 70 75 74 73 20 24 66 64 20 22 20 20 20 20 3c 68  puts $fd "    <h
1370: 31 3e 4c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e  1>List of all en
1380: 74 69 74 69 65 73 3c 2f 68 31 3e 22 0a 09 70 75  tities</h1>"..pu
1390: 74 73 20 24 66 64 20 22 20 20 20 20 3c 74 61 62  ts $fd "    <tab
13a0: 6c 65 3e 22 0a 09 70 75 74 73 20 24 66 64 20 5b  le>"..puts $fd [
13b0: 67 65 6e 65 72 61 74 65 5f 74 61 62 6c 65 20 24  generate_table $
13c0: 70 6b 67 6c 69 73 74 20 31 5d 0a 09 70 75 74 73  pkglist 1]..puts
13d0: 20 24 66 64 20 22 20 20 20 20 3c 2f 74 61 62 6c   $fd "    </tabl
13e0: 65 3e 22 0a 09 70 75 74 73 20 24 66 64 20 22 20  e>"..puts $fd " 
13f0: 20 3c 2f 62 6f 64 79 3e 22 0a 09 70 75 74 73 20   </body>"..puts 
1400: 24 66 64 20 22 3c 2f 68 74 6d 6c 3e 22 0a 09 63  $fd "</html>"..c
1410: 6c 6f 73 65 20 24 66 64 0a 0a 09 66 69 6c 65 20  lose $fd...file 
1420: 6d 6b 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e  mkdir [file dirn
1430: 61 6d 65 20 24 61 6c 74 69 6e 64 65 78 66 69 6c  ame $altindexfil
1440: 65 5d 0a 09 66 69 6c 65 20 64 65 6c 65 74 65 20  e]..file delete 
1450: 2d 66 6f 72 63 65 20 2d 2d 20 24 61 6c 74 69 6e  -force -- $altin
1460: 64 65 78 66 69 6c 65 0a 09 66 69 6c 65 20 6c 69  dexfile..file li
1470: 6e 6b 20 2d 68 61 72 64 20 24 61 6c 74 69 6e 64  nk -hard $altind
1480: 65 78 66 69 6c 65 20 24 69 6e 64 65 78 66 69 6c  exfile $indexfil
1490: 65 0a 7d 0a 0a 23 20 43 72 65 61 74 65 20 22 70  e.}..# Create "p
14a0: 61 63 6b 61 67 65 2f 6c 69 73 74 22 0a 70 72 6f  ackage/list".pro
14b0: 63 20 63 72 65 61 74 65 5f 6f 75 74 70 75 74 5f  c create_output_
14c0: 70 6b 67 6c 69 73 74 20 7b 64 73 74 64 69 72 20  pkglist {dstdir 
14d0: 70 6b 67 69 6e 66 6f 5f 61 72 72 6c 69 73 74 7d  pkginfo_arrlist}
14e0: 20 7b 0a 09 61 72 72 61 79 20 73 65 74 20 70 6b   {..array set pk
14f0: 67 69 6e 66 6f 20 24 70 6b 67 69 6e 66 6f 5f 61  ginfo $pkginfo_a
1500: 72 72 6c 69 73 74 0a 0a 09 73 65 74 20 70 6b 67  rrlist...set pkg
1510: 64 69 72 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  dir [file join $
1520: 64 73 74 64 69 72 20 70 61 63 6b 61 67 65 5d 0a  dstdir package].
1530: 09 63 61 74 63 68 20 7b 0a 09 09 66 69 6c 65 20  .catch {...file 
1540: 6d 6b 64 69 72 20 24 70 6b 67 64 69 72 0a 09 7d  mkdir $pkgdir..}
1550: 0a 09 73 65 74 20 69 6e 64 65 78 66 69 6c 65 20  ..set indexfile 
1560: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 6b 67 64  [file join $pkgd
1570: 69 72 20 6c 69 73 74 2e 68 74 6d 6c 5d 0a 09 73  ir list.html]..s
1580: 65 74 20 61 6c 74 69 6e 64 65 78 66 69 6c 65 20  et altindexfile 
1590: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 6b 67 64  [file join $pkgd
15a0: 69 72 20 6c 69 73 74 5d 0a 0a 09 73 65 74 20 70  ir list]...set p
15b0: 6b 67 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 09 66  kglist [list]..f
15c0: 6f 72 65 61 63 68 20 65 6e 74 20 5b 61 72 72 61  oreach ent [arra
15d0: 79 20 6e 61 6d 65 73 20 70 6b 67 69 6e 66 6f 5d  y names pkginfo]
15e0: 20 7b 0a 09 09 73 65 74 20 70 6b 67 20 5b 6c 69   {...set pkg [li
15f0: 6e 64 65 78 20 24 65 6e 74 20 30 5d 0a 09 09 73  ndex $ent 0]...s
1600: 65 74 20 76 65 72 20 5b 6c 69 6e 64 65 78 20 24  et ver [lindex $
1610: 65 6e 74 20 31 5d 0a 09 09 73 65 74 20 61 72 63  ent 1]...set arc
1620: 68 20 5b 6c 69 6e 64 65 78 20 24 65 6e 74 20 32  h [lindex $ent 2
1630: 5d 0a 0a 09 09 6c 61 70 70 65 6e 64 20 70 6b 67  ]....lappend pkg
1640: 6c 69 73 74 20 5b 6c 69 73 74 20 5b 6c 69 73 74  list [list [list
1650: 20 65 6e 74 69 74 79 20 70 61 63 6b 61 67 65 5d   entity package]
1660: 20 5b 6c 69 73 74 20 6e 61 6d 65 20 24 70 6b 67   [list name $pkg
1670: 5d 20 5b 6c 69 73 74 20 76 65 72 20 24 76 65 72  ] [list ver $ver
1680: 5d 20 5b 6c 69 73 74 20 61 72 63 68 20 24 61 72  ] [list arch $ar
1690: 63 68 5d 20 5b 6c 69 73 74 20 75 6e 6b 6e 6f 77  ch] [list unknow
16a0: 6e 20 30 5d 5d 0a 09 7d 0a 0a 09 73 65 74 20 70  n 0]]..}...set p
16b0: 6b 67 6c 69 73 74 20 5b 6c 73 6f 72 74 20 2d 64  kglist [lsort -d
16c0: 69 63 74 69 6f 6e 61 72 79 20 24 70 6b 67 6c 69  ictionary $pkgli
16d0: 73 74 5d 0a 0a 09 73 65 74 20 66 64 20 5b 6f 70  st]...set fd [op
16e0: 65 6e 20 24 69 6e 64 65 78 66 69 6c 65 20 77 5d  en $indexfile w]
16f0: 0a 09 70 75 74 73 20 24 66 64 20 22 3c 68 74 6d  ..puts $fd "<htm
1700: 6c 3e 22 0a 09 70 75 74 73 20 24 66 64 20 22 20  l>"..puts $fd " 
1710: 20 3c 68 65 61 64 3e 22 0a 09 70 75 74 73 20 24   <head>"..puts $
1720: 66 64 20 22 20 20 20 20 3c 74 69 74 6c 65 3e 4c  fd "    <title>L
1730: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 63 6b 61  ist of all packa
1740: 67 65 73 3c 2f 74 69 74 6c 65 3e 22 0a 09 70 75  ges</title>"..pu
1750: 74 73 20 24 66 64 20 22 20 20 3c 2f 68 65 61 64  ts $fd "  </head
1760: 3e 22 0a 09 70 75 74 73 20 24 66 64 20 22 20 20  >"..puts $fd "  
1770: 3c 62 6f 64 79 3e 22 0a 09 70 75 74 73 20 24 66  <body>"..puts $f
1780: 64 20 5b 67 65 6e 65 72 61 74 65 5f 74 70 6d 20  d [generate_tpm 
1790: 24 70 6b 67 6c 69 73 74 5d 0a 09 70 75 74 73 20  $pkglist]..puts 
17a0: 24 66 64 20 22 20 20 20 20 3c 68 31 3e 4c 69 73  $fd "    <h1>Lis
17b0: 74 20 6f 66 20 61 6c 6c 20 70 61 63 6b 61 67 65  t of all package
17c0: 73 3c 2f 68 31 3e 22 0a 09 70 75 74 73 20 24 66  s</h1>"..puts $f
17d0: 64 20 22 20 20 20 20 3c 74 61 62 6c 65 3e 22 0a  d "    <table>".
17e0: 09 70 75 74 73 20 24 66 64 20 22 20 20 20 20 20  .puts $fd "     
17f0: 20 3c 74 72 3e 22 0a 09 70 75 74 73 20 24 66 64   <tr>"..puts $fd
1800: 20 22 20 20 20 20 20 20 20 20 3c 74 68 3e 57 68   "        <th>Wh
1810: 61 74 3c 2f 74 68 3e 22 0a 09 70 75 74 73 20 24  at</th>"..puts $
1820: 66 64 20 22 20 20 20 20 20 20 20 20 3c 74 68 3e  fd "        <th>
1830: 4e 61 6d 65 3c 2f 74 68 3e 22 0a 09 70 75 74 73  Name</th>"..puts
1840: 20 24 66 64 20 22 20 20 20 20 20 20 20 20 3c 74   $fd "        <t
1850: 68 3e 56 65 72 73 69 6f 6e 3c 2f 74 68 3e 22 0a  h>Version</th>".
1860: 09 70 75 74 73 20 24 66 64 20 22 20 20 20 20 20  .puts $fd "     
1870: 20 20 20 3c 74 68 3e 50 6c 61 74 66 6f 72 6d 3c     <th>Platform<
1880: 2f 74 68 3e 22 0a 09 70 75 74 73 20 24 66 64 20  /th>"..puts $fd 
1890: 22 20 20 20 20 20 20 3c 2f 74 72 3e 22 0a 09 70  "      </tr>"..p
18a0: 75 74 73 20 24 66 64 20 5b 67 65 6e 65 72 61 74  uts $fd [generat
18b0: 65 5f 74 61 62 6c 65 20 24 70 6b 67 6c 69 73 74  e_table $pkglist
18c0: 20 34 5d 0a 09 70 75 74 73 20 24 66 64 20 22 20   4]..puts $fd " 
18d0: 20 20 20 3c 2f 74 61 62 6c 65 3e 22 0a 09 70 75     </table>"..pu
18e0: 74 73 20 24 66 64 20 22 20 20 3c 2f 62 6f 64 79  ts $fd "  </body
18f0: 3e 22 0a 09 70 75 74 73 20 24 66 64 20 22 3c 2f  >"..puts $fd "</
1900: 68 74 6d 6c 3e 22 0a 09 63 6c 6f 73 65 20 24 66  html>"..close $f
1910: 64 0a 0a 09 66 69 6c 65 20 64 65 6c 65 74 65 20  d...file delete 
1920: 2d 2d 20 24 61 6c 74 69 6e 64 65 78 66 69 6c 65  -- $altindexfile
1930: 0a 09 66 69 6c 65 20 6c 69 6e 6b 20 2d 68 61 72  ..file link -har
1940: 64 20 24 61 6c 74 69 6e 64 65 78 66 69 6c 65 20  d $altindexfile 
1950: 24 69 6e 64 65 78 66 69 6c 65 0a 7d 0a 0a 23 20  $indexfile.}..# 
1960: 43 72 65 61 74 65 20 22 70 61 63 6b 61 67 65 2f  Create "package/
1970: 6e 61 6d 65 2f 3c 70 6b 67 3e 2f 76 65 72 2f 3c  name/<pkg>/ver/<
1980: 76 65 72 3e 2f 61 72 63 68 2f 3c 61 72 63 68 3e  ver>/arch/<arch>
1990: 2f 66 69 6c 65 22 0a 70 72 6f 63 20 63 72 65 61  /file".proc crea
19a0: 74 65 5f 6f 75 74 70 75 74 5f 66 69 6c 65 73 20  te_output_files 
19b0: 7b 64 73 74 64 69 72 20 70 6b 67 69 6e 66 6f 5f  {dstdir pkginfo_
19c0: 61 72 72 6c 69 73 74 20 7b 66 6f 72 63 65 20 30  arrlist {force 0
19d0: 7d 7d 20 7b 0a 09 61 72 72 61 79 20 73 65 74 20  }} {..array set 
19e0: 70 6b 67 69 6e 66 6f 20 24 70 6b 67 69 6e 66 6f  pkginfo $pkginfo
19f0: 5f 61 72 72 6c 69 73 74 0a 0a 09 66 6f 72 65 61  _arrlist...forea
1a00: 63 68 20 65 6e 74 20 5b 61 72 72 61 79 20 6e 61  ch ent [array na
1a10: 6d 65 73 20 70 6b 67 69 6e 66 6f 5d 20 7b 0a 09  mes pkginfo] {..
1a20: 09 73 65 74 20 70 6b 67 20 5b 6c 69 6e 64 65 78  .set pkg [lindex
1a30: 20 24 65 6e 74 20 30 5d 0a 09 09 73 65 74 20 76   $ent 0]...set v
1a40: 65 72 20 5b 6c 69 6e 64 65 78 20 24 65 6e 74 20  er [lindex $ent 
1a50: 31 5d 0a 09 09 73 65 74 20 61 72 63 68 20 5b 6c  1]...set arch [l
1a60: 69 6e 64 65 78 20 24 65 6e 74 20 32 5d 0a 0a 09  index $ent 2]...
1a70: 09 61 72 72 61 79 20 73 65 74 20 63 75 72 72 70  .array set currp
1a80: 6b 67 69 6e 66 6f 20 24 70 6b 67 69 6e 66 6f 28  kginfo $pkginfo(
1a90: 24 65 6e 74 29 0a 09 09 73 65 74 20 70 6b 67 64  $ent)...set pkgd
1aa0: 69 72 20 24 63 75 72 72 70 6b 67 69 6e 66 6f 28  ir $currpkginfo(
1ab0: 70 6b 67 64 69 72 29 0a 09 09 73 65 74 20 6d 75  pkgdir)...set mu
1ac0: 6c 74 69 66 69 6c 65 20 24 63 75 72 72 70 6b 67  ltifile $currpkg
1ad0: 69 6e 66 6f 28 6d 75 6c 74 69 66 69 6c 65 29 0a  info(multifile).
1ae0: 09 09 73 65 74 20 65 78 74 66 69 6c 65 74 61 69  ..set extfiletai
1af0: 6c 20 24 63 75 72 72 70 6b 67 69 6e 66 6f 28 65  l $currpkginfo(e
1b00: 78 74 66 69 6c 65 29 0a 0a 09 09 73 65 74 20 77  xtfile)....set w
1b10: 6f 72 6b 64 69 72 20 5b 66 69 6c 65 20 6a 6f 69  orkdir [file joi
1b20: 6e 20 24 64 73 74 64 69 72 20 70 61 63 6b 61 67  n $dstdir packag
1b30: 65 20 6e 61 6d 65 20 24 70 6b 67 20 76 65 72 20  e name $pkg ver 
1b40: 24 76 65 72 20 61 72 63 68 20 24 61 72 63 68 5d  $ver arch $arch]
1b50: 0a 09 09 73 65 74 20 72 65 67 66 69 6c 65 20 5b  ...set regfile [
1b60: 66 69 6c 65 20 6a 6f 69 6e 20 24 77 6f 72 6b 64  file join $workd
1b70: 69 72 20 66 69 6c 65 5d 0a 09 09 73 65 74 20 65  ir file]...set e
1b80: 78 74 66 69 6c 65 20 5b 66 69 6c 65 20 6a 6f 69  xtfile [file joi
1b90: 6e 20 24 77 6f 72 6b 64 69 72 20 24 65 78 74 66  n $workdir $extf
1ba0: 69 6c 65 74 61 69 6c 5d 0a 0a 09 09 69 66 20 7b  iletail]....if {
1bb0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 65 78  [file exists $ex
1bc0: 74 66 69 6c 65 5d 20 26 26 20 21 24 66 6f 72 63  tfile] && !$forc
1bd0: 65 7d 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65  e} {....continue
1be0: 0a 09 09 7d 0a 0a 09 09 63 61 74 63 68 20 7b 0a  ...}....catch {.
1bf0: 09 09 09 66 69 6c 65 20 6d 6b 64 69 72 20 24 77  ...file mkdir $w
1c00: 6f 72 6b 64 69 72 0a 09 09 7d 0a 0a 09 09 69 66  orkdir...}....if
1c10: 20 7b 24 6d 75 6c 74 69 66 69 6c 65 7d 20 7b 0a   {$multifile} {.
1c20: 09 09 09 69 66 20 7b 5b 63 61 74 63 68 20 7b 0a  ...if {[catch {.
1c30: 09 09 09 09 63 64 20 24 70 6b 67 64 69 72 0a 0a  ....cd $pkgdir..
1c40: 09 09 09 09 66 69 6c 65 20 64 65 6c 65 74 65 20  ....file delete 
1c50: 2d 2d 20 24 65 78 74 66 69 6c 65 0a 09 09 09 09  -- $extfile.....
1c60: 65 78 65 63 20 7a 69 70 20 2d 72 20 24 65 78 74  exec zip -r $ext
1c70: 66 69 6c 65 20 2e 20 2d 78 20 62 75 69 6c 64 2e  file . -x build.
1c80: 6c 6f 67 0a 09 09 09 7d 20 65 72 72 5d 7d 20 7b  log....} err]} {
1c90: 0a 09 09 09 09 70 75 74 73 20 22 45 72 72 6f 72  .....puts "Error
1ca0: 20 77 68 69 6c 65 20 7a 69 70 70 69 6e 67 3a 20   while zipping: 
1cb0: 24 65 72 72 22 0a 09 09 09 7d 0a 09 09 7d 20 65  $err"....}...} e
1cc0: 6c 73 65 20 7b 0a 09 09 09 73 65 74 20 6f 72 69  lse {....set ori
1cd0: 67 66 69 6c 65 20 5b 6c 69 6e 64 65 78 20 5b 67  gfile [lindex [g
1ce0: 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  lob -nocomplain 
1cf0: 2d 64 69 72 65 63 74 6f 72 79 20 24 70 6b 67 64  -directory $pkgd
1d00: 69 72 20 2a 5d 20 30 5d 0a 0a 09 09 09 66 69 6c  ir *] 0].....fil
1d10: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 2d 2d  e copy -force --
1d20: 20 24 6f 72 69 67 66 69 6c 65 20 24 65 78 74 66   $origfile $extf
1d30: 69 6c 65 0a 09 09 7d 0a 0a 09 09 66 69 6c 65 20  ile...}....file 
1d40: 64 65 6c 65 74 65 20 2d 2d 20 24 72 65 67 66 69  delete -- $regfi
1d50: 6c 65 0a 09 09 66 69 6c 65 20 6c 69 6e 6b 20 2d  le...file link -
1d60: 68 61 72 64 20 24 72 65 67 66 69 6c 65 20 24 65  hard $regfile $e
1d70: 78 74 66 69 6c 65 0a 09 09 66 69 6c 65 20 61 74  xtfile...file at
1d80: 74 72 69 62 75 74 65 73 20 24 72 65 67 66 69 6c  tributes $regfil
1d90: 65 20 2d 70 65 72 6d 69 73 73 69 6f 6e 73 20 2d  e -permissions -
1da0: 78 0a 09 09 66 69 6c 65 20 61 74 74 72 69 62 75  x...file attribu
1db0: 74 65 73 20 24 65 78 74 66 69 6c 65 20 2d 70 65  tes $extfile -pe
1dc0: 72 6d 69 73 73 69 6f 6e 73 20 2d 78 0a 09 7d 0a  rmissions -x..}.
1dd0: 7d 0a 0a 70 72 6f 63 20 63 72 65 61 74 65 5f 65  }..proc create_e
1de0: 6e 74 69 74 79 5f 66 69 6c 65 20 7b 65 6e 74 69  ntity_file {enti
1df0: 74 79 20 64 73 74 64 69 72 20 70 6b 67 69 6e 66  ty dstdir pkginf
1e00: 6f 5f 61 72 72 6c 69 73 74 7d 20 7b 0a 09 61 72  o_arrlist} {..ar
1e10: 72 61 79 20 73 65 74 20 70 6b 67 69 6e 66 6f 20  ray set pkginfo 
1e20: 24 70 6b 67 69 6e 66 6f 5f 61 72 72 6c 69 73 74  $pkginfo_arrlist
1e30: 0a 09 61 72 72 61 79 20 73 65 74 20 65 6e 74 69  ..array set enti
1e40: 6e 66 6f 20 24 65 6e 74 69 74 79 0a 0a 09 69 66  nfo $entity...if
1e50: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1e60: 65 6e 74 69 6e 66 6f 28 65 6e 74 69 74 79 29 5d  entinfo(entity)]
1e70: 7d 20 7b 0a 09 09 72 65 74 75 72 6e 0a 09 7d 0a  } {...return..}.
1e80: 0a 09 73 65 74 20 65 6e 74 69 74 79 5f 74 79 70  ..set entity_typ
1e90: 65 20 24 65 6e 74 69 6e 66 6f 28 65 6e 74 69 74  e $entinfo(entit
1ea0: 79 29 0a 09 73 65 74 20 72 65 71 5f 66 69 65 6c  y)..set req_fiel
1eb0: 64 73 20 24 3a 3a 65 6e 74 69 74 79 5f 64 65 66  ds $::entity_def
1ec0: 69 6e 69 74 69 6f 6e 28 24 65 6e 74 69 74 79 5f  inition($entity_
1ed0: 74 79 70 65 29 0a 0a 09 73 65 74 20 63 6f 6d 70  type)...set comp
1ee0: 6c 65 74 65 20 31 0a 09 73 65 74 20 70 6b 67 70  lete 1..set pkgp
1ef0: 61 74 20 5b 6c 69 73 74 5d 0a 09 73 65 74 20 64  at [list]..set d
1f00: 69 73 70 66 69 65 6c 64 73 20 5b 6c 69 73 74 5d  ispfields [list]
1f10: 0a 09 66 6f 72 65 61 63 68 20 72 65 71 5f 66 69  ..foreach req_fi
1f20: 65 6c 64 20 24 72 65 71 5f 66 69 65 6c 64 73 20  eld $req_fields 
1f30: 7b 0a 09 09 69 66 20 7b 21 5b 69 6e 66 6f 20 65  {...if {![info e
1f40: 78 69 73 74 73 20 65 6e 74 69 6e 66 6f 28 24 72  xists entinfo($r
1f50: 65 71 5f 66 69 65 6c 64 29 5d 7d 20 7b 0a 09 09  eq_field)]} {...
1f60: 09 73 65 74 20 63 6f 6d 70 6c 65 74 65 20 30 0a  .set complete 0.
1f70: 0a 09 09 09 6c 61 70 70 65 6e 64 20 70 6b 67 70  ....lappend pkgp
1f80: 61 74 20 22 2a 22 0a 09 09 09 09 69 66 20 7b 21  at "*".....if {!
1f90: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 70 6b 67  [info exists pkg
1fa0: 6e 65 78 74 6c 65 76 65 6c 5d 7d 20 7b 0a 09 09  nextlevel]} {...
1fb0: 09 09 73 65 74 20 70 6b 67 6e 65 78 74 6c 65 76  ..set pkgnextlev
1fc0: 65 6c 20 24 72 65 71 5f 66 69 65 6c 64 0a 09 09  el $req_field...
1fd0: 09 09 6c 61 70 70 65 6e 64 20 64 69 73 70 66 69  ..lappend dispfi
1fe0: 65 6c 64 73 20 24 72 65 71 5f 66 69 65 6c 64 0a  elds $req_field.
1ff0: 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
2000: 09 09 09 6c 61 70 70 65 6e 64 20 70 6b 67 70 61  ...lappend pkgpa
2010: 74 20 24 65 6e 74 69 6e 66 6f 28 24 72 65 71 5f  t $entinfo($req_
2020: 66 69 65 6c 64 29 0a 09 09 09 6c 61 70 70 65 6e  field)....lappen
2030: 64 20 64 69 73 70 66 69 65 6c 64 73 20 24 72 65  d dispfields $re
2040: 71 5f 66 69 65 6c 64 0a 09 09 7d 0a 09 7d 0a 0a  q_field...}..}..
2050: 09 69 66 20 7b 24 63 6f 6d 70 6c 65 74 65 7d 20  .if {$complete} 
2060: 7b 0a 09 09 73 65 74 20 65 6e 74 70 61 74 68 5f  {...set entpath_
2070: 70 61 72 74 73 20 5b 6c 69 73 74 20 24 65 6e 74  parts [list $ent
2080: 69 74 79 5f 74 79 70 65 5d 0a 0a 09 09 66 6f 72  ity_type]....for
2090: 65 61 63 68 20 72 65 71 5f 66 69 65 6c 64 20 24  each req_field $
20a0: 72 65 71 5f 66 69 65 6c 64 73 20 7b 0a 09 09 09  req_fields {....
20b0: 6c 61 70 70 65 6e 64 20 65 6e 74 70 61 74 68 5f  lappend entpath_
20c0: 70 61 72 74 73 20 24 72 65 71 5f 66 69 65 6c 64  parts $req_field
20d0: 20 24 65 6e 74 69 6e 66 6f 28 24 72 65 71 5f 66   $entinfo($req_f
20e0: 69 65 6c 64 29 0a 09 09 7d 0a 09 7d 20 65 6c 73  ield)...}..} els
20f0: 65 20 7b 0a 09 09 73 65 74 20 65 6e 74 70 61 74  e {...set entpat
2100: 68 5f 70 61 72 74 73 20 5b 6c 69 73 74 20 65 6e  h_parts [list en
2110: 74 69 74 79 5d 0a 0a 09 09 66 6f 72 65 61 63 68  tity]....foreach
2120: 20 72 65 71 5f 66 69 65 6c 64 20 24 72 65 71 5f   req_field $req_
2130: 66 69 65 6c 64 73 20 7b 0a 09 09 09 69 66 20 7b  fields {....if {
2140: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 65 6e 74  [info exists ent
2150: 69 6e 66 6f 28 24 72 65 71 5f 66 69 65 6c 64 29  info($req_field)
2160: 5d 7d 20 7b 0a 09 09 09 09 6c 61 70 70 65 6e 64  ]} {.....lappend
2170: 20 65 6e 74 70 61 74 68 5f 70 61 72 74 73 20 24   entpath_parts $
2180: 72 65 71 5f 66 69 65 6c 64 20 24 65 6e 74 69 6e  req_field $entin
2190: 66 6f 28 24 72 65 71 5f 66 69 65 6c 64 29 0a 09  fo($req_field)..
21a0: 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 73 65 74  ..}...}..}...set
21b0: 20 65 6e 74 70 61 74 68 20 5b 6a 6f 69 6e 20 24   entpath [join $
21c0: 65 6e 74 70 61 74 68 5f 70 61 72 74 73 20 2f 5d  entpath_parts /]
21d0: 0a 0a 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d  ...if {[string m
21e0: 61 74 63 68 20 22 2f 2a 22 20 24 65 6e 74 70 61  atch "/*" $entpa
21f0: 74 68 5d 7d 20 7b 0a 09 09 72 65 74 75 72 6e 0a  th]} {...return.
2200: 09 7d 0a 0a 09 73 65 74 20 69 6e 64 65 78 66 69  .}...set indexfi
2210: 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  le [file join $d
2220: 73 74 64 69 72 20 24 65 6e 74 70 61 74 68 20 69  stdir $entpath i
2230: 6e 64 65 78 2e 68 74 6d 6c 5d 0a 09 73 65 74 20  ndex.html]..set 
2240: 74 6d 70 69 6e 64 65 78 66 69 6c 65 20 5b 66 69  tmpindexfile [fi
2250: 6c 65 20 6a 6f 69 6e 20 24 64 73 74 64 69 72 20  le join $dstdir 
2260: 24 65 6e 74 70 61 74 68 20 69 6e 64 65 78 2e 68  $entpath index.h
2270: 74 6d 6c 2e 74 6d 70 5d 0a 0a 09 63 61 74 63 68  tml.tmp]...catch
2280: 20 7b 0a 09 09 66 69 6c 65 20 6d 6b 64 69 72 20   {...file mkdir 
2290: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 69  [file dirname $i
22a0: 6e 64 65 78 66 69 6c 65 5d 0a 09 7d 0a 0a 09 73  ndexfile]..}...s
22b0: 65 74 20 66 64 20 5b 6f 70 65 6e 20 24 74 6d 70  et fd [open $tmp
22c0: 69 6e 64 65 78 66 69 6c 65 20 77 5d 0a 0a 09 70  indexfile w]...p
22d0: 75 74 73 20 24 66 64 20 22 3c 68 74 6d 6c 3e 22  uts $fd "<html>"
22e0: 0a 09 70 75 74 73 20 24 66 64 20 22 20 20 3c 68  ..puts $fd "  <h
22f0: 65 61 64 3e 22 0a 09 70 75 74 73 20 24 66 64 20  ead>"..puts $fd 
2300: 22 20 20 20 20 3c 74 69 74 6c 65 3e 22 0a 09 70  "    <title>"..p
2310: 75 74 73 20 24 66 64 20 22 20 20 20 20 3c 2f 74  uts $fd "    </t
2320: 69 74 6c 65 3e 22 0a 09 70 75 74 73 20 24 66 64  itle>"..puts $fd
2330: 20 22 20 20 3c 2f 68 65 61 64 3e 22 0a 09 70 75   "  </head>"..pu
2340: 74 73 20 24 66 64 20 22 20 20 3c 62 6f 64 79 3e  ts $fd "  <body>
2350: 22 0a 0a 09 73 65 74 20 70 6b 67 6c 69 73 74 20  "...set pkglist 
2360: 5b 6c 69 73 74 5d 0a 09 69 66 20 7b 21 24 63 6f  [list]..if {!$co
2370: 6d 70 6c 65 74 65 7d 20 7b 0a 09 09 66 6f 72 65  mplete} {...fore
2380: 61 63 68 20 70 6b 67 65 6e 74 20 5b 61 72 72 61  ach pkgent [arra
2390: 79 20 6e 61 6d 65 73 20 70 6b 67 69 6e 66 6f 20  y names pkginfo 
23a0: 24 70 6b 67 70 61 74 5d 20 7b 0a 09 09 09 75 6e  $pkgpat] {....un
23b0: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
23c0: 63 75 72 72 70 6b 67 69 6e 66 6f 0a 09 09 09 66  currpkginfo....f
23d0: 6f 72 20 7b 73 65 74 20 69 64 78 20 30 7d 20 7b  or {set idx 0} {
23e0: 24 69 64 78 20 3c 20 5b 6c 6c 65 6e 67 74 68 20  $idx < [llength 
23f0: 24 72 65 71 5f 66 69 65 6c 64 73 5d 7d 20 7b 69  $req_fields]} {i
2400: 6e 63 72 20 69 64 78 7d 20 7b 0a 09 09 09 09 73  ncr idx} {.....s
2410: 65 74 20 66 69 65 6c 64 20 5b 6c 69 6e 64 65 78  et field [lindex
2420: 20 24 72 65 71 5f 66 69 65 6c 64 73 20 24 69 64   $req_fields $id
2430: 78 5d 0a 09 09 09 09 73 65 74 20 76 61 6c 75 65  x].....set value
2440: 20 5b 6c 69 6e 64 65 78 20 24 70 6b 67 65 6e 74   [lindex $pkgent
2450: 20 24 69 64 78 5d 0a 09 09 09 09 73 65 74 20 63   $idx].....set c
2460: 75 72 72 70 6b 67 69 6e 66 6f 28 24 66 69 65 6c  urrpkginfo($fiel
2470: 64 29 20 24 76 61 6c 75 65 0a 09 09 09 7d 0a 0a  d) $value....}..
2480: 09 09 09 73 65 74 20 63 75 72 72 70 6b 67 64 61  ...set currpkgda
2490: 74 61 20 5b 6c 69 73 74 20 5b 6c 69 73 74 20 65  ta [list [list e
24a0: 6e 74 69 74 79 20 24 65 6e 74 69 74 79 5f 74 79  ntity $entity_ty
24b0: 70 65 5d 5d 0a 09 09 09 66 6f 72 65 61 63 68 20  pe]]....foreach 
24c0: 64 69 73 70 66 69 65 6c 64 20 24 64 69 73 70 66  dispfield $dispf
24d0: 69 65 6c 64 73 20 7b 0a 09 09 09 09 6c 61 70 70  ields {.....lapp
24e0: 65 6e 64 20 63 75 72 72 70 6b 67 64 61 74 61 20  end currpkgdata 
24f0: 5b 6c 69 73 74 20 24 64 69 73 70 66 69 65 6c 64  [list $dispfield
2500: 20 24 63 75 72 72 70 6b 67 69 6e 66 6f 28 24 64   $currpkginfo($d
2510: 69 73 70 66 69 65 6c 64 29 5d 0a 09 09 09 7d 0a  ispfield)]....}.
2520: 0a 09 09 09 69 66 20 7b 5b 6c 73 65 61 72 63 68  ....if {[lsearch
2530: 20 2d 65 78 61 63 74 20 24 70 6b 67 6c 69 73 74   -exact $pkglist
2540: 20 24 63 75 72 72 70 6b 67 64 61 74 61 5d 20 21   $currpkgdata] !
2550: 3d 20 2d 31 7d 20 7b 0a 09 09 09 09 63 6f 6e 74  = -1} {.....cont
2560: 69 6e 75 65 0a 09 09 09 7d 0a 0a 09 09 09 6c 61  inue....}.....la
2570: 70 70 65 6e 64 20 70 6b 67 6c 69 73 74 20 24 63  ppend pkglist $c
2580: 75 72 72 70 6b 67 64 61 74 61 0a 09 09 7d 0a 0a  urrpkgdata...}..
2590: 09 09 73 65 74 20 70 6b 67 6c 69 73 74 20 5b 6c  ..set pkglist [l
25a0: 73 6f 72 74 20 2d 64 69 63 74 69 6f 6e 61 72 79  sort -dictionary
25b0: 20 24 70 6b 67 6c 69 73 74 5d 0a 0a 09 09 70 75   $pkglist]....pu
25c0: 74 73 20 24 66 64 20 5b 67 65 6e 65 72 61 74 65  ts $fd [generate
25d0: 5f 74 70 6d 20 24 70 6b 67 6c 69 73 74 5d 0a 0a  _tpm $pkglist]..
25e0: 09 09 70 75 74 73 20 24 66 64 20 22 20 20 20 20  ..puts $fd "    
25f0: 3c 68 31 3e 24 70 6b 67 6e 65 78 74 6c 65 76 65  <h1>$pkgnextleve
2600: 6c 3c 2f 68 31 3e 22 0a 09 09 70 75 74 73 20 24  l</h1>"...puts $
2610: 66 64 20 22 20 20 20 20 3c 74 61 62 6c 65 3e 22  fd "    <table>"
2620: 0a 09 09 70 75 74 73 20 24 66 64 20 22 20 20 20  ...puts $fd "   
2630: 20 3c 74 72 3e 22 0a 09 09 66 6f 72 65 61 63 68   <tr>"...foreach
2640: 20 64 69 73 70 66 69 65 6c 64 20 5b 6a 6f 69 6e   dispfield [join
2650: 20 5b 6c 69 73 74 20 65 6e 74 69 74 79 20 24 64   [list entity $d
2660: 69 73 70 66 69 65 6c 64 73 5d 5d 20 7b 0a 09 09  ispfields]] {...
2670: 09 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  .if {[info exist
2680: 73 20 3a 3a 65 6e 74 69 74 79 5f 66 69 65 6c 64  s ::entity_field
2690: 6e 61 6d 65 73 28 5b 6c 69 73 74 20 24 65 6e 74  names([list $ent
26a0: 69 74 79 5f 74 79 70 65 20 24 64 69 73 70 66 69  ity_type $dispfi
26b0: 65 6c 64 5d 29 5d 7d 20 7b 0a 09 09 09 09 73 65  eld])]} {.....se
26c0: 74 20 64 69 73 70 66 69 65 6c 64 68 65 61 64 65  t dispfieldheade
26d0: 72 20 24 3a 3a 65 6e 74 69 74 79 5f 66 69 65 6c  r $::entity_fiel
26e0: 64 6e 61 6d 65 73 28 5b 6c 69 73 74 20 24 65 6e  dnames([list $en
26f0: 74 69 74 79 5f 74 79 70 65 20 24 64 69 73 70 66  tity_type $dispf
2700: 69 65 6c 64 5d 29 0a 09 09 09 7d 20 65 6c 73 65  ield])....} else
2710: 20 7b 0a 09 09 09 09 73 65 74 20 64 69 73 70 66   {.....set dispf
2720: 69 65 6c 64 68 65 61 64 65 72 20 24 3a 3a 65 6e  ieldheader $::en
2730: 74 69 74 79 5f 66 69 65 6c 64 6e 61 6d 65 73 28  tity_fieldnames(
2740: 5b 6c 69 73 74 20 24 64 69 73 70 66 69 65 6c 64  [list $dispfield
2750: 5d 29 0a 09 09 09 7d 0a 09 09 09 70 75 74 73 20  ])....}....puts 
2760: 24 66 64 20 22 20 20 20 20 20 20 3c 74 68 3e 24  $fd "      <th>$
2770: 64 69 73 70 66 69 65 6c 64 68 65 61 64 65 72 3c  dispfieldheader<
2780: 2f 74 68 3e 22 0a 09 09 7d 0a 09 09 70 75 74 73  /th>"...}...puts
2790: 20 24 66 64 20 22 20 20 20 20 3c 2f 74 72 3e 22   $fd "    </tr>"
27a0: 0a 0a 09 09 70 75 74 73 20 24 66 64 20 5b 67 65  ....puts $fd [ge
27b0: 6e 65 72 61 74 65 5f 74 61 62 6c 65 20 24 70 6b  nerate_table $pk
27c0: 67 6c 69 73 74 20 31 30 5d 0a 0a 09 09 70 75 74  glist 10]....put
27d0: 73 20 24 66 64 20 22 20 20 20 20 3c 2f 74 61 62  s $fd "    </tab
27e0: 6c 65 3e 22 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  le>"..} else {..
27f0: 09 73 65 74 20 64 69 73 70 6e 61 6d 65 5f 6c 69  .set dispname_li
2800: 73 74 20 5b 6c 69 73 74 5d 0a 09 09 73 65 74 20  st [list]...set 
2810: 70 61 74 68 6e 61 6d 65 5f 6c 69 73 74 20 5b 6c  pathname_list [l
2820: 69 73 74 20 24 65 6e 74 69 74 79 5f 74 79 70 65  ist $entity_type
2830: 5d 0a 09 09 66 6f 72 65 61 63 68 20 66 69 65 6c  ]...foreach fiel
2840: 64 20 24 72 65 71 5f 66 69 65 6c 64 73 20 7b 0a  d $req_fields {.
2850: 09 09 09 6c 61 70 70 65 6e 64 20 64 69 73 70 6e  ...lappend dispn
2860: 61 6d 65 5f 6c 69 73 74 20 24 65 6e 74 69 6e 66  ame_list $entinf
2870: 6f 28 24 66 69 65 6c 64 29 0a 09 09 09 6c 61 70  o($field)....lap
2880: 70 65 6e 64 20 70 61 74 68 6e 61 6d 65 5f 6c 69  pend pathname_li
2890: 73 74 20 24 66 69 65 6c 64 20 24 65 6e 74 69 6e  st $field $entin
28a0: 66 6f 28 24 66 69 65 6c 64 29 0a 09 09 7d 0a 09  fo($field)...}..
28b0: 09 73 65 74 20 6b 65 79 20 24 64 69 73 70 6e 61  .set key $dispna
28c0: 6d 65 5f 6c 69 73 74 0a 09 09 61 72 72 61 79 20  me_list...array 
28d0: 73 65 74 20 63 75 72 72 70 6b 67 69 6e 66 6f 20  set currpkginfo 
28e0: 24 70 6b 67 69 6e 66 6f 28 24 6b 65 79 29 0a 0a  $pkginfo($key)..
28f0: 09 09 73 65 74 20 70 61 74 68 6e 61 6d 65 5f 64  ..set pathname_d
2900: 69 72 20 22 5b 6a 6f 69 6e 20 24 70 61 74 68 6e  ir "[join $pathn
2910: 61 6d 65 5f 6c 69 73 74 20 2f 5d 22 0a 09 09 73  ame_list /]"...s
2920: 65 74 20 70 61 74 68 6e 61 6d 65 5f 64 69 72 6c  et pathname_dirl
2930: 6f 63 61 6c 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  ocal [file join 
2940: 24 64 73 74 64 69 72 20 24 70 61 74 68 6e 61 6d  $dstdir $pathnam
2950: 65 5f 64 69 72 5d 0a 09 09 73 65 74 20 70 61 74  e_dir]...set pat
2960: 68 6e 61 6d 65 5f 74 61 69 6c 20 24 63 75 72 72  hname_tail $curr
2970: 70 6b 67 69 6e 66 6f 28 65 78 74 66 69 6c 65 29  pkginfo(extfile)
2980: 0a 09 09 69 66 20 7b 24 70 61 74 68 6e 61 6d 65  ...if {$pathname
2990: 5f 74 61 69 6c 20 3d 3d 20 22 22 7d 20 7b 0a 09  _tail == ""} {..
29a0: 09 09 73 65 74 20 70 61 74 68 6e 61 6d 65 5f 74  ..set pathname_t
29b0: 61 69 6c 20 22 66 69 6c 65 22 0a 09 09 7d 0a 09  ail "file"...}..
29c0: 09 73 65 74 20 70 61 74 68 6e 61 6d 65 5f 75 72  .set pathname_ur
29d0: 69 20 22 2f 24 70 61 74 68 6e 61 6d 65 5f 64 69  i "/$pathname_di
29e0: 72 2f 24 70 61 74 68 6e 61 6d 65 5f 74 61 69 6c  r/$pathname_tail
29f0: 22 0a 0a 09 09 70 75 74 73 20 24 66 64 20 22 20  "....puts $fd " 
2a00: 20 20 20 3c 68 31 3e 44 65 74 61 69 6c 73 20 6f     <h1>Details o
2a10: 66 20 24 65 6e 74 69 74 79 5f 74 79 70 65 20 5b  f $entity_type [
2a20: 6a 6f 69 6e 20 24 64 69 73 70 6e 61 6d 65 5f 6c  join $dispname_l
2a30: 69 73 74 5d 3c 2f 68 31 3e 22 0a 09 09 70 75 74  ist]</h1>"...put
2a40: 73 20 24 66 64 20 22 20 20 20 20 3c 70 3e 3c 61  s $fd "    <p><a
2a50: 20 68 72 65 66 3d 5c 22 24 70 61 74 68 6e 61 6d   href=\"$pathnam
2a60: 65 5f 75 72 69 5c 22 3e 50 61 63 6b 61 67 65 20  e_uri\">Package 
2a70: 61 72 63 68 69 76 65 3c 2f 61 3e 3c 2f 70 3e 22  archive</a></p>"
2a80: 0a 09 09 70 75 74 73 20 24 66 64 20 22 20 20 20  ...puts $fd "   
2a90: 20 3c 70 3e 44 65 74 61 69 6c 73 3c 2f 70 3e 22   <p>Details</p>"
2aa0: 0a 09 09 70 75 74 73 20 24 66 64 20 22 20 20 20  ...puts $fd "   
2ab0: 20 3c 74 61 62 6c 65 20 62 6f 72 64 65 72 3d 5c   <table border=\
2ac0: 22 31 5c 22 20 63 65 6c 6c 70 61 64 64 69 6e 67  "1\" cellpadding
2ad0: 3d 5c 22 35 5c 22 3e 22 0a 09 09 70 75 74 73 20  =\"5\">"...puts 
2ae0: 24 66 64 20 22 20 20 20 20 20 20 3c 74 72 3e 22  $fd "      <tr>"
2af0: 0a 09 09 70 75 74 73 20 24 66 64 20 22 20 20 20  ...puts $fd "   
2b00: 20 20 20 20 20 3c 74 68 3e 4b 65 79 3c 2f 74 68       <th>Key</th
2b10: 3e 22 0a 09 09 70 75 74 73 20 24 66 64 20 22 20  >"...puts $fd " 
2b20: 20 20 20 20 20 20 20 3c 74 68 3e 56 61 6c 75 65         <th>Value
2b30: 3c 2f 74 68 3e 22 0a 09 09 70 75 74 73 20 24 66  </th>"...puts $f
2b40: 64 20 22 20 20 20 20 20 20 3c 2f 74 72 3e 22 0a  d "      </tr>".
2b50: 0a 09 09 66 6f 72 65 61 63 68 20 64 65 73 63 66  ...foreach descf
2b60: 69 65 6c 64 20 5b 6c 69 73 74 20 72 73 6b 3a 3a  ield [list rsk::
2b70: 62 75 69 6c 64 3a 3a 64 61 74 65 20 61 73 3a 3a  build::date as::
2b80: 61 75 74 68 6f 72 20 61 73 3a 3a 62 75 69 6c 64  author as::build
2b90: 3a 3a 64 61 74 65 20 61 73 3a 3a 6f 72 69 67 69  ::date as::origi
2ba0: 6e 20 63 61 74 65 67 6f 72 79 20 64 65 73 63 72  n category descr
2bb0: 69 70 74 69 6f 6e 20 6c 69 63 65 6e 73 65 20 70  iption license p
2bc0: 6c 61 74 66 6f 72 6d 20 72 65 71 75 69 72 65 20  latform require 
2bd0: 73 75 6d 6d 61 72 79 5d 20 7b 0a 09 09 09 69 66  summary] {....if
2be0: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
2bf0: 63 75 72 72 70 6b 67 69 6e 66 6f 28 24 64 65 73  currpkginfo($des
2c00: 63 66 69 65 6c 64 29 5d 7d 20 7b 0a 09 09 09 09  cfield)]} {.....
2c10: 63 6f 6e 74 69 6e 75 65 0a 09 09 09 7d 0a 09 09  continue....}...
2c20: 09 73 65 74 20 64 65 73 63 76 61 6c 20 24 63 75  .set descval $cu
2c30: 72 72 70 6b 67 69 6e 66 6f 28 24 64 65 73 63 66  rrpkginfo($descf
2c40: 69 65 6c 64 29 0a 09 09 09 73 77 69 74 63 68 20  ield)....switch 
2c50: 2d 2d 20 24 64 65 73 63 66 69 65 6c 64 20 7b 0a  -- $descfield {.
2c60: 09 09 09 09 22 72 65 71 75 69 72 65 22 20 2d 20  ...."require" - 
2c70: 22 61 73 3a 3a 61 75 74 68 6f 72 22 20 2d 20 22  "as::author" - "
2c80: 61 73 3a 3a 6f 72 69 67 69 6e 22 20 7b 0a 09 09  as::origin" {...
2c90: 09 09 09 63 61 74 63 68 20 7b 0a 09 09 09 09 09  ...catch {......
2ca0: 09 73 65 74 20 64 65 73 63 76 61 6c 20 5b 6a 6f  .set descval [jo
2cb0: 69 6e 20 24 64 65 73 63 76 61 6c 5d 0a 09 09 09  in $descval]....
2cc0: 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  ..}.....}....}..
2cd0: 09 09 09 70 75 74 73 20 24 66 64 20 22 20 20 20  ...puts $fd "   
2ce0: 20 20 20 3c 74 72 3e 22 0a 09 09 09 70 75 74 73     <tr>"....puts
2cf0: 20 24 66 64 20 22 20 20 20 20 20 20 20 20 3c 74   $fd "        <t
2d00: 64 3e 24 64 65 73 63 66 69 65 6c 64 3c 2f 74 64  d>$descfield</td
2d10: 3e 22 0a 09 09 09 70 75 74 73 20 24 66 64 20 22  >"....puts $fd "
2d20: 20 20 20 20 20 20 20 20 3c 74 64 3e 5b 6a 6f 69          <td>[joi
2d30: 6e 20 24 64 65 73 63 76 61 6c 20 22 3c 62 72 3e  n $descval "<br>
2d40: 22 5d 3c 2f 74 64 3e 22 0a 09 09 09 70 75 74 73  "]</td>"....puts
2d50: 20 24 66 64 20 22 20 20 20 20 20 20 3c 2f 74 72   $fd "      </tr
2d60: 3e 22 0a 09 09 7d 0a 09 09 70 75 74 73 20 24 66  >"...}...puts $f
2d70: 64 20 22 20 20 20 20 3c 2f 74 61 62 6c 65 3e 22  d "    </table>"
2d80: 0a 09 7d 0a 0a 09 70 75 74 73 20 24 66 64 20 22  ..}...puts $fd "
2d90: 20 20 3c 2f 62 6f 64 79 3e 22 0a 09 70 75 74 73    </body>"..puts
2da0: 20 24 66 64 20 22 3c 2f 68 74 6d 6c 3e 22 0a 0a   $fd "</html>"..
2db0: 09 63 6c 6f 73 65 20 24 66 64 0a 0a 09 66 69 6c  .close $fd...fil
2dc0: 65 20 72 65 6e 61 6d 65 20 2d 66 6f 72 63 65 20  e rename -force 
2dd0: 2d 2d 20 24 74 6d 70 69 6e 64 65 78 66 69 6c 65  -- $tmpindexfile
2de0: 20 24 69 6e 64 65 78 66 69 6c 65 0a 7d 0a 0a 70   $indexfile.}..p
2df0: 72 6f 63 20 63 72 65 61 74 65 5f 61 6c 6c 5f 65  roc create_all_e
2e00: 6e 74 69 74 79 5f 66 69 6c 65 73 20 7b 64 73 74  ntity_files {dst
2e10: 64 69 72 20 70 6b 67 69 6e 66 6f 5f 61 72 72 6c  dir pkginfo_arrl
2e20: 69 73 74 7d 20 7b 0a 09 73 65 74 20 65 6e 74 66  ist} {..set entf
2e30: 69 65 6c 64 73 20 24 3a 3a 65 6e 74 69 74 79 5f  ields $::entity_
2e40: 64 65 66 69 6e 69 74 69 6f 6e 28 70 61 63 6b 61  definition(packa
2e50: 67 65 29 0a 0a 09 66 6f 72 20 7b 73 65 74 20 69  ge)...for {set i
2e60: 64 78 20 30 7d 20 7b 24 69 64 78 20 3c 20 5b 6c  dx 0} {$idx < [l
2e70: 6c 65 6e 67 74 68 20 24 65 6e 74 66 69 65 6c 64  length $entfield
2e80: 73 5d 7d 20 7b 69 6e 63 72 20 69 64 78 7d 20 7b  s]} {incr idx} {
2e90: 0a 09 09 73 65 74 20 66 69 65 6c 64 6e 61 6d 65  ...set fieldname
2ea0: 20 5b 6c 69 6e 64 65 78 20 24 65 6e 74 66 69 65   [lindex $entfie
2eb0: 6c 64 73 20 24 69 64 78 5d 0a 09 09 73 65 74 20  lds $idx]...set 
2ec0: 66 69 65 6c 64 6e 61 6d 65 5f 74 6f 5f 69 64 78  fieldname_to_idx
2ed0: 28 24 66 69 65 6c 64 6e 61 6d 65 29 20 24 69 64  ($fieldname) $id
2ee0: 78 0a 09 7d 0a 0a 09 73 65 74 20 65 6e 74 74 79  x..}...set entty
2ef0: 70 65 73 5f 6c 69 73 74 20 5b 6c 69 73 74 5d 0a  pes_list [list].
2f00: 09 66 6f 72 20 7b 73 65 74 20 69 64 78 20 31 7d  .for {set idx 1}
2f10: 20 7b 24 69 64 78 20 3c 20 69 6e 74 28 70 6f 77   {$idx < int(pow
2f20: 28 32 2c 20 5b 6c 6c 65 6e 67 74 68 20 24 65 6e  (2, [llength $en
2f30: 74 66 69 65 6c 64 73 5d 29 29 7d 20 7b 69 6e 63  tfields]))} {inc
2f40: 72 20 69 64 78 7d 20 7b 0a 09 09 73 65 74 20 65  r idx} {...set e
2f50: 6e 74 74 79 70 65 73 5f 6c 69 73 74 5f 63 75 72  nttypes_list_cur
2f60: 20 5b 6c 69 73 74 5d 0a 0a 09 09 66 6f 72 20 7b   [list]....for {
2f70: 73 65 74 20 73 75 62 69 64 78 20 30 7d 20 7b 24  set subidx 0} {$
2f80: 73 75 62 69 64 78 20 3c 20 5b 6c 6c 65 6e 67 74  subidx < [llengt
2f90: 68 20 24 65 6e 74 66 69 65 6c 64 73 5d 7d 20 7b  h $entfields]} {
2fa0: 69 6e 63 72 20 73 75 62 69 64 78 7d 20 7b 0a 09  incr subidx} {..
2fb0: 09 09 69 66 20 7b 24 69 64 78 20 26 20 28 31 20  ..if {$idx & (1 
2fc0: 3c 3c 20 24 73 75 62 69 64 78 29 7d 20 7b 0a 09  << $subidx)} {..
2fd0: 09 09 09 6c 61 70 70 65 6e 64 20 65 6e 74 74 79  ...lappend entty
2fe0: 70 65 73 5f 6c 69 73 74 5f 63 75 72 20 5b 6c 69  pes_list_cur [li
2ff0: 6e 64 65 78 20 24 65 6e 74 66 69 65 6c 64 73 20  ndex $entfields 
3000: 24 73 75 62 69 64 78 5d 0a 09 09 09 7d 0a 09 09  $subidx]....}...
3010: 7d 0a 0a 09 09 6c 61 70 70 65 6e 64 20 65 6e 74  }....lappend ent
3020: 74 79 70 65 73 5f 6c 69 73 74 20 24 65 6e 74 74  types_list $entt
3030: 79 70 65 73 5f 6c 69 73 74 5f 63 75 72 0a 09 7d  ypes_list_cur..}
3040: 0a 0a 09 61 72 72 61 79 20 73 65 74 20 70 6b 67  ...array set pkg
3050: 69 6e 66 6f 20 24 70 6b 67 69 6e 66 6f 5f 61 72  info $pkginfo_ar
3060: 72 6c 69 73 74 0a 0a 09 73 65 74 20 73 65 65 6e  rlist...set seen
3070: 5f 65 6e 74 69 74 69 65 73 20 5b 6c 69 73 74 5d  _entities [list]
3080: 0a 09 66 6f 72 65 61 63 68 20 70 6b 67 64 61 74  ..foreach pkgdat
3090: 61 20 5b 6c 73 6f 72 74 20 2d 64 69 63 74 69 6f  a [lsort -dictio
30a0: 6e 61 72 79 20 5b 61 72 72 61 79 20 6e 61 6d 65  nary [array name
30b0: 73 20 70 6b 67 69 6e 66 6f 5d 5d 20 7b 0a 09 09  s pkginfo]] {...
30c0: 66 6f 72 65 61 63 68 20 65 6e 74 74 79 70 65 73  foreach enttypes
30d0: 20 24 65 6e 74 74 79 70 65 73 5f 6c 69 73 74 20   $enttypes_list 
30e0: 7b 0a 09 09 09 75 6e 73 65 74 20 2d 6e 6f 63 6f  {....unset -noco
30f0: 6d 70 6c 61 69 6e 20 65 6e 74 69 74 79 0a 09 09  mplain entity...
3100: 09 6c 61 70 70 65 6e 64 20 65 6e 74 69 74 79 20  .lappend entity 
3110: 65 6e 74 69 74 79 20 70 61 63 6b 61 67 65 0a 0a  entity package..
3120: 09 09 09 66 6f 72 65 61 63 68 20 65 6e 74 74 79  ...foreach entty
3130: 70 65 20 24 65 6e 74 74 79 70 65 73 20 7b 0a 09  pe $enttypes {..
3140: 09 09 09 73 65 74 20 65 6e 74 76 61 6c 20 5b 6c  ...set entval [l
3150: 69 6e 64 65 78 20 24 70 6b 67 64 61 74 61 20 24  index $pkgdata $
3160: 66 69 65 6c 64 6e 61 6d 65 5f 74 6f 5f 69 64 78  fieldname_to_idx
3170: 28 24 65 6e 74 74 79 70 65 29 5d 0a 09 09 09 09  ($enttype)].....
3180: 6c 61 70 70 65 6e 64 20 65 6e 74 69 74 79 20 24  lappend entity $
3190: 65 6e 74 74 79 70 65 0a 09 09 09 09 6c 61 70 70  enttype.....lapp
31a0: 65 6e 64 20 65 6e 74 69 74 79 20 24 65 6e 74 76  end entity $entv
31b0: 61 6c 0a 0a 09 09 09 09 69 66 20 7b 5b 6c 73 65  al......if {[lse
31c0: 61 72 63 68 20 2d 65 78 61 63 74 20 24 73 65 65  arch -exact $see
31d0: 6e 5f 65 6e 74 69 74 69 65 73 20 24 65 6e 74 69  n_entities $enti
31e0: 74 79 5d 20 21 3d 20 2d 31 7d 20 7b 0a 09 09 09  ty] != -1} {....
31f0: 09 09 63 6f 6e 74 69 6e 75 65 0a 09 09 09 09 7d  ..continue.....}
3200: 0a 09 09 09 09 6c 61 70 70 65 6e 64 20 73 65 65  .....lappend see
3210: 6e 5f 65 6e 74 69 74 69 65 73 20 24 65 6e 74 69  n_entities $enti
3220: 74 79 0a 0a 09 09 09 09 63 72 65 61 74 65 5f 65  ty......create_e
3230: 6e 74 69 74 79 5f 66 69 6c 65 20 24 65 6e 74 69  ntity_file $enti
3240: 74 79 20 24 64 73 74 64 69 72 20 24 70 6b 67 69  ty $dstdir $pkgi
3250: 6e 66 6f 5f 61 72 72 6c 69 73 74 0a 09 09 09 7d  nfo_arrlist....}
3260: 0a 09 09 7d 0a 09 7d 0a 7d 0a 0a 73 65 74 20 70  ...}..}.}..set p
3270: 6b 67 69 6e 66 6f 20 5b 74 65 61 70 6f 74 5f 69  kginfo [teapot_i
3280: 6e 64 65 78 20 24 73 72 63 64 69 72 5d 0a 63 72  ndex $srcdir].cr
3290: 65 61 74 65 5f 6f 75 74 70 75 74 5f 69 6e 64 65  eate_output_inde
32a0: 78 20 24 64 73 74 64 69 72 20 24 70 6b 67 69 6e  x $dstdir $pkgin
32b0: 66 6f 0a 63 72 65 61 74 65 5f 6f 75 74 70 75 74  fo.create_output
32c0: 5f 70 6b 67 6c 69 73 74 20 24 64 73 74 64 69 72  _pkglist $dstdir
32d0: 20 24 70 6b 67 69 6e 66 6f 0a 63 72 65 61 74 65   $pkginfo.create
32e0: 5f 6f 75 74 70 75 74 5f 66 69 6c 65 73 20 24 64  _output_files $d
32f0: 73 74 64 69 72 20 24 70 6b 67 69 6e 66 6f 0a 63  stdir $pkginfo.c
3300: 72 65 61 74 65 5f 61 6c 6c 5f 65 6e 74 69 74 79  reate_all_entity
3310: 5f 66 69 6c 65 73 20 24 64 73 74 64 69 72 20 24  _files $dstdir $
3320: 70 6b 67 69 6e 66 6f 0a                          pkginfo.