⌈⌋ branch:  freshcode


Hex Artifact Content

Artifact d4c38a1da0b2df730234c6991c95c389cd729008:

  • File page_drchangelog.php — part of check-in [a53e4ee480] at 2016-05-05 02:13:03 on branch trunk — Add `debian` changelog autoupdating method. (user: mario size: 8905)

0000: 3c 3f 70 68 70 0a 2f 2a 2a 0a 20 2a 20 74 79 70  <?php./**. * typ
0010: 65 3a 20 70 61 67 65 0a 20 2a 20 74 69 74 6c 65  e: page. * title
0020: 3a 20 44 72 2e 20 43 68 61 6e 67 65 6c 6f 67 0a  : Dr. Changelog.
0030: 20 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 3a 20   * description: 
0040: 54 6f 6f 6c 20 74 6f 20 65 78 70 65 72 69 6d 65  Tool to experime
0050: 6e 74 20 61 6e 64 20 74 72 79 20 6f 75 74 20 41  nt and try out A
0060: 75 74 6f 75 70 64 61 74 65 20 6d 6f 64 75 6c 65  utoupdate module
0070: 73 0a 20 2a 20 76 65 72 73 69 6f 6e 3a 20 30 2e  s. * version: 0.
0080: 32 0a 20 2a 20 6c 69 63 65 6e 73 65 3a 20 41 66  2. * license: Af
0090: 66 65 72 6f 47 50 4c 0a 20 2a 0a 20 2a 20 52 65  feroGPL. *. * Re
00a0: 75 73 65 73 20 66 69 65 6c 64 73 20 66 72 6f 6d  uses fields from
00b0: 20 2f 73 75 62 6d 69 74 20 66 6f 72 6d 20 74 6f   /submit form to
00c0: 20 73 74 61 72 74 20 61 20 6c 69 76 65 20 63 68   start a live ch
00d0: 65 63 6b 20 72 75 6e 20 77 69 74 68 0a 20 2a 20  eck run with. * 
00e0: 61 63 74 75 61 6c 20 41 75 74 6f 75 70 64 61 74  actual Autoupdat
00f0: 65 20 6d 6f 64 75 6c 65 73 2e 0a 20 2a 0a 20 2a  e modules.. *. *
0100: 2f 0a 0a 24 68 65 61 64 65 72 5f 61 64 64 20 3d  /..$header_add =
0110: 20 22 3c 6d 65 74 61 20 6e 61 6d 65 3d 72 6f 62   "<meta name=rob
0120: 6f 74 73 20 63 6f 6e 74 65 6e 74 3d 6e 6f 69 6e  ots content=noin
0130: 64 65 78 3e 22 3b 0a 69 6e 63 6c 75 64 65 28 22  dex>";.include("
0140: 74 65 6d 70 6c 61 74 65 2f 68 65 61 64 65 72 2e  template/header.
0150: 70 68 70 22 29 3b 0a 69 6e 63 6c 75 64 65 28 22  php");.include("
0160: 74 65 6d 70 6c 61 74 65 2f 74 61 62 6c 65 5f 6d  template/table_m
0170: 61 69 6e 2e 70 68 70 22 29 3b 0a 0a 23 2d 2d 20  ain.php");..#-- 
0180: 4f 75 74 70 75 74 20 66 6f 72 6d 61 74 74 65 64  Output formatted
0190: 20 72 65 73 75 6c 74 73 0a 63 6c 61 73 73 20 54   results.class T
01a0: 65 73 74 50 72 6f 6a 65 63 74 20 65 78 74 65 6e  estProject exten
01b0: 64 73 20 41 72 72 61 79 4f 62 6a 65 63 74 20 7b  ds ArrayObject {
01c0: 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 75 70  .    function up
01d0: 64 61 74 65 28 24 72 65 73 75 6c 74 29 20 7b 0a  date($result) {.
01e0: 20 20 20 20 20 20 20 20 23 2d 2d 20 6f 75 74 70          #-- outp
01f0: 75 74 20 66 6f 72 6d 61 74 74 65 64 0a 20 20 20  ut formatted.   
0200: 20 20 20 20 20 70 72 69 6e 74 20 22 3c 64 6c 3e       print "<dl>
0210: 5c 6e 22 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  \n";.        for
0220: 65 61 63 68 20 28 24 72 65 73 75 6c 74 20 61 73  each ($result as
0230: 20 24 6b 65 79 3d 3e 24 76 61 6c 75 65 29 20 7b   $key=>$value) {
0240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
0250: 6e 74 20 22 3c 64 74 3e 3c 62 3e 24 6b 65 79 3c  nt "<dt><b>$key<
0260: 2f 62 3e 3c 2f 64 74 3e 5c 6e 3c 64 64 3e 22 20  /b></dt>\n<dd>" 
0270: 2e 20 69 6e 70 75 74 3a 3a 68 74 6d 6c 28 24 76  . input::html($v
0280: 61 6c 75 65 29 20 2e 20 22 3c 2f 64 64 3e 5c 6e  alue) . "</dd>\n
0290: 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
02a0: 20 20 20 20 20 70 72 69 6e 74 20 22 3c 2f 64 6c       print "</dl
02b0: 3e 22 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 2f 2f  >";.    }.}...//
02c0: 20 72 75 6e 20 74 65 73 74 0a 69 66 20 28 24 5f   run test.if ($_
02d0: 52 45 51 55 45 53 54 2d 3e 68 61 73 28 22 74 65  REQUEST->has("te
02e0: 73 74 22 29 29 20 7b 0a 0a 20 20 20 20 23 2d 2d  st")) {..    #--
02f0: 20 70 72 65 70 61 72 65 0a 20 20 20 20 24 72 75   prepare.    $ru
0300: 6e 20 3d 20 6e 65 77 20 41 75 74 6f 75 70 64 61  n = new Autoupda
0310: 74 65 28 29 3b 0a 20 20 20 20 24 72 75 6e 2d 3e  te();.    $run->
0320: 64 65 62 75 67 20 3d 20 24 5f 52 45 51 55 45 53  debug = $_REQUES
0330: 54 2d 3e 62 6f 6f 6c 65 61 6e 5b 22 64 65 62 75  T->boolean["debu
0340: 67 22 5d 20 3f 20 33 20 3a 20 30 3b 0a 20 20 20  g"] ? 3 : 0;.   
0350: 20 24 70 72 6f 6a 65 63 74 20 3d 20 6e 65 77 20   $project = new 
0360: 54 65 73 74 50 72 6f 6a 65 63 74 28 61 72 72 61  TestProject(arra
0370: 79 28 0a 20 20 20 20 20 20 20 20 20 22 6e 61 6d  y(.         "nam
0380: 65 22 20 3d 3e 20 22 74 65 73 74 70 72 6f 6a 65  e" => "testproje
0390: 63 74 22 2c 0a 20 20 20 20 20 20 20 20 20 22 76  ct",.         "v
03a0: 65 72 73 69 6f 6e 22 20 3d 3e 20 22 30 2e 30 2e  ersion" => "0.0.
03b0: 30 2e 30 2e 30 2e 30 2e 31 22 2c 0a 20 20 20 20  0.0.0.0.1",.    
03c0: 20 20 20 20 20 22 74 5f 70 75 62 6c 69 73 68 65       "t_publishe
03d0: 64 22 20 3d 3e 20 30 2c 0a 20 20 20 20 20 20 20  d" => 0,.       
03e0: 20 20 22 68 6f 6d 65 70 61 67 65 22 20 3d 3e 20    "homepage" => 
03f0: 22 22 2c 0a 20 20 20 20 20 20 20 20 20 22 64 6f  "",.         "do
0400: 77 6e 6c 6f 61 64 22 20 3d 3e 20 22 22 2c 0a 20  wnload" => "",. 
0410: 20 20 20 20 20 20 20 20 22 75 72 6c 73 22 20 3d          "urls" =
0420: 3e 20 22 22 2c 0a 20 20 20 20 20 20 20 20 20 22  > "",.         "
0430: 61 75 74 6f 75 70 64 61 74 65 5f 6d 6f 64 75 6c  autoupdate_modul
0440: 65 22 20 3d 3e 20 24 5f 52 45 51 55 45 53 54 2d  e" => $_REQUEST-
0450: 3e 69 64 2d 3e 69 6e 5f 61 72 72 61 79 28 22 61  >id->in_array("a
0460: 75 74 6f 75 70 64 61 74 65 5f 6d 6f 64 75 6c 65  utoupdate_module
0470: 22 2c 20 22 6e 6f 6e 65 2c 72 65 6c 65 61 73 65  ", "none,release
0480: 2e 6a 73 6f 6e 2c 63 68 61 6e 67 65 6c 6f 67 2c  .json,changelog,
0490: 72 65 67 65 78 2c 67 69 74 68 75 62 2c 73 6f 75  regex,github,sou
04a0: 72 63 65 66 6f 72 67 65 2c 6c 61 75 6e 63 68 70  rceforge,launchp
04b0: 61 64 2c 64 65 62 69 61 6e 22 29 2c 0a 20 20 20  ad,debian"),.   
04c0: 20 20 20 20 20 20 22 61 75 74 6f 75 70 64 61 74        "autoupdat
04d0: 65 5f 75 72 6c 22 20 3d 3e 20 24 5f 52 45 51 55  e_url" => $_REQU
04e0: 45 53 54 2d 3e 75 72 6c 5b 22 61 75 74 6f 75 70  EST->url["autoup
04f0: 64 61 74 65 5f 75 72 6c 22 5d 2c 0a 20 20 20 20  date_url"],.    
0500: 20 20 20 20 20 22 61 75 74 6f 75 70 64 61 74 65       "autoupdate
0510: 5f 72 65 67 65 78 22 20 3d 3e 20 24 5f 52 45 51  _regex" => $_REQ
0520: 55 45 53 54 2d 3e 72 61 77 5b 22 61 75 74 6f 75  UEST->raw["autou
0530: 70 64 61 74 65 5f 72 65 67 65 78 22 5d 2c 0a 20  pdate_regex"],. 
0540: 20 20 20 29 29 3b 0a 20 20 20 20 0a 20 20 20 20     ));.    .    
0550: 23 2d 2d 20 65 78 65 63 0a 20 20 20 20 24 6d 65  #-- exec.    $me
0560: 74 68 6f 64 20 3d 20 24 72 75 6e 2d 3e 6d 61 70  thod = $run->map
0570: 5b 24 70 72 6f 6a 65 63 74 5b 22 61 75 74 6f 75  [$project["autou
0580: 70 64 61 74 65 5f 6d 6f 64 75 6c 65 22 5d 5d 3b  pdate_module"]];
0590: 0a 20 20 20 20 70 72 69 6e 74 20 22 3c 68 33 3e  .    print "<h3>
05a0: 52 65 73 75 6c 74 73 20 66 6f 72 20 3c 65 6d 3e  Results for <em>
05b0: 24 6d 65 74 68 6f 64 3c 2f 65 6d 3e 20 65 78 74  $method</em> ext
05c0: 72 61 63 74 69 6f 6e 3c 2f 68 33 3e 5c 6e 22 3b  raction</h3>\n";
05d0: 0a 20 20 20 20 24 72 65 73 75 6c 74 20 3d 20 24  .    $result = $
05e0: 72 75 6e 2d 3e 24 6d 65 74 68 6f 64 28 24 70 72  run->$method($pr
05f0: 6f 6a 65 63 74 29 3b 0a 20 20 20 20 24 72 65 73  oject);.    $res
0600: 75 6c 74 20 3d 20 6e 65 77 20 54 65 73 74 50 72  ult = new TestPr
0610: 6f 6a 65 63 74 28 28 61 72 72 61 79 29 24 72 65  oject((array)$re
0620: 73 75 6c 74 29 3b 0a 20 20 20 20 24 72 65 73 75  sult);.    $resu
0630: 6c 74 2d 3e 75 70 64 61 74 65 28 24 72 65 73 75  lt->update($resu
0640: 6c 74 29 3b 0a 7d 0a 0a 0a 2f 2f 20 64 69 73 70  lt);.}...// disp
0650: 6c 61 79 20 66 6f 72 6d 0a 65 6c 73 65 20 7b 0a  lay form.else {.
0660: 0a 20 20 20 24 64 61 74 61 20 3d 20 24 5f 52 45  .   $data = $_RE
0670: 51 55 45 53 54 2d 3e 6c 69 73 74 2d 3e 68 74 6d  QUEST->list->htm
0680: 6c 5b 22 6e 61 6d 65 2c 61 75 74 6f 75 70 64 61  l["name,autoupda
0690: 74 65 5f 6d 6f 64 75 6c 65 2c 61 75 74 6f 75 70  te_module,autoup
06a0: 64 61 74 65 5f 75 72 6c 2c 61 75 74 6f 75 70 64  date_url,autoupd
06b0: 61 74 65 5f 72 65 67 65 78 22 5d 3b 0a 20 20 20  ate_regex"];.   
06c0: 24 64 61 74 61 5b 22 61 75 74 6f 75 70 64 61 74  $data["autoupdat
06d0: 65 5f 72 65 67 65 78 22 5d 20 6f 72 20 24 64 61  e_regex"] or $da
06e0: 74 61 5b 22 61 75 74 6f 75 70 64 61 74 65 5f 72  ta["autoupdate_r
06f0: 65 67 65 78 22 5d 20 3d 20 22 5c 6e 5c 6e 22 3b  egex"] = "\n\n";
0700: 20 23 20 22 76 65 72 73 69 6f 6e 20 3d 20 2f 56   # "version = /V
0710: 65 72 73 69 6f 6e 20 28 5b 5c 64 2e 5d 2b 29 2f  ersion ([\d.]+)/
0720: 5c 6e 5c 6e 63 68 61 6e 67 65 73 20 3d 20 68 74  \n\nchanges = ht
0730: 74 70 3a 2f 2f 65 78 61 6d 70 6c 65 2e 6f 72 67  tp://example.org
0740: 2f 6e 65 77 73 2e 68 74 6d 6c 5c 6e 63 68 61 6e  /news.html\nchan
0750: 67 65 73 20 3d 20 24 28 27 61 72 74 69 63 6c 65  ges = $('article
0760: 20 70 72 65 23 72 65 6c 65 61 73 65 27 29 5c 6e   pre#release')\n
0770: 63 68 61 6e 67 65 73 20 3d 20 7e 20 28 28 61 64  changes = ~ ((ad
0780: 64 7c 66 69 78 7c 63 68 61 6e 67 65 29 20 5c 56  d|fix|change) \V
0790: 2b 29 20 7e 6d 69 78 2a 22 3b 0a 20 20 20 24 63  +) ~mix*";.   $c
07a0: 75 72 72 65 6e 74 5f 64 61 74 65 20 3d 20 73 74  urrent_date = st
07b0: 72 66 74 69 6d 65 28 22 25 59 2d 25 6d 2d 25 64  rftime("%Y-%m-%d
07c0: 22 2c 20 74 69 6d 65 28 29 29 3b 0a 0a 20 20 20  ", time());..   
07d0: 24 73 65 6c 65 63 74 20 3d 20 22 66 6f 72 6d 5f  $select = "form_
07e0: 73 65 6c 65 63 74 5f 6f 70 74 69 6f 6e 73 22 3b  select_options";
07f0: 0a 20 20 20 70 72 69 6e 74 3c 3c 3c 46 4f 52 4d  .   print<<<FORM
0800: 0a 0a 3c 73 74 79 6c 65 3e 0a 2f 2a 2a 0a 20 2a  ..<style>./**. *
0810: 20 70 61 67 65 2d 73 70 65 63 69 66 69 63 20 6c   page-specific l
0820: 61 79 6f 75 74 0a 20 2a 0a 20 2a 2f 0a 2e 61 75  ayout. *. */..au
0830: 74 6f 75 70 64 61 74 65 2d 61 6c 74 65 72 6e 61  toupdate-alterna
0840: 74 69 76 65 73 20 7b 20 62 6f 72 64 65 72 2d 73  tives { border-s
0850: 70 61 63 69 6e 67 3a 20 35 70 74 3b 20 7d 0a 2e  pacing: 5pt; }..
0860: 61 75 74 6f 75 70 64 61 74 65 2d 61 6c 74 65 72  autoupdate-alter
0870: 6e 61 74 69 76 65 73 20 74 64 20 7b 0a 20 20 20  natives td {.   
0880: 20 70 61 64 64 69 6e 67 3a 20 33 70 74 3b 0a 20   padding: 3pt;. 
0890: 20 20 20 77 69 64 74 68 3a 20 32 35 25 3b 0a 20     width: 25%;. 
08a0: 20 20 20 76 65 72 74 69 63 61 6c 2d 61 6c 69 67     vertical-alig
08b0: 6e 3a 20 74 6f 70 3b 0a 20 20 20 20 62 61 63 6b  n: top;.    back
08c0: 67 72 6f 75 6e 64 3a 20 23 66 63 66 63 66 63 20  ground: #fcfcfc 
08d0: 6c 69 6e 65 61 72 2d 67 72 61 64 69 65 6e 74 28  linear-gradient(
08e0: 74 6f 20 62 6f 74 74 6f 6d 2c 20 23 66 37 66 30  to bottom, #f7f0
08f0: 65 39 2c 20 23 66 66 66 29 3b 0a 20 20 20 20 62  e9, #fff);.    b
0900: 6f 78 2d 73 68 61 64 6f 77 3a 20 32 70 78 20 32  ox-shadow: 2px 2
0910: 70 78 20 33 70 78 20 31 70 78 20 23 66 39 66 35  px 3px 1px #f9f5
0920: 66 31 3b 0a 20 20 20 20 62 6f 72 64 65 72 2d 72  f1;.    border-r
0930: 61 64 69 75 73 3a 20 31 30 70 74 3b 0a 20 20 20  adius: 10pt;.   
0940: 20 66 6f 6e 74 2d 73 69 7a 65 3a 20 39 35 25 3b   font-size: 95%;
0950: 0a 7d 0a 2e 61 75 74 6f 75 70 64 61 74 65 2d 61  .}..autoupdate-a
0960: 6c 74 65 72 6e 61 74 69 76 65 73 20 74 64 20 2e  lternatives td .
0970: 68 69 64 64 65 6e 20 7b 0a 20 20 20 20 70 6f 73  hidden {.    pos
0980: 69 74 69 6f 6e 3a 20 61 62 73 6f 6c 75 74 65 3b  ition: absolute;
0990: 0a 20 20 20 20 64 69 73 70 6c 61 79 3a 20 6e 6f  .    display: no
09a0: 6e 65 3b 0a 7d 0a 2e 61 75 74 6f 75 70 64 61 74  ne;.}..autoupdat
09b0: 65 2d 61 6c 74 65 72 6e 61 74 69 76 65 73 20 74  e-alternatives t
09c0: 64 3a 68 6f 76 65 72 20 2e 68 69 64 64 65 6e 20  d:hover .hidden 
09d0: 7b 0a 20 20 20 20 64 69 73 70 6c 61 79 3a 20 62  {.    display: b
09e0: 6c 6f 63 6b 3b 0a 7d 0a 2e 61 75 74 6f 75 70 64  lock;.}..autoupd
09f0: 61 74 65 2d 61 6c 74 65 72 6e 61 74 69 76 65 73  ate-alternatives
0a00: 20 74 64 20 2e 68 69 64 64 65 6e 20 70 72 65 20   td .hidden pre 
0a10: 7b 0a 20 20 20 20 70 6f 73 69 74 69 6f 6e 3a 20  {.    position: 
0a20: 72 65 6c 61 74 69 76 65 3b 20 74 6f 70 3a 20 2d  relative; top: -
0a30: 33 30 70 74 3b 20 6c 65 66 74 3a 20 2d 33 30 70  30pt; left: -30p
0a40: 74 3b 0a 20 20 20 20 70 61 64 64 69 6e 67 3a 20  t;.    padding: 
0a50: 37 70 74 3b 0a 20 20 20 20 62 6f 72 64 65 72 3a  7pt;.    border:
0a60: 20 37 70 78 20 73 6f 6c 69 64 20 23 31 31 31 3b   7px solid #111;
0a70: 0a 20 20 20 20 62 6f 72 64 65 72 2d 72 61 64 69  .    border-radi
0a80: 75 73 3a 20 37 70 74 3b 0a 20 20 20 20 62 61 63  us: 7pt;.    bac
0a90: 6b 67 72 6f 75 6e 64 3a 20 23 66 37 66 37 66 37  kground: #f7f7f7
0aa0: 3b 0a 20 20 20 20 62 61 63 6b 67 72 6f 75 6e 64  ;.    background
0ab0: 2d 69 6d 61 67 65 3a 20 72 61 64 69 61 6c 2d 67  -image: radial-g
0ac0: 72 61 64 69 65 6e 74 28 63 69 72 63 6c 65 20 61  radient(circle a
0ad0: 74 20 35 30 25 20 35 30 25 2c 20 72 67 62 28 32  t 50% 50%, rgb(2
0ae0: 35 35 2c 32 35 35 2c 32 35 35 29 2c 20 72 67 62  55,255,255), rgb
0af0: 28 32 34 34 2c 32 34 34 2c 32 34 34 29 29 3b 0a  (244,244,244));.
0b00: 7d 0a 6c 69 20 7b 0a 20 20 20 20 70 61 64 64 69  }.li {.    paddi
0b10: 6e 67 3a 20 31 2e 35 70 74 3b 0a 7d 0a 3c 2f 73  ng: 1.5pt;.}.</s
0b20: 74 79 6c 65 3e 0a 20 20 20 0a 20 20 20 3c 68 33  tyle>.   .   <h3
0b30: 3e 44 72 2e 20 43 68 61 6e 67 65 6c 6f 67 3c 2f  >Dr. Changelog</
0b40: 68 33 3e 20 0a 20 20 20 3c 66 6f 72 6d 20 61 63  h3> .   <form ac
0b50: 74 69 6f 6e 3d 64 72 63 68 61 6e 67 65 6c 6f 67  tion=drchangelog
0b60: 20 6d 65 74 68 6f 64 3d 50 4f 53 54 3e 0a 20 20   method=POST>.  
0b70: 20 20 20 20 20 20 3c 69 6d 67 20 73 72 63 3d 69        <img src=i
0b80: 6d 67 2f 64 72 63 68 61 6e 67 65 6c 6f 67 2e 70  mg/drchangelog.p
0b90: 6e 67 20 61 6c 69 67 6e 3d 72 69 67 68 74 20 61  ng align=right a
0ba0: 6c 74 3d 22 62 69 72 64 79 20 62 69 67 20 65 79  lt="birdy big ey
0bb0: 65 73 22 20 74 69 74 6c 65 3d 22 44 6f 6e 27 74  es" title="Don't
0bc0: 20 61 73 6b 20 6d 65 2c 20 49 27 6d 20 6a 75 73   ask me, I'm jus
0bd0: 74 20 61 20 70 69 63 74 6f 67 72 61 6d 2e 22 3e  t a pictogram.">
0be0: 0a 20 20 20 20 20 20 20 20 3c 70 3e 0a 20 20 20  .        <p>.   
0bf0: 20 20 20 20 20 20 20 20 46 72 65 73 68 63 6f 64          Freshcod
0c00: 65 2e 63 6c 75 62 20 63 61 6e 20 61 75 74 6f 6d  e.club can autom
0c10: 61 74 69 63 61 6c 6c 79 20 74 72 61 63 6b 20 79  atically track y
0c20: 6f 75 72 20 73 6f 66 74 77 61 72 65 20 72 65 6c  our software rel
0c30: 65 61 73 65 73 2e 20 54 68 65 72 65 20 61 72 65  eases. There are
0c40: 0a 20 20 20 20 20 20 20 20 20 20 20 3c 61 20 68  .           <a h
0c50: 72 65 66 3d 22 68 74 74 70 3a 2f 2f 66 6f 73 73  ref="http://foss
0c60: 69 6c 2e 69 6e 63 6c 75 64 65 2d 6f 6e 63 65 2e  il.include-once.
0c70: 6f 72 67 2f 66 72 65 73 68 63 6f 64 65 2f 77 69  org/freshcode/wi
0c80: 6b 69 2f 41 75 74 6f 75 70 64 61 74 65 22 3e 76  ki/Autoupdate">v
0c90: 61 72 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  arious.         
0ca0: 20 20 61 6c 74 65 72 6e 61 74 69 76 65 73 20 66    alternatives f
0cb0: 6f 72 3c 2f 61 3e 20 75 6e 63 6f 76 65 72 69 6e  or</a> uncoverin
0cc0: 67 20 74 68 65 6d 2e 20 54 72 79 20 74 68 65 6d  g them. Try them
0cd0: 20 6f 75 74 2e 0a 0a 20 20 20 20 20 20 20 20 20   out...         
0ce0: 20 20 3c 6c 61 62 65 6c 3e 0a 20 20 20 20 20 20    <label>.      
0cf0: 20 20 20 20 20 20 20 20 20 52 65 74 72 69 65 76           Retriev
0d00: 61 6c 20 6d 65 74 68 6f 64 0a 20 20 20 20 20 20  al method.      
0d10: 20 20 20 20 20 20 20 20 20 3c 73 65 6c 65 63 74           <select
0d20: 20 6e 61 6d 65 3d 61 75 74 6f 75 70 64 61 74 65   name=autoupdate
0d30: 5f 6d 6f 64 75 6c 65 3e 0a 20 20 20 20 20 20 20  _module>.       
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 7b 24 73 65              {$se
0d50: 6c 65 63 74 28 22 72 65 6c 65 61 73 65 2e 6a 73  lect("release.js
0d60: 6f 6e 2c 63 68 61 6e 67 65 6c 6f 67 2c 72 65 67  on,changelog,reg
0d70: 65 78 2c 67 69 74 68 75 62 2c 73 6f 75 72 63 65  ex,github,source
0d80: 66 6f 72 67 65 2c 6c 61 75 6e 63 68 70 61 64 2c  forge,launchpad,
0d90: 64 65 62 69 61 6e 22 2c 20 24 64 61 74 61 5b 22  debian", $data["
0da0: 61 75 74 6f 75 70 64 61 74 65 5f 6d 6f 64 75 6c  autoupdate_modul
0db0: 65 22 5d 29 7d 0a 20 20 20 20 20 20 20 20 20 20  e"])}.          
0dc0: 20 20 20 20 20 3c 2f 73 65 6c 65 63 74 3e 0a 20       </select>. 
0dd0: 20 20 20 20 20 20 20 20 20 20 3c 2f 6c 61 62 65            </labe
0de0: 6c 3e 0a 0a 20 20 20 20 20 20 20 20 20 20 20 3c  l>..           <
0df0: 74 61 62 6c 65 20 63 6c 61 73 73 3d 61 75 74 6f  table class=auto
0e00: 75 70 64 61 74 65 2d 61 6c 74 65 72 6e 61 74 69  update-alternati
0e10: 76 65 73 3e 3c 74 72 3e 0a 20 20 20 20 20 20 20  ves><tr>.       
0e20: 20 20 20 20 3c 74 64 3e 0a 20 20 20 20 20 20 20      <td>.       
0e30: 20 20 20 20 20 20 3c 61 20 68 72 65 66 3d 22 68        <a href="h
0e40: 74 74 70 3a 2f 2f 66 6f 73 73 69 6c 2e 69 6e 63  ttp://fossil.inc
0e50: 6c 75 64 65 2d 6f 6e 63 65 2e 6f 72 67 2f 66 72  lude-once.org/fr
0e60: 65 73 68 63 6f 64 65 2f 77 69 6b 69 2f 72 65 6c  eshcode/wiki/rel
0e70: 65 61 73 65 73 2e 6a 73 6f 6e 22 3e 3c 65 6d 3e  eases.json"><em>
0e80: 72 65 6c 65 61 73 65 73 2e 6a 73 6f 6e 3c 2f 65  releases.json</e
0e90: 6d 3e 3c 2f 61 3e 0a 20 20 20 20 20 20 20 20 20  m></a>.         
0ea0: 20 20 20 20 64 65 66 69 6e 65 73 20 61 20 63 6f      defines a co
0eb0: 6e 63 72 65 74 65 20 73 63 68 65 6d 65 20 66 6f  ncrete scheme fo
0ec0: 72 20 70 75 62 6c 69 73 68 69 6e 67 20 76 65 72  r publishing ver
0ed0: 73 69 6f 6e 20 61 6e 64 20 72 65 6c 65 61 73 65  sion and release
0ee0: 20 6e 6f 74 65 73 2e 0a 3c 73 70 61 6e 20 63 6c   notes..<span cl
0ef0: 61 73 73 3d 68 69 64 64 65 6e 3e 3c 70 72 65 3e  ass=hidden><pre>
0f00: 0a 7b 0a 20 20 22 76 65 72 73 69 6f 6e 22 3a 20  .{.  "version": 
0f10: 22 31 2e 30 2e 30 22 2c 0a 20 20 22 63 68 61 6e  "1.0.0",.  "chan
0f20: 67 65 73 22 3a 20 22 46 69 78 65 73 20 61 6e 64  ges": "Fixes and
0f30: 20 61 64 64 73 20 6c 6f 74 73 0a 20 20 20 20 20   adds lots.     
0f40: 20 20 20 20 20 20 20 20 20 6f 66 20 6e 65 77 20           of new 
0f50: 66 75 6e 63 74 69 6f 6e 73 20 2e 2e 22 2c 0a 20  functions ..",. 
0f60: 20 22 73 74 61 74 65 22 3a 20 22 73 74 61 62 6c   "state": "stabl
0f70: 65 22 2c 0a 20 20 22 73 63 6f 70 65 22 3a 20 22  e",.  "scope": "
0f80: 6d 61 6a 6f 72 20 66 65 61 74 75 72 65 22 2c 0a  major feature",.
0f90: 20 20 22 64 6f 77 6e 6c 6f 61 64 22 3a 20 22 68    "download": "h
0fa0: 74 74 70 3a 2f 2f 65 78 6d 70 6c 2e 6f 72 67 2f  ttp://exmpl.org/
0fb0: 22 0a 7d 0a 3c 2f 70 72 65 3e 3c 2f 73 70 61 6e  ".}.</pre></span
0fc0: 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3c  >.             <
0fd0: 2f 74 64 3e 0a 20 20 20 20 20 20 20 20 20 20 20  /td>.           
0fe0: 3c 74 64 3e 57 68 69 6c 65 20 61 20 3c 61 20 68  <td>While a <a h
0ff0: 72 65 66 3d 22 68 74 74 70 3a 2f 2f 66 6f 73 73  ref="http://foss
1000: 69 6c 2e 69 6e 63 6c 75 64 65 2d 6f 6e 63 65 2e  il.include-once.
1010: 6f 72 67 2f 66 72 65 73 68 63 6f 64 65 2f 77 69  org/freshcode/wi
1020: 6b 69 2f 41 75 74 6f 75 70 64 61 74 65 43 68 61  ki/AutoupdateCha
1030: 6e 67 65 6c 6f 67 22 3e 3c 65 6d 3e 43 68 61 6e  ngelog"><em>Chan
1040: 67 65 6c 6f 67 3c 2f 65 6d 3e 3c 2f 61 3e 0a 20  gelog</em></a>. 
1050: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 78 74              text
1060: 20 66 69 6c 65 20 69 73 20 6c 69 6b 65 6c 79 20   file is likely 
1070: 74 68 65 20 65 61 73 69 65 73 74 2c 20 67 69 76  the easiest, giv
1080: 65 6e 20 61 20 63 6f 68 65 72 65 6e 74 20 66 6f  en a coherent fo
1090: 72 6d 61 74 20 61 6e 64 20 73 74 79 6c 65 2e 0a  rmat and style..
10a0: 3c 73 70 61 6e 20 63 6c 61 73 73 3d 68 69 64 64  <span class=hidd
10b0: 65 6e 3e 3c 70 72 65 3e 0a 31 2e 30 2e 30 20 28  en><pre>.1.0.0 (
10c0: 24 63 75 72 72 65 6e 74 5f 64 61 74 65 29 0a 2d  $current_date).-
10d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e0: 2d 0a 20 2a 20 43 68 61 6e 67 65 73 20 66 6f 6f  -. * Changes foo
10f0: 20 61 6e 64 20 62 61 72 2e 0a 20 2b 20 41 64 64   and bar.. + Add
1100: 73 20 62 61 7a 20 62 61 7a 2e 0a 20 2d 20 53 6f  s baz baz.. - So
1110: 6d 65 20 6d 6f 72 65 20 62 75 67 73 20 72 65 6d  me more bugs rem
1120: 6f 76 65 64 2e 0a 20 0a 30 2e 39 2e 39 20 28 32  oved.. .0.9.9 (2
1130: 30 31 34 2d 30 32 2d 32 37 29 0a 2d 2d 2d 2d 2d  014-02-27).-----
1140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
1150: 20 4e 6f 77 20 75 73 65 73 20 51 74 35 0a 20 2d   Now uses Qt5. -
1160: 20 52 65 6d 6f 76 65 64 20 61 6c 6c 20 74 68 65   Removed all the
1170: 20 62 75 67 73 0a 0a 30 2e 39 2e 31 20 28 32 30   bugs..0.9.1 (20
1180: 31 34 2d 30 31 2d 32 30 29 0a 2d 2d 2d 2d 2d 2d  14-01-20).------
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 20  ------------. * 
11a0: 49 6e 69 74 69 61 6c 20 72 65 6c 65 61 73 65 20  Initial release 
11b0: 77 69 74 68 0a 3c 2f 70 72 65 3e 3c 2f 73 70 61  with.</pre></spa
11c0: 6e 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n>.             
11d0: 3c 2f 74 64 3e 0a 20 20 20 20 20 20 20 20 20 20  </td>.          
11e0: 20 3c 74 64 3e 3c 61 20 68 72 65 66 3d 22 68 74   <td><a href="ht
11f0: 74 70 3a 2f 2f 66 6f 73 73 69 6c 2e 69 6e 63 6c  tp://fossil.incl
1200: 75 64 65 2d 6f 6e 63 65 2e 6f 72 67 2f 66 72 65  ude-once.org/fre
1210: 73 68 63 6f 64 65 2f 77 69 6b 69 2f 41 75 74 6f  shcode/wiki/Auto
1220: 75 70 64 61 74 65 47 69 74 68 75 62 22 3e 3c 65  updateGithub"><e
1230: 6d 3e 47 69 74 68 75 62 3c 2f 65 6d 3e 3c 2f 61  m>Github</em></a
1240: 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  >.            ex
1250: 74 72 61 63 74 69 6f 6e 20 70 72 65 66 65 72 73  traction prefers
1260: 20 3c 6e 6f 62 72 3e 2f 72 65 6c 65 61 73 65 73   <nobr>/releases
1270: 3c 2f 6e 6f 62 72 3e 20 6e 6f 74 65 73 2e 20 42  </nobr> notes. B
1280: 75 74 20 6d 61 79 20 61 73 20 6c 61 73 74 20 72  ut may as last r
1290: 65 73 6f 72 74 20 63 6f 6e 64 65 6e 73 65 20 61  esort condense a
12a0: 20 67 69 74 20 63 6f 6d 6d 69 74 20 6c 6f 67 2e   git commit log.
12b0: 0a 3c 73 70 61 6e 20 63 6c 61 73 73 3d 68 69 64  .<span class=hid
12c0: 64 65 6e 3e 3c 70 72 65 3e 3c 61 20 68 72 65 66  den><pre><a href
12d0: 3d 22 68 74 74 70 73 3a 2f 2f 67 69 74 68 75 62  ="https://github
12e0: 2e 63 6f 6d 2f 62 6c 6f 67 2f 31 35 34 37 2d 72  .com/blog/1547-r
12f0: 65 6c 65 61 73 65 2d 79 6f 75 72 2d 73 6f 66 74  elease-your-soft
1300: 77 61 72 65 22 3e 3c 69 6d 67 20 73 72 63 3d 22  ware"><img src="
1310: 68 74 74 70 73 3a 2f 2f 63 61 6d 6f 2e 67 69 74  https://camo.git
1320: 68 75 62 75 73 65 72 63 6f 6e 74 65 6e 74 2e 63  hubusercontent.c
1330: 6f 6d 2f 39 66 32 33 66 35 34 64 66 39 65 32 66  om/9f23f54df9e2f
1340: 36 39 30 34 37 66 62 30 66 39 66 38 30 62 32 65  69047fb0f9f80b2e
1350: 33 33 63 38 33 33 39 36 30 36 66 2f 36 38 37 34  33c8339606f/6874
1360: 37 34 37 30 37 33 33 61 32 66 32 66 36 36 32 65  7470733a2f2f662e
1370: 36 33 36 63 36 66 37 35 36 34 32 65 36 37 36 39  636c6f75642e6769
1380: 37 34 36 38 37 35 36 32 32 65 36 33 36 66 36 64  746875622e636f6d
1390: 32 66 36 31 37 33 37 33 36 35 37 34 37 33 32 66  2f6173736574732f
13a0: 33 32 33 31 32 66 33 37 33 33 33 37 33 31 33 36  32312f3733373136
13b0: 33 36 32 66 36 32 36 34 33 31 36 33 36 32 33 36  362f626431636236
13c0: 33 37 36 35 32 64 36 35 33 33 33 32 33 39 32 64  37652d653332392d
13d0: 33 31 33 31 36 35 33 32 32 64 33 39 33 30 36 34  313165322d393064
13e0: 33 31 32 64 33 33 36 31 36 35 36 33 36 35 36 35  312d336165636565
13f0: 33 39 33 30 33 37 33 33 33 39 36 36 32 65 36 61  3930373339662e6a
1400: 37 30 36 37 22 20 77 69 64 74 68 3d 34 30 30 20  7067" width=400 
1410: 68 65 69 67 68 74 3d 32 30 30 3e 3c 2f 61 3e 3c  height=200></a><
1420: 2f 70 72 65 3e 3c 2f 73 70 61 6e 3e 0a 20 20 20  /pre></span>.   
1430: 20 20 20 20 20 20 20 20 20 3c 2f 74 64 3e 0a 20           </td>. 
1440: 20 20 20 20 20 20 20 20 20 20 3c 74 64 3e 55 73            <td>Us
1450: 69 6e 67 20 3c 61 20 68 72 65 66 3d 22 68 74 74  ing <a href="htt
1460: 70 3a 2f 2f 66 6f 73 73 69 6c 2e 69 6e 63 6c 75  p://fossil.inclu
1470: 64 65 2d 6f 6e 63 65 2e 6f 72 67 2f 66 72 65 73  de-once.org/fres
1480: 68 63 6f 64 65 2f 77 69 6b 69 2f 41 75 74 6f 75  hcode/wiki/Autou
1490: 70 64 61 74 65 52 65 67 65 78 22 3e 3c 65 6d 3e  pdateRegex"><em>
14a0: 72 65 67 65 78 2f 78 70 61 74 68 3c 2f 65 6d 3e  regex/xpath</em>
14b0: 3c 2f 61 3e 0a 20 20 20 20 20 20 20 20 20 20 20  </a>.           
14c0: 20 20 69 73 20 68 6f 77 65 76 65 72 20 74 68 65    is however the
14d0: 20 6d 6f 73 74 20 75 6e 69 76 65 72 73 61 6c 20   most universal 
14e0: 77 61 79 20 74 6f 20 65 78 74 72 61 63 74 20 66  way to extract f
14f0: 72 6f 6d 20 70 72 6f 6a 65 63 74 20 77 65 62 73  rom project webs
1500: 69 74 65 73 2e 0a 3c 73 70 61 6e 20 63 6c 61 73  ites..<span clas
1510: 73 3d 68 69 64 64 65 6e 3e 3c 70 72 65 3e 0a 3c  s=hidden><pre>.<
1520: 73 70 61 6e 20 73 74 79 6c 65 3d 63 6f 6c 6f 72  span style=color
1530: 3a 67 72 61 79 3e 23 20 6c 6f 61 64 20 70 61 67  :gray># load pag
1540: 65 3c 2f 73 70 61 6e 3e 0a 63 68 61 6e 67 65 73  e</span>.changes
1550: 20 3d 20 68 74 74 70 3a 2f 2f 65 78 6d 70 6c 2f   = http://exmpl/
1560: 6e 65 77 73 0a 0a 3c 73 70 61 6e 20 73 74 79 6c  news..<span styl
1570: 65 3d 63 6f 6c 6f 72 3a 67 72 61 79 3e 23 20 6a  e=color:gray># j
1580: 51 75 65 72 79 3c 2f 73 70 61 6e 3e 0a 63 68 61  Query</span>.cha
1590: 6e 67 65 73 20 3d 20 24 28 22 62 6f 64 79 20 2e  nges = $("body .
15a0: 72 65 6c 65 61 73 65 22 29 0a 20 0a 3c 73 70 61  release"). .<spa
15b0: 6e 20 73 74 79 6c 65 3d 63 6f 6c 6f 72 3a 67 72  n style=color:gr
15c0: 61 79 3e 23 20 52 65 67 45 78 70 3c 2f 73 70 61  ay># RegExp</spa
15d0: 6e 3e 0a 76 65 72 73 69 6f 6e 20 3d 20 2f 56 65  n>.version = /Ve
15e0: 72 73 69 6f 6e 20 5c 64 2b 5c 2e 5c 64 2b 2f 0a  rsion \d+\.\d+/.
15f0: 0a 3c 2f 70 72 65 3e 3c 2f 73 70 61 6e 3e 0a 20  .</pre></span>. 
1600: 20 20 20 20 20 20 20 20 20 20 20 20 3c 2f 74 64              </td
1610: 3e 0a 20 20 20 20 20 20 20 20 20 20 20 3c 2f 74  >.           </t
1620: 72 3e 3c 2f 74 61 62 6c 65 3e 0a 0a 20 20 20 20  r></table>..    
1630: 20 20 20 20 3c 2f 70 3e 0a 20 20 20 20 20 20 20      </p>.       
1640: 20 3c 70 3e 0a 20 20 20 20 20 20 20 20 20 20 20   <p>.           
1650: 3c 6c 61 62 65 6c 3e 0a 20 20 20 20 20 20 20 20  <label>.        
1660: 20 20 20 20 20 20 20 41 75 74 6f 75 70 64 61 74         Autoupdat
1670: 65 20 55 52 4c 0a 20 20 20 20 20 20 20 20 20 20  e URL.          
1680: 20 20 20 20 20 3c 69 6e 70 75 74 20 6e 61 6d 65       <input name
1690: 3d 61 75 74 6f 75 70 64 61 74 65 5f 75 72 6c 20  =autoupdate_url 
16a0: 74 79 70 65 3d 75 72 6c 20 73 69 7a 65 3d 38 30  type=url size=80
16b0: 20 76 61 6c 75 65 3d 22 24 64 61 74 61 5b 61 75   value="$data[au
16c0: 74 6f 75 70 64 61 74 65 5f 75 72 6c 5d 22 20 70  toupdate_url]" p
16d0: 6c 61 63 65 68 6f 6c 64 65 72 3d 22 68 74 74 70  laceholder="http
16e0: 73 3a 2f 2f 67 69 74 68 75 62 2e 63 6f 6d 2f 75  s://github.com/u
16f0: 73 65 72 2f 72 65 70 6f 2f 74 61 67 73 2e 61 74  ser/repo/tags.at
1700: 6f 6d 22 20 6d 61 78 6c 65 6e 67 74 68 3d 32 35  om" maxlength=25
1710: 30 3e 0a 20 20 20 20 20 20 20 20 20 20 20 3c 2f  0>.           </
1720: 6c 61 62 65 6c 3e 0a 20 20 20 20 20 20 20 20 20  label>.         
1730: 20 20 41 64 64 20 74 68 65 20 55 52 4c 20 74 6f    Add the URL to
1740: 20 79 6f 75 72 20 43 68 61 6e 67 65 6c 6f 67 2c   your Changelog,
1750: 20 72 65 6c 65 61 73 65 73 2e 6a 73 6f 6e 2c 20   releases.json, 
1760: 6f 72 20 47 69 74 48 75 62 20 70 72 6f 6a 65 63  or GitHub projec
1770: 74 20 68 65 72 65 2e 20 46 6f 72 20 74 68 65 20  t here. For the 
1780: 72 65 67 65 78 20 6d 65 74 68 6f 64 0a 20 20 20  regex method.   
1790: 20 20 20 20 20 20 20 20 74 68 69 73 20 77 69 6c          this wil
17a0: 6c 20 61 6c 73 6f 20 62 65 20 74 68 65 20 66 69  l also be the fi
17b0: 72 73 74 20 70 61 67 65 20 74 6f 20 62 65 20 65  rst page to be e
17c0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 2e 0a 20  xtracted from.. 
17d0: 20 20 20 20 20 20 20 3c 2f 70 3e 0a 0a 20 20 20         </p>..   
17e0: 20 20 20 20 20 3c 70 3e 0a 20 20 20 20 20 20 20       <p>.       
17f0: 20 20 20 20 3c 68 34 3e 43 6f 6e 74 65 6e 74 20      <h4>Content 
1800: 53 63 72 61 70 69 6e 67 3c 2f 68 34 3e 0a 20 20  Scraping</h4>.  
1810: 20 20 20 20 20 20 20 20 20 50 69 63 6b 69 6e 67           Picking
1820: 20 6f 75 74 20 66 72 6f 6d 20 79 6f 75 72 20 6f   out from your o
1830: 77 6e 20 70 72 6f 6a 65 63 74 20 77 65 62 73 69  wn project websi
1840: 74 65 20 63 61 6e 20 62 65 20 73 75 72 70 72 69  te can be surpri
1850: 73 69 6e 67 6c 79 20 73 69 6d 70 6c 65 2e 20 44  singly simple. D
1860: 65 66 69 6e 65 20 61 20 6c 69 73 74 20 66 6f 72  efine a list for
1870: 20 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 6c   at.           l
1880: 65 61 73 74 20 3c 63 6f 64 65 3e 76 65 72 73 69  east <code>versi
1890: 6f 6e 20 3d 20 2e 2e 2e 3c 2f 63 6f 64 65 3e 20  on = ...</code> 
18a0: 61 6e 64 20 3c 63 6f 64 65 3e 63 68 61 6e 67 65  and <code>change
18b0: 73 20 3d 20 2e 2e 2e 3c 2f 63 6f 64 65 3e 20 2d  s = ...</code> -
18c0: 20 41 64 64 20 73 6f 75 72 63 65 20 55 52 4c 73   Add source URLs
18d0: 0a 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20  .           and 
18e0: 61 70 70 6c 79 0a 20 20 20 20 20 20 20 20 20 20  apply.          
18f0: 20 3c 61 20 68 72 65 66 3d 22 68 74 74 70 3a 2f   <a href="http:/
1900: 2f 66 6f 73 73 69 6c 2e 69 6e 63 6c 75 64 65 2d  /fossil.include-
1910: 6f 6e 63 65 2e 6f 72 67 2f 66 72 65 73 68 63 6f  once.org/freshco
1920: 64 65 2f 77 69 6b 69 2f 41 75 74 6f 75 70 64 61  de/wiki/Autoupda
1930: 74 65 52 65 67 65 78 22 3e 0a 20 20 20 20 20 20  teRegex">.      
1940: 20 20 20 20 20 52 65 67 45 78 70 2c 20 58 50 61       RegExp, XPa
1950: 74 68 2c 20 6f 72 20 6a 51 75 65 72 79 3c 2f 61  th, or jQuery</a
1960: 3e 20 73 65 6c 65 63 74 6f 72 73 20 66 6f 72 20  > selectors for 
1970: 65 78 74 72 61 63 74 69 6f 6e 2e 0a 20 20 20 20  extraction..    
1980: 20 20 20 20 20 20 20 3c 6c 61 62 65 6c 3e 0a 20         <label>. 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
19a0: 74 72 61 63 74 69 6f 6e 20 52 75 6c 65 73 20 3c  traction Rules <
19b0: 65 6d 3e 28 55 52 4c 73 2c 20 52 65 67 65 78 2c  em>(URLs, Regex,
19c0: 20 58 70 61 74 68 2c 20 6a 51 75 65 72 79 29 3c   Xpath, jQuery)<
19d0: 2f 65 6d 3e 0a 20 20 20 20 20 20 20 20 20 20 20  /em>.           
19e0: 20 20 20 20 3c 74 65 78 74 61 72 65 61 20 63 6f      <textarea co
19f0: 6c 73 3d 36 37 20 72 6f 77 73 3d 31 30 20 6e 61  ls=67 rows=10 na
1a00: 6d 65 3d 61 75 74 6f 75 70 64 61 74 65 5f 72 65  me=autoupdate_re
1a10: 67 65 78 20 70 6c 61 63 65 68 6f 6c 64 65 72 3d  gex placeholder=
1a20: 22 76 65 72 73 69 6f 6e 20 3d 20 2f 2d 28 5c 64  "version = /-(\d
1a30: 2b 5c 2e 5c 64 2b 5c 2e 5c 64 2b 29 5c 2e 74 78  +\.\d+\.\d+)\.tx
1a40: 7a 2f 22 20 6d 61 78 6c 65 6e 67 74 68 3d 32 35  z/" maxlength=25
1a50: 30 30 3e 24 64 61 74 61 5b 61 75 74 6f 75 70 64  00>$data[autoupd
1a60: 61 74 65 5f 72 65 67 65 78 5d 3c 2f 74 65 78 74  ate_regex]</text
1a70: 61 72 65 61 3e 0a 20 20 20 20 20 20 20 20 20 20  area>.          
1a80: 20 20 20 20 20 3c 73 6d 61 6c 6c 3e 0a 20 20 20       <small>.   
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 3c 6c 69 3e              <li>
1aa0: 41 73 73 69 67 6e 69 6e 67 20 6e 65 77 20 55 52  Assigning new UR
1ab0: 4c 73 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73  Ls is only neces
1ac0: 73 61 72 79 20 77 68 65 6e 20 74 68 65 72 65 27  sary when there'
1ad0: 73 20 64 69 66 66 65 72 65 6e 74 20 64 61 74 61  s different data
1ae0: 20 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f 6d   to extract from
1af0: 2e 3c 2f 6c 69 3e 0a 20 20 20 20 20 20 20 20 20  .</li>.         
1b00: 20 20 20 20 20 20 3c 6c 69 3e 52 65 67 45 78 70        <li>RegExp
1b10: 73 20 6c 69 6b 65 20 3c 63 6f 64 65 3e 76 65 72  s like <code>ver
1b20: 73 69 6f 6e 20 3d 20 2f 43 68 61 6e 67 65 73 20  sion = /Changes 
1b30: 66 6f 72 20 28 5b 5c 64 2e 5d 2b 29 2f 3c 2f 63  for ([\d.]+)/</c
1b40: 6f 64 65 3e 20 6f 66 74 65 6e 20 6d 61 74 63 68  ode> often match
1b50: 20 68 65 61 64 6c 69 6e 65 73 20 77 65 6c 6c 2e   headlines well.
1b60: 3c 2f 6c 69 3e 0a 20 20 20 20 20 20 20 20 20 20  </li>.          
1b70: 20 20 20 20 20 3c 6c 69 3e 41 20 63 6f 6d 6d 6f       <li>A commo
1b80: 6e 20 58 50 61 74 68 20 72 75 6c 65 20 66 6f 72  n XPath rule for
1b90: 20 65 78 74 72 61 63 74 69 6e 67 20 74 68 65 20   extracting the 
1ba0: 66 69 72 73 74 20 62 75 6c 6c 65 74 20 70 6f 69  first bullet poi
1bb0: 6e 74 20 6c 69 73 74 20 69 73 20 3c 63 6f 64 65  nt list is <code
1bc0: 3e 63 68 61 6e 67 65 73 20 3d 20 28 2f 2f 75 6c  >changes = (//ul
1bd0: 29 5b 31 5d 2f 6c 69 3c 2f 63 6f 64 65 3e 2e 3c  )[1]/li</code>.<
1be0: 2f 6c 69 3e 0a 20 20 20 20 20 20 20 20 20 20 20  /li>.           
1bf0: 20 20 20 20 3c 6c 69 3e 57 68 69 6c 65 20 3c 63      <li>While <c
1c00: 6f 64 65 3e 63 68 61 6e 67 65 73 20 3d 20 24 28  ode>changes = $(
1c10: 22 73 65 63 74 69 6f 6e 23 6d 61 69 6e 20 61 72  "section#main ar
1c20: 74 69 63 6c 65 20 2e 72 65 6c 65 61 73 65 22 29  ticle .release")
1c30: 3c 2f 63 6f 64 65 3e 20 6e 61 72 72 6f 77 73 20  </code> narrows 
1c40: 69 74 20 64 6f 77 6e 0a 20 20 20 20 20 20 20 20  it down.        
1c50: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 48             for H
1c60: 54 4d 4c 20 70 61 67 65 73 2e 3c 2f 6c 69 3e 0a  TML pages.</li>.
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
1c80: 6c 69 3e 59 6f 75 20 6f 66 74 65 6e 20 63 61 6e  li>You often can
1c90: 20 6d 69 78 20 65 78 74 72 61 63 74 6f 72 73 20   mix extractors 
1ca0: 2d 20 65 2e 67 2e 20 66 69 72 73 74 20 61 6e 20  - e.g. first an 
1cb0: 58 50 61 74 68 2f 6a 51 75 65 72 79 20 65 78 70  XPath/jQuery exp
1cc0: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 61 20  ression, then a 
1cd0: 52 65 67 45 78 70 2e 3c 2f 6c 69 3e 0a 20 20 20  RegExp.</li>.   
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 3c 6c 69 3e              <li>
1cf0: 52 75 6c 65 73 20 66 6f 72 20 73 74 61 74 65 3d  Rules for state=
1d00: 2c 20 73 63 6f 70 65 3d 20 61 6e 64 20 64 6f 77  , scope= and dow
1d10: 6e 6c 6f 61 64 3d 20 61 72 65 20 6f 70 74 69 6f  nload= are optio
1d20: 6e 61 6c 2e 3c 2f 6c 69 3e 0a 20 20 20 20 20 20  nal.</li>.      
1d30: 20 20 20 20 20 20 20 20 20 3c 6c 69 3e 54 68 65           <li>The
1d40: 20 3c 62 3e 63 68 61 6e 67 65 6c 6f 67 3c 2f 62   <b>changelog</b
1d50: 3e 20 70 61 72 73 65 72 20 61 6c 6c 6f 77 73 20  > parser allows 
1d60: 61 20 3c 63 6f 64 65 3e 68 65 61 64 65 72 20 3d  a <code>header =
1d70: 20 2f 5e 4e 61 6d 65 20 28 5b 5c 64 2e 5d 2b 29   /^Name ([\d.]+)
1d80: 2f 6d 3c 2f 63 6f 64 65 3e 20 63 75 73 74 6f 6d  /m</code> custom
1d90: 69 7a 61 74 69 6f 6e 20 72 75 6c 65 2c 20 62 74  ization rule, bt
1da0: 77 2e 3c 2f 6c 69 3e 0a 20 20 20 20 20 20 20 20  w.</li>.        
1db0: 20 20 20 20 20 20 20 3c 6c 69 3e 47 65 6e 65 72         <li>Gener
1dc0: 69 63 20 72 75 6c 65 73 20 6c 69 6b 65 20 3c 63  ic rules like <c
1dd0: 6f 64 65 3e 69 6e 74 65 72 76 61 6c 20 3d 20 33  ode>interval = 3
1de0: 20 64 61 79 73 3c 2f 63 6f 64 65 3e 20 61 6e 64   days</code> and
1df0: 20 20 3c 63 6f 64 65 3e 65 78 63 6c 75 64 65 20    <code>exclude 
1e00: 3d 20 30 2e 39 2e 39 2c 20 31 2e 32 2e 33 3c 2f  = 0.9.9, 1.2.3</
1e10: 63 6f 64 65 3e 20 77 6f 72 6b 20 66 6f 72 20 61  code> work for a
1e20: 6c 6c 20 72 65 74 72 69 65 76 61 6c 20 6d 65 74  ll retrieval met
1e30: 68 6f 64 73 2e 3c 2f 6c 69 3e 0a 20 20 20 20 20  hods.</li>.     
1e40: 20 20 20 20 20 20 20 20 20 20 3c 2f 73 6d 61 6c            </smal
1e50: 6c 3e 0a 20 20 20 20 20 20 20 20 20 20 20 3c 2f  l>.           </
1e60: 6c 61 62 65 6c 3e 0a 20 20 20 20 20 20 20 20 3c  label>.        <
1e70: 2f 70 3e 0a 20 20 20 20 20 20 20 20 3c 70 3e 0a  /p>.        <p>.
1e80: 20 20 20 20 20 20 20 20 20 20 3c 69 6e 70 75 74            <input
1e90: 20 74 79 70 65 3d 73 75 62 6d 69 74 20 6e 61 6d   type=submit nam
1ea0: 65 3d 74 65 73 74 20 76 61 6c 75 65 3d 54 65 73  e=test value=Tes
1eb0: 74 2d 52 75 6e 3e 0a 20 20 20 20 20 20 20 20 20  t-Run>.         
1ec0: 20 3c 6c 61 62 65 6c 20 73 74 79 6c 65 3d 22 66   <label style="f
1ed0: 6f 6e 74 2d 77 65 69 67 68 74 3a 20 6e 6f 72 6d  ont-weight: norm
1ee0: 61 6c 22 3e 3c 69 6e 70 75 74 20 73 74 79 6c 65  al"><input style
1ef0: 3d 22 64 69 73 70 6c 61 79 3a 20 69 6e 6c 69 6e  ="display: inlin
1f00: 65 22 20 74 79 70 65 3d 63 68 65 63 6b 62 6f 78  e" type=checkbox
1f10: 20 6e 61 6d 65 3d 64 65 62 75 67 20 76 61 6c 75   name=debug valu
1f20: 65 3d 79 65 73 3e 20 77 69 74 68 20 73 6f 6d 65  e=yes> with some
1f30: 20 64 65 62 75 67 20 6e 6f 74 69 63 65 73 3c 2f   debug notices</
1f40: 6c 61 62 65 6c 3e 0a 20 20 20 20 20 20 20 20 3c  label>.        <
1f50: 2f 70 3e 0a 20 20 20 3c 2f 66 6f 72 6d 3e 0a 46  /p>.   </form>.F
1f60: 4f 52 4d 3b 0a 7d 0a 0a 3f 3e 0a 3c 74 64 20 69  ORM;.}..?>.<td i
1f70: 64 3d 73 69 64 65 62 61 72 3e 0a 20 3c 73 65 63  d=sidebar>. <sec
1f80: 74 69 6f 6e 3e 0a 20 20 3c 68 35 3e 4b 6e 6f 77  tion>.  <h5>Know
1f90: 20 79 6f 75 72 20 61 75 64 69 65 6e 63 65 3c 2f   your audience</
1fa0: 68 35 3e 0a 20 20 3c 73 6d 61 6c 6c 3e 0a 20 20  h5>.  <small>.  
1fb0: 3c 70 3e 20 57 68 61 74 65 76 65 72 20 73 6f 75  <p> Whatever sou
1fc0: 72 63 65 20 79 6f 75 20 63 68 6f 6f 73 65 20 66  rce you choose f
1fd0: 6f 72 20 72 65 6c 65 61 73 65 20 61 6e 6e 6f 75  or release annou
1fe0: 6e 63 65 6d 65 6e 74 73 2c 20 74 72 79 20 74 6f  ncements, try to
1ff0: 20 6b 65 65 70 20 74 68 65 6d 20 3c 62 3e 75 73   keep them <b>us
2000: 65 72 2d 66 72 69 65 6e 64 6c 79 3c 2f 62 3e 2e  er-friendly</b>.
2010: 20 3c 2f 70 3e 0a 20 20 3c 70 3e 20 45 6e 64 20   </p>.  <p> End 
2020: 75 73 65 72 73 20 61 72 65 6e 27 74 20 66 6f 6e  users aren't fon
2030: 64 20 6f 66 20 63 6f 6d 6d 69 74 20 6c 6f 67 73  d of commit logs
2040: 2e 20 57 68 69 6c 65 20 22 6d 65 72 67 65 64 20  . While "merged 
2050: 70 75 6c 6c 20 72 65 71 75 65 73 74 20 58 59 22  pull request XY"
2060: 20 6d 69 67 68 74 20 62 65 20 74 65 63 68 6e 69   might be techni
2070: 63 61 6c 6c 79 0a 20 20 20 20 20 20 68 69 67 68  cally.      high
2080: 6c 79 20 72 65 6c 65 76 61 6e 74 20 28 66 6f 72  ly relevant (for
2090: 20 65 2e 67 2e 20 6c 69 62 72 61 72 69 65 73 29   e.g. libraries)
20a0: 2c 20 69 74 27 73 20 67 69 62 62 65 72 69 73 68  , it's gibberish
20b0: 20 74 6f 20 6d 6f 73 74 20 65 76 65 72 79 6f 6e   to most everyon
20c0: 65 20 65 6c 73 65 2e 3c 2f 70 3e 0a 20 20 3c 70  e else.</p>.  <p
20d0: 3e 20 53 6f 20 62 65 20 63 61 72 65 66 75 6c 20  > So be careful 
20e0: 77 69 74 68 20 74 68 65 20 3c 65 6d 3e 47 69 74  with the <em>Git
20f0: 48 75 62 3c 2f 65 6d 3e 20 6d 6f 64 75 6c 65 20  Hub</em> module 
2100: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 2e 20 49  in particular. I
2110: 66 20 79 6f 75 27 72 65 20 6e 6f 74 20 75 73 69  f you're not usi
2120: 6e 67 20 67 69 74 68 75 62 73 0a 20 20 20 20 20  ng githubs.     
2130: 20 2f 72 65 6c 65 61 73 65 20 74 6f 6f 6c 2c 20   /release tool, 
2140: 61 20 63 6f 6d 6d 69 74 20 6c 6f 67 20 6d 61 79  a commit log may
2150: 20 62 65 20 75 73 65 64 20 73 74 69 6c 6c 2e 20   be used still. 
2160: 4f 6e 6c 79 20 62 61 73 69 63 20 66 69 6c 74 65  Only basic filte
2170: 72 69 6e 67 20 69 73 20 61 70 70 6c 69 65 64 2e  ring is applied.
2180: 0a 20 20 20 20 20 20 3c 65 6d 3e f0 9f 94 a7 20  .      <em>.... 
2190: 41 6e 64 20 69 74 27 73 20 73 6f 72 74 20 6f 66  And it's sort of
21a0: 20 62 72 6f 6b 65 6e 20 61 74 20 74 68 65 20 6d   broken at the m
21b0: 6f 6d 65 6d 65 6e 74 20 3a 2f 3c 2f 65 6d 3e 3c  omement :/</em><
21c0: 2f 70 3e 0a 20 20 3c 70 3e 20 4c 69 6b 65 77 69  /p>.  <p> Likewi
21d0: 73 65 20 77 72 69 74 65 20 3c 65 6d 3e 43 68 61  se write <em>Cha
21e0: 6e 67 65 6c 6f 67 73 3c 2f 65 6d 3e 20 61 73 20  ngelogs</em> as 
21f0: 3c 62 3e 73 75 6d 6d 61 72 69 65 73 3c 2f 62 3e  <b>summaries</b>
2200: 2e 20 28 54 68 65 79 27 72 65 20 62 65 74 74 65  . (They're bette
2210: 72 20 61 6e 64 20 6d 6f 72 65 20 63 6f 72 72 65  r and more corre
2220: 63 74 6c 79 20 63 61 6c 6c 65 64 20 4e 45 57 53  ctly called NEWS
2230: 0a 20 20 20 20 20 20 6f 72 20 52 45 4c 45 41 53  .      or RELEAS
2240: 45 2d 4e 4f 54 45 53 20 66 69 6c 65 73 20 61 63  E-NOTES files ac
2250: 74 75 61 6c 6c 79 2e 29 3c 2f 70 3e 0a 20 20 3c  tually.)</p>.  <
2260: 2f 73 6d 61 6c 6c 3e 0a 20 3c 2f 73 65 63 74 69  /small>. </secti
2270: 6f 6e 3e 0a 3c 2f 74 64 3e 0a 3c 3f 70 68 70 0a  on>.</td>.<?php.
2280: 0a 0a 0a 69 6e 63 6c 75 64 65 28 22 74 65 6d 70  ...include("temp
2290: 6c 61 74 65 2f 74 61 62 6c 65 5f 65 6e 64 2e 70  late/table_end.p
22a0: 68 70 22 29 3b 0a 69 6e 63 6c 75 64 65 28 22 74  hp");.include("t
22b0: 65 6d 70 6c 61 74 65 2f 62 6f 74 74 6f 6d 2e 70  emplate/bottom.p
22c0: 68 70 22 29 3b 0a 0a 3f 3e                       hp");..?>