Hex Artifact Content

Artifact 092ef76dba7130effcbc0c337655409036a6e8ca:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 74  #!/usr/bin/env t
0010: 63 6c 73 68 0a 23 20 54 63 6c 6b 69 74 20 44 6f  clsh.# Tclkit Do
0020: 77 6e 6c 6f 61 64 65 72 20 76 30 2e 32 2e 32 20  wnloader v0.2.2 
0030: 2d 2d 20 64 6f 77 6e 6c 6f 61 64 20 54 63 6c 6b  -- download Tclk
0040: 69 74 73 20 63 72 65 61 74 65 64 20 77 69 74 68  its created with
0050: 20 74 68 65 20 4b 69 74 43 72 65 61 74 6f 72 0a   the KitCreator.
0060: 23 20 57 65 62 20 49 6e 74 65 72 66 61 63 65 2e  # Web Interface.
0070: 20 57 6f 72 6b 73 20 77 69 74 68 20 54 63 6c 20   Works with Tcl 
0080: 38 2e 35 2b 20 61 6e 64 20 4a 69 6d 20 54 63 6c  8.5+ and Jim Tcl
0090: 20 76 30 2e 37 35 2b 2e 20 54 68 69 73 20 73 63   v0.75+. This sc
00a0: 72 69 70 74 20 72 65 71 75 69 72 65 73 0a 23 20  ript requires.# 
00b0: 74 68 61 74 20 63 55 52 4c 20 62 65 20 61 76 61  that cURL be ava
00c0: 69 6c 61 62 6c 65 20 74 68 72 6f 75 67 68 20 5b  ilable through [
00d0: 65 78 65 63 20 63 75 72 6c 5d 2e 0a 23 20 43 6f  exec curl]..# Co
00e0: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 31 36  pyright (C) 2016
00f0: 2c 20 64 62 6f 68 64 61 6e 2e 0a 23 20 4c 69 63  , dbohdan..# Lic
0100: 65 6e 73 65 3a 20 4d 49 54 2e 0a 70 72 6f 63 20  ense: MIT..proc 
0110: 64 6f 77 6e 6c 6f 61 64 20 75 72 6c 20 7b 0a 20  download url {. 
0120: 20 20 20 69 66 20 7b 21 5b 73 74 72 69 6e 67 20     if {![string 
0130: 6d 61 74 63 68 20 2a 2f 62 75 69 6c 64 69 6e 66  match */buildinf
0140: 6f 20 24 75 72 6c 5d 7d 20 7b 0a 20 20 20 20 20  o $url]} {.     
0150: 20 20 20 23 20 47 75 65 73 73 20 61 74 20 77 68     # Guess at wh
0160: 61 74 20 74 68 65 20 62 75 69 6c 64 69 6e 66 6f  at the buildinfo
0170: 20 55 52 4c 20 6d 69 67 68 74 20 62 65 20 69 66   URL might be if
0180: 20 77 65 20 61 72 65 20 67 69 76 65 6e 2c 20 65   we are given, e
0190: 2e 67 2e 2c 20 61 0a 20 20 20 20 20 20 20 20 23  .g., a.        #
01a0: 20 62 75 69 6c 64 69 6e 67 20 70 61 67 65 20 55   building page U
01b0: 52 4c 2e 0a 20 20 20 20 20 20 20 20 73 65 74 20  RL..        set 
01c0: 75 72 6c 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  url [string map 
01d0: 7b 2f 62 75 69 6c 64 69 6e 67 20 7b 7d 7d 20 24  {/building {}} $
01e0: 75 72 6c 5d 0a 20 20 20 20 20 20 20 20 73 65 74  url].        set
01f0: 20 63 68 65 63 6b 73 75 6d 20 7b 7d 0a 20 20 20   checksum {}.   
0200: 20 20 20 20 20 66 6f 72 65 61 63 68 20 70 69 65       foreach pie
0210: 63 65 20 5b 73 70 6c 69 74 20 24 75 72 6c 20 2f  ce [split $url /
0220: 5d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ] {.            
0230: 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 5b 61  if {[regexp {^[a
0240: 2d 7a 30 2d 39 5d 7b 34 30 7d 24 7d 20 24 70 69  -z0-9]{40}$} $pi
0250: 65 63 65 20 63 68 65 63 6b 73 75 6d 5d 7d 20 7b  ece checksum]} {
0260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0270: 20 62 72 65 61 6b 0a 20 20 20 20 20 20 20 20 20   break.         
0280: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
0290: 20 20 20 20 20 20 20 69 66 20 7b 24 63 68 65 63         if {$chec
02a0: 6b 73 75 6d 20 65 71 20 7b 7d 7d 20 7b 0a 20 20  ksum eq {}} {.  
02b0: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
02c0: 22 63 61 6e 27 74 20 64 65 74 65 72 6d 69 6e 65  "can't determine
02d0: 20 68 6f 77 20 74 6f 20 67 65 74 20 74 68 65 20   how to get the 
02e0: 66 72 6f 6d 20 74 68 65 20 55 52 4c 20 5c 22 24  from the URL \"$
02f0: 75 72 6c 5c 22 20 74 6f 20 74 68 65 5c 0a 20 20  url\" to the\.  
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0310: 20 20 62 75 69 6c 64 69 6e 66 6f 22 0a 20 20 20    buildinfo".   
0320: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
0330: 65 74 20 75 72 6c 20 5b 72 65 67 65 78 70 20 2d  et url [regexp -
0340: 69 6e 6c 69 6e 65 20 22 5e 2e 2a 24 63 68 65 63  inline "^.*$chec
0350: 6b 73 75 6d 22 20 24 75 72 6c 5d 2f 62 75 69 6c  ksum" $url]/buil
0360: 64 69 6e 66 6f 0a 20 20 20 20 7d 0a 0a 20 20 20  dinfo.    }..   
0370: 20 73 65 74 20 62 75 69 6c 64 49 6e 66 6f 20 5b   set buildInfo [
0380: 65 78 65 63 20 63 75 72 6c 20 2d 73 20 24 75 72  exec curl -s $ur
0390: 6c 5d 0a 0a 20 20 20 20 73 65 74 20 66 69 6c 65  l]..    set file
03a0: 6e 61 6d 65 20 5b 64 69 63 74 20 67 65 74 20 24  name [dict get $
03b0: 62 75 69 6c 64 49 6e 66 6f 20 66 69 6c 65 6e 61  buildInfo filena
03c0: 6d 65 5d 0a 20 20 20 20 61 70 70 65 6e 64 20 66  me].    append f
03d0: 69 6c 65 6e 61 6d 65 20 2d 5b 64 69 63 74 20 67  ilename -[dict g
03e0: 65 74 20 24 62 75 69 6c 64 49 6e 66 6f 20 74 63  et $buildInfo tc
03f0: 6c 5f 76 65 72 73 69 6f 6e 5d 0a 20 20 20 20 61  l_version].    a
0400: 70 70 65 6e 64 20 66 69 6c 65 6e 61 6d 65 20 2d  ppend filename -
0410: 5b 64 69 63 74 20 67 65 74 20 24 62 75 69 6c 64  [dict get $build
0420: 49 6e 66 6f 20 70 6c 61 74 66 6f 72 6d 5d 0a 0a  Info platform]..
0430: 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
0440: 20 5b 64 69 63 74 20 67 65 74 20 24 62 75 69 6c   [dict get $buil
0450: 64 49 6e 66 6f 20 70 61 63 6b 61 67 65 73 5d 5d  dInfo packages]]
0460: 20 3e 20 30 7d 20 7b 0a 20 20 20 20 20 20 20 20   > 0} {.        
0470: 66 6f 72 65 61 63 68 20 6f 70 74 69 6f 6e 20 7b  foreach option {
0480: 73 74 61 74 69 63 70 6b 67 73 20 74 68 72 65 61  staticpkgs threa
0490: 64 65 64 20 64 65 62 75 67 7d 20 7b 0a 20 20 20  ded debug} {.   
04a0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 64 69           if {[di
04b0: 63 74 20 65 78 69 73 74 73 20 24 62 75 69 6c 64  ct exists $build
04c0: 49 6e 66 6f 20 6f 70 74 69 6f 6e 73 20 24 6f 70  Info options $op
04d0: 74 69 6f 6e 5d 20 26 26 0a 20 20 20 20 20 20 20  tion] &&.       
04e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 64 69               [di
04f0: 63 74 20 67 65 74 20 24 62 75 69 6c 64 49 6e 66  ct get $buildInf
0500: 6f 20 6f 70 74 69 6f 6e 73 20 24 6f 70 74 69 6f  o options $optio
0510: 6e 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  n]} {.          
0520: 20 20 20 20 20 20 61 70 70 65 6e 64 20 66 69 6c        append fil
0530: 65 6e 61 6d 65 20 2d 24 6f 70 74 69 6f 6e 0a 20  ename -$option. 
0540: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0550: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
0560: 70 70 65 6e 64 20 66 69 6c 65 6e 61 6d 65 20 2d  ppend filename -
0570: 5b 6a 6f 69 6e 20 5b 64 69 63 74 20 67 65 74 20  [join [dict get 
0580: 24 62 75 69 6c 64 49 6e 66 6f 20 70 61 63 6b 61  $buildInfo packa
0590: 67 65 73 5d 20 2d 5d 0a 20 20 20 20 7d 0a 0a 20  ges] -].    }.. 
05a0: 20 20 20 73 65 74 20 74 61 69 6c 20 5b 66 69 6c     set tail [fil
05b0: 65 20 74 61 69 6c 20 24 75 72 6c 5d 0a 20 20 20  e tail $url].   
05c0: 20 23 20 57 65 20 63 61 6e 27 74 20 75 73 65 20   # We can't use 
05d0: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 5d 20 68  [file dirname] h
05e0: 65 72 65 20 62 65 63 61 75 73 65 20 69 74 20 77  ere because it w
05f0: 69 6c 6c 20 74 72 61 6e 73 66 6f 72 6d 0a 20 20  ill transform.  
0600: 20 20 23 20 22 68 74 74 70 3a 2f 2f 65 78 61 6d    # "http://exam
0610: 70 6c 65 2e 63 6f 6d 2f 22 20 69 6e 74 6f 20 22  ple.com/" into "
0620: 68 74 74 70 3a 2f 65 78 61 6d 70 6c 65 2e 63 6f  http:/example.co
0630: 6d 2f 22 2e 0a 20 20 20 20 73 65 74 20 62 61 73  m/"..    set bas
0640: 65 55 72 6c 20 5b 73 74 72 69 6e 67 20 72 61 6e  eUrl [string ran
0650: 67 65 20 24 75 72 6c 20 30 20 65 6e 64 2d 5b 73  ge $url 0 end-[s
0660: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 74 61  tring length $ta
0670: 69 6c 5d 5d 0a 20 20 20 20 69 66 20 7b 5b 73 74  il]].    if {[st
0680: 72 69 6e 67 20 69 6e 64 65 78 20 24 62 61 73 65  ring index $base
0690: 55 72 6c 20 65 6e 64 5d 20 6e 65 20 7b 2f 7d 7d  Url end] ne {/}}
06a0: 20 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e   {.        appen
06b0: 64 20 62 61 73 65 55 72 6c 20 2f 0a 20 20 20 20  d baseUrl /.    
06c0: 7d 0a 20 20 20 20 73 65 74 20 74 63 6c 6b 69 74  }.    set tclkit
06d0: 20 24 62 61 73 65 55 72 6c 5b 64 69 63 74 20 67   $baseUrl[dict g
06e0: 65 74 20 24 62 75 69 6c 64 49 6e 66 6f 20 66 69  et $buildInfo fi
06f0: 6c 65 6e 61 6d 65 5d 0a 0a 20 20 20 20 70 75 74  lename]..    put
0700: 73 20 22 44 6f 77 6e 6c 6f 61 64 69 6e 67 20 24  s "Downloading $
0710: 74 63 6c 6b 69 74 20 74 6f 20 24 66 69 6c 65 6e  tclkit to $filen
0720: 61 6d 65 2e 2e 2e 22 0a 20 20 20 20 65 78 65 63  ame...".    exec
0730: 20 63 75 72 6c 20 2d 6f 20 24 66 69 6c 65 6e 61   curl -o $filena
0740: 6d 65 20 24 74 63 6c 6b 69 74 20 3e 40 20 73 74  me $tclkit >@ st
0750: 64 6f 75 74 20 32 3e 40 20 73 74 64 65 72 72 0a  dout 2>@ stderr.
0760: 0a 20 20 20 20 63 61 74 63 68 20 7b 65 78 65 63  .    catch {exec
0770: 20 63 68 6d 6f 64 20 2b 78 20 24 66 69 6c 65 6e   chmod +x $filen
0780: 61 6d 65 7d 0a 7d 0a 0a 73 65 74 20 75 72 6c 20  ame}.}..set url 
0790: 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20 30 5d  [lindex $argv 0]
07a0: 0a 69 66 20 7b 24 75 72 6c 20 65 71 20 7b 7d 7d  .if {$url eq {}}
07b0: 20 7b 0a 20 20 20 20 70 75 74 73 20 22 75 73 61   {.    puts "usa
07c0: 67 65 3a 20 24 61 72 67 76 30 20 75 72 6c 22 0a  ge: $argv0 url".
07d0: 20 20 20 20 70 75 74 73 20 7b 54 68 65 20 55 52      puts {The UR
07e0: 4c 20 73 68 6f 75 6c 64 20 62 65 20 61 20 4b 69  L should be a Ki
07f0: 74 43 72 65 61 74 6f 72 20 57 65 62 20 49 6e 74  tCreator Web Int
0800: 65 72 66 61 63 65 20 62 75 69 6c 64 69 6e 66 6f  erface buildinfo
0810: 20 70 61 67 65 2e 5c 0a 20 20 20 20 20 20 20 20   page.\.        
0820: 20 20 20 20 49 66 20 69 74 20 69 73 20 69 6e 73      If it is ins
0830: 74 65 61 64 2c 20 65 2e 67 2e 2c 20 61 20 62 75  tead, e.g., a bu
0840: 69 6c 64 69 6e 67 20 70 61 67 65 20 6f 72 20 61  ilding page or a
0850: 20 64 69 72 65 63 74 20 54 63 6c 6b 69 74 20 64   direct Tclkit d
0860: 6f 77 6e 6c 6f 61 64 5c 0a 20 20 20 20 20 20 20  ownload\.       
0870: 20 20 20 20 20 55 52 4c 2c 20 74 68 65 20 73 63       URL, the sc
0880: 72 69 70 74 20 77 69 6c 6c 20 74 72 79 20 74 6f  ript will try to
0890: 20 67 75 65 73 73 20 77 68 65 72 65 20 74 68 65   guess where the
08a0: 20 62 75 69 6c 64 69 6e 66 6f 20 69 73 2e 7d 0a   buildinfo is.}.
08b0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 64 6f 77  } else {.    dow
08c0: 6e 6c 6f 61 64 20 24 75 72 6c 0a 7d 0a           nload $url.}.