System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 726d58d5cc24f6371fc65bded1f24027250a0ce0:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 75 70 64 61 74 65 2e 65 61 67  .#..# update.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 45 78 74 65  le --..#..# Exte
0070: 6e 73 69 62 6c 65 20 41 64 61 70 74 61 62 6c 65  nsible Adaptable
0080: 20 47 65 6e 65 72 61 6c 69 7a 65 64 20 4c 6f 67   Generalized Log
0090: 69 63 20 45 6e 67 69 6e 65 20 28 45 61 67 6c 65  ic Engine (Eagle
00a0: 29 0d 0a 23 20 45 61 67 6c 65 20 55 70 64 61 74  )..# Eagle Updat
00b0: 65 20 50 61 63 6b 61 67 65 20 46 69 6c 65 0d 0a  e Package File..
00c0: 23 0d 0a 23 20 43 6f 70 79 72 69 67 68 74 20 28  #..# Copyright (
00d0: 63 29 20 32 30 30 37 2d 32 30 31 32 20 62 79 20  c) 2007-2012 by 
00e0: 4a 6f 65 20 4d 69 73 74 61 63 68 6b 69 6e 2e 20  Joe Mistachkin. 
00f0: 20 41 6c 6c 20 72 69 67 68 74 73 20 72 65 73 65   All rights rese
0100: 72 76 65 64 2e 0d 0a 23 0d 0a 23 20 53 65 65 20  rved...#..# See 
0110: 74 68 65 20 66 69 6c 65 20 22 6c 69 63 65 6e 73  the file "licens
0120: 65 2e 74 65 72 6d 73 22 20 66 6f 72 20 69 6e 66  e.terms" for inf
0130: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67  ormation on usag
0140: 65 20 61 6e 64 20 72 65 64 69 73 74 72 69 62 75  e and redistribu
0150: 74 69 6f 6e 20 6f 66 0d 0a 23 20 74 68 69 73 20  tion of..# this 
0160: 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61 20  file, and for a 
0170: 44 49 53 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c  DISCLAIMER OF AL
0180: 4c 20 57 41 52 52 41 4e 54 49 45 53 2e 0d 0a 23  L WARRANTIES...#
0190: 0d 0a 23 20 52 43 53 3a 20 40 28 23 29 20 24 49  ..# RCS: @(#) $I
01a0: 64 3a 20 24 0d 0a 23 0d 0a 23 23 23 23 23 23 23  d: $..#..#######
01b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
01f0: 23 23 23 23 23 23 23 23 0d 0a 0d 0a 23 0d 0a 23  ########....#..#
0200: 20 4e 4f 54 45 3a 20 55 73 65 20 6f 75 72 20 6f   NOTE: Use our o
0210: 77 6e 20 6e 61 6d 65 73 70 61 63 65 20 68 65 72  wn namespace her
0220: 65 20 62 65 63 61 75 73 65 20 65 76 65 6e 20 74  e because even t
0230: 68 6f 75 67 68 20 77 65 20 64 6f 20 6e 6f 74 20  hough we do not 
0240: 64 69 72 65 63 74 6c 79 0d 0a 23 20 20 20 20 20  directly..#     
0250: 20 20 73 75 70 70 6f 72 74 20 6e 61 6d 65 73 70    support namesp
0260: 61 63 65 73 20 6f 75 72 73 65 6c 76 65 73 2c 20  aces ourselves, 
0270: 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
0280: 6f 20 70 6f 6c 6c 75 74 65 20 74 68 65 20 67 6c  o pollute the gl
0290: 6f 62 61 6c 0d 0a 23 20 20 20 20 20 20 20 6e 61  obal..#       na
02a0: 6d 65 73 70 61 63 65 20 69 66 20 74 68 69 73 20  mespace if this 
02b0: 73 63 72 69 70 74 20 61 63 74 75 61 6c 6c 79 20  script actually 
02c0: 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 65 76  ends up being ev
02d0: 61 6c 75 61 74 65 64 20 69 6e 20 54 63 6c 2e 0d  aluated in Tcl..
02e0: 0a 23 0d 0a 6e 61 6d 65 73 70 61 63 65 20 65 76  .#..namespace ev
02f0: 61 6c 20 3a 3a 45 61 67 6c 65 20 7b 0d 0a 20 20  al ::Eagle {..  
0300: 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69  #..  # NOTE: Thi
0310: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
0320: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
0330: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 75  the specified pu
0340: 62 6c 69 63 20 6b 65 79 20 74 6f 6b 65 6e 0d 0a  blic key token..
0350: 20 20 23 20 20 20 20 20 20 20 6d 61 74 63 68 65    #       matche
0360: 73 20 74 68 65 20 6f 6e 65 20 69 6e 20 75 73 65  s the one in use
0370: 20 62 79 20 74 68 65 20 45 61 67 6c 65 20 73 63   by the Eagle sc
0380: 72 69 70 74 20 65 6e 67 69 6e 65 2e 0d 0a 20 20  ript engine...  
0390: 23 0d 0a 20 20 70 72 6f 63 20 6d 61 74 63 68 45  #..  proc matchE
03a0: 6e 67 69 6e 65 50 75 62 6c 69 63 4b 65 79 54 6f  nginePublicKeyTo
03b0: 6b 65 6e 20 7b 20 70 75 62 6c 69 63 4b 65 79 54  ken { publicKeyT
03c0: 6f 6b 65 6e 20 7d 20 7b 0d 0a 20 20 20 20 72 65  oken } {..    re
03d0: 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 73 74 72  turn [expr {[str
03e0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 75 62 6c  ing length $publ
03f0: 69 63 4b 65 79 54 6f 6b 65 6e 5d 20 3d 3d 20 30  icKeyToken] == 0
0400: 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 24   || \..        $
0410: 70 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 20 65  publicKeyToken e
0420: 71 20 5b 69 6e 66 6f 20 65 6e 67 69 6e 65 20 50  q [info engine P
0430: 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 5d 7d 5d  ublicKeyToken]}]
0440: 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20  ..  }.....  #.. 
0450: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
0460: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
0470: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
0480: 73 70 65 63 69 66 69 65 64 20 65 6e 67 69 6e 65  specified engine
0490: 20 6e 61 6d 65 0d 0a 20 20 23 20 20 20 20 20 20   name..  #      
04a0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 45 61 67   matches the Eag
04b0: 6c 65 20 73 63 72 69 70 74 20 65 6e 67 69 6e 65  le script engine
04c0: 2e 0d 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20 6d  ...  #..  proc m
04d0: 61 74 63 68 45 6e 67 69 6e 65 4e 61 6d 65 20 7b  atchEngineName {
04e0: 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 72   name } {..    r
04f0: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 73 74  eturn [expr {[st
0500: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d  ring length $nam
0510: 65 5d 20 3d 3d 20 30 20 7c 7c 20 5c 0d 0a 20 20  e] == 0 || \..  
0520: 20 20 20 20 20 20 24 6e 61 6d 65 20 65 71 20 5b        $name eq [
0530: 69 6e 66 6f 20 65 6e 67 69 6e 65 20 4e 61 6d 65  info engine Name
0540: 5d 7d 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23  ]}]..  }.....  #
0550: 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73  ..  # NOTE: This
0560: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
0570: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ns non-zero if t
0580: 68 65 20 73 70 65 63 69 66 69 65 64 20 63 75 6c  he specified cul
0590: 74 75 72 65 20 6d 61 74 63 68 65 73 0d 0a 20 20  ture matches..  
05a0: 23 20 20 20 20 20 20 20 74 68 65 20 6f 6e 65 20  #       the one 
05b0: 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 45 61  in use by the Ea
05c0: 67 6c 65 20 73 63 72 69 70 74 20 65 6e 67 69 6e  gle script engin
05d0: 65 2e 0d 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20  e...  #..  proc 
05e0: 6d 61 74 63 68 45 6e 67 69 6e 65 43 75 6c 74 75  matchEngineCultu
05f0: 72 65 20 7b 20 63 75 6c 74 75 72 65 20 7d 20 7b  re { culture } {
0600: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78  ..    return [ex
0610: 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
0620: 74 68 20 24 63 75 6c 74 75 72 65 5d 20 3d 3d 20  th $culture] == 
0630: 30 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  0 || \..        
0640: 24 63 75 6c 74 75 72 65 20 65 71 20 5b 69 6e 66  $culture eq [inf
0650: 6f 20 65 6e 67 69 6e 65 20 43 75 6c 74 75 72 65  o engine Culture
0660: 5d 7d 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23  ]}]..  }.....  #
0670: 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73  ..  # NOTE: This
0680: 20 70 72 6f 63 65 64 75 72 65 20 65 73 63 61 70   procedure escap
0690: 65 73 20 74 68 65 20 72 65 73 65 72 76 65 64 20  es the reserved 
06a0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
06b0: 65 20 73 70 65 63 69 66 69 65 64 0d 0a 20 20 23  e specified..  #
06c0: 20 20 20 20 20 20 20 75 70 64 61 74 65 20 6e 6f         update no
06d0: 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
06e0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 73 74  the resulting st
06f0: 72 69 6e 67 2e 0d 0a 20 20 23 0d 0a 20 20 70 72  ring...  #..  pr
0700: 6f 63 20 65 73 63 61 70 65 55 70 64 61 74 65 4e  oc escapeUpdateN
0710: 6f 74 65 73 20 7b 20 6e 6f 74 65 73 20 7d 20 7b  otes { notes } {
0720: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
0730: 4f 54 45 3a 20 45 73 63 61 70 65 20 61 6e 79 20  OTE: Escape any 
0740: 65 6d 62 65 64 64 65 64 20 74 61 62 20 61 6e 64  embedded tab and
0750: 20 6c 69 6e 65 2d 65 6e 64 69 6e 67 20 63 68 61   line-ending cha
0760: 72 61 63 74 65 72 73 2e 0d 0a 20 20 20 20 23 0d  racters...    #.
0770: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 73 74 72  .    return [str
0780: 69 6e 67 20 6d 61 70 20 5c 0d 0a 20 20 20 20 20  ing map \..     
0790: 20 20 20 5b 6c 69 73 74 20 26 20 26 61 6d 70 5c     [list & &amp\
07a0: 3b 20 5c 74 20 26 68 74 61 62 5c 3b 20 5c 76 20  ; \t &htab\; \v 
07b0: 26 76 74 61 62 5c 3b 20 5c 6e 20 26 6c 66 5c 3b  &vtab\; \n &lf\;
07c0: 20 5c 72 20 26 63 72 5c 3b 5d 20 24 6e 6f 74 65   \r &cr\;] $note
07d0: 73 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d  s]..  }.....  #.
07e0: 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20  .  # NOTE: This 
07f0: 70 72 6f 63 65 64 75 72 65 20 75 6e 65 73 63 61  procedure unesca
0800: 70 65 73 20 72 65 73 65 72 76 65 64 20 63 68 61  pes reserved cha
0810: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
0820: 70 65 63 69 66 69 65 64 0d 0a 20 20 23 20 20 20  pecified..  #   
0830: 20 20 20 20 75 70 64 61 74 65 20 6e 6f 74 65 73      update notes
0840: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
0850: 20 72 65 73 75 6c 74 69 6e 67 20 73 74 72 69 6e   resulting strin
0860: 67 2e 0d 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20  g...  #..  proc 
0870: 75 6e 65 73 63 61 70 65 55 70 64 61 74 65 4e 6f  unescapeUpdateNo
0880: 74 65 73 20 7b 20 6e 6f 74 65 73 20 7d 20 7b 0d  tes { notes } {.
0890: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
08a0: 54 45 3a 20 55 6e 65 73 63 61 70 65 20 61 6e 79  TE: Unescape any
08b0: 20 65 6d 62 65 64 64 65 64 20 74 61 62 20 61 6e   embedded tab an
08c0: 64 20 6c 69 6e 65 2d 65 6e 64 69 6e 67 20 63 68  d line-ending ch
08d0: 61 72 61 63 74 65 72 73 2e 0d 0a 20 20 20 20 23  aracters...    #
08e0: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 73 74  ..    return [st
08f0: 72 69 6e 67 20 6d 61 70 20 5c 0d 0a 20 20 20 20  ring map \..    
0900: 20 20 20 20 5b 6c 69 73 74 20 26 68 74 61 62 5c      [list &htab\
0910: 3b 20 5c 74 20 26 76 74 61 62 5c 3b 20 5c 76 20  ; \t &vtab\; \v 
0920: 26 6c 66 5c 3b 20 5c 6e 20 26 63 72 5c 3b 20 5c  &lf\; \n &cr\; \
0930: 72 20 26 61 6d 70 5c 3b 20 26 5d 20 24 6e 6f 74  r &amp\; &] $not
0940: 65 73 5d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23  es]..  }.....  #
0950: 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73  ..  # NOTE: This
0960: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
0970: 6e 73 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  ns the list of a
0980: 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 20 70  rguments to be p
0990: 61 73 73 65 64 20 74 6f 20 74 68 65 0d 0a 20 20  assed to the..  
09a0: 23 20 20 20 20 20 20 20 5b 75 72 69 20 64 6f 77  #       [uri dow
09b0: 6e 6c 6f 61 64 5d 20 63 61 6c 6c 20 74 68 61 74  nload] call that
09c0: 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 61 75   performs the au
09d0: 74 6f 2d 75 70 64 61 74 65 20 63 68 65 63 6b 2e  to-update check.
09e0: 0d 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20 67 65  ..  #..  proc ge
09f0: 74 46 65 74 63 68 55 70 64 61 74 65 41 72 67 73  tFetchUpdateArgs
0a00: 20 7b 20 62 61 73 65 55 72 69 20 70 61 74 63 68   { baseUri patch
0a10: 4c 65 76 65 6c 20 74 79 70 65 20 64 69 72 65 63  Level type direc
0a20: 74 6f 72 79 20 65 78 74 65 6e 73 69 6f 6e 20 7d  tory extension }
0a30: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
0a40: 20 4e 4f 54 45 3a 20 49 6e 69 74 69 61 6c 6c 79   NOTE: Initially
0a50: 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  , set the result
0a60: 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 6c 69 73   to an empty lis
0a70: 74 20 74 6f 20 69 6e 64 69 63 61 74 65 0d 0a 20  t to indicate.. 
0a80: 20 20 20 23 20 20 20 20 20 20 20 75 6e 72 65 63     #       unrec
0a90: 6f 67 6e 69 7a 65 64 20 69 6e 70 75 74 2e 0d 0a  ognized input...
0aa0: 20 20 20 20 23 0d 0a 20 20 20 20 73 65 74 20 72      #..    set r
0ab0: 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a  esult [list]....
0ac0: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
0ad0: 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  E: Make sure the
0ae0: 20 62 61 73 65 20 55 52 49 20 69 73 20 76 61 6c   base URI is val
0af0: 69 64 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  id...    #..    
0b00: 69 66 20 7b 5b 75 72 69 20 69 73 76 61 6c 69 64  if {[uri isvalid
0b10: 20 24 62 61 73 65 55 72 69 5d 7d 20 74 68 65 6e   $baseUri]} then
0b20: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
0b30: 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20     # NOTE: Make 
0b40: 73 75 72 65 20 74 68 65 20 70 61 74 63 68 20 6c  sure the patch l
0b50: 65 76 65 6c 20 6c 6f 6f 6b 73 20 76 61 6c 69 64  evel looks valid
0b60: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
0b70: 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 2d    if {[regexp --
0b80: 20 7b 5e 5c 64 2b 5c 2e 5c 64 2b 5c 2e 5c 64 2b   {^\d+\.\d+\.\d+
0b90: 5c 2e 5c 64 2b 24 7d 20 24 70 61 74 63 68 4c 65  \.\d+$} $patchLe
0ba0: 76 65 6c 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  vel]} then {..  
0bb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0bc0: 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75   # NOTE: Make su
0bd0: 72 65 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  re the directory
0be0: 20 69 73 20 65 69 74 68 65 72 20 65 6d 70 74 79   is either empty
0bf0: 20 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 0d   or an existing.
0c00: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
0c10: 20 76 61 6c 69 64 20 64 69 72 65 63 74 6f 72 79   valid directory
0c20: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
0c30: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
0c40: 67 20 6c 65 6e 67 74 68 20 24 64 69 72 65 63 74  g length $direct
0c50: 6f 72 79 5d 20 3d 3d 20 30 20 7c 7c 20 5c 0d 0a  ory] == 0 || \..
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
0c70: 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 64  e isdirectory $d
0c80: 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
0c90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
0ca0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
0cb0: 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  : Make sure the 
0cc0: 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 73 75 70  extension is sup
0cd0: 70 6f 72 74 65 64 2e 0d 0a 20 20 20 20 20 20 20  ported...       
0ce0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
0cf0: 69 66 20 7b 24 65 78 74 65 6e 73 69 6f 6e 20 65  if {$extension e
0d00: 71 20 22 2e 65 78 65 22 20 7c 7c 20 24 65 78 74  q ".exe" || $ext
0d10: 65 6e 73 69 6f 6e 20 65 71 20 22 2e 72 61 72 22  ension eq ".rar"
0d20: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
0d30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0d40: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 61       # NOTE: Sta
0d50: 72 74 20 77 69 74 68 20 74 68 65 20 55 52 49 20  rt with the URI 
0d60: 63 6f 6d 70 6f 6e 65 6e 74 73 20 63 6f 6d 6d 6f  components commo
0d70: 6e 20 74 6f 20 61 6c 6c 20 64 6f 77 6e 6c 6f 61  n to all downloa
0d80: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  d..            #
0d90: 20 20 20 20 20 20 20 74 79 70 65 73 2e 0d 0a 20         types... 
0da0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0db0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f            set co
0dc0: 6d 70 6f 6e 65 6e 74 73 20 5b 6c 69 73 74 20 24  mponents [list $
0dd0: 62 61 73 65 55 72 69 20 72 65 6c 65 61 73 65 73  baseUri releases
0de0: 20 24 70 61 74 63 68 4c 65 76 65 6c 5d 0d 0a 0d   $patchLevel]...
0df0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
0e10: 54 45 3a 20 4e 65 78 74 2c 20 66 69 67 75 72 65  TE: Next, figure
0e20: 20 6f 75 74 20 77 68 61 74 20 74 79 70 65 20 6f   out what type o
0e30: 66 20 64 6f 77 6e 6c 6f 61 64 20 69 73 20 62 65  f download is be
0e40: 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ing..           
0e50: 20 23 20 20 20 20 20 20 20 72 65 71 75 65 73 74   #       request
0e60: 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
0e70: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
0e80: 73 77 69 74 63 68 20 2d 65 78 61 63 74 20 2d 6e  switch -exact -n
0e90: 6f 63 61 73 65 20 2d 2d 20 24 74 79 70 65 20 7b  ocase -- $type {
0ea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0eb0: 73 6f 75 72 63 65 20 2d 0d 0a 20 20 20 20 20 20  source -..      
0ec0: 20 20 20 20 20 20 20 20 73 65 74 75 70 20 2d 0d          setup -.
0ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
0ee0: 69 6e 61 72 79 20 7b 0d 0a 20 20 20 20 20 20 20  inary {..       
0ef0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
0f10: 54 45 3a 20 53 6f 75 72 63 65 20 63 6f 64 65 2c  TE: Source code,
0f20: 20 73 65 74 75 70 2c 20 6f 72 20 62 69 6e 61 72   setup, or binar
0f30: 79 20 64 6f 77 6e 6c 6f 61 64 2e 20 20 54 68 69  y download.  Thi
0f40: 73 20 6d 61 79 20 62 65 0d 0a 20 20 20 20 20 20  s may be..      
0f50: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
0f60: 20 20 61 20 52 41 52 20 6f 72 20 61 6e 20 45 58    a RAR or an EX
0f70: 45 20 66 69 6c 65 2e 20 20 41 70 70 65 6e 64 20  E file.  Append 
0f80: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
0f90: 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  file..          
0fa0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
0fb0: 6d 65 20 61 6e 64 20 74 68 65 6e 20 6a 6f 69 6e  me and then join
0fc0: 20 61 6c 6c 20 74 68 65 20 55 52 49 20 63 6f 6d   all the URI com
0fd0: 70 6f 6e 65 6e 74 73 20 74 6f 20 66 6f 72 6d 20  ponents to form 
0fe0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
0ff0: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6e       #       fin
1000: 61 6c 20 55 52 49 2e 0d 0a 20 20 20 20 20 20 20  al URI...       
1010: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1020: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
1030: 66 69 6c 65 4e 61 6d 65 20 5b 61 70 70 65 6e 64  fileName [append
1040: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1050: 20 20 20 20 20 20 20 20 20 20 20 20 5b 69 6e 66              [inf
1060: 6f 20 65 6e 67 69 6e 65 5d 20 5b 73 74 72 69 6e  o engine] [strin
1070: 67 20 74 6f 74 69 74 6c 65 20 24 74 79 70 65 5d  g totitle $type]
1080: 20 24 70 61 74 63 68 4c 65 76 65 6c 20 5c 0d 0a   $patchLevel \..
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a0: 20 20 20 20 5b 65 78 70 72 20 7b 5b 73 74 72 69      [expr {[stri
10b0: 6e 67 20 74 6f 6c 6f 77 65 72 20 24 74 79 70 65  ng tolower $type
10c0: 5d 20 65 71 20 22 73 65 74 75 70 22 20 3f 20 22  ] eq "setup" ? "
10d0: 2e 65 78 65 22 20 3a 20 5c 0d 0a 20 20 20 20 20  .exe" : \..     
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
10f0: 65 78 74 65 6e 73 69 6f 6e 7d 5d 5d 0d 0a 0d 0a  extension}]]....
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1110: 6c 61 70 70 65 6e 64 20 63 6f 6d 70 6f 6e 65 6e  lappend componen
1120: 74 73 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 0d 0a  ts $fileName....
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1140: 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74  set result [list
1150: 20 5b 65 76 61 6c 20 75 72 69 20 6a 6f 69 6e 20   [eval uri join 
1160: 24 63 6f 6d 70 6f 6e 65 6e 74 73 5d 20 5b 66 69  $components] [fi
1170: 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1190: 64 69 72 65 63 74 6f 72 79 20 24 66 69 6c 65 4e  directory $fileN
11a0: 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20  ame]]..         
11b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
11c0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
11d0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
11e0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0d       }..    }...
11f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73  .    return $res
1200: 75 6c 74 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23  ult..  }.....  #
1210: 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73  ..  # NOTE: This
1220: 20 70 72 6f 63 65 64 75 72 65 20 66 65 74 63 68   procedure fetch
1230: 65 73 20 61 6e 20 75 70 64 61 74 65 20 70 61 63  es an update pac
1240: 6b 61 67 65 20 77 69 74 68 20 74 68 65 20 73 70  kage with the sp
1250: 65 63 69 66 69 65 64 20 70 61 74 63 68 0d 0a 20  ecified patch.. 
1260: 20 23 20 20 20 20 20 20 20 6c 65 76 65 6c 20 61   #       level a
1270: 6e 64 20 70 61 63 6b 61 67 65 20 74 79 70 65 20  nd package type 
1280: 61 6e 64 20 74 68 65 6e 20 73 61 76 65 73 20 69  and then saves i
1290: 74 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  t to the specifi
12a0: 65 64 20 6c 6f 63 61 6c 0d 0a 20 20 23 20 20 20  ed local..  #   
12b0: 20 20 20 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a      directory...
12c0: 20 20 23 0d 0a 20 20 70 72 6f 63 20 66 65 74 63    #..  proc fetc
12d0: 68 55 70 64 61 74 65 20 7b 20 62 61 73 65 55 72  hUpdate { baseUr
12e0: 69 20 70 61 74 63 68 4c 65 76 65 6c 20 74 79 70  i patchLevel typ
12f0: 65 20 64 69 72 65 63 74 6f 72 79 20 7d 20 7b 0d  e directory } {.
1300: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
1310: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74  TE: Figure out t
1320: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  he appropriate f
1330: 69 6c 65 20 65 78 74 65 6e 73 69 6f 6e 20 74 6f  ile extension to
1340: 20 64 6f 77 6e 6c 6f 61 64 20 66 6f 72 0d 0a 20   download for.. 
1350: 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20     #       this 
1360: 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 23  platform...    #
1370: 0d 0a 20 20 20 20 73 65 74 20 65 78 74 65 6e 73  ..    set extens
1380: 69 6f 6e 20 5b 65 78 70 72 20 7b 5b 69 73 57 69  ion [expr {[isWi
1390: 6e 64 6f 77 73 5d 20 3f 20 22 2e 65 78 65 22 20  ndows] ? ".exe" 
13a0: 3a 20 22 2e 72 61 72 22 7d 5d 0d 0a 0d 0a 20 20  : ".rar"}]....  
13b0: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
13c0: 20 42 75 69 6c 64 20 74 68 65 20 6e 65 63 65 73   Build the neces
13d0: 73 61 72 79 20 61 72 67 75 6d 65 6e 74 73 20 66  sary arguments f
13e0: 6f 72 20 74 68 65 20 64 6f 77 6e 6c 6f 61 64 2e  or the download.
13f0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73 65 74  ..    #..    set
1400: 20 61 72 67 73 20 5b 67 65 74 46 65 74 63 68 55   args [getFetchU
1410: 70 64 61 74 65 41 72 67 73 20 24 62 61 73 65 55  pdateArgs $baseU
1420: 72 69 20 24 70 61 74 63 68 4c 65 76 65 6c 20 24  ri $patchLevel $
1430: 74 79 70 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  type \..        
1440: 24 64 69 72 65 63 74 6f 72 79 20 24 65 78 74 65  $directory $exte
1450: 6e 73 69 6f 6e 5d 0d 0a 0d 0a 20 20 20 20 69 66  nsion]....    if
1460: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 73   {[llength $args
1470: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1480: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1490: 4e 4f 54 45 3a 20 53 74 61 72 74 20 74 72 75 73  NOTE: Start trus
14a0: 74 69 6e 67 20 4f 4e 4c 59 20 6f 75 72 20 73 65  ting ONLY our se
14b0: 6c 66 2d 73 69 67 6e 65 64 20 53 53 4c 20 63 65  lf-signed SSL ce
14c0: 72 74 69 66 69 63 61 74 65 2e 0d 0a 20 20 20 20  rtificate...    
14d0: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 74    #..      set t
14e0: 72 75 73 74 65 64 20 74 72 75 65 0d 0a 0d 0a 20  rusted true.... 
14f0: 20 20 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78       if {[lindex
1500: 20 5b 75 72 69 20 73 6f 66 74 77 61 72 65 75 70   [uri softwareup
1510: 64 61 74 65 73 5d 20 65 6e 64 5d 20 65 71 20 22  dates] end] eq "
1520: 75 6e 74 72 75 73 74 65 64 22 7d 20 74 68 65 6e  untrusted"} then
1530: 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 72 69 20   {..        uri 
1540: 73 6f 66 74 77 61 72 65 75 70 64 61 74 65 73 20  softwareupdates 
1550: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 20 65 6c  true..      } el
1560: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
1570: 74 20 74 72 75 73 74 65 64 20 66 61 6c 73 65 3b  t trusted false;
1580: 20 23 20 4e 4f 54 45 3a 20 41 6c 72 65 61 64 79   # NOTE: Already
1590: 20 74 72 75 73 74 65 64 2e 0d 0a 20 20 20 20 20   trusted...     
15a0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 72 79 20   }....      try 
15b0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
15c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
15d0: 77 6e 6c 6f 61 64 20 74 68 65 20 66 69 6c 65 20  wnload the file 
15e0: 66 72 6f 6d 20 74 68 65 20 77 65 62 20 73 69 74  from the web sit
15f0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
1600: 20 20 20 20 20 20 20 65 76 61 6c 20 75 72 69 20         eval uri 
1610: 64 6f 77 6e 6c 6f 61 64 20 24 61 72 67 73 3b 20  download $args; 
1620: 23 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e 0d 0a  # synchronous...
1630: 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20        } finally 
1640: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  {..        if {$
1650: 74 72 75 73 74 65 64 20 26 26 20 5c 0d 0a 20 20  trusted && \..  
1660: 20 20 20 20 20 20 20 20 20 20 5b 6c 69 6e 64 65            [linde
1670: 78 20 5b 75 72 69 20 73 6f 66 74 77 61 72 65 75  x [uri softwareu
1680: 70 64 61 74 65 73 5d 20 65 6e 64 5d 20 65 71 20  pdates] end] eq 
1690: 22 74 72 75 73 74 65 64 22 7d 20 74 68 65 6e 20  "trusted"} then 
16a0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
16b0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
16c0: 3a 20 53 74 6f 70 20 74 72 75 73 74 69 6e 67 20  : Stop trusting 
16d0: 4f 4e 4c 59 20 6f 75 72 20 73 65 6c 66 2d 73 69  ONLY our self-si
16e0: 67 6e 65 64 20 53 53 4c 20 63 65 72 74 69 66 69  gned SSL certifi
16f0: 63 61 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  cate...         
1700: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 75 72   #..          ur
1710: 69 20 73 6f 66 74 77 61 72 65 75 70 64 61 74 65  i softwareupdate
1720: 73 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20  s false..       
1730: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
1740: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1750: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 61 20 72  NOTE: Return a r
1760: 65 73 75 6c 74 20 69 6e 64 69 63 61 74 69 6e 67  esult indicating
1770: 20 77 68 61 74 20 77 61 73 20 64 6f 6e 65 2e 0d   what was done..
1780: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1790: 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41 72  return [appendAr
17a0: 67 73 20 22 64 6f 77 6e 6c 6f 61 64 65 64 20 55  gs "downloaded U
17b0: 52 49 20 22 20 5b 6c 69 6e 64 65 78 20 24 61 72  RI " [lindex $ar
17c0: 67 73 20 30 5d 20 5c 0d 0a 20 20 20 20 20 20 20  gs 0] \..       
17d0: 20 20 20 22 20 74 6f 20 64 69 72 65 63 74 6f 72     " to director
17e0: 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79  y \"" $directory
17f0: 20 5c 22 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65   \"]..    } else
1800: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
1810: 20 22 63 61 6e 6e 6f 74 20 66 65 74 63 68 20 75   "cannot fetch u
1820: 70 64 61 74 65 2c 20 74 68 65 20 55 52 49 20 69  pdate, the URI i
1830: 73 20 69 6e 76 61 6c 69 64 22 0d 0a 20 20 20 20  s invalid"..    
1840: 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a  }..  }.....  #..
1850: 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70    # NOTE: This p
1860: 72 6f 63 65 64 75 72 65 20 72 75 6e 73 20 74 68  rocedure runs th
1870: 65 20 75 70 64 61 74 65 72 20 74 6f 6f 6c 20 61  e updater tool a
1880: 6e 64 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74  nd then immediat
1890: 65 6c 79 20 65 78 69 74 73 0d 0a 20 20 23 20 20  ely exits..  #  
18a0: 20 20 20 20 20 74 68 65 20 70 72 6f 63 65 73 73       the process
18b0: 2e 0d 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20 72  ...  #..  proc r
18c0: 75 6e 55 70 64 61 74 65 41 6e 64 45 78 69 74 20  unUpdateAndExit 
18d0: 7b 20 7b 61 75 74 6f 6d 61 74 69 63 20 66 61 6c  { {automatic fal
18e0: 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 67 6c 6f  se} } {..    glo
18f0: 62 61 6c 20 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  bal tcl_platform
1900: 0d 0a 0d 0a 20 20 20 20 73 65 74 20 64 69 72 65  ....    set dire
1910: 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e  ctory [file dirn
1920: 61 6d 65 20 5b 69 6e 66 6f 20 6e 61 6d 65 6f 66  ame [info nameof
1930: 65 78 65 63 75 74 61 62 6c 65 5d 5d 0d 0a 0d 0a  executable]]....
1940: 20 20 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64 20      set command 
1950: 5b 6c 69 73 74 20 65 78 65 63 20 2d 73 68 65 6c  [list exec -shel
1960: 6c 20 2d 2d 20 5c 0d 0a 20 20 20 20 20 20 20 20  l -- \..        
1970: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65  [file join $dire
1980: 63 74 6f 72 79 20 48 69 70 70 6f 67 72 69 66 66  ctory Hippogriff
1990: 2e 65 78 65 5d 20 2d 64 65 6c 61 79 20 32 30 30  .exe] -delay 200
19a0: 30 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20 20 20  0]....    #..   
19b0: 20 23 20 48 41 43 4b 3a 20 54 68 65 20 6e 61 74   # HACK: The nat
19c0: 69 76 65 20 53 74 72 6f 6e 67 4e 61 6d 65 53 69  ive StrongNameSi
19d0: 67 6e 61 74 75 72 65 56 65 72 69 66 69 63 61 74  gnatureVerificat
19e0: 69 6f 6e 45 78 28 29 20 66 75 6e 63 74 69 6f 6e  ionEx() function
19f0: 20 64 6f 65 73 0d 0a 20 20 20 20 23 20 20 20 20   does..    #    
1a00: 20 20 20 6e 6f 74 20 61 70 70 65 61 72 20 74 6f     not appear to
1a10: 20 77 6f 72 6b 20 6f 6e 20 57 4f 41 20 28 57 69   work on WOA (Wi
1a20: 6e 64 6f 77 73 2d 6f 6e 2d 41 52 4d 29 20 6f 6e  ndows-on-ARM) on
1a30: 20 74 68 65 20 53 75 72 66 61 63 65 20 52 54 0d   the Surface RT.
1a40: 0a 20 20 20 20 23 20 20 20 20 20 20 20 74 61 62  .    #       tab
1a50: 6c 65 74 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  let; therefore, 
1a60: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 61 62  attempt to disab
1a70: 6c 65 20 69 74 73 20 75 73 65 20 77 68 65 6e 20  le its use when 
1a80: 63 61 6c 6c 69 6e 67 0d 0a 20 20 20 20 23 20 20  calling..    #  
1a90: 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 75 70       into the up
1aa0: 64 61 74 65 72 20 6f 6e 20 74 68 61 74 20 70 6c  dater on that pl
1ab0: 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 23 0d 0a  atform...    #..
1ac0: 20 20 20 20 69 66 20 7b 5b 69 73 57 69 6e 64 6f      if {[isWindo
1ad0: 77 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ws] && \..      
1ae0: 20 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 74    [info exists t
1af0: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68  cl_platform(mach
1b00: 69 6e 65 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ine)] && \..    
1b10: 20 20 20 20 24 74 63 6c 5f 70 6c 61 74 66 6f 72      $tcl_platfor
1b20: 6d 28 6d 61 63 68 69 6e 65 29 20 65 71 20 22 61  m(machine) eq "a
1b30: 72 6d 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  rm"} then {..   
1b40: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1b50: 54 45 3a 20 57 65 20 61 70 70 65 61 72 20 74 6f  TE: We appear to
1b60: 20 62 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 57   be running on W
1b70: 4f 41 20 28 57 69 6e 64 6f 77 73 2d 6f 6e 2d 41  OA (Windows-on-A
1b80: 52 4d 29 2c 20 61 64 64 20 74 68 65 0d 0a 20 20  RM), add the..  
1b90: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d      #       comm
1ba0: 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 20  and line option 
1bb0: 74 68 61 74 20 73 6b 69 70 73 20 73 74 72 6f 6e  that skips stron
1bc0: 67 20 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74  g name verificat
1bd0: 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ion...      #.. 
1be0: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d       lappend com
1bf0: 6d 61 6e 64 20 2d 6e 6f 53 74 72 6f 6e 67 4e 61  mand -noStrongNa
1c00: 6d 65 53 69 67 6e 65 64 20 74 72 75 65 0d 0a 20  meSigned true.. 
1c10: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a 20     }....    #.. 
1c20: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72 65     # NOTE: If re
1c30: 71 75 65 73 74 65 64 2c 20 65 6e 61 62 6c 65 20  quested, enable 
1c40: 66 75 6c 6c 79 20 61 75 74 6f 6d 61 74 69 63 20  fully automatic 
1c50: 75 70 64 61 74 65 20 6d 6f 64 65 2e 0d 0a 20 20  update mode...  
1c60: 20 20 23 0d 0a 20 20 20 20 69 66 20 7b 24 61 75    #..    if {$au
1c70: 74 6f 6d 61 74 69 63 7d 20 74 68 65 6e 20 7b 0d  tomatic} then {.
1c80: 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63  .      lappend c
1c90: 6f 6d 6d 61 6e 64 20 2d 73 69 6c 65 6e 74 20 74  ommand -silent t
1ca0: 72 75 65 20 2d 63 6f 6e 66 69 72 6d 20 66 61 6c  rue -confirm fal
1cb0: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  se..    }....   
1cc0: 20 73 65 74 20 62 61 73 65 55 72 69 20 5b 67 65   set baseUri [ge
1cd0: 74 55 70 64 61 74 65 42 61 73 65 55 72 69 5d 0d  tUpdateBaseUri].
1ce0: 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69  ...    if {[stri
1cf0: 6e 67 20 6c 65 6e 67 74 68 20 24 62 61 73 65 55  ng length $baseU
1d00: 72 69 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ri] > 0} then {.
1d10: 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63  .      lappend c
1d20: 6f 6d 6d 61 6e 64 20 2d 62 61 73 65 55 72 69 20  ommand -baseUri 
1d30: 24 62 61 73 65 55 72 69 0d 0a 20 20 20 20 7d 0d  $baseUri..    }.
1d40: 0a 0d 0a 20 20 20 20 73 65 74 20 70 61 74 68 41  ...    set pathA
1d50: 6e 64 51 75 65 72 79 20 5b 67 65 74 55 70 64 61  ndQuery [getUpda
1d60: 74 65 50 61 74 68 41 6e 64 51 75 65 72 79 5d 0d  tePathAndQuery].
1d70: 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69  ...    if {[stri
1d80: 6e 67 20 6c 65 6e 67 74 68 20 24 70 61 74 68 41  ng length $pathA
1d90: 6e 64 51 75 65 72 79 5d 20 3e 20 30 7d 20 74 68  ndQuery] > 0} th
1da0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 6c 61 70 70  en {..      lapp
1db0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 2d 74 61 67  end command -tag
1dc0: 50 61 74 68 41 6e 64 51 75 65 72 79 20 24 70 61  PathAndQuery $pa
1dd0: 74 68 41 6e 64 51 75 65 72 79 0d 0a 20 20 20 20  thAndQuery..    
1de0: 7d 0d 0a 0d 0a 20 20 20 20 65 76 61 6c 20 24 63  }....    eval $c
1df0: 6f 6d 6d 61 6e 64 20 26 3b 20 65 78 69 74 20 2d  ommand &; exit -
1e00: 66 6f 72 63 65 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20  force..  }..... 
1e10: 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68   #..  # NOTE: Th
1e20: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
1e30: 75 72 6e 73 20 74 68 65 20 62 61 73 65 20 55 52  urns the base UR
1e40: 49 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  I that should be
1e50: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 0d 0a   used to check..
1e60: 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 61 76    #       for av
1e70: 61 69 6c 61 62 6c 65 20 75 70 64 61 74 65 73 2e  ailable updates.
1e80: 0d 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20 67 65  ..  #..  proc ge
1e90: 74 55 70 64 61 74 65 42 61 73 65 55 72 69 20 7b  tUpdateBaseUri {
1ea0: 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  } {..    #..    
1eb0: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
1ec0: 65 20 63 75 72 72 65 6e 74 20 62 61 73 65 20 55  e current base U
1ed0: 52 49 20 66 6f 72 20 75 70 64 61 74 65 73 20 61  RI for updates a
1ee0: 67 61 69 6e 73 74 20 74 68 65 20 6f 6e 65 20 62  gainst the one b
1ef0: 61 6b 65 64 0d 0a 20 20 20 20 23 20 20 20 20 20  aked..    #     
1f00: 20 20 69 6e 74 6f 20 74 68 65 20 61 73 73 65 6d    into the assem
1f10: 62 6c 79 2e 20 20 49 66 20 74 68 65 79 20 61 72  bly.  If they ar
1f20: 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68 65  e different, the
1f30: 6e 20 74 68 65 20 62 61 73 65 20 55 52 49 0d 0a  n the base URI..
1f40: 20 20 20 20 23 20 20 20 20 20 20 20 6d 75 73 74      #       must
1f50: 20 68 61 76 65 20 62 65 65 6e 20 6f 76 65 72 72   have been overr
1f60: 69 64 64 65 6e 2e 20 20 49 6e 20 74 68 61 74 20  idden.  In that 
1f70: 63 61 73 65 2c 20 77 65 20 6d 75 73 74 20 72 65  case, we must re
1f80: 74 75 72 6e 20 74 68 65 0d 0a 20 20 20 20 23 20  turn the..    # 
1f90: 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 62 61        current ba
1fa0: 73 65 20 55 52 49 3b 20 6f 74 68 65 72 77 69 73  se URI; otherwis
1fb0: 65 2c 20 77 65 20 6d 75 73 74 20 72 65 74 75 72  e, we must retur
1fc0: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
1fd0: 67 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73  g...    #..    s
1fe0: 65 74 20 62 61 73 65 55 72 69 28 30 29 20 5b 69  et baseUri(0) [i
1ff0: 6e 66 6f 20 65 6e 67 69 6e 65 20 55 70 64 61 74  nfo engine Updat
2000: 65 42 61 73 65 55 72 69 20 66 61 6c 73 65 5d 3b  eBaseUri false];
2010: 20 23 20 4e 4f 54 45 3a 20 43 75 72 72 65 6e 74   # NOTE: Current
2020: 2e 0d 0a 20 20 20 20 73 65 74 20 62 61 73 65 55  ...    set baseU
2030: 72 69 28 31 29 20 5b 69 6e 66 6f 20 65 6e 67 69  ri(1) [info engi
2040: 6e 65 20 55 70 64 61 74 65 42 61 73 65 55 72 69  ne UpdateBaseUri
2050: 20 74 72 75 65 5d 3b 20 20 23 20 4e 4f 54 45 3a   true];  # NOTE:
2060: 20 44 65 66 61 75 6c 74 2e 0d 0a 0d 0a 20 20 20   Default.....   
2070: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
2080: 67 74 68 20 24 62 61 73 65 55 72 69 28 30 29 5d  gth $baseUri(0)]
2090: 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20   > 0 && \..     
20a0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
20b0: 68 20 24 62 61 73 65 55 72 69 28 31 29 5d 20 3e  h $baseUri(1)] >
20c0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
20d0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
20e0: 45 3a 20 4f 6b 2c 20 74 68 65 79 20 61 72 65 20  E: Ok, they are 
20f0: 62 6f 74 68 20 76 61 6c 69 64 2e 20 20 41 72 65  both valid.  Are
2100: 20 74 68 65 79 20 64 69 66 66 65 72 65 6e 74 3f   they different?
2110: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2120: 20 69 66 20 7b 24 62 61 73 65 55 72 69 28 30 29   if {$baseUri(0)
2130: 20 6e 65 20 24 62 61 73 65 55 72 69 28 31 29 7d   ne $baseUri(1)}
2140: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2150: 20 72 65 74 75 72 6e 20 24 62 61 73 65 55 72 69   return $baseUri
2160: 28 30 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  (0)..      }..  
2170: 20 20 7d 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72    }....    retur
2180: 6e 20 22 22 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20  n ""..  }.....  
2190: 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69  #..  # NOTE: Thi
21a0: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
21b0: 72 6e 73 20 74 68 65 20 70 61 74 68 20 61 6e 64  rns the path and
21c0: 20 71 75 65 72 79 20 70 6f 72 74 69 6f 6e 73 20   query portions 
21d0: 6f 66 20 74 68 65 20 55 52 49 0d 0a 20 20 23 20  of the URI..  # 
21e0: 20 20 20 20 20 20 74 68 61 74 20 73 68 6f 75 6c        that shoul
21f0: 64 20 62 65 20 75 73 65 64 20 74 6f 20 63 68 65  d be used to che
2200: 63 6b 20 66 6f 72 20 61 76 61 69 6c 61 62 6c 65  ck for available
2210: 20 75 70 64 61 74 65 73 2e 0d 0a 20 20 23 0d 0a   updates...  #..
2220: 20 20 70 72 6f 63 20 67 65 74 55 70 64 61 74 65    proc getUpdate
2230: 50 61 74 68 41 6e 64 51 75 65 72 79 20 7b 7d 20  PathAndQuery {} 
2240: 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  {..    #..    # 
2250: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
2260: 63 75 72 72 65 6e 74 20 74 61 67 20 70 61 74 68  current tag path
2270: 20 61 6e 64 20 71 75 65 72 79 20 66 6f 72 20 75   and query for u
2280: 70 64 61 74 65 73 20 61 67 61 69 6e 73 74 20 74  pdates against t
2290: 68 65 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  he..    #       
22a0: 6f 6e 65 20 62 61 6b 65 64 20 69 6e 74 6f 20 74  one baked into t
22b0: 68 65 20 61 73 73 65 6d 62 6c 79 2e 20 20 49 66  he assembly.  If
22c0: 20 74 68 65 79 20 61 72 65 20 64 69 66 66 65 72   they are differ
22d0: 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 0d 0a 20  ent, then the.. 
22e0: 20 20 20 23 20 20 20 20 20 20 20 74 61 67 20 70     #       tag p
22f0: 61 74 68 20 61 6e 64 20 71 75 65 72 79 20 6d 75  ath and query mu
2300: 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 76 65  st have been ove
2310: 72 72 69 64 64 65 6e 2e 20 20 49 6e 20 74 68 61  rridden.  In tha
2320: 74 20 63 61 73 65 2c 0d 0a 20 20 20 20 23 20 20  t case,..    #  
2330: 20 20 20 20 20 77 65 20 6d 75 73 74 20 72 65 74       we must ret
2340: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
2350: 74 61 67 20 70 61 74 68 20 61 6e 64 20 71 75 65  tag path and que
2360: 72 79 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 77  ry; otherwise, w
2370: 65 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20 6d  e..    #       m
2380: 75 73 74 20 72 65 74 75 72 6e 20 61 6e 20 65 6d  ust return an em
2390: 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20  pty string...   
23a0: 20 23 0d 0a 20 20 20 20 73 65 74 20 70 61 74 68   #..    set path
23b0: 41 6e 64 51 75 65 72 79 28 30 29 20 5b 69 6e 66  AndQuery(0) [inf
23c0: 6f 20 65 6e 67 69 6e 65 20 55 70 64 61 74 65 50  o engine UpdateP
23d0: 61 74 68 41 6e 64 51 75 65 72 79 20 5c 0d 0a 20  athAndQuery \.. 
23e0: 20 20 20 20 20 20 20 66 61 6c 73 65 5d 3b 20 23         false]; #
23f0: 20 4e 4f 54 45 3a 20 43 75 72 72 65 6e 74 2e 0d   NOTE: Current..
2400: 0a 0d 0a 20 20 20 20 73 65 74 20 70 61 74 68 41  ...    set pathA
2410: 6e 64 51 75 65 72 79 28 31 29 20 5b 69 6e 66 6f  ndQuery(1) [info
2420: 20 65 6e 67 69 6e 65 20 55 70 64 61 74 65 50 61   engine UpdatePa
2430: 74 68 41 6e 64 51 75 65 72 79 20 5c 0d 0a 20 20  thAndQuery \..  
2440: 20 20 20 20 20 20 74 72 75 65 5d 3b 20 20 23 20        true];  # 
2450: 4e 4f 54 45 3a 20 44 65 66 61 75 6c 74 2e 0d 0a  NOTE: Default...
2460: 0d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e  ..    if {[strin
2470: 67 20 6c 65 6e 67 74 68 20 24 70 61 74 68 41 6e  g length $pathAn
2480: 64 51 75 65 72 79 28 30 29 5d 20 3e 20 30 20 26  dQuery(0)] > 0 &
2490: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 5b 73 74  & \..        [st
24a0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 61 74  ring length $pat
24b0: 68 41 6e 64 51 75 65 72 79 28 31 29 5d 20 3e 20  hAndQuery(1)] > 
24c0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
24d0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
24e0: 3a 20 4f 6b 2c 20 74 68 65 79 20 61 72 65 20 62  : Ok, they are b
24f0: 6f 74 68 20 76 61 6c 69 64 2e 20 20 41 72 65 20  oth valid.  Are 
2500: 74 68 65 79 20 64 69 66 66 65 72 65 6e 74 3f 0d  they different?.
2510: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2520: 69 66 20 7b 24 70 61 74 68 41 6e 64 51 75 65 72  if {$pathAndQuer
2530: 79 28 30 29 20 6e 65 20 24 70 61 74 68 41 6e 64  y(0) ne $pathAnd
2540: 51 75 65 72 79 28 31 29 7d 20 74 68 65 6e 20 7b  Query(1)} then {
2550: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
2560: 20 24 70 61 74 68 41 6e 64 51 75 65 72 79 28 30   $pathAndQuery(0
2570: 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  )..      }..    
2580: 7d 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20  }....    return 
2590: 22 22 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23 0d  ""..  }.....  #.
25a0: 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20  .  # NOTE: This 
25b0: 70 72 6f 63 65 64 75 72 65 20 64 6f 77 6e 6c 6f  procedure downlo
25c0: 61 64 73 20 74 68 65 20 61 76 61 69 6c 61 62 6c  ads the availabl
25d0: 65 20 75 70 64 61 74 65 20 64 61 74 61 20 61 6e  e update data an
25e0: 64 20 72 65 74 75 72 6e 73 0d 0a 20 20 23 20 20  d returns..  #  
25f0: 20 20 20 20 20 69 74 20 76 65 72 62 61 74 69 6d       it verbatim
2600: 2e 0d 0a 20 20 23 0d 0a 20 20 70 72 6f 63 20 67  ...  #..  proc g
2610: 65 74 55 70 64 61 74 65 44 61 74 61 20 7b 20 75  etUpdateData { u
2620: 72 69 20 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20  ri } {..    #.. 
2630: 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 61 72 74     # NOTE: Start
2640: 20 74 72 75 73 74 69 6e 67 20 4f 4e 4c 59 20 6f   trusting ONLY o
2650: 75 72 20 6f 77 6e 20 73 65 6c 66 2d 73 69 67 6e  ur own self-sign
2660: 65 64 20 53 53 4c 20 63 65 72 74 69 66 69 63 61  ed SSL certifica
2670: 74 65 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  te...    #..    
2680: 73 65 74 20 74 72 75 73 74 65 64 20 74 72 75 65  set trusted true
2690: 0d 0a 0d 0a 20 20 20 20 69 66 20 7b 5b 6c 69 6e  ....    if {[lin
26a0: 64 65 78 20 5b 75 72 69 20 73 6f 66 74 77 61 72  dex [uri softwar
26b0: 65 75 70 64 61 74 65 73 5d 20 65 6e 64 5d 20 65  eupdates] end] e
26c0: 71 20 22 75 6e 74 72 75 73 74 65 64 22 7d 20 74  q "untrusted"} t
26d0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 75 72 69  hen {..      uri
26e0: 20 73 6f 66 74 77 61 72 65 75 70 64 61 74 65 73   softwareupdates
26f0: 20 74 72 75 65 0d 0a 20 20 20 20 7d 20 65 6c 73   true..    } els
2700: 65 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 74  e {..      set t
2710: 72 75 73 74 65 64 20 66 61 6c 73 65 3b 20 23 20  rusted false; # 
2720: 4e 4f 54 45 3a 20 41 6c 72 65 61 64 79 20 74 72  NOTE: Already tr
2730: 75 73 74 65 64 2e 0d 0a 20 20 20 20 7d 0d 0a 0d  usted...    }...
2740: 0a 20 20 20 20 74 72 79 20 7b 0d 0a 20 20 20 20  .    try {..    
2750: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
2760: 45 3a 20 44 6f 77 6e 6c 6f 61 64 20 74 68 65 20  E: Download the 
2770: 74 61 67 20 66 69 6c 65 20 66 72 6f 6d 20 74 68  tag file from th
2780: 65 20 77 65 62 20 73 69 74 65 2e 0d 0a 20 20 20  e web site...   
2790: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
27a0: 72 6e 20 5b 75 72 69 20 64 6f 77 6e 6c 6f 61 64  rn [uri download
27b0: 20 2d 69 6e 6c 69 6e 65 20 24 75 72 69 5d 3b 20   -inline $uri]; 
27c0: 23 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e 0d 0a  # synchronous...
27d0: 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d      } finally {.
27e0: 0a 20 20 20 20 20 20 69 66 20 7b 24 74 72 75 73  .      if {$trus
27f0: 74 65 64 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ted && \..      
2800: 20 20 20 20 5b 6c 69 6e 64 65 78 20 5b 75 72 69      [lindex [uri
2810: 20 73 6f 66 74 77 61 72 65 75 70 64 61 74 65 73   softwareupdates
2820: 5d 20 65 6e 64 5d 20 65 71 20 22 74 72 75 73 74  ] end] eq "trust
2830: 65 64 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ed"} then {..   
2840: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2850: 23 20 4e 4f 54 45 3a 20 53 74 6f 70 20 74 72 75  # NOTE: Stop tru
2860: 73 74 69 6e 67 20 4f 4e 4c 59 20 6f 75 72 20 6f  sting ONLY our o
2870: 77 6e 20 73 65 6c 66 2d 73 69 67 6e 65 64 20 53  wn self-signed S
2880: 53 4c 20 63 65 72 74 69 66 69 63 61 74 65 2e 0d  SL certificate..
2890: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
28a0: 20 20 20 20 75 72 69 20 73 6f 66 74 77 61 72 65      uri software
28b0: 75 70 64 61 74 65 73 20 66 61 6c 73 65 0d 0a 20  updates false.. 
28c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20       }..    }.. 
28d0: 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23 20   }.....  #..  # 
28e0: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
28f0: 64 75 72 65 20 64 6f 77 6e 6c 6f 61 64 73 20 61  dure downloads a
2900: 6e 20 75 70 64 61 74 65 20 73 63 72 69 70 74 20  n update script 
2910: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 73  and then returns
2920: 20 69 74 0d 0a 20 20 23 20 20 20 20 20 20 20 76   it..  #       v
2930: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 23 0d 0a 20  erbatim...  #.. 
2940: 20 70 72 6f 63 20 67 65 74 55 70 64 61 74 65 53   proc getUpdateS
2950: 63 72 69 70 74 44 61 74 61 20 7b 20 75 72 69 20  criptData { uri 
2960: 7d 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20  } {..    #..    
2970: 23 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 74 72  # NOTE: Start tr
2980: 75 73 74 69 6e 67 20 4f 4e 4c 59 20 6f 75 72 20  usting ONLY our 
2990: 6f 77 6e 20 73 65 6c 66 2d 73 69 67 6e 65 64 20  own self-signed 
29a0: 53 53 4c 20 63 65 72 74 69 66 69 63 61 74 65 2e  SSL certificate.
29b0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73 65 74  ..    #..    set
29c0: 20 74 72 75 73 74 65 64 20 74 72 75 65 0d 0a 0d   trusted true...
29d0: 0a 20 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78  .    if {[lindex
29e0: 20 5b 75 72 69 20 73 6f 66 74 77 61 72 65 75 70   [uri softwareup
29f0: 64 61 74 65 73 5d 20 65 6e 64 5d 20 65 71 20 22  dates] end] eq "
2a00: 75 6e 74 72 75 73 74 65 64 22 7d 20 74 68 65 6e  untrusted"} then
2a10: 20 7b 0d 0a 20 20 20 20 20 20 75 72 69 20 73 6f   {..      uri so
2a20: 66 74 77 61 72 65 75 70 64 61 74 65 73 20 74 72  ftwareupdates tr
2a30: 75 65 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ue..    } else {
2a40: 0d 0a 20 20 20 20 20 20 73 65 74 20 74 72 75 73  ..      set trus
2a50: 74 65 64 20 66 61 6c 73 65 3b 20 23 20 4e 4f 54  ted false; # NOT
2a60: 45 3a 20 41 6c 72 65 61 64 79 20 74 72 75 73 74  E: Already trust
2a70: 65 64 2e 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  ed...    }....  
2a80: 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 23    try {..      #
2a90: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
2aa0: 44 6f 77 6e 6c 6f 61 64 20 74 68 65 20 73 63 72  Download the scr
2ab0: 69 70 74 20 66 69 6c 65 20 66 72 6f 6d 20 74 68  ipt file from th
2ac0: 65 20 77 65 62 20 73 69 74 65 2e 0d 0a 20 20 20  e web site...   
2ad0: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
2ae0: 72 6e 20 5b 69 6e 74 65 72 70 20 72 65 61 64 6f  rn [interp reado
2af0: 72 67 65 74 73 63 72 69 70 74 66 69 6c 65 20 2d  rgetscriptfile -
2b00: 2d 20 22 22 20 24 75 72 69 5d 3b 20 23 20 73 79  - "" $uri]; # sy
2b10: 6e 63 68 72 6f 6e 6f 75 73 2e 0d 0a 20 20 20 20  nchronous...    
2b20: 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20  } finally {..   
2b30: 20 20 20 69 66 20 7b 24 74 72 75 73 74 65 64 20     if {$trusted 
2b40: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
2b50: 5b 6c 69 6e 64 65 78 20 5b 75 72 69 20 73 6f 66  [lindex [uri sof
2b60: 74 77 61 72 65 75 70 64 61 74 65 73 5d 20 65 6e  twareupdates] en
2b70: 64 5d 20 65 71 20 22 74 72 75 73 74 65 64 22 7d  d] eq "trusted"}
2b80: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2b90: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2ba0: 54 45 3a 20 53 74 6f 70 20 74 72 75 73 74 69 6e  TE: Stop trustin
2bb0: 67 20 4f 4e 4c 59 20 6f 75 72 20 6f 77 6e 20 73  g ONLY our own s
2bc0: 65 6c 66 2d 73 69 67 6e 65 64 20 53 53 4c 20 63  elf-signed SSL c
2bd0: 65 72 74 69 66 69 63 61 74 65 2e 0d 0a 20 20 20  ertificate...   
2be0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2bf0: 75 72 69 20 73 6f 66 74 77 61 72 65 75 70 64 61  uri softwareupda
2c00: 74 65 73 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  tes false..     
2c10: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a   }..    }..  }..
2c20: 0c 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45  ...  #..  # NOTE
2c30: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
2c40: 20 72 65 74 75 72 6e 73 20 74 68 65 20 62 61 73   returns the bas
2c50: 65 20 55 52 49 20 74 68 61 74 20 73 68 6f 75 6c  e URI that shoul
2c60: 64 20 62 65 20 75 73 65 64 20 74 6f 20 64 6f 77  d be used to dow
2c70: 6e 6c 6f 61 64 0d 0a 20 20 23 20 20 20 20 20 20  nload..  #      
2c80: 20 61 76 61 69 6c 61 62 6c 65 20 75 70 64 61 74   available updat
2c90: 65 73 2c 20 69 66 20 61 20 73 70 65 63 69 66 69  es, if a specifi
2ca0: 63 20 62 61 73 65 20 55 52 49 20 69 73 20 6e 6f  c base URI is no
2cb0: 74 20 73 70 65 63 69 66 69 65 64 20 76 69 61 20  t specified via 
2cc0: 74 68 65 0d 0a 20 20 23 20 20 20 20 20 20 20 6d  the..  #       m
2cd0: 61 6e 69 66 65 73 74 20 6f 66 20 61 76 61 69 6c  anifest of avail
2ce0: 61 62 6c 65 20 75 70 64 61 74 65 73 2e 0d 0a 20  able updates... 
2cf0: 20 23 0d 0a 20 20 70 72 6f 63 20 67 65 74 44 6f   #..  proc getDo
2d00: 77 6e 6c 6f 61 64 42 61 73 65 55 72 69 20 7b 7d  wnloadBaseUri {}
2d10: 20 7b 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23   {..    #..    #
2d20: 20 4e 4f 54 45 3a 20 4a 75 73 74 20 72 65 74 75   NOTE: Just retu
2d30: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 62  rn the current b
2d40: 61 73 65 20 55 52 49 20 66 6f 72 20 64 6f 77 6e  ase URI for down
2d50: 6c 6f 61 64 73 2e 0d 0a 20 20 20 20 23 0d 0a 20  loads...    #.. 
2d60: 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20     return [info 
2d70: 65 6e 67 69 6e 65 20 44 6f 77 6e 6c 6f 61 64 42  engine DownloadB
2d80: 61 73 65 55 72 69 5d 3b 20 23 20 4e 4f 54 45 3a  aseUri]; # NOTE:
2d90: 20 43 75 72 72 65 6e 74 2e 0d 0a 20 20 7d 0d 0a   Current...  }..
2da0: 0c 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45  ...  #..  # NOTE
2db0: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
2dc0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 62 61 73   returns the bas
2dd0: 65 20 55 52 49 20 74 68 61 74 20 73 68 6f 75 6c  e URI that shoul
2de0: 64 20 62 65 20 75 73 65 64 20 74 6f 20 64 6f 77  d be used to dow
2df0: 6e 6c 6f 61 64 0d 0a 20 20 23 20 20 20 20 20 20  nload..  #      
2e00: 20 61 76 61 69 6c 61 62 6c 65 20 73 63 72 69 70   available scrip
2e10: 74 73 2c 20 69 66 20 61 20 73 70 65 63 69 66 69  ts, if a specifi
2e20: 63 20 62 61 73 65 20 55 52 49 20 69 73 20 6e 6f  c base URI is no
2e30: 74 20 73 70 65 63 69 66 69 65 64 20 76 69 61 20  t specified via 
2e40: 74 68 65 0d 0a 20 20 23 20 20 20 20 20 20 20 6d  the..  #       m
2e50: 61 6e 69 66 65 73 74 20 6f 66 20 61 76 61 69 6c  anifest of avail
2e60: 61 62 6c 65 20 73 63 72 69 70 74 73 2e 0d 0a 20  able scripts... 
2e70: 20 23 0d 0a 20 20 70 72 6f 63 20 67 65 74 53 63   #..  proc getSc
2e80: 72 69 70 74 42 61 73 65 55 72 69 20 7b 7d 20 7b  riptBaseUri {} {
2e90: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
2ea0: 4f 54 45 3a 20 4a 75 73 74 20 72 65 74 75 72 6e  OTE: Just return
2eb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 61 73   the current bas
2ec0: 65 20 55 52 49 20 66 6f 72 20 73 63 72 69 70 74  e URI for script
2ed0: 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 72  s...    #..    r
2ee0: 65 74 75 72 6e 20 5b 69 6e 66 6f 20 65 6e 67 69  eturn [info engi
2ef0: 6e 65 20 53 63 72 69 70 74 42 61 73 65 55 72 69  ne ScriptBaseUri
2f00: 5d 3b 20 23 20 4e 4f 54 45 3a 20 43 75 72 72 65  ]; # NOTE: Curre
2f10: 6e 74 2e 0d 0a 20 20 7d 0d 0a 0c 0d 0a 20 20 23  nt...  }.....  #
2f20: 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73  ..  # NOTE: This
2f30: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
2f40: 6e 73 20 74 68 65 20 62 61 73 65 20 55 52 49 20  ns the base URI 
2f50: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
2f60: 73 65 64 20 74 6f 20 64 6f 77 6e 6c 6f 61 64 0d  sed to download.
2f70: 0a 20 20 23 20 20 20 20 20 20 20 61 75 78 69 6c  .  #       auxil
2f80: 69 61 72 79 20 64 61 74 61 2e 0d 0a 20 20 23 0d  iary data...  #.
2f90: 0a 20 20 70 72 6f 63 20 67 65 74 41 75 78 69 6c  .  proc getAuxil
2fa0: 69 61 72 79 42 61 73 65 55 72 69 20 7b 7d 20 7b  iaryBaseUri {} {
2fb0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e  ..    #..    # N
2fc0: 4f 54 45 3a 20 4a 75 73 74 20 72 65 74 75 72 6e  OTE: Just return
2fd0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 61 73   the current bas
2fe0: 65 20 55 52 49 20 66 6f 72 20 61 75 78 69 6c 69  e URI for auxili
2ff0: 61 72 79 20 64 61 74 61 2e 0d 0a 20 20 20 20 23  ary data...    #
3000: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 69 6e  ..    return [in
3010: 66 6f 20 65 6e 67 69 6e 65 20 41 75 78 69 6c 69  fo engine Auxili
3020: 61 72 79 42 61 73 65 55 72 69 5d 3b 20 23 20 4e  aryBaseUri]; # N
3030: 4f 54 45 3a 20 43 75 72 72 65 6e 74 2e 0d 0a 20  OTE: Current... 
3040: 20 7d 0d 0a 0c 0d 0a 20 20 23 0d 0a 20 20 23 20   }.....  #..  # 
3050: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
3060: 64 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  dure is used to 
3070: 63 68 65 63 6b 20 66 6f 72 20 6e 65 77 20 76 65  check for new ve
3080: 72 73 69 6f 6e 73 20 2d 4f 52 2d 20 6e 65 77 20  rsions -OR- new 
3090: 75 70 64 61 74 65 0d 0a 20 20 23 20 20 20 20 20  update..  #     
30a0: 20 20 73 63 72 69 70 74 73 20 66 6f 72 20 74 68    scripts for th
30b0: 65 20 72 75 6e 74 69 6d 65 20 77 68 65 6e 20 61  e runtime when a
30c0: 20 75 73 65 72 20 65 78 65 63 75 74 65 73 20 74   user executes t
30d0: 68 65 20 69 6e 74 65 72 61 63 74 69 76 65 0d 0a  he interactive..
30e0: 20 20 23 20 20 20 20 20 20 20 22 23 63 68 65 63    #       "#chec
30f0: 6b 22 20 63 6f 6d 6d 61 6e 64 2e 20 20 54 6f 20  k" command.  To 
3100: 64 69 73 61 62 6c 65 20 74 68 69 73 20 66 75 6e  disable this fun
3110: 63 74 69 6f 6e 61 6c 69 74 79 2c 20 73 69 6d 70  ctionality, simp
3120: 6c 79 20 72 65 64 65 66 69 6e 65 0d 0a 20 20 23  ly redefine..  #
3130: 20 20 20 20 20 20 20 74 68 69 73 20 70 72 6f 63         this proc
3140: 65 64 75 72 65 20 74 6f 20 64 6f 20 6e 6f 74 68  edure to do noth
3150: 69 6e 67 2e 0d 0a 20 20 23 0d 0a 20 20 70 72 6f  ing...  #..  pro
3160: 63 20 63 68 65 63 6b 46 6f 72 55 70 64 61 74 65  c checkForUpdate
3170: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 77   {..          {w
3180: 61 6e 74 53 63 72 69 70 74 73 20 66 61 6c 73 65  antScripts false
3190: 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
31a0: 7b 70 72 6f 6d 70 74 20 66 61 6c 73 65 7d 0d 0a  {prompt false}..
31b0: 20 20 20 20 20 20 20 20 20 20 7b 61 75 74 6f 6d            {autom
31c0: 61 74 69 63 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  atic false} } {.
31d0: 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f  .    #..    # NO
31e0: 54 45 3a 20 47 72 61 62 20 74 68 65 20 62 61 73  TE: Grab the bas
31f0: 65 20 55 52 49 20 66 6f 72 20 75 70 64 61 74 65  e URI for update
3200: 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73  s...    #..    s
3210: 65 74 20 75 70 64 61 74 65 42 61 73 65 55 72 69  et updateBaseUri
3220: 20 5b 69 6e 66 6f 20 65 6e 67 69 6e 65 20 55 70   [info engine Up
3230: 64 61 74 65 42 61 73 65 55 72 69 5d 0d 0a 0d 0a  dateBaseUri]....
3240: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
3250: 45 3a 20 47 72 61 62 20 74 68 65 20 75 70 64 61  E: Grab the upda
3260: 74 65 20 70 61 74 68 20 61 6e 64 20 71 75 65 72  te path and quer
3270: 79 20 73 74 72 69 6e 67 20 75 73 65 64 20 66 6f  y string used fo
3280: 72 20 75 70 64 61 74 65 73 2e 0d 0a 20 20 20 20  r updates...    
3290: 23 0d 0a 20 20 20 20 73 65 74 20 75 70 64 61 74  #..    set updat
32a0: 65 50 61 74 68 41 6e 64 51 75 65 72 79 20 5b 69  ePathAndQuery [i
32b0: 6e 66 6f 20 65 6e 67 69 6e 65 20 55 70 64 61 74  nfo engine Updat
32c0: 65 50 61 74 68 41 6e 64 51 75 65 72 79 5d 0d 0a  ePathAndQuery]..
32d0: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20 48  ..    #..    # H
32e0: 41 43 4b 3a 20 45 78 72 61 63 74 20 74 68 65 20  ACK: Exract the 
32f0: 55 52 49 20 74 79 70 65 20 28 65 2e 67 2e 20 22  URI type (e.g. "
3300: 73 74 61 62 6c 65 22 20 6f 72 20 22 6c 61 74 65  stable" or "late
3310: 73 74 22 29 20 66 72 6f 6d 20 74 68 65 0d 0a 20  st") from the.. 
3320: 20 20 20 23 20 20 20 20 20 20 20 75 70 64 61 74     #       updat
3330: 65 20 70 61 74 68 20 61 6e 64 20 71 75 65 72 79  e path and query
3340: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 6d 61 79  .  This code may
3350: 20 6e 65 65 64 20 74 6f 20 62 65 20 6d 6f 64 69   need to be modi
3360: 66 69 65 64 0d 0a 20 20 20 20 23 20 20 20 20 20  fied..    #     
3370: 20 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e    in the future.
3380: 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 73 65 74  ..    #..    set
3390: 20 75 70 64 61 74 65 55 72 69 54 79 70 65 20 5b   updateUriType [
33a0: 6c 69 6e 64 65 78 20 5b 73 70 6c 69 74 20 24 75  lindex [split $u
33b0: 70 64 61 74 65 50 61 74 68 41 6e 64 51 75 65 72  pdatePathAndQuer
33c0: 79 20 2e 5d 20 30 5d 0d 0a 0d 0a 20 20 20 20 23  y .] 0]....    #
33d0: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f  ..    # NOTE: Co
33e0: 6d 62 69 6e 65 20 74 68 65 6d 20 74 6f 20 66 6f  mbine them to fo
33f0: 72 6d 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  rm the complete 
3400: 75 70 64 61 74 65 20 55 52 49 2e 0d 0a 20 20 20  update URI...   
3410: 20 23 0d 0a 20 20 20 20 73 65 74 20 75 70 64 61   #..    set upda
3420: 74 65 55 72 69 20 5b 61 70 70 65 6e 64 41 72 67  teUri [appendArg
3430: 73 20 24 75 70 64 61 74 65 42 61 73 65 55 72 69  s $updateBaseUri
3440: 20 24 75 70 64 61 74 65 50 61 74 68 41 6e 64 51   $updatePathAndQ
3450: 75 65 72 79 5d 0d 0a 0d 0a 20 20 20 20 23 0d 0a  uery]....    #..
3460: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 65 74 63      # NOTE: Fetc
3470: 68 20 74 68 65 20 6d 61 73 74 65 72 20 75 70 64  h the master upd
3480: 61 74 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ate data from th
3490: 65 20 64 69 73 74 72 69 62 75 74 69 6f 6e 20 73  e distribution s
34a0: 69 74 65 0d 0a 20 20 20 20 23 20 20 20 20 20 20  ite..    #      
34b0: 20 61 6e 64 20 6e 6f 72 6d 61 6c 69 7a 65 20 74   and normalize t
34c0: 6f 20 55 6e 69 78 2d 73 74 79 6c 65 20 6c 69 6e  o Unix-style lin
34d0: 65 2d 65 6e 64 69 6e 67 73 2e 0d 0a 20 20 20 20  e-endings...    
34e0: 23 0d 0a 20 20 20 20 73 65 74 20 75 70 64 61 74  #..    set updat
34f0: 65 44 61 74 61 20 5b 73 74 72 69 6e 67 20 6d 61  eData [string ma
3500: 70 20 5b 6c 69 73 74 20 5c 72 5c 6e 20 5c 6e 5d  p [list \r\n \n]
3510: 20 5b 67 65 74 55 70 64 61 74 65 44 61 74 61 20   [getUpdateData 
3520: 24 75 70 64 61 74 65 55 72 69 5d 5d 0d 0a 0d 0a  $updateUri]]....
3530: 20 20 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54      #..    # NOT
3540: 45 3a 20 53 70 6c 69 74 20 74 68 65 20 64 61 74  E: Split the dat
3550: 61 20 69 6e 74 6f 20 6c 69 6e 65 73 2e 0d 0a 20  a into lines... 
3560: 20 20 20 23 0d 0a 20 20 20 20 73 65 74 20 6c 69     #..    set li
3570: 6e 65 73 20 5b 73 70 6c 69 74 20 24 75 70 64 61  nes [split $upda
3580: 74 65 44 61 74 61 20 5c 6e 5d 0d 0a 0d 0a 20 20  teData \n]....  
3590: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
35a0: 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 68   Keep track of h
35b0: 6f 77 20 6d 61 6e 79 20 75 70 64 61 74 65 20 73  ow many update s
35c0: 63 72 69 70 74 73 20 61 72 65 20 70 72 6f 63 65  cripts are proce
35d0: 73 73 65 64 2e 0d 0a 20 20 20 20 23 0d 0a 20 20  ssed...    #..  
35e0: 20 20 61 72 72 61 79 20 73 65 74 20 73 63 72 69    array set scri
35f0: 70 74 43 6f 75 6e 74 20 7b 0d 0a 20 20 20 20 20  ptCount {..     
3600: 20 69 6e 76 61 6c 69 64 20 20 20 20 20 20 20 20   invalid        
3610: 20 20 20 20 30 20 66 61 69 6c 20 20 20 20 20 20      0 fail      
3620: 20 20 20 20 20 20 20 20 20 30 20 62 61 64 20 20           0 bad  
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0d                0.
3640: 0a 20 20 20 20 20 20 6f 6b 20 20 20 20 20 20 20  .      ok       
3650: 20 20 20 20 20 20 20 20 20 20 30 20 65 72 72 6f            0 erro
3660: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  r              0
3670: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23  ..    }....    #
3680: 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68  ..    # NOTE: Ch
3690: 65 63 6b 20 65 61 63 68 20 6c 69 6e 65 20 74 6f  eck each line to
36a0: 20 66 69 6e 64 20 74 68 65 20 62 75 69 6c 64 20   find the build 
36b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 2e 2e 0d 0a  information.....
36c0: 20 20 20 20 23 0d 0a 20 20 20 20 66 6f 72 65 61      #..    forea
36d0: 63 68 20 6c 69 6e 65 20 24 6c 69 6e 65 73 20 7b  ch line $lines {
36e0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
36f0: 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f 76 65 20   # NOTE: Remove 
3700: 65 78 63 65 73 73 20 77 68 69 74 65 73 70 61 63  excess whitespac
3710: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
3720: 20 20 20 73 65 74 20 6c 69 6e 65 20 5b 73 74 72     set line [str
3730: 69 6e 67 20 74 72 69 6d 20 24 6c 69 6e 65 5d 0d  ing trim $line].
3740: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3750: 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 62    # NOTE: Skip b
3760: 6c 61 6e 6b 20 6c 69 6e 65 73 2e 0d 0a 20 20 20  lank lines...   
3770: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
3780: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
3790: 6c 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  line] > 0} then 
37a0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
37b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
37c0: 69 70 20 63 6f 6d 6d 65 6e 74 20 6c 69 6e 65 73  ip comment lines
37d0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
37e0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
37f0: 67 20 69 6e 64 65 78 20 24 6c 69 6e 65 20 30 5d  g index $line 0]
3800: 20 6e 65 20 22 23 22 20 26 26 20 5c 0d 0a 20 20   ne "#" && \..  
3810: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
3820: 67 20 69 6e 64 65 78 20 24 6c 69 6e 65 20 30 5d  g index $line 0]
3830: 20 6e 65 20 22 3b 22 7d 20 74 68 65 6e 20 7b 0d   ne ";"} then {.
3840: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
3850: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3860: 53 70 6c 69 74 20 74 68 65 20 74 61 62 2d 64 65  Split the tab-de
3870: 6c 69 6d 69 74 65 64 20 6c 69 6e 65 20 69 6e 74  limited line int
3880: 6f 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 66  o fields.  The f
3890: 6f 72 6d 61 74 0d 0a 20 20 20 20 20 20 20 20 20  ormat..         
38a0: 20 23 20 20 20 20 20 20 20 6f 66 20 61 6c 6c 20   #       of all 
38b0: 6c 69 6e 65 73 20 69 6e 20 74 68 65 20 64 61 74  lines in the dat
38c0: 61 20 6d 75 73 74 20 62 65 20 61 73 20 66 6f 6c  a must be as fol
38d0: 6c 6f 77 73 3a 0d 0a 20 20 20 20 20 20 20 20 20  lows:..         
38e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
38f0: 20 20 20 20 20 20 3c 73 74 61 72 74 4c 69 6e 65        <startLine
3900: 3e 20 70 72 6f 74 6f 63 6f 6c 49 64 20 3c 74 61  > protocolId <ta
3910: 62 3e 20 70 75 62 6c 69 63 4b 65 79 54 6f 6b 65  b> publicKeyToke
3920: 6e 20 3c 74 61 62 3e 20 6e 61 6d 65 0d 0a 20 20  n <tab> name..  
3930: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3940: 3c 74 61 62 3e 20 63 75 6c 74 75 72 65 20 3c 74  <tab> culture <t
3950: 61 62 3e 20 70 61 74 63 68 4c 65 76 65 6c 20 3c  ab> patchLevel <
3960: 74 61 62 3e 20 74 69 6d 65 53 74 61 6d 70 20 3c  tab> timeStamp <
3970: 74 61 62 3e 0d 0a 20 20 20 20 20 20 20 20 20 20  tab>..          
3980: 23 20 20 20 20 20 20 20 62 61 73 65 55 72 69 20  #       baseUri 
3990: 3c 74 61 62 3e 20 6d 64 35 48 61 73 68 20 3c 74  <tab> md5Hash <t
39a0: 61 62 3e 20 73 68 61 31 48 61 73 68 20 3c 74 61  ab> sha1Hash <ta
39b0: 62 3e 20 73 68 61 35 31 32 48 61 73 68 0d 0a 20  b> sha512Hash.. 
39c0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
39d0: 20 3c 74 61 62 3e 20 6e 6f 74 65 73 20 3c 6e 65   <tab> notes <ne
39e0: 77 4c 69 6e 65 3e 0d 0a 20 20 20 20 20 20 20 20  wLine>..        
39f0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
3a00: 65 74 20 66 69 65 6c 64 73 20 5b 73 70 6c 69 74  et fields [split
3a10: 20 24 6c 69 6e 65 20 5c 74 5d 0d 0a 0d 0a 20 20   $line \t]....  
3a20: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3a30: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61       # NOTE: Gra
3a40: 62 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 20 49  b the protocol I
3a50: 64 20 66 69 65 6c 64 2e 0d 0a 20 20 20 20 20 20  d field...      
3a60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
3a70: 20 73 65 74 20 70 72 6f 74 6f 63 6f 6c 49 64 20   set protocolId 
3a80: 5b 6c 69 6e 64 65 78 20 24 66 69 65 6c 64 73 20  [lindex $fields 
3a90: 30 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  0]....          
3aa0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
3ab0: 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 70 75  OTE: Grab the pu
3ac0: 62 6c 69 63 20 6b 65 79 20 74 6f 6b 65 6e 20 66  blic key token f
3ad0: 69 65 6c 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  ield...         
3ae0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
3af0: 74 20 70 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e  t publicKeyToken
3b00: 20 5b 6c 69 6e 64 65 78 20 24 66 69 65 6c 64 73   [lindex $fields
3b10: 20 31 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   1]....         
3b20: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
3b30: 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 6e  NOTE: Grab the n
3b40: 61 6d 65 20 66 69 65 6c 64 2e 0d 0a 20 20 20 20  ame field...    
3b50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3b60: 20 20 20 73 65 74 20 6e 61 6d 65 20 5b 6c 69 6e     set name [lin
3b70: 64 65 78 20 24 66 69 65 6c 64 73 20 32 5d 0d 0a  dex $fields 2]..
3b80: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
3b90: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
3ba0: 20 47 72 61 62 20 74 68 65 20 63 75 6c 74 75 72   Grab the cultur
3bb0: 65 20 66 69 65 6c 64 2e 0d 0a 20 20 20 20 20 20  e field...      
3bc0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
3bd0: 20 73 65 74 20 63 75 6c 74 75 72 65 20 5b 6c 69   set culture [li
3be0: 6e 64 65 78 20 24 66 69 65 6c 64 73 20 33 5d 0d  ndex $fields 3].
3bf0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
3c00: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
3c10: 3a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69  : Figure out whi
3c20: 63 68 20 70 72 6f 74 6f 63 6f 6c 20 69 73 20 69  ch protocol is i
3c30: 6e 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c  n use for this l
3c40: 69 6e 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ine...          
3c50: 23 20 20 20 20 20 20 20 54 68 65 20 76 61 6c 75  #       The valu
3c60: 65 20 22 31 22 20 6d 65 61 6e 73 20 74 68 69 73  e "1" means this
3c70: 20 6c 69 6e 65 20 73 70 65 63 69 66 69 65 73 20   line specifies 
3c80: 61 20 62 75 69 6c 64 20 6f 66 0d 0a 20 20 20 20  a build of..    
3c90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
3ca0: 65 20 73 63 72 69 70 74 20 65 6e 67 69 6e 65 2e  e script engine.
3cb0: 20 20 54 68 65 20 76 61 6c 75 65 20 22 32 22 20    The value "2" 
3cc0: 6d 65 61 6e 73 20 74 68 69 73 20 6c 69 6e 65 0d  means this line.
3cd0: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
3ce0: 20 20 20 73 70 65 63 69 66 69 65 73 20 61 6e 20     specifies an 
3cf0: 75 70 64 61 74 65 20 73 63 72 69 70 74 20 28 76  update script (v
3d00: 69 61 20 61 20 55 52 49 29 20 74 6f 20 65 76 61  ia a URI) to eva
3d10: 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  luate...        
3d20: 20 20 23 20 20 20 20 20 20 20 41 6c 6c 20 6f 74    #       All ot
3d30: 68 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 63  her values are c
3d40: 75 72 72 65 6e 74 6c 79 20 72 65 73 65 72 76 65  urrently reserve
3d50: 64 20 61 6e 64 20 69 67 6e 6f 72 65 64 2e 0d 0a  d and ignored...
3d60: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
3d70: 20 20 20 20 20 20 20 73 65 74 20 63 68 65 63 6b         set check
3d80: 42 75 69 6c 64 20 5b 65 78 70 72 20 7b 21 24 77  Build [expr {!$w
3d90: 61 6e 74 53 63 72 69 70 74 73 20 26 26 20 24 70  antScripts && $p
3da0: 72 6f 74 6f 63 6f 6c 49 64 20 65 71 20 22 31 22  rotocolId eq "1"
3db0: 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  }]..          se
3dc0: 74 20 63 68 65 63 6b 53 63 72 69 70 74 20 5b 65  t checkScript [e
3dd0: 78 70 72 20 7b 24 77 61 6e 74 53 63 72 69 70 74  xpr {$wantScript
3de0: 73 20 26 26 20 24 70 72 6f 74 6f 63 6f 6c 49 64  s && $protocolId
3df0: 20 65 71 20 22 32 22 7d 5d 0d 0a 0d 0a 20 20 20   eq "2"}]....   
3e00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3e10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 6f      # NOTE: We o
3e20: 6e 6c 79 20 77 61 6e 74 20 74 6f 20 66 69 6e 64  nly want to find
3e30: 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20   the first line 
3e40: 74 68 61 74 20 6d 61 74 63 68 65 73 20 6f 75 72  that matches our
3e50: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
3e60: 20 20 20 20 65 6e 67 69 6e 65 2e 20 20 54 68 65      engine.  The
3e70: 20 70 75 62 6c 69 63 20 6b 65 79 20 74 6f 6b 65   public key toke
3e80: 6e 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  n is being used 
3e90: 68 65 72 65 20 74 6f 0d 0a 20 20 20 20 20 20 20  here to..       
3ea0: 20 20 20 23 20 20 20 20 20 20 20 6d 61 6b 65 20     #       make 
3eb0: 73 75 72 65 20 77 65 20 67 65 74 20 74 68 65 20  sure we get the 
3ec0: 73 61 6d 65 20 22 66 6c 61 76 6f 72 22 20 6f 66  same "flavor" of
3ed0: 20 74 68 65 20 65 6e 67 69 6e 65 2e 0d 0a 20 20   the engine...  
3ee0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3ef0: 54 68 65 20 6c 69 6e 65 73 20 61 72 65 20 6f 72  The lines are or
3f00: 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
3f10: 74 68 65 20 22 6c 61 74 65 73 74 20 73 74 61 62  the "latest stab
3f20: 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  le..          # 
3f30: 20 20 20 20 20 20 76 65 72 73 69 6f 6e 22 20 69        version" i
3f40: 73 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 6c  s on the first l
3f50: 69 6e 65 20 28 66 6f 72 20 61 20 67 69 76 65 6e  ine (for a given
3f60: 20 70 75 62 6c 69 63 20 6b 65 79 0d 0a 20 20 20   public key..   
3f70: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
3f80: 6f 6b 65 6e 29 2c 20 66 6f 6c 6c 6f 77 65 64 20  oken), followed 
3f90: 62 79 20 64 65 76 65 6c 6f 70 6d 65 6e 74 20 62  by development b
3fa0: 75 69 6c 64 73 2c 20 65 78 70 65 72 69 6d 65 6e  uilds, experimen
3fb0: 74 61 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 23  tal..          #
3fc0: 20 20 20 20 20 20 20 62 75 69 6c 64 73 2c 20 65         builds, e
3fd0: 74 63 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  tc...          #
3fe0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
3ff0: 28 24 63 68 65 63 6b 42 75 69 6c 64 20 7c 7c 20  ($checkBuild || 
4000: 24 63 68 65 63 6b 53 63 72 69 70 74 29 20 26 26  $checkScript) &&
4010: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
4020: 20 20 5b 6d 61 74 63 68 45 6e 67 69 6e 65 50 75    [matchEnginePu
4030: 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 20 24 70 75  blicKeyToken $pu
4040: 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 5d 20 26 26  blicKeyToken] &&
4050: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
4060: 20 20 5b 6d 61 74 63 68 45 6e 67 69 6e 65 4e 61    [matchEngineNa
4070: 6d 65 20 24 6e 61 6d 65 5d 20 26 26 20 5c 0d 0a  me $name] && \..
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6d                [m
4090: 61 74 63 68 45 6e 67 69 6e 65 43 75 6c 74 75 72  atchEngineCultur
40a0: 65 20 24 63 75 6c 74 75 72 65 5d 7d 20 74 68 65  e $culture]} the
40b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
40c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
40d0: 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65  # NOTE: Grab the
40e0: 20 70 61 74 63 68 20 6c 65 76 65 6c 20 66 69 65   patch level fie
40f0: 6c 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ld...           
4100: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
4110: 73 65 74 20 70 61 74 63 68 4c 65 76 65 6c 20 5b  set patchLevel [
4120: 6c 69 6e 64 65 78 20 24 66 69 65 6c 64 73 20 34  lindex $fields 4
4130: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
4140: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
4150: 67 74 68 20 24 70 61 74 63 68 4c 65 76 65 6c 5d  gth $patchLevel]
4160: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
4180: 20 70 61 74 63 68 4c 65 76 65 6c 20 30 2e 30 2e   patchLevel 0.0.
4190: 30 2e 30 3b 20 23 20 6e 6f 20 70 61 74 63 68 20  0.0; # no patch 
41a0: 6c 65 76 65 6c 3f 0d 0a 20 20 20 20 20 20 20 20  level?..        
41b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
41c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
41d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62      # NOTE: Grab
41e0: 20 74 68 65 20 74 69 6d 65 2d 73 74 61 6d 70 20   the time-stamp 
41f0: 66 69 65 6c 64 2e 0d 0a 20 20 20 20 20 20 20 20  field...        
4200: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
4210: 20 20 20 73 65 74 20 74 69 6d 65 53 74 61 6d 70     set timeStamp
4220: 20 5b 6c 69 6e 64 65 78 20 24 66 69 65 6c 64 73   [lindex $fields
4230: 20 35 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   5]....         
4240: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
4250: 65 6e 67 74 68 20 24 74 69 6d 65 53 74 61 6d 70  ength $timeStamp
4260: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
4280: 74 20 74 69 6d 65 53 74 61 6d 70 20 30 3b 20 23  t timeStamp 0; #
4290: 6e 65 76 65 72 3f 0d 0a 20 20 20 20 20 20 20 20  never?..        
42a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
42b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
42c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61 74      # NOTE: What
42d0: 20 73 68 6f 75 6c 64 20 74 68 65 20 44 61 74 65   should the Date
42e0: 54 69 6d 65 20 66 6f 72 6d 61 74 20 62 65 20 66  Time format be f
42f0: 6f 72 20 64 69 73 70 6c 61 79 3f 20 20 54 68 69  or display?  Thi
4300: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  s..            #
4310: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
4320: 20 73 6f 6d 65 20 76 61 72 69 61 74 69 6f 6e 20   some variation 
4330: 6f 6e 20 49 53 4f 2d 38 36 30 31 2e 0d 0a 20 20  on ISO-8601...  
4340: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
4350: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74           set dat
4360: 65 54 69 6d 65 46 6f 72 6d 61 74 20 79 79 79 79  eTimeFormat yyyy
4370: 2d 4d 4d 2d 64 64 54 48 48 3a 6d 6d 3a 73 73 0d  -MM-ddTHH:mm:ss.
4380: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
4390: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
43a0: 4e 4f 54 45 3a 20 44 6f 65 73 20 69 74 20 6c 6f  NOTE: Does it lo
43b0: 6f 6b 20 6c 69 6b 65 20 74 68 65 20 6e 75 6d 62  ok like the numb
43c0: 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
43d0: 6e 63 65 20 74 68 65 20 65 70 6f 63 68 0d 0a 20  nce the epoch.. 
43e0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
43f0: 20 20 20 6f 72 20 73 6f 6d 65 20 6b 69 6e 64 20     or some kind 
4400: 6f 66 20 64 61 74 65 2f 74 69 6d 65 20 73 74 72  of date/time str
4410: 69 6e 67 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  ing?..          
4420: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
4430: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20   if {[string is 
4440: 69 6e 74 65 67 65 72 20 2d 73 74 72 69 63 74 20  integer -strict 
4450: 24 74 69 6d 65 53 74 61 6d 70 5d 7d 20 74 68 65  $timeStamp]} the
4460: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
4470: 20 20 20 73 65 74 20 64 61 74 65 54 69 6d 65 20     set dateTime 
4480: 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5c 0d  [clock format \.
4490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
44a0: 20 20 20 24 74 69 6d 65 53 74 61 6d 70 20 2d 66     $timeStamp -f
44b0: 6f 72 6d 61 74 20 24 64 61 74 65 54 69 6d 65 46  ormat $dateTimeF
44c0: 6f 72 6d 61 74 5d 0d 0a 20 20 20 20 20 20 20 20  ormat]..        
44d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
44f0: 64 61 74 65 54 69 6d 65 20 5b 63 6c 6f 63 6b 20  dateTime [clock 
4500: 66 6f 72 6d 61 74 20 5c 0d 0a 20 20 20 20 20 20  format \..      
4510: 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f              [clo
4520: 63 6b 20 73 63 61 6e 20 24 74 69 6d 65 53 74 61  ck scan $timeSta
4530: 6d 70 5d 20 2d 66 6f 72 6d 61 74 20 24 64 61 74  mp] -format $dat
4540: 65 54 69 6d 65 46 6f 72 6d 61 74 5d 0d 0a 20 20  eTimeFormat]..  
4550: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
4560: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
4570: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
4580: 3a 20 47 72 61 62 20 74 68 65 20 70 61 74 63 68  : Grab the patch
4590: 20 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 72   level for the r
45a0: 75 6e 6e 69 6e 67 20 65 6e 67 69 6e 65 2e 0d 0a  unning engine...
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
45c0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 65             set e
45d0: 6e 67 69 6e 65 50 61 74 63 68 4c 65 76 65 6c 20  nginePatchLevel 
45e0: 5b 69 6e 66 6f 20 65 6e 67 69 6e 65 20 50 61 74  [info engine Pat
45f0: 63 68 4c 65 76 65 6c 5d 0d 0a 0d 0a 20 20 20 20  chLevel]....    
4600: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4610: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47         # NOTE: G
4620: 72 61 62 20 74 68 65 20 74 69 6d 65 2d 73 74 61  rab the time-sta
4630: 6d 70 20 66 6f 72 20 74 68 65 20 72 75 6e 6e 69  mp for the runni
4640: 6e 67 20 65 6e 67 69 6e 65 2e 0d 0a 20 20 20 20  ng engine...    
4650: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4660: 20 20 20 20 20 20 20 73 65 74 20 65 6e 67 69 6e         set engin
4670: 65 54 69 6d 65 53 74 61 6d 70 20 5b 69 6e 66 6f  eTimeStamp [info
4680: 20 65 6e 67 69 6e 65 20 54 69 6d 65 53 74 61 6d   engine TimeStam
4690: 70 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  p]....          
46a0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
46b0: 6e 67 74 68 20 24 65 6e 67 69 6e 65 54 69 6d 65  ngth $engineTime
46c0: 53 74 61 6d 70 5d 20 3d 3d 20 30 7d 20 74 68 65  Stamp] == 0} the
46d0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
46e0: 20 20 20 73 65 74 20 65 6e 67 69 6e 65 54 69 6d     set engineTim
46f0: 65 53 74 61 6d 70 20 30 3b 20 23 6e 65 76 65 72  eStamp 0; #never
4700: 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ?..            }
4710: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
4720: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
4730: 20 4e 4f 54 45 3a 20 44 6f 65 73 20 69 74 20 6c   NOTE: Does it l
4740: 6f 6f 6b 20 6c 69 6b 65 20 74 68 65 20 6e 75 6d  ook like the num
4750: 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73  ber of seconds s
4760: 69 6e 63 65 20 74 68 65 20 65 70 6f 63 68 0d 0a  ince the epoch..
4770: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
4780: 20 20 20 20 6f 72 20 73 6f 6d 65 20 6b 69 6e 64      or some kind
4790: 20 6f 66 20 64 61 74 65 2f 74 69 6d 65 20 73 74   of date/time st
47a0: 72 69 6e 67 3f 0d 0a 20 20 20 20 20 20 20 20 20  ring?..         
47b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
47c0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73    if {[string is
47d0: 20 69 6e 74 65 67 65 72 20 2d 73 74 72 69 63 74   integer -strict
47e0: 20 24 65 6e 67 69 6e 65 54 69 6d 65 53 74 61 6d   $engineTimeStam
47f0: 70 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  p]} then {..    
4800: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 65 6e            set en
4810: 67 69 6e 65 44 61 74 65 54 69 6d 65 20 5b 63 6c  gineDateTime [cl
4820: 6f 63 6b 20 66 6f 72 6d 61 74 20 5c 0d 0a 20 20  ock format \..  
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4840: 24 65 6e 67 69 6e 65 54 69 6d 65 53 74 61 6d 70  $engineTimeStamp
4850: 20 2d 66 6f 72 6d 61 74 20 24 64 61 74 65 54 69   -format $dateTi
4860: 6d 65 46 6f 72 6d 61 74 5d 0d 0a 20 20 20 20 20  meFormat]..     
4870: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
4880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
4890: 65 74 20 65 6e 67 69 6e 65 44 61 74 65 54 69 6d  et engineDateTim
48a0: 65 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20  e [clock format 
48b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
48c0: 20 20 20 20 20 5b 63 6c 6f 63 6b 20 73 63 61 6e       [clock scan
48d0: 20 24 65 6e 67 69 6e 65 54 69 6d 65 53 74 61 6d   $engineTimeStam
48e0: 70 5d 20 2d 66 6f 72 6d 61 74 20 24 64 61 74 65  p] -format $date
48f0: 54 69 6d 65 46 6f 72 6d 61 74 5d 0d 0a 20 20 20  TimeFormat]..   
4900: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
4910: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
4920: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
4930: 20 46 6f 72 20 62 75 69 6c 64 20 6c 69 6e 65 73   For build lines
4940: 2c 20 63 6f 6d 70 61 72 65 20 74 68 65 20 70 61  , compare the pa
4950: 74 63 68 20 6c 65 76 65 6c 20 66 72 6f 6d 20 74  tch level from t
4960: 68 65 20 6c 69 6e 65 0d 0a 20 20 20 20 20 20 20  he line..       
4970: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
4980: 74 68 65 20 6f 6e 65 20 77 65 20 61 72 65 20 63  the one we are c
4990: 75 72 72 65 6e 74 6c 79 20 75 73 69 6e 67 20 75  urrently using u
49a0: 73 69 6e 67 20 61 20 73 69 6d 70 6c 65 20 70 61  sing a simple pa
49b0: 74 63 68 0d 0a 20 20 20 20 20 20 20 20 20 20 20  tch..           
49c0: 20 23 20 20 20 20 20 20 20 6c 65 76 65 6c 20 63   #       level c
49d0: 6f 6d 70 61 72 69 73 6f 6e 2e 0d 0a 20 20 20 20  omparison...    
49e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
49f0: 20 20 20 20 20 20 20 69 66 20 7b 24 63 68 65 63         if {$chec
4a00: 6b 42 75 69 6c 64 7d 20 74 68 65 6e 20 7b 0d 0a  kBuild} then {..
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
4a20: 74 20 63 6f 6d 70 61 72 65 20 5b 70 61 63 6b 61  t compare [packa
4a30: 67 65 20 76 63 6f 6d 70 61 72 65 20 24 70 61 74  ge vcompare $pat
4a40: 63 68 4c 65 76 65 6c 20 24 65 6e 67 69 6e 65 50  chLevel $engineP
4a50: 61 74 63 68 4c 65 76 65 6c 5d 0d 0a 20 20 20 20  atchLevel]..    
4a60: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
4a70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4a80: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
4a90: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73   # NOTE: This is
4aa0: 20 6e 6f 74 20 61 20 62 75 69 6c 64 20 6c 69 6e   not a build lin
4ab0: 65 2c 20 6e 6f 20 6d 61 74 63 68 2e 0d 0a 20 20  e, no match...  
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
4ae0: 20 63 6f 6d 70 61 72 65 20 2d 31 0d 0a 20 20 20   compare -1..   
4af0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
4b00: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
4b10: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
4b20: 20 46 6f 72 20 73 63 72 69 70 74 20 6c 69 6e 65   For script line
4b30: 73 2c 20 75 73 65 20 72 65 67 75 6c 61 72 20 65  s, use regular e
4b40: 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 69  xpression matchi
4b50: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ng...           
4b60: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
4b70: 69 66 20 7b 24 63 68 65 63 6b 53 63 72 69 70 74  if {$checkScript
4b80: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4b90: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4ba0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
4bb0: 20 55 73 65 20 5b 63 61 74 63 68 5d 20 68 65 72   Use [catch] her
4bc0: 65 20 74 6f 20 70 72 65 76 65 6e 74 20 72 61 69  e to prevent rai
4bd0: 73 69 6e 67 20 61 20 73 63 72 69 70 74 20 65 72  sing a script er
4be0: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ror..           
4bf0: 20 20 20 23 20 20 20 20 20 20 20 64 75 65 20 74     #       due t
4c00: 6f 20 61 20 6d 61 6c 66 6f 72 6d 65 64 20 70 61  o a malformed pa
4c10: 74 63 68 20 6c 65 76 65 6c 20 72 65 67 75 6c 61  tch level regula
4c20: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0d 0a 20  r expression... 
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
4c50: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 65              rege
4c70: 78 70 20 2d 6e 6f 63 61 73 65 20 2d 2d 20 24 70  xp -nocase -- $p
4c80: 61 74 63 68 4c 65 76 65 6c 20 24 65 6e 67 69 6e  atchLevel $engin
4c90: 65 50 61 74 63 68 4c 65 76 65 6c 0d 0a 20 20 20  ePatchLevel..   
4ca0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 6d 61 74             } mat
4cb0: 63 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ch]} then {..   
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 70 61 74 63  # NOTE: The patc
4cf0: 68 20 6c 65 76 65 6c 20 66 72 6f 6d 20 74 68 65  h level from the
4d00: 20 73 63 72 69 70 74 20 6c 69 6e 65 20 77 61 73   script line was
4d10: 20 6d 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 20   most..         
4d20: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c         #       l
4d30: 69 6b 65 6c 79 20 6e 6f 74 20 61 20 76 61 6c 69  ikely not a vali
4d40: 64 20 72 65 67 75 6c 61 72 20 65 78 70 72 65 73  d regular expres
4d50: 73 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20  sion...         
4d60: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4d70: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 61            set ma
4d80: 74 63 68 20 66 61 6c 73 65 0d 0a 20 20 20 20 20  tch false..     
4d90: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
4da0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
4db0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4dc0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
4dd0: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73   # NOTE: This is
4de0: 20 6e 6f 74 20 61 20 73 63 72 69 70 74 20 6c 69   not a script li
4df0: 6e 65 2c 20 6e 6f 20 6d 61 74 63 68 2e 0d 0a 20  ne, no match... 
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
4e20: 74 20 6d 61 74 63 68 20 66 61 6c 73 65 0d 0a 20  t match false.. 
4e30: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
4e50: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
4e60: 45 3a 20 41 72 65 20 77 65 20 69 6e 74 65 72 65  E: Are we intere
4e70: 73 74 65 64 20 69 6e 20 66 75 72 74 68 65 72 20  sted in further 
4e80: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 69 73 20  processing this 
4e90: 6c 69 6e 65 3f 0d 0a 20 20 20 20 20 20 20 20 20  line?..         
4ea0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
4eb0: 20 20 69 66 20 7b 28 24 63 68 65 63 6b 42 75 69    if {($checkBui
4ec0: 6c 64 20 26 26 20 24 63 6f 6d 70 61 72 65 20 3e  ld && $compare >
4ed0: 20 30 29 20 7c 7c 0d 0a 20 20 20 20 20 20 20 20   0) ||..        
4ee0: 20 20 20 20 20 20 20 20 28 24 63 68 65 63 6b 53          ($checkS
4ef0: 63 72 69 70 74 20 26 26 20 24 6d 61 74 63 68 29  cript && $match)
4f00: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4f10: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
4f20: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
4f30: 20 47 72 61 62 20 74 68 65 20 62 61 73 65 20 55   Grab the base U
4f40: 52 49 20 66 69 65 6c 64 20 28 69 2e 65 2e 20 69  RI field (i.e. i
4f50: 74 20 6d 61 79 20 62 65 20 61 20 6d 69 72 72 6f  t may be a mirro
4f60: 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r..             
4f70: 20 23 20 20 20 20 20 20 20 73 69 74 65 29 2e 0d   #       site)..
4f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
4f90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4fa0: 73 65 74 20 62 61 73 65 55 72 69 20 5b 6c 69 6e  set baseUri [lin
4fb0: 64 65 78 20 24 66 69 65 6c 64 73 20 36 5d 0d 0a  dex $fields 6]..
4fc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4fd0: 69 66 20 7b 24 63 68 65 63 6b 42 75 69 6c 64 7d  if {$checkBuild}
4fe0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4ff0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
5000: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 62 61 73  ring length $bas
5010: 65 55 72 69 5d 20 3e 20 30 7d 20 74 68 65 6e 20  eUri] > 0} then 
5020: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5030: 20 20 20 20 20 73 65 74 20 62 75 69 6c 64 55 72       set buildUr
5040: 69 20 24 62 61 73 65 55 72 69 0d 0a 20 20 20 20  i $baseUri..    
5050: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
5060: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
5070: 20 20 20 20 20 20 20 20 73 65 74 20 62 75 69 6c          set buil
5080: 64 55 72 69 20 5b 67 65 74 44 6f 77 6e 6c 6f 61  dUri [getDownloa
5090: 64 42 61 73 65 55 72 69 5d 3b 20 23 20 70 72 69  dBaseUri]; # pri
50a0: 6d 61 72 79 20 73 69 74 65 2e 0d 0a 20 20 20 20  mary site...    
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
50c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
50d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
50e0: 69 66 20 7b 24 63 68 65 63 6b 53 63 72 69 70 74  if {$checkScript
50f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5100: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
5110: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 62 61  tring length $ba
5120: 73 65 55 72 69 5d 20 3e 20 30 7d 20 74 68 65 6e  seUri] > 0} then
5130: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5140: 20 20 20 20 20 20 73 65 74 20 73 63 72 69 70 74        set script
5150: 55 72 69 20 24 62 61 73 65 55 72 69 0d 0a 20 20  Uri $baseUri..  
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
5170: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
5180: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 63            set sc
5190: 72 69 70 74 55 72 69 20 5b 67 65 74 53 63 72 69  riptUri [getScri
51a0: 70 74 42 61 73 65 55 72 69 5d 3b 20 23 20 70 72  ptBaseUri]; # pr
51b0: 69 6d 61 72 79 20 73 69 74 65 2e 0d 0a 20 20 20  imary site...   
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
51e0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
51f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
5200: 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74    # NOTE: Grab t
5210: 68 65 20 6e 6f 74 65 73 20 66 69 65 6c 64 20 28  he notes field (
5220: 77 68 69 63 68 20 6d 61 79 20 62 65 20 65 6d 70  which may be emp
5230: 74 79 29 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ty)...          
5240: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
5250: 20 20 20 20 20 73 65 74 20 6e 6f 74 65 73 20 5b       set notes [
5260: 6c 69 6e 64 65 78 20 24 66 69 65 6c 64 73 20 31  lindex $fields 1
5270: 30 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  0]....          
5280: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
5290: 6c 65 6e 67 74 68 20 24 6e 6f 74 65 73 5d 20 3e  length $notes] >
52a0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
52c0: 6e 6f 74 65 73 20 5b 75 6e 65 73 63 61 70 65 55  notes [unescapeU
52d0: 70 64 61 74 65 4e 6f 74 65 73 20 24 6e 6f 74 65  pdateNotes $note
52e0: 73 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s]..            
52f0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
5300: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5310: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
5320: 65 20 65 6e 67 69 6e 65 20 70 61 74 63 68 20 6c  e engine patch l
5330: 65 76 65 6c 20 66 72 6f 6d 20 74 68 65 20 6c 69  evel from the li
5340: 6e 65 20 69 73 20 67 72 65 61 74 65 72 2c 0d 0a  ne is greater,..
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
5360: 20 20 20 20 20 20 77 65 20 61 72 65 20 6f 75 74        we are out
5370: 2d 6f 66 2d 64 61 74 65 2e 20 20 52 65 74 75 72  -of-date.  Retur
5380: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
5390: 6f 75 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  our..           
53a0: 20 20 20 23 20 20 20 20 20 20 20 63 68 65 63 6b     #       check
53b0: 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ing now...      
53c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
53d0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 63 68           if {$ch
53e0: 65 63 6b 42 75 69 6c 64 7d 20 74 68 65 6e 20 7b  eckBuild} then {
53f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5400: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
5410: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 72 65       # NOTE: Are
5420: 20 77 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20   we supposed to 
5430: 70 72 6f 6d 70 74 20 74 68 65 20 69 6e 74 65 72  prompt the inter
5440: 61 63 74 69 76 65 20 75 73 65 72 2c 0d 0a 20 20  active user,..  
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
5460: 20 20 20 20 20 20 69 66 20 61 6e 79 2c 20 74 6f        if any, to
5470: 20 75 70 67 72 61 64 65 20 6e 6f 77 3f 0d 0a 20   upgrade now?.. 
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
5490: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
54a0: 20 20 73 65 74 20 74 65 78 74 20 5b 61 70 70 65    set text [appe
54b0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75                $u
54d0: 70 64 61 74 65 55 72 69 54 79 70 65 20 22 20 62  pdateUriType " b
54e0: 75 69 6c 64 20 22 20 24 70 61 74 63 68 4c 65 76  uild " $patchLev
54f0: 65 6c 20 22 2c 20 64 61 74 65 64 20 22 20 5c 0d  el ", dated " \.
5500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5510: 20 20 20 20 20 24 64 61 74 65 54 69 6d 65 20 22       $dateTime "
5520: 2c 20 69 73 20 6e 65 77 65 72 20 74 68 61 6e 20  , is newer than 
5530: 74 68 65 20 72 75 6e 6e 69 6e 67 20 62 75 69 6c  the running buil
5540: 64 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  d " \..         
5550: 20 20 20 20 20 20 20 20 20 20 20 24 65 6e 67 69             $engi
5560: 6e 65 50 61 74 63 68 4c 65 76 65 6c 20 22 2c 20  nePatchLevel ", 
5570: 64 61 74 65 64 20 22 20 24 65 6e 67 69 6e 65 44  dated " $engineD
5580: 61 74 65 54 69 6d 65 20 5c 0d 0a 20 20 20 20 20  ateTime \..     
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
55a0: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 64  , based on the d
55b0: 61 74 61 20 66 72 6f 6d 20 22 20 24 75 70 64 61  ata from " $upda
55c0: 74 65 42 61 73 65 55 72 69 5d 0d 0a 0d 0a 20 20  teBaseUri]....  
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
55e0: 20 7b 24 70 72 6f 6d 70 74 20 26 26 20 5b 69 73   {$prompt && [is
55f0: 49 6e 74 65 72 61 63 74 69 76 65 5d 7d 20 74 68  Interactive]} th
5600: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
5610: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
5630: 4f 54 45 3a 20 49 73 20 74 68 65 20 5b 6f 62 6a  OTE: Is the [obj
5640: 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 61 76 61  ect] command ava
5650: 69 6c 61 62 6c 65 3f 20 20 49 66 20 6e 6f 74 2c  ilable?  If not,
5660: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5670: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73      #       this
5680: 20 63 61 6e 6e 6f 74 20 62 65 20 64 6f 6e 65 2e   cannot be done.
5690: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
56a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
56b0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c           if {[ll
56c0: 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d  ength [info comm
56d0: 61 6e 64 73 20 6f 62 6a 65 63 74 5d 5d 20 3e 20  ands object]] > 
56e0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
5700: 65 74 20 6d 65 73 73 61 67 65 43 61 70 74 69 6f  et messageCaptio
5710: 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  n [appendArgs \.
5720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5730: 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65           [info e
5740: 6e 67 69 6e 65 20 4e 61 6d 65 5d 20 22 20 28 22  ngine Name] " ("
5750: 20 5b 6c 69 6e 64 65 78 20 5b 69 6e 66 6f 20 6c   [lindex [info l
5760: 65 76 65 6c 20 30 5d 20 30 5d 20 5c 0d 0a 20 20  evel 0] 0] \..  
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 20 20 20 20 20 20 22 20 73 63 72 69 70 74 29 22        " script)"
5790: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
57a0: 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 73           set mes
57b0: 73 61 67 65 54 65 78 74 20 5b 61 70 70 65 6e 64  sageText [append
57c0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 22 54 68 65 20 22 20 24 74 65 78 74 20 5c 6e 5c  "The " $text \n\
57f0: 6e 20 22 52 75 6e 20 74 68 65 20 75 70 64 61 74  n "Run the updat
5800: 65 72 20 6e 6f 77 3f 22 5d 0d 0a 0d 0a 20 20 20  er now?"]....   
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 69 66 20 7b 24 61 75 74 6f 6d 61 74 69 63 7d   if {$automatic}
5830: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
5850: 70 70 65 6e 64 20 6d 65 73 73 61 67 65 54 65 78  ppend messageTex
5860: 74 20 5c 6e 5c 6e 20 5c 0d 0a 20 20 20 20 20 20  t \n\n \..      
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5880: 20 20 20 20 22 57 41 52 4e 49 4e 47 3a 20 54 68      "WARNING: Th
5890: 65 20 75 70 64 61 74 65 72 20 70 72 6f 63 65 73  e updater proces
58a0: 73 20 77 69 6c 6c 20 62 65 20 72 75 6e 20 22 20  s will be run " 
58b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69 6e               "in
58d0: 20 61 75 74 6f 6d 61 74 69 63 20 6d 6f 64 65 20   automatic mode 
58e0: 61 6e 64 20 74 68 65 72 65 20 77 69 6c 6c 20 62  and there will b
58f0: 65 20 6e 6f 20 22 20 5c 0d 0a 20 20 20 20 20 20  e no " \..      
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5910: 20 20 20 20 22 66 75 72 74 68 65 72 20 70 72 6f      "further pro
5920: 6d 70 74 73 2e 22 0d 0a 20 20 20 20 20 20 20 20  mpts."..        
5930: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
5940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5950: 20 20 20 20 20 69 66 20 7b 5b 6f 62 6a 65 63 74       if {[object
5960: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
5970: 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
5980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5990: 20 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70       Eagle._Comp
59a0: 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e 57  onents.Private.W
59b0: 69 6e 64 6f 77 4f 70 73 20 59 65 73 4f 72 4e 6f  indowOps YesOrNo
59c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 24 6d 65 73              $mes
59e0: 73 61 67 65 54 65 78 74 20 24 6d 65 73 73 61 67  sageText $messag
59f0: 65 43 61 70 74 69 6f 6e 20 66 61 6c 73 65 5d 7d  eCaption false]}
5a00: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
5a20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5a30: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
5a40: 4f 6b 2c 20 72 75 6e 20 74 68 65 20 75 70 64 61  Ok, run the upda
5a50: 74 65 72 20 6e 6f 77 20 61 6e 64 20 74 68 65 6e  ter now and then
5a60: 20 65 78 69 74 2e 0d 0a 20 20 20 20 20 20 20 20   exit...        
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
5a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5a90: 20 20 20 20 20 20 20 72 75 6e 55 70 64 61 74 65         runUpdate
5aa0: 41 6e 64 45 78 69 74 20 24 61 75 74 6f 6d 61 74  AndExit $automat
5ab0: 69 63 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ic..            
5ac0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5af0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
5b00: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
5b10: 74 20 24 74 65 78 74 20 5b 6c 69 73 74 20 24 62  t $text [list $b
5b20: 75 69 6c 64 55 72 69 20 24 70 61 74 63 68 4c 65  uildUri $patchLe
5b30: 76 65 6c 5d 20 5b 6c 69 73 74 20 24 6e 6f 74 65  vel] [list $note
5b40: 73 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s]]..           
5b50: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
5b60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5b70: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
5b80: 68 65 20 73 63 72 69 70 74 20 70 61 74 63 68 20  he script patch 
5b90: 6c 65 76 65 6c 20 66 72 6f 6d 20 74 68 65 20 6c  level from the l
5ba0: 69 6e 65 20 6d 61 74 63 68 65 73 20 74 68 65 0d  ine matches the.
5bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
5bc0: 20 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 65         current e
5bd0: 6e 67 69 6e 65 20 70 61 74 63 68 20 6c 65 76 65  ngine patch leve
5be0: 6c 20 65 78 61 63 74 6c 79 2c 20 74 68 69 73 20  l exactly, this 
5bf0: 73 63 72 69 70 74 0d 0a 20 20 20 20 20 20 20 20  script..        
5c00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
5c10: 6f 75 6c 64 20 62 65 20 65 76 61 6c 75 61 74 65  ould be evaluate
5c20: 64 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 61  d if it can be a
5c30: 75 74 68 65 6e 74 69 63 61 74 65 64 2e 0d 0a 20  uthenticated... 
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
5c60: 20 7b 24 63 68 65 63 6b 53 63 72 69 70 74 7d 20   {$checkScript} 
5c70: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5c80: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5c90: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
5ca0: 45 3a 20 46 69 72 73 74 2c 20 73 65 74 20 74 68  E: First, set th
5cb0: 65 20 64 65 66 61 75 6c 74 20 63 68 61 6e 6e 65  e default channe
5cc0: 6c 20 66 6f 72 20 75 70 64 61 74 65 20 73 63 72  l for update scr
5cd0: 69 70 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ipt..           
5ce0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 74 61       #       sta
5cf0: 74 75 73 20 6d 65 73 73 61 67 65 73 2e 20 20 49  tus messages.  I
5d00: 66 20 74 68 65 20 74 65 73 74 20 63 68 61 6e 6e  f the test chann
5d10: 65 6c 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20  el has been..   
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
5d30: 20 20 20 20 20 73 65 74 20 28 69 2e 65 2e 20 62       set (i.e. b
5d40: 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  y the test suite
5d50: 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73  ), it will be us
5d60: 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
5d70: 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 73 74      #       inst
5d80: 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ead...          
5d90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5da0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
5db0: 6e 66 6f 20 65 78 69 73 74 73 20 63 68 61 6e 6e  nfo exists chann
5dc0: 65 6c 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  el]} then {..   
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
5de0: 65 74 20 63 68 61 6e 6e 65 6c 20 5b 65 78 70 72  et channel [expr
5df0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
5e00: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d 20 3f  :test_channel] ?
5e10: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5e20: 20 20 20 20 20 20 20 20 20 20 24 3a 3a 74 65 73            $::tes
5e30: 74 5f 63 68 61 6e 6e 65 6c 20 3a 20 22 73 74 64  t_channel : "std
5e40: 6f 75 74 22 7d 5d 0d 0a 20 20 20 20 20 20 20 20  out"}]..        
5e50: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 23 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20 76 65  # NOTE: Next, ve
5e90: 72 69 66 79 20 74 68 65 20 73 63 72 69 70 74 20  rify the script 
5ea0: 68 61 73 20 61 20 76 61 6c 69 64 20 62 61 73 65  has a valid base
5eb0: 20 55 52 49 2e 0d 0a 20 20 20 20 20 20 20 20 20   URI...         
5ec0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 46         #       F
5ed0: 6f 72 20 75 70 64 61 74 65 20 73 63 72 69 70 74  or update script
5ee0: 73 2c 20 74 68 69 73 20 6d 75 73 74 20 62 65 20  s, this must be 
5ef0: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 0d 0a 20 20  the location..  
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
5f10: 20 20 20 20 20 20 77 68 65 72 65 20 74 68 65 20        where the 
5f20: 75 70 64 61 74 65 20 73 63 72 69 70 74 20 64 61  update script da
5f30: 74 61 20 63 61 6e 20 62 65 20 64 6f 77 6e 6c 6f  ta can be downlo
5f40: 61 64 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  aded...         
5f50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
5f60: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
5f70: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 63  tring length $sc
5f80: 72 69 70 74 55 72 69 5d 20 3d 3d 20 30 7d 20 74  riptUri] == 0} t
5f90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
5fa0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
5fb0: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fd0: 20 20 74 71 70 75 74 73 20 24 63 68 61 6e 6e 65    tqputs $channe
5fe0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
5ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6000: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 69           "---- i
6010: 6e 76 61 6c 69 64 20 62 61 73 65 55 72 69 20 76  nvalid baseUri v
6020: 61 6c 75 65 20 66 6f 72 20 75 70 64 61 74 65 20  alue for update 
6030: 73 63 72 69 70 74 20 22 20 5c 0d 0a 20 20 20 20  script " \..    
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6050: 20 20 20 20 22 6c 69 6e 65 3a 20 22 20 24 6c 69      "line: " $li
6060: 6e 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  ne \"\n]..      
6070: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6090: 20 69 6e 63 72 20 73 63 72 69 70 74 43 6f 75 6e   incr scriptCoun
60a0: 74 28 69 6e 76 61 6c 69 64 29 3b 20 63 6f 6e 74  t(invalid); cont
60b0: 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  inue..          
60c0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
60d0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
60f0: 4e 4f 54 45 3a 20 4e 65 78 74 2c 20 67 72 61 62  NOTE: Next, grab
6100: 20 74 68 65 20 6d 64 35 20 66 69 65 6c 64 20 61   the md5 field a
6110: 6e 64 20 73 65 65 20 69 66 20 69 74 20 6c 6f 6f  nd see if it loo
6120: 6b 73 20 76 61 6c 69 64 2e 0d 0a 20 20 20 20 20  ks valid...     
6130: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
6140: 20 20 20 42 65 6c 6f 77 2c 20 74 68 65 20 76 61     Below, the va
6150: 6c 75 65 20 6f 66 20 74 68 69 73 20 66 69 65 6c  lue of this fiel
6160: 64 20 77 69 6c 6c 20 62 65 20 63 6f 6d 70 61 72  d will be compar
6170: 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 20  ed to..         
6180: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
6190: 68 61 74 20 6f 66 20 74 68 65 20 61 63 74 75 61  hat of the actua
61a0: 6c 20 4d 44 35 20 68 61 73 68 20 6f 66 20 74 68  l MD5 hash of th
61b0: 65 20 64 6f 77 6e 6c 6f 61 64 65 64 20 73 63 72  e downloaded scr
61c0: 69 70 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ipt..           
61d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74       #       dat
61e0: 61 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  a...            
61f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
6200: 20 20 20 20 20 20 20 73 65 74 20 6c 69 6e 65 4d         set lineM
6210: 64 35 20 5b 6c 69 6e 64 65 78 20 24 66 69 65 6c  d5 [lindex $fiel
6220: 64 73 20 37 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ds 7]....       
6230: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
6240: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6c 69 6e  ring length $lin
6250: 65 4d 64 35 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  eMd5] == 0} then
6260: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
6270: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
6280: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
62a0: 71 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  qputs $channel [
62b0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62d0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 69 6e 76 61        "---- inva
62e0: 6c 69 64 20 6d 64 35 20 76 61 6c 75 65 20 66 6f  lid md5 value fo
62f0: 72 20 75 70 64 61 74 65 20 73 63 72 69 70 74 20  r update script 
6300: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6c 69               "li
6320: 6e 65 3a 20 22 20 24 6c 69 6e 65 20 5c 22 5c 6e  ne: " $line \"\n
6330: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
6340: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
6350: 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 73            incr s
6360: 63 72 69 70 74 43 6f 75 6e 74 28 69 6e 76 61 6c  criptCount(inval
6370: 69 64 29 3b 20 63 6f 6e 74 69 6e 75 65 0d 0a 20  id); continue.. 
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
6390: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
63a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
63b0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
63c0: 65 78 74 2c 20 67 72 61 62 20 74 68 65 20 73 68  ext, grab the sh
63d0: 61 31 20 66 69 65 6c 64 20 61 6e 64 20 73 65 65  a1 field and see
63e0: 20 69 66 20 69 74 20 6c 6f 6f 6b 73 20 76 61 6c   if it looks val
63f0: 69 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  id...           
6400: 20 20 20 20 20 23 20 20 20 20 20 20 20 42 65 6c       #       Bel
6410: 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ow, the value of
6420: 20 74 68 69 73 20 66 69 65 6c 64 20 77 69 6c 6c   this field will
6430: 20 62 65 20 63 6f 6d 70 61 72 65 64 20 74 6f 0d   be compared to.
6440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6450: 20 23 20 20 20 20 20 20 20 74 68 61 74 20 6f 66   #       that of
6460: 20 74 68 65 20 61 63 74 75 61 6c 20 53 48 41 31   the actual SHA1
6470: 20 68 61 73 68 20 6f 66 20 74 68 65 20 64 6f 77   hash of the dow
6480: 6e 6c 6f 61 64 65 64 20 73 63 72 69 70 74 0d 0a  nloaded script..
6490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64a0: 23 20 20 20 20 20 20 20 64 61 74 61 2e 0d 0a 20  #       data... 
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
64c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
64d0: 20 20 73 65 74 20 6c 69 6e 65 53 68 61 31 20 5b    set lineSha1 [
64e0: 6c 69 6e 64 65 78 20 24 66 69 65 6c 64 73 20 38  lindex $fields 8
64f0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
6500: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
6510: 20 6c 65 6e 67 74 68 20 24 6c 69 6e 65 53 68 61   length $lineSha
6520: 31 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  1] == 0} then {.
6530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6540: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
6550: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
6560: 20 20 20 20 20 20 20 20 20 20 20 20 74 71 70 75              tqpu
6570: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
6580: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
6590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65a0: 20 20 20 22 2d 2d 2d 2d 20 69 6e 76 61 6c 69 64     "---- invalid
65b0: 20 73 68 61 31 20 76 61 6c 75 65 20 66 6f 72 20   sha1 value for 
65c0: 75 70 64 61 74 65 20 73 63 72 69 70 74 20 22 20  update script " 
65d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
65e0: 20 20 20 20 20 20 20 20 20 20 20 22 6c 69 6e 65             "line
65f0: 3a 20 22 20 24 6c 69 6e 65 20 5c 22 5c 6e 5d 0d  : " $line \"\n].
6600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6610: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
6620: 20 20 20 20 20 20 20 20 69 6e 63 72 20 73 63 72          incr scr
6630: 69 70 74 43 6f 75 6e 74 28 69 6e 76 61 6c 69 64  iptCount(invalid
6640: 29 3b 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20  ); continue..   
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
6660: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6670: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
6680: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78       # NOTE: Nex
6690: 74 2c 20 67 72 61 62 20 74 68 65 20 73 68 61 35  t, grab the sha5
66a0: 31 32 20 66 69 65 6c 64 20 61 6e 64 20 73 65 65  12 field and see
66b0: 20 69 66 20 69 74 20 6c 6f 6f 6b 73 0d 0a 20 20   if it looks..  
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
66d0: 20 20 20 20 20 20 76 61 6c 69 64 2e 20 20 42 65        valid.  Be
66e0: 6c 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 20 6f  low, the value o
66f0: 66 20 74 68 69 73 20 66 69 65 6c 64 20 77 69 6c  f this field wil
6700: 6c 20 62 65 0d 0a 20 20 20 20 20 20 20 20 20 20  l be..          
6710: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
6720: 6d 70 61 72 65 64 20 74 6f 20 74 68 61 74 20 6f  mpared to that o
6730: 66 20 74 68 65 20 61 63 74 75 61 6c 20 53 48 41  f the actual SHA
6740: 35 31 32 20 68 61 73 68 20 6f 66 20 74 68 65 0d  512 hash of the.
6750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6760: 20 23 20 20 20 20 20 20 20 64 6f 77 6e 6c 6f 61   #       downloa
6770: 64 65 64 20 73 63 72 69 70 74 20 64 61 74 61 2e  ded script data.
6780: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6790: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
67a0: 20 20 20 20 20 73 65 74 20 6c 69 6e 65 53 68 61       set lineSha
67b0: 35 31 32 20 5b 6c 69 6e 64 65 78 20 24 66 69 65  512 [lindex $fie
67c0: 6c 64 73 20 39 5d 0d 0a 0d 0a 20 20 20 20 20 20  lds 9]....      
67d0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
67e0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6c 69  tring length $li
67f0: 6e 65 53 68 61 35 31 32 5d 20 3d 3d 20 30 7d 20  neSha512] == 0} 
6800: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
6810: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
6820: 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6840: 20 20 20 74 71 70 75 74 73 20 24 63 68 61 6e 6e     tqputs $chann
6850: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
6860: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6870: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
6880: 69 6e 76 61 6c 69 64 20 73 68 61 35 31 32 20 76  invalid sha512 v
6890: 61 6c 75 65 20 66 6f 72 20 75 70 64 61 74 65 20  alue for update 
68a0: 73 63 72 69 70 74 20 22 20 5c 0d 0a 20 20 20 20  script " \..    
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68c0: 20 20 20 20 22 6c 69 6e 65 3a 20 22 20 24 6c 69      "line: " $li
68d0: 6e 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  ne \"\n]..      
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6900: 20 69 6e 63 72 20 73 63 72 69 70 74 43 6f 75 6e   incr scriptCoun
6910: 74 28 69 6e 76 61 6c 69 64 29 3b 20 63 6f 6e 74  t(invalid); cont
6920: 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  inue..          
6930: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
6940: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
6960: 4e 4f 54 45 3a 20 4e 65 78 74 2c 20 73 68 6f 77  NOTE: Next, show
6970: 20 74 68 65 20 65 78 74 72 61 20 69 6e 66 6f 72   the extra infor
6980: 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  mation associate
6990: 64 20 77 69 74 68 0d 0a 20 20 20 20 20 20 20 20  d with..        
69a0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
69b0: 74 68 69 73 20 75 70 64 61 74 65 20 73 63 72 69  this update scri
69c0: 70 74 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20 20  pt, if any...   
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
69e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69f0: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
6a00: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
6a10: 20 20 20 20 20 20 20 74 71 70 75 74 73 20 24 63         tqputs $c
6a20: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
6a30: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
6a50: 2d 20 66 65 74 63 68 69 6e 67 20 75 70 64 61 74  - fetching updat
6a60: 65 20 73 63 72 69 70 74 20 66 72 6f 6d 20 5c 22  e script from \"
6a70: 22 20 24 73 63 72 69 70 74 55 72 69 20 5c 0d 0a  " $scriptUri \..
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 20 20 20 20 20 20 22 5c 22 20 28 22 20 24 64 61        "\" (" $da
6aa0: 74 65 54 69 6d 65 20 22 29 20 77 69 74 68 20 6e  teTime ") with n
6ab0: 6f 74 65 73 3a 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  otes:\n"]....   
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
6ad0: 65 74 20 74 72 69 6d 4e 6f 74 65 73 20 5b 73 74  et trimNotes [st
6ae0: 72 69 6e 67 20 74 72 69 6d 20 24 6e 6f 74 65 73  ring trim $notes
6af0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
6b00: 20 20 20 20 20 20 20 74 71 70 75 74 73 20 24 63         tqputs $c
6b10: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
6b20: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70              [exp
6b40: 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  r {[string lengt
6b50: 68 20 24 74 72 69 6d 4e 6f 74 65 73 5d 20 3e 20  h $trimNotes] > 
6b60: 30 20 3f 20 24 74 72 69 6d 4e 6f 74 65 73 20 3a  0 ? $trimNotes :
6b70: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
6b80: 20 20 20 20 20 20 20 20 20 20 22 3c 6e 6f 6e 65            "<none
6b90: 3e 22 7d 5d 20 22 5c 6e 2d 2d 2d 2d 20 65 6e 64  >"}] "\n---- end
6ba0: 20 6f 66 20 75 70 64 61 74 65 20 73 63 72 69 70   of update scrip
6bb0: 74 20 6e 6f 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  t notes\n"]..   
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
6bd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6be0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
6bf0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78       # NOTE: Nex
6c00: 74 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 66 65  t, attempt to fe
6c10: 74 63 68 20 74 68 65 20 75 70 64 61 74 65 20 73  tch the update s
6c20: 63 72 69 70 74 20 64 61 74 61 2e 0d 0a 20 20 20  cript data...   
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c50: 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
6c60: 7b 67 65 74 55 70 64 61 74 65 53 63 72 69 70 74  {getUpdateScript
6c70: 44 61 74 61 20 24 73 63 72 69 70 74 55 72 69 7d  Data $scriptUri}
6c80: 20 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20   result]....    
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
6ca0: 24 63 6f 64 65 20 3d 3d 20 30 7d 20 74 68 65 6e  $code == 0} then
6cb0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
6cc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6cd0: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
6ce0: 45 3a 20 53 75 63 63 65 73 73 2c 20 73 65 74 20  E: Success, set 
6cf0: 74 68 65 20 73 63 72 69 70 74 20 64 61 74 61 20  the script data 
6d00: 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 2e  from the result.
6d10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6d20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
6d30: 20 20 20 20 20 20 20 20 20 73 65 74 20 73 63 72           set scr
6d40: 69 70 74 44 61 74 61 20 24 72 65 73 75 6c 74 0d  iptData $result.
6d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6d60: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
6d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d90: 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72    # NOTE: Failur
6da0: 65 2c 20 72 65 70 6f 72 74 20 74 68 65 20 65 72  e, report the er
6db0: 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 74  ror message to t
6dc0: 68 65 20 6c 6f 67 2e 0d 0a 20 20 20 20 20 20 20  he log...       
6dd0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
6e00: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
6e10: 20 20 20 20 20 20 20 20 20 74 71 70 75 74 73 20           tqputs 
6e20: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
6e30: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e50: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
6e60: 66 65 74 63 68 20 75 70 64 61 74 65 20 73 63 72  fetch update scr
6e70: 69 70 74 3a 20 22 20 24 72 65 73 75 6c 74 20 5c  ipt: " $result \
6e80: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
6e90: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
6ea0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20             incr 
6eb0: 73 63 72 69 70 74 43 6f 75 6e 74 28 66 61 69 6c  scriptCount(fail
6ec0: 29 3b 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20  ); continue..   
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
6ee0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6ef0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
6f00: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65 78       # NOTE: Nex
6f10: 74 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 74  t, verify that t
6f20: 68 65 20 6d 64 35 2c 20 73 68 61 31 2c 20 61 6e  he md5, sha1, an
6f30: 64 20 73 68 61 35 31 32 0d 0a 20 20 20 20 20 20  d sha512..      
6f40: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
6f50: 20 20 68 61 73 68 65 73 20 6f 66 20 74 68 65 20    hashes of the 
6f60: 72 61 77 20 73 63 72 69 70 74 20 64 61 74 61 20  raw script data 
6f70: 6d 61 74 63 68 20 77 68 61 74 20 77 61 73 0d 0a  match what was..
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f90: 23 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65  #       specifie
6fa0: 64 20 69 6e 20 74 68 65 20 6d 64 35 2c 20 73 68  d in the md5, sh
6fb0: 61 31 2c 20 61 6e 64 20 73 68 61 35 31 32 20 66  a1, and sha512 f
6fc0: 69 65 6c 64 73 2e 0d 0a 20 20 20 20 20 20 20 20  ields...        
6fd0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6fe0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73             set s
6ff0: 63 72 69 70 74 4d 64 35 20 5b 68 61 73 68 20 6e  criptMd5 [hash n
7000: 6f 72 6d 61 6c 20 6d 64 35 20 24 73 63 72 69 70  ormal md5 $scrip
7010: 74 44 61 74 61 5d 0d 0a 0d 0a 20 20 20 20 20 20  tData]....      
7020: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
7030: 73 74 72 69 6e 67 20 65 71 75 61 6c 20 2d 6e 6f  string equal -no
7040: 63 61 73 65 20 24 6c 69 6e 65 4d 64 35 20 24 73  case $lineMd5 $s
7050: 63 72 69 70 74 4d 64 35 5d 7d 20 74 68 65 6e 20  criptMd5]} then 
7060: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
7070: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
7080: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 71                tq
70a0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
70b0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 20 20 20 20 22 2d 2d 2d 2d 20 77 72 6f 6e 67       "---- wrong
70e0: 20 6d 64 35 20 76 61 6c 75 65 20 5c 22 22 20 24   md5 value \"" $
70f0: 73 63 72 69 70 74 4d 64 35 20 5c 0d 0a 20 20 20  scriptMd5 \..   
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 20 20 20 22 5c 22 20 66 6f 72 20 75 70 64       "\" for upd
7120: 61 74 65 20 73 63 72 69 70 74 20 6c 69 6e 65 3a  ate script line:
7130: 20 22 20 24 6c 69 6e 65 20 5c 22 5c 6e 5d 0d 0a   " $line \"\n]..
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7150: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
7160: 20 20 20 20 20 20 20 69 6e 63 72 20 73 63 72 69         incr scri
7170: 70 74 43 6f 75 6e 74 28 62 61 64 29 3b 20 63 6f  ptCount(bad); co
7180: 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20  ntinue..        
7190: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
71a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
71b0: 20 73 63 72 69 70 74 53 68 61 31 20 5b 68 61 73   scriptSha1 [has
71c0: 68 20 6e 6f 72 6d 61 6c 20 73 68 61 31 20 24 73  h normal sha1 $s
71d0: 63 72 69 70 74 44 61 74 61 5d 0d 0a 0d 0a 20 20  criptData]....  
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
71f0: 20 7b 21 5b 73 74 72 69 6e 67 20 65 71 75 61 6c   {![string equal
7200: 20 2d 6e 6f 63 61 73 65 20 24 6c 69 6e 65 53 68   -nocase $lineSh
7210: 61 31 20 24 73 63 72 69 70 74 53 68 61 31 5d 7d  a1 $scriptSha1]}
7220: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7230: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
7240: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 20 20 20 74 71 70 75 74 73 20 24 63 68 61 6e      tqputs $chan
7270: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
7280: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
7290: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
72a0: 20 77 72 6f 6e 67 20 73 68 61 31 20 76 61 6c 75   wrong sha1 valu
72b0: 65 20 5c 22 22 20 24 73 63 72 69 70 74 53 68 61  e \"" $scriptSha
72c0: 31 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  1 \..           
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
72e0: 20 66 6f 72 20 75 70 64 61 74 65 20 73 63 72 69   for update scri
72f0: 70 74 20 6c 69 6e 65 3a 20 22 20 24 6c 69 6e 65  pt line: " $line
7300: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
7310: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
7320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
7330: 6e 63 72 20 73 63 72 69 70 74 43 6f 75 6e 74 28  ncr scriptCount(
7340: 62 61 64 29 3b 20 63 6f 6e 74 69 6e 75 65 0d 0a  bad); continue..
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
7370: 20 20 20 20 20 73 65 74 20 73 63 72 69 70 74 53       set scriptS
7380: 68 61 35 31 32 20 5b 68 61 73 68 20 6e 6f 72 6d  ha512 [hash norm
7390: 61 6c 20 73 68 61 35 31 32 20 24 73 63 72 69 70  al sha512 $scrip
73a0: 74 44 61 74 61 5d 0d 0a 0d 0a 20 20 20 20 20 20  tData]....      
73b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
73c0: 73 74 72 69 6e 67 20 65 71 75 61 6c 20 2d 6e 6f  string equal -no
73d0: 63 61 73 65 20 24 6c 69 6e 65 53 68 61 35 31 32  case $lineSha512
73e0: 20 24 73 63 72 69 70 74 53 68 61 35 31 32 5d 7d   $scriptSha512]}
73f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7400: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
7410: 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 20 74 71 70 75 74 73 20 24 63 68 61 6e      tqputs $chan
7440: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
7450: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
7460: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
7470: 20 77 72 6f 6e 67 20 73 68 61 35 31 32 20 76 61   wrong sha512 va
7480: 6c 75 65 20 5c 22 22 20 24 73 63 72 69 70 74 53  lue \"" $scriptS
7490: 68 61 35 31 32 20 5c 0d 0a 20 20 20 20 20 20 20  ha512 \..       
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74b0: 20 22 5c 22 20 66 6f 72 20 75 70 64 61 74 65 20   "\" for update 
74c0: 73 63 72 69 70 74 20 6c 69 6e 65 3a 20 22 20 24  script line: " $
74d0: 6c 69 6e 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  line \"\n]..    
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
74f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7500: 20 20 20 69 6e 63 72 20 73 63 72 69 70 74 43 6f     incr scriptCo
7510: 75 6e 74 28 62 61 64 29 3b 20 63 6f 6e 74 69 6e  unt(bad); contin
7520: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
7530: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
7540: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
7550: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
7560: 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 65 76 65  TE: Finally, eve
7570: 72 79 74 68 69 6e 67 20 6c 6f 6f 6b 73 20 67 6f  rything looks go
7580: 6f 64 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  od.  Therefore, 
7590: 6a 75 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20  just..          
75a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76        #       ev
75b0: 61 6c 75 61 74 65 20 74 68 65 20 75 70 64 61 74  aluate the updat
75c0: 65 20 73 63 72 69 70 74 20 61 6e 64 20 70 72 69  e script and pri
75d0: 6e 74 20 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a  nt the result...
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
7600: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
7610: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7620: 20 20 20 20 20 20 20 20 20 20 74 71 70 75 74 73            tqputs
7630: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
7640: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
7650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
7660: 2d 2d 2d 2d 20 65 76 61 6c 75 61 74 69 6e 67 20  ---- evaluating 
7670: 75 70 64 61 74 65 20 73 63 72 69 70 74 20 66 72  update script fr
7680: 6f 6d 20 5c 22 22 20 24 73 63 72 69 70 74 55 72  om \"" $scriptUr
7690: 69 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  i \..           
76a0: 20 20 20 20 20 20 20 20 20 20 20 5c 22 2e 2e 2e             \"...
76b0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
76c0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
76d0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
76f0: 4f 54 45 3a 20 52 65 73 65 74 20 74 68 65 20 76  OTE: Reset the v
7700: 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 77 69  ariables that wi
7710: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f  ll be used to co
7720: 6e 74 61 69 6e 0d 0a 20 20 20 20 20 20 20 20 20  ntain..         
7730: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
7740: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
7750: 20 75 70 64 61 74 65 20 73 63 72 69 70 74 2e 0d   update script..
7760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7770: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
7780: 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 3b 20      set code 0; 
7790: 73 65 74 20 72 65 73 75 6c 74 20 22 22 0d 0a 0d  set result ""...
77a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
77b0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
77c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6e 75      # NOTE: Manu
77d0: 61 6c 6c 79 20 6f 76 65 72 72 69 64 65 20 66 69  ally override fi
77e0: 6c 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 72 65  le name to be re
77f0: 74 75 72 6e 65 64 20 62 79 0d 0a 20 20 20 20 20  turned by..     
7800: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
7810: 20 20 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d     [info script]
7820: 20 74 6f 20 72 65 66 65 72 20 62 61 63 6b 20 74   to refer back t
7830: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 6c 79  o the originally
7840: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7850: 20 20 23 20 20 20 20 20 20 20 72 65 61 64 20 73    #       read s
7860: 63 72 69 70 74 20 62 61 73 65 20 55 52 49 2e 0d  cript base URI..
7870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7880: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
7890: 20 20 20 20 73 65 74 20 70 75 73 68 65 64 20 66      set pushed f
78a0: 61 6c 73 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  alse....        
78b0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65          if {[lle
78c0: 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61  ngth [info comma
78d0: 6e 64 73 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30  nds object]] > 0
78e0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
7900: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
7910: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65   +NonPublic Inte
7920: 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76  rpreter.GetActiv
7930: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
7940: 20 20 20 20 20 20 20 20 20 20 20 50 75 73 68 53             PushS
7950: 63 72 69 70 74 4c 6f 63 61 74 69 6f 6e 20 24 73  criptLocation $s
7960: 63 72 69 70 74 55 72 69 20 74 72 75 65 0d 0a 0d  criptUri true...
7970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7980: 20 20 20 73 65 74 20 70 75 73 68 65 64 20 74 72     set pushed tr
7990: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
79a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
79b0: 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0d 0a           try {..
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
79e0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45         # NOTE: E
79f0: 76 61 6c 75 61 74 65 20 74 68 65 20 75 70 64 61  valuate the upda
7a00: 74 65 20 73 63 72 69 70 74 20 69 6e 20 74 68 65  te script in the
7a10: 20 63 6f 6e 74 65 78 74 20 6f 66 0d 0a 20 20 20   context of..   
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
7a30: 20 20 20 20 20 20 20 74 68 65 20 63 61 6c 6c 65         the calle
7a40: 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r...            
7a50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7a60: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63             set c
7a70: 6f 64 65 20 5b 63 61 74 63 68 20 7b 75 70 6c 65  ode [catch {uple
7a80: 76 65 6c 20 31 20 24 73 63 72 69 70 74 44 61 74  vel 1 $scriptDat
7a90: 61 7d 20 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20  a} result]..    
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 66 69              } fi
7ab0: 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20  nally {..       
7ac0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ae0: 23 20 4e 4f 54 45 3a 20 52 65 73 65 74 20 6d 61  # NOTE: Reset ma
7af0: 6e 75 61 6c 20 6f 76 65 72 72 69 64 65 20 6f 66  nual override of
7b00: 20 74 68 65 20 73 63 72 69 70 74 20 66 69 6c 65   the script file
7b10: 20 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20   name..         
7b20: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
7b30: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
7b40: 62 79 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d  by [info script]
7b50: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
7b60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7b70: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 70            if {$p
7b80: 75 73 68 65 64 7d 20 74 68 65 6e 20 7b 0d 0a 20  ushed} then {.. 
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ba0: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
7bb0: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
7bc0: 69 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ic Interpreter.G
7bd0: 65 74 41 63 74 69 76 65 20 5c 0d 0a 20 20 20 20  etActive \..    
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 20 50 6f 70 53 63 72 69 70 74 4c 6f 63      PopScriptLoc
7c00: 61 74 69 6f 6e 20 74 72 75 65 0d 0a 20 20 20 20  ation true..    
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
7c20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7c30: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
7c40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7c50: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
7c60: 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
7c70: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 70 64  he number of upd
7c80: 61 74 65 20 73 63 72 69 70 74 73 20 74 68 61 74  ate scripts that
7c90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7ca0: 20 20 23 20 20 20 20 20 20 20 67 65 6e 65 72 61    #       genera
7cb0: 74 65 20 4f 6b 20 61 6e 64 20 45 72 72 6f 72 20  te Ok and Error 
7cc0: 72 65 74 75 72 6e 20 63 6f 64 65 73 2e 0d 0a 20  return codes... 
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
7ce0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7cf0: 20 20 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 30    if {$code == 0
7d00: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72              incr
7d20: 20 73 63 72 69 70 74 43 6f 75 6e 74 28 6f 6b 29   scriptCount(ok)
7d30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7d40: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
7d60: 63 72 20 73 63 72 69 70 74 43 6f 75 6e 74 28 65  cr scriptCount(e
7d70: 72 72 6f 72 29 0d 0a 20 20 20 20 20 20 20 20 20  rror)..         
7d80: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
7da0: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
7db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7dc0: 20 20 20 68 6f 73 74 20 72 65 73 75 6c 74 20 24     host result $
7dd0: 63 6f 64 65 20 24 72 65 73 75 6c 74 0d 0a 20 20  code $result..  
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7df0: 74 71 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20  tqputs $channel 
7e00: 22 5c 6e 2d 2d 2d 2d 20 65 6e 64 20 6f 66 20 75  "\n---- end of u
7e10: 70 64 61 74 65 20 73 63 72 69 70 74 20 72 65 73  pdate script res
7e20: 75 6c 74 73 5c 6e 22 0d 0a 20 20 20 20 20 20 20  ults\n"..       
7e30: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
7e40: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
7e50: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
7e60: 66 20 7b 24 63 68 65 63 6b 42 75 69 6c 64 20 26  f {$checkBuild &
7e70: 26 20 24 63 6f 6d 70 61 72 65 20 3c 20 30 7d 20  & $compare < 0} 
7e80: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7e90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7ea0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
7eb0: 68 65 20 70 61 74 63 68 20 6c 65 76 65 6c 20 66  he patch level f
7ec0: 72 6f 6d 20 74 68 65 20 6c 69 6e 65 20 69 73 20  rom the line is 
7ed0: 6c 65 73 73 2c 20 77 65 20 61 72 65 20 6d 6f 72  less, we are mor
7ee0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
7ef0: 20 23 20 20 20 20 20 20 20 75 70 2d 74 6f 2d 64   #       up-to-d
7f00: 61 74 65 20 74 68 61 6e 20 74 68 65 20 6c 61 74  ate than the lat
7f10: 65 73 74 20 76 65 72 73 69 6f 6e 3f 0d 0a 20 20  est version?..  
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
7f40: 75 72 6e 20 5b 6c 69 73 74 20 5b 61 70 70 65 6e  urn [list [appen
7f50: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
7f60: 20 20 20 20 20 20 20 20 20 20 20 22 72 75 6e 6e             "runn
7f70: 69 6e 67 20 62 75 69 6c 64 20 22 20 24 65 6e 67  ing build " $eng
7f80: 69 6e 65 50 61 74 63 68 4c 65 76 65 6c 20 22 2c  inePatchLevel ",
7f90: 20 64 61 74 65 64 20 22 20 5c 0d 0a 20 20 20 20   dated " \..    
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65                $e
7fb0: 6e 67 69 6e 65 44 61 74 65 54 69 6d 65 20 22 2c  ngineDateTime ",
7fc0: 20 69 73 20 6e 65 77 65 72 20 74 68 61 6e 20 74   is newer than t
7fd0: 68 65 20 22 20 24 75 70 64 61 74 65 55 72 69 54  he " $updateUriT
7fe0: 79 70 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ype \..         
7ff0: 20 20 20 20 20 20 20 20 20 22 20 62 75 69 6c 64           " build
8000: 20 22 20 24 70 61 74 63 68 4c 65 76 65 6c 20 22   " $patchLevel "
8010: 2c 20 64 61 74 65 64 20 22 20 24 64 61 74 65 54  , dated " $dateT
8020: 69 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ime \..         
8030: 20 20 20 20 20 20 20 20 20 22 2c 20 62 61 73 65           ", base
8040: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 20 22 20  d on the data " 
8050: 22 66 72 6f 6d 20 22 20 24 75 70 64 61 74 65 42  "from " $updateB
8060: 61 73 65 55 72 69 5d 5d 0d 0a 20 20 20 20 20 20  aseUri]]..      
8070: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
8080: 24 63 68 65 63 6b 42 75 69 6c 64 7d 20 74 68 65  $checkBuild} the
8090: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
80a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
80b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
80c0: 70 61 74 63 68 20 6c 65 76 65 6c 73 20 61 72 65  patch levels are
80d0: 20 65 71 75 61 6c 2c 20 77 65 20 61 72 65 20 75   equal, we are u
80e0: 70 2d 74 6f 2d 64 61 74 65 2e 0d 0a 20 20 20 20  p-to-date...    
80f0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
8100: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
8110: 6e 20 5b 6c 69 73 74 20 5b 61 70 70 65 6e 64 41  n [list [appendA
8120: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
8130: 20 20 20 20 20 20 20 20 20 22 72 75 6e 6e 69 6e           "runnin
8140: 67 20 62 75 69 6c 64 20 22 20 24 65 6e 67 69 6e  g build " $engin
8150: 65 50 61 74 63 68 4c 65 76 65 6c 20 22 2c 20 64  ePatchLevel ", d
8160: 61 74 65 64 20 22 20 5c 0d 0a 20 20 20 20 20 20  ated " \..      
8170: 20 20 20 20 20 20 20 20 20 20 20 20 24 65 6e 67              $eng
8180: 69 6e 65 44 61 74 65 54 69 6d 65 20 22 2c 20 69  ineDateTime ", i
8190: 73 20 74 68 65 20 22 20 24 75 70 64 61 74 65 55  s the " $updateU
81a0: 72 69 54 79 70 65 20 5c 0d 0a 20 20 20 20 20 20  riType \..      
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 62 75              " bu
81c0: 69 6c 64 2c 20 62 61 73 65 64 20 6f 6e 20 74 68  ild, based on th
81d0: 65 20 64 61 74 61 20 66 72 6f 6d 20 22 20 24 75  e data from " $u
81e0: 70 64 61 74 65 42 61 73 65 55 72 69 5d 5d 0d 0a  pdateBaseUri]]..
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
8200: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
8210: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
8220: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 0d 0a      }....    #..
8230: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
8240: 72 65 20 6f 75 74 20 77 68 61 74 20 74 68 65 20  re out what the 
8250: 66 69 6e 61 6c 20 72 65 73 75 6c 74 20 73 68 6f  final result sho
8260: 75 6c 64 20 62 65 2e 20 20 49 66 20 77 65 20 67  uld be.  If we g
8270: 65 74 0d 0a 20 20 20 20 23 20 20 20 20 20 20 20  et..    #       
8280: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 77 68  to this point wh
8290: 65 6e 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  en checking for 
82a0: 61 20 6e 65 77 20 62 75 69 6c 64 2c 20 73 6f 6d  a new build, som
82b0: 65 74 68 69 6e 67 0d 0a 20 20 20 20 23 20 20 20  ething..    #   
82c0: 20 20 20 20 6d 75 73 74 20 68 61 76 65 20 67 6f      must have go
82d0: 6e 65 20 61 77 72 79 2e 20 20 4f 74 68 65 72 77  ne awry.  Otherw
82e0: 69 73 65 2c 20 72 65 70 6f 72 74 20 74 68 65 20  ise, report the 
82f0: 6e 75 6d 62 65 72 20 6f 66 0d 0a 20 20 20 20 23  number of..    #
8300: 20 20 20 20 20 20 20 75 70 64 61 74 65 20 73 63         update sc
8310: 72 69 70 74 73 20 74 68 61 74 20 77 65 72 65 20  ripts that were 
8320: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 70 72 6f  successfully pro
8330: 63 65 73 73 65 64 2e 0d 0a 20 20 20 20 23 0d 0a  cessed...    #..
8340: 20 20 20 20 69 66 20 7b 24 77 61 6e 74 53 63 72      if {$wantScr
8350: 69 70 74 73 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ipts} then {..  
8360: 20 20 20 20 73 65 74 20 73 63 72 69 70 74 43 6f      set scriptCo
8370: 75 6e 74 28 74 6f 74 61 6c 29 20 5b 65 78 70 72  unt(total) [expr
8380: 20 5b 6a 6f 69 6e 20 5b 61 72 72 61 79 20 76 61   [join [array va
8390: 6c 75 65 73 20 73 63 72 69 70 74 43 6f 75 6e 74  lues scriptCount
83a0: 5d 20 2b 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  ] +]]....      i
83b0: 66 20 7b 24 73 63 72 69 70 74 43 6f 75 6e 74 28  f {$scriptCount(
83c0: 74 6f 74 61 6c 29 20 3e 20 30 7d 20 74 68 65 6e  total) > 0} then
83d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
83e0: 72 6e 20 5b 6c 69 73 74 20 5b 61 70 70 65 6e 64  rn [list [append
83f0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
8400: 20 20 20 20 22 70 72 6f 63 65 73 73 65 64 20 22      "processed "
8410: 20 24 73 63 72 69 70 74 43 6f 75 6e 74 28 74 6f   $scriptCount(to
8420: 74 61 6c 29 20 22 20 75 70 64 61 74 65 20 73 63  tal) " update sc
8430: 72 69 70 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20  ripts: " \..    
8440: 20 20 20 20 20 20 20 20 5b 61 72 72 61 79 20 67          [array g
8450: 65 74 20 73 63 72 69 70 74 43 6f 75 6e 74 5d 5d  et scriptCount]]
8460: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
8470: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
8480: 6e 20 5b 6c 69 73 74 20 22 6e 6f 20 75 70 64 61  n [list "no upda
8490: 74 65 20 73 63 72 69 70 74 73 20 77 65 72 65 20  te scripts were 
84a0: 70 72 6f 63 65 73 73 65 64 22 5d 0d 0a 20 20 20  processed"]..   
84b0: 20 20 20 7d 0d 0a 20 20 20 20 7d 20 65 6c 73 65     }..    } else
84c0: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
84d0: 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
84e0: 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 64      "could not d
84f0: 65 74 65 72 6d 69 6e 65 20 69 66 20 72 75 6e 6e  etermine if runn
8500: 69 6e 67 20 62 75 69 6c 64 20 69 73 20 74 68 65  ing build is the
8510: 20 6c 61 74 65 73 74 20 62 75 69 6c 64 22 5d 0d   latest build"].
8520: 0a 20 20 20 20 7d 0d 0a 20 20 7d 0d 0a 0c 0d 0a  .    }..  }.....
8530: 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 50    #..  # NOTE: P
8540: 72 6f 76 69 64 65 20 74 68 65 20 45 61 67 6c 65  rovide the Eagle
8550: 20 22 75 70 64 61 74 65 22 20 70 61 63 6b 61 67   "update" packag
8560: 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72  e to the interpr
8570: 65 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61  eter...  #..  pa
8580: 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 45 61  ckage provide Ea
8590: 67 6c 65 2e 55 70 64 61 74 65 20 5c 0d 0a 20 20  gle.Update \..  
85a0: 20 20 5b 65 78 70 72 20 7b 5b 69 73 45 61 67 6c    [expr {[isEagl
85b0: 65 5d 20 3f 20 5b 69 6e 66 6f 20 65 6e 67 69 6e  e] ? [info engin
85c0: 65 20 50 61 74 63 68 4c 65 76 65 6c 5d 20 3a 20  e PatchLevel] : 
85d0: 22 31 2e 30 22 7d 5d 0d 0a 7d 0d 0a 0c           "1.0"}]..}...