Collection of themes/skins for the Fossil SCM

⌈⌋ ⎇ branch:  Fossil Skins Extra


Hex Artifact Content

Artifact 352bc4af263c64b2eb52e550224be3f8232a1ae5:

  • Executable file extroot/crashreport — part of check-in [d3dbeea9f5] at 2021-04-14 07:22:56 on branch trunk — Basic error-to-ticket conversion backend. (user: mario size: 3803)

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 61 70 69 0a 23 20 63 61 74 65 67  ype: api.# categ
0060: 6f 72 79 3a 20 74 69 63 6b 65 74 73 0a 23 20 74  ory: tickets.# t
0070: 69 74 6c 65 3a 20 43 72 61 73 68 72 65 70 6f 72  itle: Crashrepor
0080: 74 0a 23 20 64 65 73 63 72 69 70 74 69 6f 6e 3a  t.# description:
0090: 20 52 65 63 65 69 76 65 73 20 65 72 72 6f 72 73   Receives errors
00a0: 20 28 4a 53 4f 4e 20 50 4f 53 54 29 20 61 6e 64   (JSON POST) and
00b0: 20 66 69 6c 65 73 20 74 68 65 6d 20 61 73 20 74   files them as t
00c0: 69 63 6b 65 74 73 0a 23 20 76 65 72 73 69 6f 6e  ickets.# version
00d0: 3a 20 30 2e 31 0a 23 20 73 74 61 74 65 3a 20 61  : 0.1.# state: a
00e0: 6c 70 68 61 0a 23 20 63 6f 6e 66 69 67 3a 20 2d  lpha.# config: -
00f0: 0a 23 0a 23 20 43 72 65 61 74 65 73 20 61 20 74  .#.# Creates a t
0100: 69 63 6b 65 74 20 66 6f 72 20 61 6e 79 20 50 4f  icket for any PO
0110: 53 54 20 69 74 20 72 65 63 65 69 76 65 73 20 74  ST it receives t
0120: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  hat contains val
0130: 69 64 20 4a 53 4f 4e 2e 0a 23 20 55 6e 70 61 63  id JSON..# Unpac
0140: 6b 73 20 73 6f 6d 65 20 66 69 65 6c 64 73 20 69  ks some fields i
0150: 6e 74 6f 20 74 69 63 6b 65 74 20 70 72 6f 70 65  nto ticket prope
0160: 72 74 69 65 73 2c 20 61 6e 64 20 70 6f 73 74 73  rties, and posts
0170: 20 74 68 65 20 77 68 6f 6c 65 20 62 6c 6f 62 0a   the whole blob.
0180: 23 20 61 73 20 74 69 63 6b 65 74 20 63 6f 6d 6d  # as ticket comm
0190: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 70 72 6f  ent. This is pro
01a0: 62 61 62 6c 79 20 6d 6f 72 65 20 73 75 69 74 61  bably more suita
01b0: 62 6c 65 20 66 6f 72 20 47 55 49 20 61 70 70 73  ble for GUI apps
01c0: 20 74 68 61 6e 0a 23 20 73 6d 61 6c 6c 65 72 20   than.# smaller 
01d0: 63 6f 6e 73 6f 6c 65 20 74 6f 6f 6c 73 20 6f 72  console tools or
01e0: 20 6c 69 62 72 61 72 69 6b 65 73 2e 0a 23 20 41   librarikes..# A
01f0: 6e 64 20 69 74 20 63 6f 75 6c 64 20 70 72 6f 62  nd it could prob
0200: 61 62 6c 79 20 61 6c 73 6f 20 62 65 20 72 65 75  ably also be reu
0210: 73 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  sed for storing 
0220: 66 65 61 74 75 72 65 20 72 65 71 75 65 73 74 73  feature requests
0230: 2e 0a 23 0a 23 20 4e 6f 77 20 74 68 69 73 20 68  ..#.# Now this h
0240: 61 73 20 73 6f 6d 65 20 70 72 69 76 61 63 79 20  as some privacy 
0250: 69 6d 70 6c 69 63 61 74 69 6f 6e 73 2e 20 53 6f  implications. So
0260: 20 63 61 72 65 20 73 68 6f 75 6c 64 20 62 65 20   care should be 
0270: 74 61 6b 65 6e 20 77 68 69 63 68 0a 23 20 69 6e  taken which.# in
0280: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 69 6e 63  formation is inc
0290: 6c 75 64 65 64 2c 20 74 68 65 20 66 69 6c 74 65  luded, the filte
02a0: 72 20 6f 70 74 69 6f 6e 73 20 65 78 70 61 6e 64  r options expand
02b0: 65 64 2c 20 6f 72 20 70 65 72 68 61 70 73 20 65  ed, or perhaps e
02c0: 76 65 6e 0a 23 20 74 68 65 20 74 69 63 6b 65 74  ven.# the ticket
02d0: 20 62 61 63 6b 65 6e 64 20 74 61 6b 65 6e 20 6e   backend taken n
02e0: 6f 6e 2d 70 75 62 6c 69 63 2e 0a 23 0a 23 20 42  on-public..#.# B
02f0: 61 73 69 63 20 75 73 61 67 65 20 63 6f 75 6c 64  asic usage could
0300: 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69   be something li
0310: 6b 65 3a 0a 23 0a 23 20 20 20 20 63 61 74 63 68  ke:.#.#    catch
0320: 20 45 78 63 65 70 74 69 6f 6e 20 61 73 20 65 3a   Exception as e:
0330: 0a 23 20 20 20 20 20 20 20 20 69 6d 70 6f 72 74  .#        import
0340: 20 72 65 71 75 65 73 74 73 2c 20 74 72 61 63 65   requests, trace
0350: 62 61 63 6b 2c 20 6a 73 6f 6e 0a 23 20 20 20 20  back, json.#    
0360: 20 20 20 20 72 65 71 75 65 73 74 73 2e 70 6f 73      requests.pos
0370: 74 28 22 68 74 74 70 3a 2f 2f 66 6f 73 73 69 6c  t("http://fossil
0380: 2e 65 78 61 6d 70 6c 65 2e 63 6f 6d 2f 72 65 70  .example.com/rep
0390: 6f 2f 65 78 74 2f 63 72 61 73 68 72 65 70 6f 72  o/ext/crashrepor
03a0: 74 22 2c 20 64 61 74 61 3d 6a 73 6f 6e 2e 64 75  t", data=json.du
03b0: 6d 70 73 28 7b 0a 23 20 20 20 20 20 20 20 20 20  mps({.#         
03c0: 20 20 20 22 76 65 72 73 69 6f 6e 22 3a 20 22 30     "version": "0
03d0: 2e 30 2e 31 22 2c 0a 23 20 20 20 20 20 20 20 20  .0.1",.#        
03e0: 20 20 20 20 22 66 69 6c 65 22 3a 20 5f 5f 66 69      "file": __fi
03f0: 6c 65 5f 5f 2c 0a 23 20 20 20 20 20 20 20 20 20  le__,.#         
0400: 20 20 20 22 65 72 72 6f 72 22 3a 20 73 74 72 28     "error": str(
0410: 65 29 2c 0a 23 20 20 20 20 20 20 20 20 20 20 20  e),.#           
0420: 20 22 65 78 63 65 70 74 69 6f 6e 22 3a 20 72 65   "exception": re
0430: 70 72 28 65 29 2c 0a 23 20 20 20 20 20 20 20 20  pr(e),.#        
0440: 20 20 20 20 22 62 61 63 6b 74 72 61 63 65 22 3a      "backtrace":
0450: 20 74 72 61 63 65 62 61 63 6b 2e 65 78 74 72 61   traceback.extra
0460: 63 74 5f 74 62 2c 0a 23 20 20 20 20 20 20 20 20  ct_tb,.#        
0470: 20 20 20 20 22 6c 6f 63 61 6c 73 22 3a 20 6c 6f      "locals": lo
0480: 63 61 6c 73 28 29 2c 0a 23 20 20 20 20 20 20 20  cals(),.#       
0490: 20 7d 2c 20 64 65 66 61 75 6c 74 3d 6c 61 6d 62   }, default=lamb
04a0: 64 61 20 76 3a 20 72 65 70 72 28 76 29 29 29 0a  da v: repr(v))).
04b0: 23 0a 23 20 4f 62 76 69 6f 75 73 6c 79 20 79 6f  #.# Obviously yo
04c0: 75 20 6d 69 67 68 74 20 77 61 6e 74 20 74 6f 20  u might want to 
04d0: 77 72 61 70 20 74 68 69 73 20 69 6e 20 73 6f 6d  wrap this in som
04e0: 65 20 67 65 6e 65 72 61 6c 20 72 65 70 6f 72 74  e general report
04f0: 69 6e 67 20 63 61 6c 6c 2e 0a 23 20 41 6e 64 20  ing call..# And 
0500: 63 65 72 74 61 69 6e 6c 79 20 63 75 73 74 6f 6d  certainly custom
0510: 69 7a 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ize the mapping 
0520: 66 6f 72 20 61 63 74 75 61 6c 6c 79 20 75 73 65  for actually use
0530: 64 20 66 69 65 6c 64 73 2e 0a 0a 0a 23 2d 2d 20  d fields....#-- 
0540: 63 6f 6e 66 69 67 0a 0a 23 20 72 65 71 75 69 72  config..# requir
0550: 65 20 74 68 61 74 20 50 4f 53 54 20 70 61 79 6c  e that POST payl
0560: 6f 61 64 20 63 6f 6e 74 61 69 6e 73 20 61 74 20  oad contains at 
0570: 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 6f  least one of tho
0580: 73 65 20 66 69 65 6c 64 73 20 28 74 6f 20 61 76  se fields (to av
0590: 65 72 74 20 61 72 62 69 74 72 61 72 79 20 73 70  ert arbitrary sp
05a0: 61 6d 62 6f 74 73 20 66 69 6c 69 6e 67 20 74 69  ambots filing ti
05b0: 63 6b 65 74 73 29 0a 24 72 65 71 75 69 72 65 64  ckets).$required
05c0: 5f 66 69 65 6c 64 73 20 3d 20 5b 0a 20 20 20 20  _fields = [.    
05d0: 22 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20 22  "version",.    "
05e0: 65 72 72 6f 72 22 2c 0a 20 20 20 20 22 65 78 63  error",.    "exc
05f0: 65 70 74 69 6f 6e 22 2c 0a 5d 3b 0a 23 20 63 6f  eption",.];.# co
0600: 6e 74 61 69 6e 65 64 20 66 69 65 6c 64 73 20 6f  ntained fields o
0610: 6e 74 6f 20 74 69 63 6b 65 74 20 70 72 6f 70 65  nto ticket prope
0620: 72 74 69 65 73 0a 24 6d 61 70 5f 66 69 65 6c 64  rties.$map_field
0630: 73 20 3d 20 5b 0a 20 20 20 20 22 65 72 72 6f 72  s = [.    "error
0640: 22 20 3d 3e 20 22 74 69 74 6c 65 22 2c 0a 20 20  " => "title",.  
0650: 20 20 22 76 65 72 73 69 6f 6e 22 20 3d 3e 20 22    "version" => "
0660: 66 6f 75 6e 64 69 6e 22 2c 0a 20 20 20 20 22 6d  foundin",.    "m
0670: 6f 64 75 6c 65 22 20 3d 3e 20 22 73 75 62 73 79  odule" => "subsy
0680: 73 74 65 6d 22 2c 0a 5d 3b 0a 23 20 74 69 63 6b  stem",.];.# tick
0690: 65 74 20 64 65 66 61 75 6c 74 73 0a 24 64 65 66  et defaults.$def
06a0: 61 75 6c 74 5f 66 69 65 6c 64 73 20 3d 20 5b 0a  ault_fields = [.
06b0: 20 20 20 23 22 63 6f 6d 6d 65 6e 74 22 20 3d 3e     #"comment" =>
06c0: 20 22 4a 53 4f 4e 22 2c 0a 20 20 20 23 22 66 6f   "JSON",.   #"fo
06d0: 75 6e 64 69 6e 22 20 3d 3e 20 22 30 2e 30 2e 31  undin" => "0.0.1
06e0: 22 2c 0a 20 20 20 23 22 69 63 6f 6d 6d 65 6e 74  ",.   #"icomment
06f0: 22 20 3d 3e 20 22 22 2e 0a 20 20 20 23 22 6c 6f  " => ""..   #"lo
0700: 67 69 6e 22 20 3d 3e 20 22 65 78 74 72 6f 6f 74  gin" => "extroot
0710: 22 2c 0a 20 20 20 22 6d 69 6d 65 74 79 70 65 22  ",.   "mimetype"
0720: 20 3d 3e 20 22 74 65 78 74 2f 6a 73 6f 6e 22 2c   => "text/json",
0730: 0a 20 20 20 22 70 72 69 76 61 74 65 5f 63 6f 6e  .   "private_con
0740: 74 61 63 74 22 20 3d 3e 20 22 22 2c 0a 20 20 20  tact" => "",.   
0750: 22 74 79 70 65 22 20 3d 3e 20 22 49 6e 63 69 64  "type" => "Incid
0760: 65 6e 74 22 2c 0a 20 20 20 22 73 74 61 74 75 73  ent",.   "status
0770: 22 20 3d 3e 20 22 4f 70 65 6e 22 2c 0a 20 20 20  " => "Open",.   
0780: 22 73 65 76 65 72 69 74 79 22 20 3d 3e 20 22 4d  "severity" => "M
0790: 65 64 69 75 6d 22 2c 0a 20 20 20 22 70 72 69 6f  edium",.   "prio
07a0: 72 69 74 79 22 20 3d 3e 20 22 4d 65 64 69 75 6d  rity" => "Medium
07b0: 22 2c 0a 20 20 20 23 22 72 65 73 6f 6c 75 74 69  ",.   #"resoluti
07c0: 6f 6e 22 20 3d 3e 20 22 22 2c 0a 20 20 20 22 73  on" => "",.   "s
07d0: 75 62 73 79 73 74 65 6d 22 20 3d 3e 20 22 63 6f  ubsystem" => "co
07e0: 72 65 22 2c 0a 20 20 20 22 74 69 74 6c 65 22 20  re",.   "title" 
07f0: 3d 3e 20 22 43 72 61 73 68 72 65 70 6f 72 74 22  => "Crashreport"
0800: 2c 0a 20 20 20 22 75 73 65 72 6e 61 6d 65 22 20  ,.   "username" 
0810: 3d 3e 20 22 63 72 61 73 68 72 65 70 6f 72 74 22  => "crashreport"
0820: 2c 0a 5d 3b 0a 23 20 72 65 77 72 69 74 65 20 74  ,.];.# rewrite t
0830: 65 78 74 20 63 6f 6e 74 65 6e 74 73 20 69 6e 20  ext contents in 
0840: 61 6e 79 20 66 69 65 6c 64 20 28 73 6f 6d 65 20  any field (some 
0850: 70 72 69 76 61 63 79 20 66 69 6c 74 65 72 69 6e  privacy filterin
0860: 67 29 0a 24 66 69 6c 74 65 72 5f 63 6f 6e 74 65  g).$filter_conte
0870: 6e 74 20 3d 20 5b 0a 20 20 20 20 22 7e 2f 68 6f  nt = [.    "~/ho
0880: 6d 65 2f 5b 5c 77 5c 2d 5c 2e 5d 2b 2f 7e 22 20  me/[\w\-\.]+/~" 
0890: 3d 3e 20 22 2f 68 6f 6d 65 2f 75 73 65 72 2f 22  => "/home/user/"
08a0: 2c 20 23 20 61 76 6f 69 64 20 75 73 65 72 20 6e  , # avoid user n
08b0: 61 6d 65 73 0a 20 20 20 20 22 7e 5b 5e 5c 5c 74  ames.    "~[^\\t
08c0: 5c 5c 72 5c 5c 6e 5c 5c 78 32 30 2d 5c 5c 78 46  \\r\\n\\x20-\\xF
08d0: 46 5d 2f 7e 22 20 3d 3e 20 22 23 22 2c 20 20 20  F]/~" => "#",   
08e0: 23 20 6e 6f 20 63 6f 6e 74 72 6f 6c 20 63 68 61  # no control cha
08f0: 72 73 0a 5d 3b 0a 0a 0a 23 2d 2d 20 69 6e 69 74  rs.];...#-- init
0900: 0a 69 66 20 28 24 5f 53 45 52 56 45 52 5b 22 43  .if ($_SERVER["C
0910: 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 22 5d 20  ONTENT_LENGTH"] 
0920: 3e 3d 20 31 30 29 20 7b 0a 20 20 20 20 24 6a 73  >= 10) {.    $js
0930: 6f 6e 20 3d 20 66 72 6f 6d 5f 69 6e 70 75 74 28  on = from_input(
0940: 29 3b 0a 20 20 20 20 69 66 20 28 21 61 72 72 61  );.    if (!arra
0950: 79 5f 69 6e 74 65 72 73 65 63 74 28 61 72 72 61  y_intersect(arra
0960: 79 5f 6b 65 79 73 28 24 6a 73 6f 6e 29 2c 20 24  y_keys($json), $
0970: 72 65 71 75 69 72 65 64 5f 66 69 65 6c 64 73 29  required_fields)
0980: 29 20 7b 0a 20 20 20 20 20 20 20 20 64 69 65 28  ) {.        die(
0990: 6a 73 6f 6e 5f 65 6e 63 6f 64 65 28 5b 22 65 72  json_encode(["er
09a0: 72 6f 72 22 20 3d 3e 20 22 72 65 71 75 69 72 65  ror" => "require
09b0: 64 20 66 69 65 6c 64 73 20 6d 69 73 73 69 6e 67  d fields missing
09c0: 22 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  "]));.    }.    
09d0: 73 74 6f 72 65 28 24 6a 73 6f 6e 29 3b 0a 7d 0a  store($json);.}.
09e0: 65 6c 73 65 20 7b 0a 20 20 20 20 68 65 61 64 65  else {.    heade
09f0: 72 28 22 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a  r("Content-Type:
0a00: 20 74 65 78 74 2f 78 2d 6d 61 72 6b 64 6f 77 6e   text/x-markdown
0a10: 22 29 3b 0a 20 20 20 20 64 69 65 28 22 53 61 76  ");.    die("Sav
0a20: 65 20 61 6e 79 20 73 74 61 63 6b 74 72 61 63 65  e any stacktrace
0a30: 73 2f 65 72 72 6f 72 73 2f 65 74 63 2e 20 61 73  s/errors/etc. as
0a40: 20 74 69 63 6b 65 74 73 2c 20 69 66 20 73 65 6e   tickets, if sen
0a50: 74 20 61 73 20 4a 53 4f 4e 20 62 6c 6f 62 20 70  t as JSON blob p
0a60: 65 72 20 50 4f 53 54 2e 22 29 3b 0a 7d 0a 0a 0a  er POST.");.}...
0a70: 23 20 61 73 73 75 6d 65 20 69 6e 70 75 74 20 69  # assume input i
0a80: 73 20 4a 53 4f 4e 0a 66 75 6e 63 74 69 6f 6e 20  s JSON.function 
0a90: 66 72 6f 6d 5f 69 6e 70 75 74 28 29 20 7b 0a 20  from_input() {. 
0aa0: 20 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e 5f 64     return json_d
0ab0: 65 63 6f 64 65 28 66 69 6c 65 5f 67 65 74 5f 63  ecode(file_get_c
0ac0: 6f 6e 74 65 6e 74 73 28 22 70 68 70 3a 2f 2f 69  ontents("php://i
0ad0: 6e 70 75 74 22 29 2c 20 54 72 75 65 29 3b 0a 7d  nput"), True);.}
0ae0: 0a 0a 23 20 73 74 6f 72 65 20 61 73 20 74 69 63  ..# store as tic
0af0: 6b 65 74 0a 66 75 6e 63 74 69 6f 6e 20 73 74 6f  ket.function sto
0b00: 72 65 28 24 64 61 74 61 29 20 7b 0a 20 20 20 20  re($data) {.    
0b10: 67 6c 6f 62 61 6c 20 24 6d 61 70 5f 66 69 65 6c  global $map_fiel
0b20: 64 73 2c 20 24 64 65 66 61 75 6c 74 5f 66 69 65  ds, $default_fie
0b30: 6c 64 73 2c 20 24 66 69 6c 74 65 72 5f 63 6f 6e  lds, $filter_con
0b40: 74 65 6e 74 3b 0a 0a 20 20 20 20 23 2d 2d 20 70  tent;..    #-- p
0b50: 72 65 70 61 72 65 20 66 69 65 6c 64 73 0a 20 20  repare fields.  
0b60: 20 20 24 66 69 65 6c 64 73 20 3d 20 24 64 65 66    $fields = $def
0b70: 61 75 6c 74 5f 66 69 65 6c 64 73 3b 0a 20 20 20  ault_fields;.   
0b80: 20 24 66 69 65 6c 64 73 5b 22 63 6f 6d 6d 65 6e   $fields["commen
0b90: 74 22 5d 20 3d 20 6a 73 6f 6e 5f 65 6e 63 6f 64  t"] = json_encod
0ba0: 65 28 24 64 61 74 61 2c 20 4a 53 4f 4e 5f 50 52  e($data, JSON_PR
0bb0: 45 54 54 59 5f 50 52 49 4e 54 7c 4a 53 4f 4e 5f  ETTY_PRINT|JSON_
0bc0: 55 4e 45 53 43 41 50 45 44 5f 53 4c 41 53 48 45  UNESCAPED_SLASHE
0bd0: 53 7c 4a 53 4f 4e 5f 55 4e 45 53 43 41 50 45 44  S|JSON_UNESCAPED
0be0: 5f 55 4e 49 43 4f 44 45 29 3b 0a 20 20 20 20 23  _UNICODE);.    #
0bf0: 2d 2d 20 65 78 74 72 61 20 66 69 65 6c 64 73 0a  -- extra fields.
0c00: 20 20 20 20 66 6f 72 65 61 63 68 20 28 24 6d 61      foreach ($ma
0c10: 70 5f 66 69 65 6c 64 73 20 61 73 20 24 66 72 6f  p_fields as $fro
0c20: 6d 3d 3e 24 74 6f 29 20 7b 0a 20 20 20 20 20 20  m=>$to) {.      
0c30: 20 20 69 66 20 28 69 73 73 65 74 28 24 64 61 74    if (isset($dat
0c40: 61 5b 24 66 72 6f 6d 5d 29 29 20 7b 0a 20 20 20  a[$from])) {.   
0c50: 20 20 20 20 20 20 20 20 20 24 66 69 65 6c 64 73           $fields
0c60: 5b 24 74 6f 5d 20 3d 20 73 75 62 73 74 72 28 24  [$to] = substr($
0c70: 64 61 74 61 5b 24 66 72 6f 6d 5d 2c 20 30 2c 20  data[$from], 0, 
0c80: 31 30 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  100);.        }.
0c90: 20 20 20 20 7d 0a 0a 20 20 20 20 23 2d 2d 20 61      }..    #-- a
0ca0: 73 73 65 6d 62 6c 65 20 63 6d 64 0a 20 20 20 20  ssemble cmd.    
0cb0: 24 63 6d 64 20 3d 20 22 66 6f 73 73 69 6c 20 2d  $cmd = "fossil -
0cc0: 2d 6e 6f 63 67 69 20 2d 52 20 7b 24 71 28 24 5f  -nocgi -R {$q($_
0cd0: 53 45 52 56 45 52 5b 27 46 4f 53 53 49 4c 5f 52  SERVER['FOSSIL_R
0ce0: 45 50 4f 53 49 54 4f 52 59 27 5d 29 7d 20 74 69  EPOSITORY'])} ti
0cf0: 63 6b 65 74 20 61 64 64 22 3b 0a 20 20 20 20 24  cket add";.    $
0d00: 71 20 3d 20 27 65 73 63 61 70 65 73 68 65 6c 6c  q = 'escapeshell
0d10: 61 72 67 27 3b 0a 20 20 20 20 66 6f 72 65 61 63  arg';.    foreac
0d20: 68 20 28 24 66 69 65 6c 64 73 20 61 73 20 24 6e  h ($fields as $n
0d30: 61 6d 65 3d 3e 24 76 61 6c 75 65 29 20 7b 0a 20  ame=>$value) {. 
0d40: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28         foreach (
0d50: 24 66 69 6c 74 65 72 5f 63 6f 6e 74 65 6e 74 20  $filter_content 
0d60: 61 73 20 24 72 78 3d 3e 24 74 6f 29 20 7b 0a 20  as $rx=>$to) {. 
0d70: 20 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75             $valu
0d80: 65 20 3d 20 70 72 65 67 5f 72 65 70 6c 61 63 65  e = preg_replace
0d90: 28 24 72 78 2c 20 24 74 6f 2c 20 24 76 61 6c 75  ($rx, $to, $valu
0da0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
0db0: 20 20 20 20 20 20 24 63 6d 64 20 2e 3d 20 22 20        $cmd .= " 
0dc0: 7b 24 71 28 24 6e 61 6d 65 29 7d 20 7b 24 71 28  {$q($name)} {$q(
0dd0: 24 76 61 6c 75 65 29 7d 22 3b 0a 20 20 20 20 7d  $value)}";.    }
0de0: 0a 0a 20 20 20 20 23 2d 2d 20 72 75 6e 0a 20 20  ..    #-- run.  
0df0: 20 20 65 78 65 63 28 24 63 6d 64 2c 20 24 73 74    exec($cmd, $st
0e00: 64 6f 75 74 2c 20 24 65 72 72 6e 6f 29 3b 0a 0a  dout, $errno);..
0e10: 20 20 20 20 23 2d 2d 20 4a 53 4f 4e 20 72 65 73      #-- JSON res
0e20: 70 6f 6e 73 65 0a 20 20 20 20 69 66 20 28 21 24  ponse.    if (!$
0e30: 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 20  errno) {.       
0e40: 20 64 69 65 28 6a 73 6f 6e 5f 65 6e 63 6f 64 65   die(json_encode
0e50: 28 5b 22 65 72 72 6f 72 22 20 3d 3e 20 24 73 74  (["error" => $st
0e60: 64 6f 75 74 2c 20 22 65 72 72 6e 6f 22 20 3d 3e  dout, "errno" =>
0e70: 20 24 65 72 72 6e 6f 5d 29 29 3b 0a 20 20 20 20   $errno]));.    
0e80: 7d 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20  }.    else {.   
0e90: 20 20 20 20 20 64 69 65 28 6a 73 6f 6e 5f 65 6e       die(json_en
0ea0: 63 6f 64 65 28 5b 22 73 75 63 63 65 73 73 22 20  code(["success" 
0eb0: 3d 3e 20 24 73 74 64 6f 75 74 2c 20 22 65 72 72  => $stdout, "err
0ec0: 6e 6f 22 20 3d 3e 20 24 65 72 72 6e 6f 5d 29 29  no" => $errno]))
0ed0: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a                 ;.    }.}..