Collection of themes/skins for the Fossil SCM

⌈⌋ ⎇ branch:  Fossil Skins Extra


Hex Artifact Content

Artifact dd916d75def1219ce1c4210d066b69fccb7fe1b9:

  • Executable file extroot/hooks — part of check-in [5f992c6e40] at 2021-10-24 06:18:36 on branch trunk — enable saving (user: mario size: 3386)

0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 70 68 70 2d 63  #!/usr/bin/php-c
0010: 67 69 20 2d 64 63 67 69 2e 66 6f 72 63 65 5f 72  gi -dcgi.force_r
0020: 65 64 69 72 65 63 74 3d 30 0a 3c 3f 70 68 70 0a  edirect=0.<?php.
0030: 23 20 65 6e 63 6f 64 69 6e 67 3a 20 75 74 66 2d  # encoding: utf-
0040: 38 0a 23 20 61 70 69 3a 20 63 67 69 0a 23 20 74  8.# api: cgi.# t
0050: 79 70 65 3a 20 63 6f 6e 66 69 67 0a 23 20 63 61  ype: config.# ca
0060: 74 65 67 6f 72 79 3a 20 61 64 6d 69 6e 0a 23 20  tegory: admin.# 
0070: 74 69 74 6c 65 3a 20 48 6f 6f 6b 73 0a 23 20 64  title: Hooks.# d
0080: 65 73 63 72 69 70 74 69 6f 6e 3a 20 43 6f 6e 66  escription: Conf
0090: 69 67 75 72 65 20 68 6f 6f 6b 73 20 28 65 2e 67  igure hooks (e.g
00a0: 2e 20 77 65 62 20 73 65 72 76 69 63 65 73 29 0a  . web services).
00b0: 23 20 76 65 72 73 69 6f 6e 3a 20 30 2e 32 0a 23  # version: 0.2.#
00c0: 20 73 74 61 74 65 3a 20 62 65 74 61 0a 23 20 63   state: beta.# c
00d0: 6f 6e 66 69 67 3a 20 2d 0a 23 20 64 65 70 65 6e  onfig: -.# depen
00e0: 64 73 3a 20 66 6f 73 73 69 6c 20 28 3d 32 2e 31  ds: fossil (=2.1
00f0: 37 29 0a 23 20 61 63 63 65 73 73 3a 20 61 64 6d  7).# access: adm
0100: 69 6e 0a 23 0a 23 20 54 68 65 20 60 68 6f 6f 6b  in.#.# The `hook
0110: 73 60 20 65 6e 74 72 79 20 69 73 20 61 20 4a 53  s` entry is a JS
0120: 4f 4e 20 6c 69 73 74 2e 20 57 41 52 4e 49 4e 47  ON list. WARNING
0130: 3a 20 6d 69 67 68 74 20 62 65 20 73 75 62 6a 65  : might be subje
0140: 63 74 0a 23 20 74 6f 20 63 68 61 6e 67 65 2e 20  ct.# to change. 
0150: 53 6f 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  So should not be
0160: 20 75 73 65 64 20 77 69 74 68 6f 75 74 20 76 65   used without ve
0170: 72 69 66 79 69 6e 67 20 63 6f 6d 70 61 74 2e 0a  rifying compat..
0180: 23 0a 0a 23 2d 2d 20 69 6e 69 74 0a 69 6e 63 6c  #..#-- init.incl
0190: 75 64 65 28 22 2e 2f 66 6f 73 73 69 6c 5f 63 6f  ude("./fossil_co
01a0: 6d 6d 6f 6e 2e 70 68 70 22 29 3b 20 20 20 23 20  mmon.php");   # 
01b0: 64 62 28 29 20 65 74 63 2e 0a 69 66 20 28 21 69  db() etc..if (!i
01c0: 73 5f 61 64 6d 69 6e 28 29 29 20 7b 0a 20 20 20  s_admin()) {.   
01d0: 20 64 69 65 28 22 41 64 6d 69 6e 2d 6f 6e 6c 79   die("Admin-only
01e0: 22 29 3b 0a 7d 0a 65 72 72 6f 72 5f 72 65 70 6f  ");.}.error_repo
01f0: 72 74 69 6e 67 28 45 5f 41 4c 4c 29 3b 0a 0a 23  rting(E_ALL);..#
0200: 2d 2d 20 66 6f 73 73 69 6c 20 48 54 4d 4c 20 6f  -- fossil HTML o
0210: 75 74 70 75 74 0a 66 75 6e 63 74 69 6f 6e 20 70  utput.function p
0220: 61 67 65 5f 6d 64 28 24 74 65 78 74 29 20 7b 0a  age_md($text) {.
0230: 20 20 20 20 68 65 61 64 65 72 28 22 43 6f 6e 74      header("Cont
0240: 65 6e 74 2d 54 79 70 65 3a 20 74 65 78 74 2f 68  ent-Type: text/h
0250: 74 6d 6c 3b 20 63 68 61 72 73 65 74 3d 75 74 66  tml; charset=utf
0260: 2d 38 22 29 3b 0a 20 20 20 20 70 72 69 6e 74 20  -8");.    print 
0270: 3c 3c 3c 45 4f 46 0a 3c 64 69 76 20 63 6c 61 73  <<<EOF.<div clas
0280: 73 3d 27 66 6f 73 73 69 6c 2d 64 6f 63 27 20 64  s='fossil-doc' d
0290: 61 74 61 2d 74 69 74 6c 65 3d 27 48 6f 6f 6b 73  ata-title='Hooks
02a0: 20 73 65 74 75 70 27 3e 0a 3c 73 74 79 6c 65 3e   setup'>.<style>
02b0: 0a 20 2e 63 6f 6e 66 69 67 2d 6c 69 73 74 20 6c  . .config-list l
02c0: 61 62 65 6c 20 7b 0a 20 20 20 20 64 69 73 70 6c  abel {.    displ
02d0: 61 79 3a 20 62 6c 6f 63 6b 3b 0a 20 20 20 20 6d  ay: block;.    m
02e0: 61 72 67 69 6e 2d 62 6f 74 74 6f 6d 3a 20 31 30  argin-bottom: 10
02f0: 70 74 3b 0a 20 20 20 20 62 6f 72 64 65 72 2d 6c  pt;.    border-l
0300: 65 66 74 3a 20 33 70 74 20 23 64 64 64 20 73 6f  eft: 3pt #ddd so
0310: 6c 69 64 3b 0a 20 20 20 20 62 6f 72 64 65 72 2d  lid;.    border-
0320: 72 61 64 69 75 73 3a 20 35 70 74 20 30 20 30 20  radius: 5pt 0 0 
0330: 35 70 74 3b 0a 20 20 20 20 70 61 64 64 69 6e 67  5pt;.    padding
0340: 2d 6c 65 66 74 3a 20 31 30 70 74 3b 0a 20 7d 0a  -left: 10pt;. }.
0350: 20 2e 73 61 76 65 2d 62 75 74 74 6f 6e 20 7b 0a   .save-button {.
0360: 20 20 20 20 70 61 64 64 69 6e 67 3a 20 32 70 74      padding: 2pt
0370: 20 33 30 70 74 3b 0a 20 7d 0a 3c 2f 73 74 79 6c   30pt;. }.</styl
0380: 65 3e 0a 24 74 65 78 74 0a 45 4f 46 3b 0a 7d 0a  e>.$text.EOF;.}.
0390: 0a 23 2d 2d 20 73 61 76 69 6e 67 0a 66 75 6e 63  .#-- saving.func
03a0: 74 69 6f 6e 20 73 61 76 65 28 24 68 6f 6f 6b 73  tion save($hooks
03b0: 29 20 7b 0a 20 20 20 20 24 68 6f 6f 6b 73 20 3d  ) {.    $hooks =
03c0: 20 61 72 72 61 79 5f 76 61 6c 75 65 73 28 0a 20   array_values(. 
03d0: 20 20 20 20 20 20 20 61 72 72 61 79 5f 66 69 6c         array_fil
03e0: 74 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20  ter(.           
03f0: 20 28 61 72 72 61 79 29 24 68 6f 6f 6b 73 2c 0a   (array)$hooks,.
0400: 20 20 20 20 20 20 20 20 20 20 20 20 66 75 6e 63              func
0410: 74 69 6f 6e 28 24 72 6f 77 29 20 7b 0a 20 20 20  tion($row) {.   
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
0430: 75 72 6e 20 21 65 6d 70 74 79 28 24 72 6f 77 5b  urn !empty($row[
0440: 22 63 6d 64 22 5d 29 3b 0a 20 20 20 20 20 20 20  "cmd"]);.       
0450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 29       }.        )
0460: 0a 20 20 20 20 29 3b 0a 20 20 20 20 64 62 28 0a  .    );.    db(.
0470: 20 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45          "REPLACE
0480: 20 49 4e 54 4f 20 63 6f 6e 66 69 67 20 28 6e 61   INTO config (na
0490: 6d 65 2c 6d 74 69 6d 65 2c 76 61 6c 75 65 29 20  me,mtime,value) 
04a0: 56 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f 29 22 2c  VALUES (?,?,?)",
04b0: 0a 20 20 20 20 20 20 20 20 5b 22 68 6f 6f 6b 73  .        ["hooks
04c0: 22 2c 20 74 69 6d 65 28 29 2c 20 6a 73 6f 6e 5f  ", time(), json_
04d0: 65 6e 63 6f 64 65 28 24 68 6f 6f 6b 73 29 5d 0a  encode($hooks)].
04e0: 20 20 20 20 29 3b 0a 7d 0a 69 66 20 28 21 65 6d      );.}.if (!em
04f0: 70 74 79 28 24 5f 50 4f 53 54 5b 22 68 6f 6f 6b  pty($_POST["hook
0500: 73 22 5d 29 29 20 7b 0a 20 20 20 20 73 61 76 65  s"])) {.    save
0510: 28 24 5f 50 4f 53 54 5b 22 68 6f 6f 6b 73 22 5d  ($_POST["hooks"]
0520: 29 3b 0a 7d 0a 0a 23 2d 2d 20 70 72 69 6e 74 20  );.}..#-- print 
0530: 68 6f 6f 6b 20 72 6f 77 0a 66 75 6e 63 74 69 6f  hook row.functio
0540: 6e 20 68 6f 6f 6b 5f 72 6f 77 28 24 69 2c 20 24  n hook_row($i, $
0550: 72 6f 77 2c 20 24 72 6f 77 73 3d 31 2c 20 24 69  row, $rows=1, $i
0560: 64 3d 22 22 2c 20 24 68 3d 22 68 22 29 20 7b 0a  d="", $h="h") {.
0570: 20 20 20 20 70 72 69 6e 74 20 3c 3c 3c 45 4e 44      print <<<END
0580: 0a 20 20 20 20 3c 74 72 3e 0a 20 20 20 20 20 20  .    <tr>.      
0590: 20 20 3c 74 64 3e 24 69 3c 2f 74 64 3e 0a 20 20    <td>$i</td>.  
05a0: 20 20 20 20 20 20 3c 74 64 3e 3c 69 6e 70 75 74        <td><input
05b0: 20 6c 69 73 74 3d 68 6f 6f 6b 74 79 70 65 73 20   list=hooktypes 
05c0: 6e 61 6d 65 3d 22 68 6f 6f 6b 73 5b 24 69 5d 5b  name="hooks[$i][
05d0: 74 79 70 65 5d 22 20 76 61 6c 75 65 3d 22 7b 24  type]" value="{$
05e0: 68 28 24 72 6f 77 5b 22 74 79 70 65 22 5d 29 7d  h($row["type"])}
05f0: 22 20 73 69 7a 65 3d 31 33 3e 3c 2f 74 64 3e 0a  " size=13></td>.
0600: 20 20 20 20 20 20 20 20 3c 74 64 3e 3c 74 65 78          <td><tex
0610: 74 61 72 65 61 20 6e 61 6d 65 3d 22 68 6f 6f 6b  tarea name="hook
0620: 73 5b 24 69 5d 5b 63 6d 64 5d 22 20 24 69 64 20  s[$i][cmd]" $id 
0630: 63 6f 6c 73 3d 37 35 20 72 6f 77 73 3d 24 72 6f  cols=75 rows=$ro
0640: 77 73 3e 7b 24 68 28 24 72 6f 77 5b 22 63 6d 64  ws>{$h($row["cmd
0650: 22 5d 29 7d 3c 2f 74 65 78 74 61 72 65 61 3e 3c  "])}</textarea><
0660: 2f 74 64 3e 0a 20 20 20 20 20 20 20 20 3c 74 64  /td>.        <td
0670: 3e 3c 69 6e 70 75 74 20 6e 61 6d 65 3d 22 68 6f  ><input name="ho
0680: 6f 6b 73 5b 24 69 5d 5b 73 65 71 5d 22 20 76 61  oks[$i][seq]" va
0690: 6c 75 65 3d 22 7b 24 68 28 24 72 6f 77 5b 22 73  lue="{$h($row["s
06a0: 65 71 22 5d 29 7d 22 20 73 69 7a 65 3d 33 3e 3c  eq"])}" size=3><
06b0: 2f 74 64 3e 0a 20 20 20 20 3c 2f 74 72 3e 0a 45  /td>.    </tr>.E
06c0: 4e 44 3b 0a 7d 0a 0a 0a 23 2d 2d 20 67 65 74 20  ND;.}...#-- get 
06d0: 60 68 6f 6f 6b 73 60 20 66 72 6f 6d 20 63 6f 6e  `hooks` from con
06e0: 66 69 67 20 74 61 62 6c 65 0a 24 68 6f 6f 6b 73  fig table.$hooks
06f0: 20 3d 20 6a 73 6f 6e 5f 64 65 63 6f 64 65 28 67   = json_decode(g
0700: 65 74 5f 63 6f 6e 66 69 67 28 22 68 6f 6f 6b 73  et_config("hooks
0710: 22 2c 20 22 5b 5d 22 29 2c 20 54 52 55 45 29 3b  ", "[]"), TRUE);
0720: 0a 0a 23 2d 2d 20 62 75 69 6c 64 20 66 6f 72 6d  ..#-- build form
0730: 20 74 61 62 6c 65 0a 70 61 67 65 5f 6d 64 28 22   table.page_md("
0740: 0a 20 20 3c 64 69 76 20 63 6c 61 73 73 3d 63 6f  .  <div class=co
0750: 6e 66 69 67 2d 6c 69 73 74 3e 0a 20 20 3c 66 6f  nfig-list>.  <fo
0760: 72 6d 20 6d 65 74 68 6f 64 3d 50 4f 53 54 20 65  rm method=POST e
0770: 6e 63 74 79 70 65 3d 27 6d 75 6c 74 69 70 61 72  nctype='multipar
0780: 74 2f 66 6f 72 6d 2d 64 61 74 61 27 3e 0a 20 20  t/form-data'>.  
0790: 20 20 3c 64 61 74 61 6c 69 73 74 20 69 64 3d 68    <datalist id=h
07a0: 6f 6f 6b 74 79 70 65 73 3e 0a 20 20 20 20 20 20  ooktypes>.      
07b0: 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 61 66  <option value=af
07c0: 74 65 72 2d 72 65 63 65 69 76 65 20 74 69 74 6c  ter-receive titl
07d0: 65 3d 27 61 66 74 65 72 20 65 76 65 72 79 20 63  e='after every c
07e0: 6f 6d 6d 69 74 20 6f 72 20 70 75 73 68 2f 70 75  ommit or push/pu
07f0: 6c 6c 27 3e 0a 20 20 20 20 20 20 3c 6f 70 74 69  ll'>.      <opti
0800: 6f 6e 20 76 61 6c 75 65 3d 62 65 66 6f 72 65 2d  on value=before-
0810: 63 6f 6d 6d 69 74 3e 0a 20 20 20 20 20 20 3c 6f  commit>.      <o
0820: 70 74 69 6f 6e 20 76 61 6c 75 65 3d 63 6f 6d 6d  ption value=comm
0830: 69 74 2d 6d 73 67 3e 0a 20 20 20 20 20 20 3c 6f  it-msg>.      <o
0840: 70 74 69 6f 6e 20 76 61 6c 75 65 3d 64 69 73 61  ption value=disa
0850: 62 6c 65 64 3e 0a 20 20 20 20 3c 2f 64 61 74 61  bled>.    </data
0860: 6c 69 73 74 3e 0a 20 20 3c 74 61 62 6c 65 3e 0a  list>.  <table>.
0870: 20 20 3c 74 72 3e 20 3c 74 68 3e 23 3c 2f 74 68    <tr> <th>#</th
0880: 3e 20 3c 74 68 3e 74 79 70 65 3c 2f 74 68 3e 20  > <th>type</th> 
0890: 3c 74 68 3e 63 6f 6d 6d 61 6e 64 3c 2f 74 68 3e  <th>command</th>
08a0: 20 3c 74 68 3e 73 65 71 3c 2f 74 68 3e 20 3c 2f   <th>seq</th> </
08b0: 74 72 3e 0a 22 29 3b 0a 0a 23 20 66 69 65 6c 64  tr>.");..# field
08c0: 73 0a 66 6f 72 65 61 63 68 20 28 24 68 6f 6f 6b  s.foreach ($hook
08d0: 73 20 61 73 20 24 69 3d 3e 24 72 6f 77 29 20 7b  s as $i=>$row) {
08e0: 0a 20 20 20 20 68 6f 6f 6b 5f 72 6f 77 28 24 69  .    hook_row($i
08f0: 2c 20 24 72 6f 77 29 3b 0a 7d 0a 68 6f 6f 6b 5f  , $row);.}.hook_
0900: 72 6f 77 28 63 6f 75 6e 74 28 24 68 6f 6f 6b 73  row(count($hooks
0910: 29 2c 20 5b 22 74 79 70 65 22 3d 3e 22 61 66 74  ), ["type"=>"aft
0920: 65 72 2d 72 65 63 65 69 76 65 22 2c 20 22 63 6d  er-receive", "cm
0930: 64 22 3d 3e 22 22 2c 20 22 73 65 71 22 3d 3e 35  d"=>"", "seq"=>5
0940: 30 5d 2c 20 33 2c 20 22 69 64 3d 68 6f 6f 6b 5f  0], 3, "id=hook_
0950: 63 6d 64 22 29 3b 0a 0a 3f 3e 0a 3c 74 72 3e 3c  cmd");..?>.<tr><
0960: 74 64 20 63 6f 6c 73 70 61 6e 3d 34 20 61 6c 69  td colspan=4 ali
0970: 67 6e 3d 63 65 6e 74 65 72 3e 3c 69 6e 70 75 74  gn=center><input
0980: 20 74 79 70 65 3d 73 75 62 6d 69 74 20 76 61 6c   type=submit val
0990: 75 65 3d 22 41 64 64 20 2f 20 53 61 76 65 22 20  ue="Add / Save" 
09a0: 63 6c 61 73 73 3d 73 61 76 65 2d 62 75 74 74 6f  class=save-butto
09b0: 6e 3e 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 3c 2f 74  n></td></tr>.</t
09c0: 61 62 6c 65 3e 0a 3c 2f 66 6f 72 6d 3e 0a 3c 68  able>.</form>.<h
09d0: 33 3e 57 65 62 20 68 6f 6f 6b 73 3c 2f 68 33 3e  3>Web hooks</h3>
09e0: 0a 3c 70 3e 0a 41 64 64 20 6f 6e 65 20 6f 66 20  .<p>.Add one of 
09f0: 74 68 65 20 73 74 61 6e 64 61 72 64 20 77 65 62  the standard web
0a00: 68 6f 6f 6b 20 73 65 72 76 69 63 65 73 3a 0a 3c  hook services:.<
0a10: 2f 70 3e 0a 3c 70 3e 0a 3c 73 65 6c 65 63 74 20  /p>.<p>.<select 
0a20: 69 64 3d 77 65 62 5f 73 65 74 20 6f 6e 63 68 61  id=web_set oncha
0a30: 6e 67 65 3d 22 64 6f 63 75 6d 65 6e 74 2e 67 65  nge="document.ge
0a40: 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 27 68 6f  tElementById('ho
0a50: 6f 6b 5f 63 6d 64 27 29 2e 69 6e 6e 65 72 54 65  ok_cmd').innerTe
0a60: 78 74 3d 74 68 69 73 2e 76 61 6c 75 65 22 3e 0a  xt=this.value">.
0a70: 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 27 27  <option value=''
0a80: 3e 0a 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d  >.<option value=
0a90: 22 66 6f 73 73 69 6c 2d 77 65 62 68 6f 6f 6b 20  "fossil-webhook 
0aa0: 2d 52 20 27 25 52 27 20 2d 2d 66 6f 73 73 69 6c  -R '%R' --fossil
0ab0: 20 68 74 74 70 3a 2f 2f 73 65 72 76 69 63 65 2e   http://service.
0ac0: 72 65 73 74 2f 22 3e 66 6f 73 73 69 6c 2d 77 65  rest/">fossil-we
0ad0: 62 68 6f 6f 6b 0a 3c 6f 70 74 69 6f 6e 20 76 61  bhook.<option va
0ae0: 6c 75 65 3d 27 63 75 72 6c 20 2d 58 20 50 4f 53  lue='curl -X POS
0af0: 54 20 2d 64 20 22 62 72 61 6e 63 68 65 73 3d 74  T -d "branches=t
0b00: 72 75 6e 6b 22 20 2d 64 20 22 74 6f 6b 65 6e 3d  runk" -d "token=
0b10: 31 32 33 34 22 20 68 74 74 70 73 3a 2f 2f 72 65  1234" https://re
0b20: 61 64 74 68 65 64 6f 63 73 2e 6f 72 67 2f 61 70  adthedocs.org/ap
0b30: 69 2f 76 32 2f 77 65 62 68 6f 6f 6b 2f 65 78 61  i/v2/webhook/exa
0b40: 6d 70 6c 65 2d 70 72 6f 6a 65 63 74 2f 31 2f 27  mple-project/1/'
0b50: 3e 52 65 61 64 54 68 65 44 6f 63 73 0a 3c 6f 70  >ReadTheDocs.<op
0b60: 74 69 6f 6e 20 76 61 6c 75 65 3d 27 77 67 65 74  tion value='wget
0b70: 20 68 74 74 70 73 3a 2f 2f 31 32 37 2e 30 2e 30   https://127.0.0
0b80: 2e 31 2f 6a 65 6e 6b 69 6e 73 2f 67 69 74 68 75  .1/jenkins/githu
0b90: 62 2d 77 65 62 6f 6f 6b 27 3e 4a 65 6e 6b 69 6e  b-webook'>Jenkin
0ba0: 73 0a 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d  s.<option value=
0bb0: 27 77 67 65 74 20 68 74 74 70 73 3a 2f 2f 6c 6f  'wget https://lo
0bc0: 63 61 6c 68 6f 73 74 3a 38 30 38 30 2f 65 78 74  calhost:8080/ext
0bd0: 2f 66 78 5f 6d 65 74 61 27 3e 66 6f 73 73 69 6c  /fx_meta'>fossil
0be0: 2f 65 78 74 2f 66 78 5f 6d 65 74 61 0a 3c 2f 73  /ext/fx_meta.</s
0bf0: 65 6c 65 63 74 3e 0a 3c 2f 70 3e 0a 0a 3c 68 33  elect>.</p>..<h3
0c00: 3e 44 6f 63 73 3c 2f 68 33 3e 0a 3c 75 6c 3e 0a  >Docs</h3>.<ul>.
0c10: 3c 6c 69 3e 20 53 65 65 20 3c 61 20 68 72 65 66  <li> See <a href
0c20: 3d 22 68 74 74 70 73 3a 2f 2f 66 6f 73 73 69 6c  ="https://fossil
0c30: 2d 73 63 6d 2e 6f 72 67 2f 68 6f 6d 65 2f 64 6f  -scm.org/home/do
0c40: 63 2f 74 72 75 6e 6b 2f 77 77 77 2f 68 6f 6f 6b  c/trunk/www/hook
0c50: 73 2e 6d 64 22 3e 68 6f 6f 6b 73 2e 6d 64 3c 2f  s.md">hooks.md</
0c60: 61 3e 20 6f 6e 20 68 6f 77 20 63 6f 6d 6d 61 6e  a> on how comman
0c70: 64 73 20 61 72 65 20 72 75 6e 2e 0a 3c 6c 69 3e  ds are run..<li>
0c80: 20 45 6d 75 6c 61 74 65 20 68 74 74 70 73 3a 2f   Emulate https:/
0c90: 2f 64 6f 63 73 2e 67 69 74 68 75 62 2e 63 6f 6d  /docs.github.com
0ca0: 2f 65 6e 2f 64 65 76 65 6c 6f 70 65 72 73 2f 77  /en/developers/w
0cb0: 65 62 68 6f 6f 6b 73 2d 61 6e 64 2d 65 76 65 6e  ebhooks-and-even
0cc0: 74 73 2f 77 65 62 68 6f 6f 6b 73 2f 77 65 62 68  ts/webhooks/webh
0cd0: 6f 6f 6b 2d 65 76 65 6e 74 73 2d 61 6e 64 2d 70  ook-events-and-p
0ce0: 61 79 6c 6f 61 64 73 20 e2 80 a6 0a 3c 6c 69 3e  ayloads ….<li>
0cf0: 20 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 73 20   Probably needs 
0d00: 61 20 63 6d 64 6c 69 6e 65 20 68 65 6c 70 65 72  a cmdline helper
0d10: 20 3c 63 6f 64 65 3e 66 6f 73 73 69 6c 2d 77 65   <code>fossil-we
0d20: 62 68 6f 6f 6b 3c 2f 63 6f 64 65 3e 0a 3c 2f 75  bhook</code>.</u
0d30: 6c 3e 0a 3c 2f 64 69 76 3e 0a                    l>.</div>.