Hex Artifact Content
Not logged in

Artifact 3f3e3d13b13df17f9f9faeb991ac85bbb2cef17c:

File src/info.c part of check-in [ee544f4843] - Better descriptions of raw artifacts on the "artifact" URL. by drh on 2009-08-29 18:47:02.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74   contains code t
0380: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
0390: 22 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 20  "info" command. 
03a0: 20 54 68 65 0a 2a 2a 20 22 69 6e 66 6f 22 20 63   The.** "info" c
03b0: 6f 6d 6d 61 6e 64 20 67 69 76 65 73 20 63 6f 6d  ommand gives com
03c0: 6d 61 6e 64 2d 6c 69 6e 65 20 61 63 63 65 73 73  mand-line access
03d0: 20 74 6f 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   to information 
03e0: 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 75 72  about.** the cur
03f0: 72 65 6e 74 20 74 72 65 65 2c 20 6f 72 20 61 20  rent tree, or a 
0400: 70 61 72 74 69 63 75 6c 61 72 20 61 72 74 69 66  particular artif
0410: 61 63 74 20 6f 72 20 63 68 65 63 6b 2d 69 6e 2e  act or check-in.
0420: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f  .*/.#include "co
0430: 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64 65  nfig.h".#include
0440: 20 22 69 6e 66 6f 2e 68 22 0a 23 69 6e 63 6c 75   "info.h".#inclu
0450: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 0a  de <assert.h>...
0460: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 63 6f 6d 6d  /*.** Print comm
0470: 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  on information a
0480: 62 6f 75 74 20 61 20 70 61 72 74 69 63 75 6c 61  bout a particula
0490: 72 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  r record..**.** 
04a0: 20 20 20 20 2a 20 20 54 68 65 20 55 55 49 44 0a      *  The UUID.
04b0: 2a 2a 20 20 20 20 20 2a 20 20 54 68 65 20 72 65  **     *  The re
04c0: 63 6f 72 64 20 49 44 0a 2a 2a 20 20 20 20 20 2a  cord ID.**     *
04d0: 20 20 6d 74 69 6d 65 20 61 6e 64 20 63 74 69 6d    mtime and ctim
04e0: 65 0a 2a 2a 20 20 20 20 20 2a 20 20 77 68 6f 20  e.**     *  who 
04f0: 73 69 67 6e 65 64 20 69 74 0a 2a 2f 0a 76 6f 69  signed it.*/.voi
0500: 64 20 73 68 6f 77 5f 63 6f 6d 6d 6f 6e 5f 69 6e  d show_common_in
0510: 66 6f 28 69 6e 74 20 72 69 64 2c 20 63 6f 6e 73  fo(int rid, cons
0520: 74 20 63 68 61 72 20 2a 7a 55 75 69 64 4e 61 6d  t char *zUuidNam
0530: 65 2c 20 69 6e 74 20 73 68 6f 77 43 6f 6d 6d 65  e, int showComme
0540: 6e 74 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20  nt){.  Stmt q;. 
0550: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 65 6e 74 20   char *zComment 
0560: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61  = 0;.  char *zTa
0570: 67 73 3b 0a 20 20 63 68 61 72 20 2a 7a 44 61 74  gs;.  char *zDat
0580: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 55 75 69 64  e;.  char *zUuid
0590: 3b 0a 20 20 7a 55 75 69 64 20 3d 20 64 62 5f 74  ;.  zUuid = db_t
05a0: 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 75  ext(0, "SELECT u
05b0: 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48  uid FROM blob WH
05c0: 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72 69 64  ERE rid=%d", rid
05d0: 29 3b 0a 20 20 69 66 28 20 7a 55 75 69 64 20 29  );.  if( zUuid )
05e0: 7b 0a 20 20 20 20 7a 44 61 74 65 20 3d 20 64 62  {.    zDate = db
05f0: 5f 74 65 78 74 28 22 22 2c 20 0a 20 20 20 20 20  _text("", .     
0600: 20 22 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d   "SELECT datetim
0610: 65 28 6d 74 69 6d 65 29 20 7c 7c 20 27 20 55 54  e(mtime) || ' UT
0620: 43 27 20 46 52 4f 4d 20 65 76 65 6e 74 20 57 48  C' FROM event WH
0630: 45 52 45 20 6f 62 6a 69 64 3d 25 64 22 2c 0a 20  ERE objid=%d",. 
0640: 20 20 20 20 20 72 69 64 0a 20 20 20 20 29 3b 0a       rid.    );.
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 31 32 33           /* 0123
0660: 34 35 36 37 38 39 30 31 32 33 20 2a 2f 0a 20 20  4567890123 */.  
0670: 20 20 70 72 69 6e 74 66 28 22 25 2d 31 33 73 20    printf("%-13s 
0680: 25 73 20 25 73 5c 6e 22 2c 20 7a 55 75 69 64 4e  %s %s\n", zUuidN
0690: 61 6d 65 2c 20 7a 55 75 69 64 2c 20 7a 44 61 74  ame, zUuid, zDat
06a0: 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 55 75  e);.    free(zUu
06b0: 69 64 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 44  id);.    free(zD
06c0: 61 74 65 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 70  ate);.  }.  db_p
06d0: 72 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45  repare(&q, "SELE
06e0: 43 54 20 75 75 69 64 2c 20 70 69 64 20 46 52 4f  CT uuid, pid FRO
06f0: 4d 20 70 6c 69 6e 6b 20 4a 4f 49 4e 20 62 6c 6f  M plink JOIN blo
0700: 62 20 4f 4e 20 70 69 64 3d 72 69 64 20 22 0a 20  b ON pid=rid ". 
0710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0720: 22 20 57 48 45 52 45 20 63 69 64 3d 25 64 22 2c  " WHERE cid=%d",
0730: 20 72 69 64 29 3b 0a 20 20 77 68 69 6c 65 28 20   rid);.  while( 
0740: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c  db_step(&q)==SQL
0750: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
0760: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64  onst char *zUuid
0770: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
0780: 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 7a 44  t(&q, 0);.    zD
0790: 61 74 65 20 3d 20 64 62 5f 74 65 78 74 28 22 22  ate = db_text(""
07a0: 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  , .      "SELECT
07b0: 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 29   datetime(mtime)
07c0: 20 7c 7c 20 27 20 55 54 43 27 20 46 52 4f 4d 20   || ' UTC' FROM 
07d0: 65 76 65 6e 74 20 57 48 45 52 45 20 6f 62 6a 69  event WHERE obji
07e0: 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 64 62 5f  d=%d",.      db_
07f0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 31  column_int(&q, 1
0800: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 72 69  ).    );.    pri
0810: 6e 74 66 28 22 70 61 72 65 6e 74 3a 20 20 20 20  ntf("parent:    
0820: 20 20 20 25 73 20 25 73 5c 6e 22 2c 20 7a 55 75     %s %s\n", zUu
0830: 69 64 2c 20 7a 44 61 74 65 29 3b 0a 20 20 20 20  id, zDate);.    
0840: 66 72 65 65 28 7a 44 61 74 65 29 3b 0a 20 20 7d  free(zDate);.  }
0850: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26  .  db_finalize(&
0860: 71 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65  q);.  db_prepare
0870: 28 26 71 2c 20 22 53 45 4c 45 43 54 20 75 75 69  (&q, "SELECT uui
0880: 64 2c 20 63 69 64 20 46 52 4f 4d 20 70 6c 69 6e  d, cid FROM plin
0890: 6b 20 4a 4f 49 4e 20 62 6c 6f 62 20 4f 4e 20 63  k JOIN blob ON c
08a0: 69 64 3d 72 69 64 20 22 0a 20 20 20 20 20 20 20  id=rid ".       
08b0: 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
08c0: 45 20 70 69 64 3d 25 64 22 2c 20 72 69 64 29 3b  E pid=%d", rid);
08d0: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
08e0: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
08f0: 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  W ){.    const c
0900: 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f  har *zUuid = db_
0910: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
0920: 30 29 3b 0a 20 20 20 20 7a 44 61 74 65 20 3d 20  0);.    zDate = 
0930: 64 62 5f 74 65 78 74 28 22 22 2c 20 0a 20 20 20  db_text("", .   
0940: 20 20 20 22 53 45 4c 45 43 54 20 64 61 74 65 74     "SELECT datet
0950: 69 6d 65 28 6d 74 69 6d 65 29 20 7c 7c 20 27 20  ime(mtime) || ' 
0960: 55 54 43 27 20 46 52 4f 4d 20 65 76 65 6e 74 20  UTC' FROM event 
0970: 57 48 45 52 45 20 6f 62 6a 69 64 3d 25 64 22 2c  WHERE objid=%d",
0980: 0a 20 20 20 20 20 20 64 62 5f 63 6f 6c 75 6d 6e  .      db_column
0990: 5f 69 6e 74 28 26 71 2c 20 31 29 0a 20 20 20 20  _int(&q, 1).    
09a0: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 63  );.    printf("c
09b0: 68 69 6c 64 3a 20 20 20 20 20 20 20 20 25 73 20  hild:        %s 
09c0: 25 73 5c 6e 22 2c 20 7a 55 75 69 64 2c 20 7a 44  %s\n", zUuid, zD
09d0: 61 74 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  ate);.    free(z
09e0: 44 61 74 65 29 3b 0a 20 20 7d 0a 20 20 64 62 5f  Date);.  }.  db_
09f0: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
0a00: 7a 54 61 67 73 20 3d 20 64 62 5f 74 65 78 74 28  zTags = db_text(
0a10: 30 2c 20 22 53 45 4c 45 43 54 20 67 72 6f 75 70  0, "SELECT group
0a20: 5f 63 6f 6e 63 61 74 28 73 75 62 73 74 72 28 74  _concat(substr(t
0a30: 61 67 6e 61 6d 65 2c 20 35 29 2c 20 27 2c 20 27  agname, 5), ', '
0a40: 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )".             
0a50: 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20          "  FROM 
0a60: 74 61 67 78 72 65 66 2c 20 74 61 67 22 0a 20 20  tagxref, tag".  
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 20 22 20 57 48 45 52 45 20 74 61 67 78 72     " WHERE tagxr
0a90: 65 66 2e 72 69 64 3d 25 64 20 41 4e 44 20 74 61  ef.rid=%d AND ta
0aa0: 67 78 72 65 66 2e 74 61 67 74 79 70 65 3e 30 22  gxref.tagtype>0"
0ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0ac0: 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 74 61        "   AND ta
0ad0: 67 2e 74 61 67 69 64 3d 74 61 67 78 72 65 66 2e  g.tagid=tagxref.
0ae0: 74 61 67 69 64 22 0a 20 20 20 20 20 20 20 20 20  tagid".         
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20              "   
0b00: 41 4e 44 20 74 61 67 2e 74 61 67 6e 61 6d 65 20  AND tag.tagname 
0b10: 47 4c 4f 42 20 27 73 79 6d 2d 2a 27 22 2c 0a 20  GLOB 'sym-*'",. 
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b30: 20 20 20 20 72 69 64 29 3b 0a 20 20 69 66 28 20      rid);.  if( 
0b40: 7a 54 61 67 73 20 26 26 20 7a 54 61 67 73 5b 30  zTags && zTags[0
0b50: 5d 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  ] ){.    printf(
0b60: 22 74 61 67 73 3a 20 20 20 20 20 20 20 20 20 25  "tags:         %
0b70: 73 5c 6e 22 2c 20 7a 54 61 67 73 29 3b 0a 20 20  s\n", zTags);.  
0b80: 7d 0a 20 20 66 72 65 65 28 7a 54 61 67 73 29 3b  }.  free(zTags);
0b90: 0a 20 20 69 66 28 20 7a 43 6f 6d 6d 65 6e 74 20  .  if( zComment 
0ba0: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 63  ){.    printf("c
0bb0: 6f 6d 6d 65 6e 74 3a 5c 6e 25 73 5c 6e 22 2c 20  omment:\n%s\n", 
0bc0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 66  zComment);.    f
0bd0: 72 65 65 28 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  ree(zComment);. 
0be0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d   }.}.../*.** COM
0bf0: 4d 41 4e 44 3a 20 69 6e 66 6f 0a 2a 2a 0a 2a 2a  MAND: info.**.**
0c00: 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20   Usage: %fossil 
0c10: 69 6e 66 6f 20 3f 41 52 54 49 46 41 43 54 2d 49  info ?ARTIFACT-I
0c20: 44 7c 46 49 4c 45 4e 41 4d 45 3f 0a 2a 2a 0a 2a  D|FILENAME?.**.*
0c30: 2a 20 57 69 74 68 20 6e 6f 20 61 72 67 75 6d 65  * With no argume
0c40: 6e 74 73 2c 20 70 72 6f 76 69 64 65 20 69 6e 66  nts, provide inf
0c50: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
0c60: 68 65 20 63 75 72 72 65 6e 74 20 74 72 65 65 2e  he current tree.
0c70: 0a 2a 2a 20 49 66 20 61 6e 20 61 72 67 75 6d 65  .** If an argume
0c80: 6e 74 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  nt is specified,
0c90: 20 70 72 6f 76 69 64 65 20 69 6e 66 6f 72 6d 61   provide informa
0ca0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 6f  tion about the o
0cb0: 62 6a 65 63 74 0a 2a 2a 20 69 6e 20 74 68 65 20  bject.** in the 
0cc0: 72 65 73 70 6f 73 69 74 6f 72 79 20 6f 66 20 74  respository of t
0cd0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 65 65 20  he current tree 
0ce0: 74 68 61 74 20 74 68 65 20 61 72 67 75 6d 65 6e  that the argumen
0cf0: 74 20 72 65 66 65 72 73 0a 2a 2a 20 74 6f 2e 20  t refers.** to. 
0d00: 20 4f 72 20 69 66 20 74 68 65 20 61 72 67 75 6d   Or if the argum
0d10: 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
0d20: 6f 66 20 61 20 72 65 70 6f 73 69 74 6f 72 79 2c  of a repository,
0d30: 20 73 68 6f 77 0a 2a 2a 20 69 6e 66 6f 72 6d 61   show.** informa
0d40: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 61 74 20  tion about that 
0d50: 72 65 70 6f 73 69 74 6f 72 79 2e 0a 2a 2f 0a 76  repository..*/.v
0d60: 6f 69 64 20 69 6e 66 6f 5f 63 6d 64 28 76 6f 69  oid info_cmd(voi
0d70: 64 29 7b 0a 20 20 69 36 34 20 66 73 69 7a 65 3b  d){.  i64 fsize;
0d80: 0a 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d 32  .  if( g.argc!=2
0d90: 20 26 26 20 67 2e 61 72 67 63 21 3d 33 20 29 7b   && g.argc!=3 ){
0da0: 0a 20 20 20 20 75 73 61 67 65 28 22 3f 46 49 4c  .    usage("?FIL
0db0: 45 4e 41 4d 45 7c 41 52 54 49 46 41 43 54 2d 49  ENAME|ARTIFACT-I
0dc0: 44 3f 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  D?");.  }.  if( 
0dd0: 67 2e 61 72 67 63 3d 3d 33 20 26 26 20 28 66 73  g.argc==3 && (fs
0de0: 69 7a 65 20 3d 20 66 69 6c 65 5f 73 69 7a 65 28  ize = file_size(
0df0: 67 2e 61 72 67 76 5b 32 5d 29 29 3e 30 20 26 26  g.argv[2]))>0 &&
0e00: 20 28 66 73 69 7a 65 26 30 78 31 66 66 29 3d 3d   (fsize&0x1ff)==
0e10: 30 20 29 7b 0a 20 20 20 20 64 62 5f 6f 70 65 6e  0 ){.    db_open
0e20: 5f 63 6f 6e 66 69 67 28 30 29 3b 0a 20 20 20 20  _config(0);.    
0e30: 64 62 5f 72 65 63 6f 72 64 5f 72 65 70 6f 73 69  db_record_reposi
0e40: 74 6f 72 79 5f 66 69 6c 65 6e 61 6d 65 28 67 2e  tory_filename(g.
0e50: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 64 62  argv[2]);.    db
0e60: 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79  _open_repository
0e70: 28 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  (g.argv[2]);.   
0e80: 20 70 72 69 6e 74 66 28 22 70 72 6f 6a 65 63 74   printf("project
0e90: 2d 63 6f 64 65 3a 20 25 73 5c 6e 22 2c 20 64 62  -code: %s\n", db
0ea0: 5f 67 65 74 28 22 70 72 6f 6a 65 63 74 2d 63 6f  _get("project-co
0eb0: 64 65 22 2c 20 22 3c 6e 6f 6e 65 3e 22 29 29 3b  de", "<none>"));
0ec0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 70 72 6f  .    printf("pro
0ed0: 6a 65 63 74 2d 6e 61 6d 65 3a 20 25 73 5c 6e 22  ject-name: %s\n"
0ee0: 2c 20 64 62 5f 67 65 74 28 22 70 72 6f 6a 65 63  , db_get("projec
0ef0: 74 2d 6e 61 6d 65 22 2c 20 22 3c 75 6e 6e 61 6d  t-name", "<unnam
0f00: 65 64 3e 22 29 29 3b 0a 20 20 20 20 70 72 69 6e  ed>"));.    prin
0f10: 74 66 28 22 73 65 72 76 65 72 2d 63 6f 64 65 3a  tf("server-code:
0f20: 20 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28    %s\n", db_get(
0f30: 22 73 65 72 76 65 72 2d 63 6f 64 65 22 2c 20 22  "server-code", "
0f40: 3c 6e 6f 6e 65 3e 22 29 29 3b 0a 20 20 20 20 72  <none>"));.    r
0f50: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62 5f  eturn;.  }.  db_
0f60: 6d 75 73 74 5f 62 65 5f 77 69 74 68 69 6e 5f 74  must_be_within_t
0f70: 72 65 65 28 29 3b 0a 20 20 69 66 28 20 67 2e 61  ree();.  if( g.a
0f80: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e  rgc==2 ){.    in
0f90: 74 20 76 69 64 3b 0a 20 20 20 20 20 20 20 20 20  t vid;.         
0fa0: 2f 2a 20 30 31 32 33 34 35 36 37 38 39 30 31 32  /* 0123456789012
0fb0: 33 34 20 2a 2f 0a 20 20 20 20 64 62 5f 72 65 63  34 */.    db_rec
0fc0: 6f 72 64 5f 72 65 70 6f 73 69 74 6f 72 79 5f 66  ord_repository_f
0fd0: 69 6c 65 6e 61 6d 65 28 30 29 3b 0a 20 20 20 20  ilename(0);.    
0fe0: 70 72 69 6e 74 66 28 22 72 65 70 6f 73 69 74 6f  printf("reposito
0ff0: 72 79 3a 20 20 20 25 73 5c 6e 22 2c 20 64 62 5f  ry:   %s\n", db_
1000: 6c 67 65 74 28 22 72 65 70 6f 73 69 74 6f 72 79  lget("repository
1010: 22 2c 20 22 22 29 29 3b 0a 20 20 20 20 70 72 69  ", ""));.    pri
1020: 6e 74 66 28 22 6c 6f 63 61 6c 2d 72 6f 6f 74 3a  ntf("local-root:
1030: 20 20 20 25 73 5c 6e 22 2c 20 67 2e 7a 4c 6f 63     %s\n", g.zLoc
1040: 61 6c 52 6f 6f 74 29 3b 0a 20 20 20 20 70 72 69  alRoot);.    pri
1050: 6e 74 66 28 22 70 72 6f 6a 65 63 74 2d 63 6f 64  ntf("project-cod
1060: 65 3a 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74  e: %s\n", db_get
1070: 28 22 70 72 6f 6a 65 63 74 2d 63 6f 64 65 22 2c  ("project-code",
1080: 20 22 22 29 29 3b 0a 20 20 20 20 70 72 69 6e 74   ""));.    print
1090: 66 28 22 73 65 72 76 65 72 2d 63 6f 64 65 3a 20  f("server-code: 
10a0: 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28 22   %s\n", db_get("
10b0: 73 65 72 76 65 72 2d 63 6f 64 65 22 2c 20 22 22  server-code", ""
10c0: 29 29 3b 0a 20 20 20 20 76 69 64 20 3d 20 64 62  ));.    vid = db
10d0: 5f 6c 67 65 74 5f 69 6e 74 28 22 63 68 65 63 6b  _lget_int("check
10e0: 6f 75 74 22 2c 20 30 29 3b 0a 20 20 20 20 69 66  out", 0);.    if
10f0: 28 20 76 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ( vid==0 ){.    
1100: 20 20 70 72 69 6e 74 66 28 22 63 68 65 63 6b 6f    printf("checko
1110: 75 74 3a 20 20 20 20 20 6e 69 6c 5c 6e 22 29 3b  ut:     nil\n");
1120: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1130: 20 20 73 68 6f 77 5f 63 6f 6d 6d 6f 6e 5f 69 6e    show_common_in
1140: 66 6f 28 76 69 64 2c 20 22 63 68 65 63 6b 6f 75  fo(vid, "checkou
1150: 74 3a 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  t:", 1);.    }. 
1160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1170: 72 69 64 3b 0a 20 20 20 20 72 69 64 20 3d 20 6e  rid;.    rid = n
1180: 61 6d 65 5f 74 6f 5f 72 69 64 28 67 2e 61 72 67  ame_to_rid(g.arg
1190: 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  v[2]);.    if( r
11a0: 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  id==0 ){.      f
11b0: 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 6e 6f 20  ossil_panic("no 
11c0: 73 75 63 68 20 6f 62 6a 65 63 74 3a 20 25 73 5c  such object: %s\
11d0: 6e 22 2c 20 67 2e 61 72 67 76 5b 32 5d 29 3b 0a  n", g.argv[2]);.
11e0: 20 20 20 20 7d 0a 20 20 20 20 73 68 6f 77 5f 63      }.    show_c
11f0: 6f 6d 6d 6f 6e 5f 69 6e 66 6f 28 72 69 64 2c 20  ommon_info(rid, 
1200: 22 75 75 69 64 3a 22 2c 20 31 29 3b 0a 20 20 7d  "uuid:", 1);.  }
1210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 69  .}../*.** Show i
1220: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
1230: 20 61 6c 6c 20 74 61 67 73 20 6f 6e 20 61 20 67   all tags on a g
1240: 69 76 65 6e 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74  iven node..*/.st
1250: 61 74 69 63 20 76 6f 69 64 20 73 68 6f 77 54 61  atic void showTa
1260: 67 73 28 69 6e 74 20 72 69 64 2c 20 63 6f 6e 73  gs(int rid, cons
1270: 74 20 63 68 61 72 20 2a 7a 4e 6f 74 47 6c 6f 62  t char *zNotGlob
1280: 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69  ){.  Stmt q;.  i
1290: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 64 62  nt cnt = 0;.  db
12a0: 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20  _prepare(&q,.   
12b0: 20 22 53 45 4c 45 43 54 20 74 61 67 2e 74 61 67   "SELECT tag.tag
12c0: 69 64 2c 20 74 61 67 6e 61 6d 65 2c 20 22 0a 20  id, tagname, ". 
12d0: 20 20 20 22 20 20 20 20 20 20 20 28 53 45 4c 45     "       (SELE
12e0: 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f  CT uuid FROM blo
12f0: 62 20 57 48 45 52 45 20 72 69 64 3d 74 61 67 78  b WHERE rid=tagx
1300: 72 65 66 2e 73 72 63 69 64 20 41 4e 44 20 72 69  ref.srcid AND ri
1310: 64 21 3d 25 64 29 2c 22 0a 20 20 20 20 22 20 20  d!=%d),".    "  
1320: 20 20 20 20 20 76 61 6c 75 65 2c 20 64 61 74 65       value, date
1330: 74 69 6d 65 28 74 61 67 78 72 65 66 2e 6d 74 69  time(tagxref.mti
1340: 6d 65 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c  me,'localtime'),
1350: 20 74 61 67 74 79 70 65 2c 22 0a 20 20 20 20 22   tagtype,".    "
1360: 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 75         (SELECT u
1370: 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48  uid FROM blob WH
1380: 45 52 45 20 72 69 64 3d 74 61 67 78 72 65 66 2e  ERE rid=tagxref.
1390: 6f 72 69 67 69 64 20 41 4e 44 20 72 69 64 21 3d  origid AND rid!=
13a0: 25 64 29 22 0a 20 20 20 20 22 20 20 46 52 4f 4d  %d)".    "  FROM
13b0: 20 74 61 67 78 72 65 66 20 4a 4f 49 4e 20 74 61   tagxref JOIN ta
13c0: 67 20 4f 4e 20 74 61 67 78 72 65 66 2e 74 61 67  g ON tagxref.tag
13d0: 69 64 3d 74 61 67 2e 74 61 67 69 64 22 0a 20 20  id=tag.tagid".  
13e0: 20 20 22 20 57 48 45 52 45 20 74 61 67 78 72 65    " WHERE tagxre
13f0: 66 2e 72 69 64 3d 25 64 20 41 4e 44 20 74 61 67  f.rid=%d AND tag
1400: 6e 61 6d 65 20 4e 4f 54 20 47 4c 4f 42 20 27 25  name NOT GLOB '%
1410: 73 27 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20  s'".    " ORDER 
1420: 42 59 20 74 61 67 6e 61 6d 65 22 2c 20 72 69 64  BY tagname", rid
1430: 2c 20 72 69 64 2c 20 72 69 64 2c 20 7a 4e 6f 74  , rid, rid, zNot
1440: 47 6c 6f 62 0a 20 20 29 3b 0a 20 20 77 68 69 6c  Glob.  );.  whil
1450: 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
1460: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1470: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1480: 61 67 6e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75  agname = db_colu
1490: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a  mn_text(&q, 1);.
14a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14b0: 7a 53 72 63 55 75 69 64 20 3d 20 64 62 5f 63 6f  zSrcUuid = db_co
14c0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32 29  lumn_text(&q, 2)
14d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14e0: 20 2a 7a 56 61 6c 75 65 20 3d 20 64 62 5f 63 6f   *zValue = db_co
14f0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 33 29  lumn_text(&q, 3)
1500: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1510: 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c   *zDate = db_col
1520: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 34 29 3b  umn_text(&q, 4);
1530: 0a 20 20 20 20 69 6e 74 20 74 61 67 74 79 70 65  .    int tagtype
1540: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
1550: 28 26 71 2c 20 35 29 3b 0a 20 20 20 20 63 6f 6e  (&q, 5);.    con
1560: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 55 75  st char *zOrigUu
1570: 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  id = db_column_t
1580: 65 78 74 28 26 71 2c 20 36 29 3b 0a 20 20 20 20  ext(&q, 6);.    
1590: 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 63  cnt++;.    if( c
15a0: 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 40  nt==1 ){.      @
15b0: 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 73 65 63   <div class="sec
15c0: 74 69 6f 6e 22 3e 54 61 67 73 20 41 6e 64 20 50  tion">Tags And P
15d0: 72 6f 70 65 72 74 69 65 73 3c 2f 64 69 76 3e 0a  roperties</div>.
15e0: 20 20 20 20 20 20 40 20 3c 75 6c 3e 0a 20 20 20        @ <ul>.   
15f0: 20 7d 0a 20 20 20 20 40 20 3c 6c 69 3e 0a 20 20   }.    @ <li>.  
1600: 20 20 69 66 28 20 74 61 67 74 79 70 65 3d 3d 30    if( tagtype==0
1610: 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 62 3e 3c   ){.      @ <b><
1620: 73 3e 25 68 28 7a 54 61 67 6e 61 6d 65 29 3c 2f  s>%h(zTagname)</
1630: 73 3e 3c 2f 62 3e 20 63 61 6e 63 65 6c 6c 65 64  s></b> cancelled
1640: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
1650: 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 40  Value ){.      @
1660: 20 3c 62 3e 25 68 28 7a 54 61 67 6e 61 6d 65 29   <b>%h(zTagname)
1670: 3d 25 68 28 7a 56 61 6c 75 65 29 3c 2f 62 3e 0a  =%h(zValue)</b>.
1680: 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20      }else {.    
1690: 20 20 40 20 3c 62 3e 25 68 28 7a 54 61 67 6e 61    @ <b>%h(zTagna
16a0: 6d 65 29 3c 2f 62 3e 0a 20 20 20 20 7d 0a 20 20  me)</b>.    }.  
16b0: 20 20 69 66 28 20 74 61 67 74 79 70 65 3d 3d 32    if( tagtype==2
16c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 4f   ){.      if( zO
16d0: 72 69 67 55 75 69 64 20 26 26 20 7a 4f 72 69 67  rigUuid && zOrig
16e0: 55 75 69 64 5b 30 5d 20 29 7b 0a 20 20 20 20 20  Uuid[0] ){.     
16f0: 20 20 20 40 20 69 6e 68 65 72 69 74 65 64 20 66     @ inherited f
1700: 72 6f 6d 0a 20 20 20 20 20 20 20 20 68 79 70 65  rom.        hype
1710: 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 28 7a 4f  rlink_to_uuid(zO
1720: 72 69 67 55 75 69 64 29 3b 0a 20 20 20 20 20 20  rigUuid);.      
1730: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 40  }else{.        @
1740: 20 70 72 6f 70 61 67 61 74 65 73 20 74 6f 20 64   propagates to d
1750: 65 73 63 65 6e 64 61 6e 74 73 0a 20 20 20 20 20  escendants.     
1760: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1770: 20 7a 53 72 63 55 75 69 64 20 26 26 20 7a 53 72   zSrcUuid && zSr
1780: 63 55 75 69 64 5b 30 5d 20 29 7b 0a 20 20 20 20  cUuid[0] ){.    
1790: 20 20 69 66 28 20 74 61 67 74 79 70 65 3d 3d 30    if( tagtype==0
17a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20 62 79   ){.        @ by
17b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17c0: 20 20 20 20 20 20 40 20 61 64 64 65 64 20 62 79        @ added by
17d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 68  .      }.      h
17e0: 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64  yperlink_to_uuid
17f0: 28 7a 53 72 63 55 75 69 64 29 3b 0a 20 20 20 20  (zSrcUuid);.    
1800: 20 20 40 20 6f 6e 0a 20 20 20 20 20 20 68 79 70    @ on.      hyp
1810: 65 72 6c 69 6e 6b 5f 74 6f 5f 64 61 74 65 28 7a  erlink_to_date(z
1820: 44 61 74 65 2c 30 29 3b 0a 20 20 20 20 7d 0a 20  Date,0);.    }. 
1830: 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65   }.  db_finalize
1840: 28 26 71 29 3b 0a 20 20 69 66 28 20 63 6e 74 20  (&q);.  if( cnt 
1850: 29 7b 0a 20 20 20 20 40 20 3c 2f 75 6c 3e 0a 20  ){.    @ </ul>. 
1860: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70   }.}.../*.** App
1870: 65 6e 64 20 74 68 65 20 64 69 66 66 65 72 65 6e  end the differen
1880: 63 65 20 62 65 74 77 65 65 6e 20 74 77 6f 20 52  ce between two R
1890: 49 44 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75  IDs to the outpu
18a0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
18b0: 20 61 70 70 65 6e 64 5f 64 69 66 66 28 69 6e 74   append_diff(int
18c0: 20 66 72 6f 6d 69 64 2c 20 69 6e 74 20 74 6f 69   fromid, int toi
18d0: 64 29 7b 0a 20 20 42 6c 6f 62 20 66 72 6f 6d 2c  d){.  Blob from,
18e0: 20 74 6f 2c 20 6f 75 74 3b 0a 20 20 63 6f 6e 74   to, out;.  cont
18f0: 65 6e 74 5f 67 65 74 28 66 72 6f 6d 69 64 2c 20  ent_get(fromid, 
1900: 26 66 72 6f 6d 29 3b 0a 20 20 63 6f 6e 74 65 6e  &from);.  conten
1910: 74 5f 67 65 74 28 74 6f 69 64 2c 20 26 74 6f 29  t_get(toid, &to)
1920: 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6f  ;.  blob_zero(&o
1930: 75 74 29 3b 0a 20 20 74 65 78 74 5f 64 69 66 66  ut);.  text_diff
1940: 28 26 66 72 6f 6d 2c 20 26 74 6f 2c 20 26 6f 75  (&from, &to, &ou
1950: 74 2c 20 35 29 3b 0a 20 20 40 20 25 68 28 62 6c  t, 5);.  @ %h(bl
1960: 6f 62 5f 73 74 72 28 26 6f 75 74 29 29 0a 20 20  ob_str(&out)).  
1970: 62 6c 6f 62 5f 72 65 73 65 74 28 26 66 72 6f 6d  blob_reset(&from
1980: 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28  );.  blob_reset(
1990: 26 74 6f 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73  &to);.  blob_res
19a0: 65 74 28 26 6f 75 74 29 3b 20 20 0a 7d 0a 0a 0a  et(&out);  .}...
19b0: 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 76  /*.** WEBPAGE: v
19c0: 69 6e 66 6f 0a 2a 2a 20 57 45 42 50 41 47 45 3a  info.** WEBPAGE:
19d0: 20 63 69 0a 2a 2a 20 55 52 4c 3a 20 20 2f 63 69   ci.** URL:  /ci
19e0: 3f 6e 61 6d 65 3d 52 49 44 7c 41 52 54 49 46 41  ?name=RID|ARTIFA
19f0: 43 54 49 44 0a 2a 2a 0a 2a 2a 20 44 69 73 70 6c  CTID.**.** Displ
1a00: 61 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ay information a
1a10: 62 6f 75 74 20 61 20 70 61 72 74 69 63 75 6c 61  bout a particula
1a20: 72 20 63 68 65 63 6b 2d 69 6e 2e 0a 2a 2f 0a 76  r check-in..*/.v
1a30: 6f 69 64 20 63 69 5f 70 61 67 65 28 76 6f 69 64  oid ci_page(void
1a40: 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69  ){.  Stmt q;.  i
1a50: 6e 74 20 72 69 64 3b 0a 20 20 69 6e 74 20 69 73  nt rid;.  int is
1a60: 4c 65 61 66 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63  Leaf;..  login_c
1a70: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
1a80: 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52  ();.  if( !g.okR
1a90: 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65  ead ){ login_nee
1aa0: 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d  ded(); return; }
1ab0: 0a 20 20 72 69 64 20 3d 20 6e 61 6d 65 5f 74 6f  .  rid = name_to
1ac0: 5f 72 69 64 28 50 44 28 22 6e 61 6d 65 22 2c 22  _rid(PD("name","
1ad0: 30 22 29 29 3b 0a 20 20 69 66 28 20 72 69 64 3d  0"));.  if( rid=
1ae0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f  =0 ){.    style_
1af0: 68 65 61 64 65 72 28 22 43 68 65 63 6b 2d 69 6e  header("Check-in
1b00: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 45 72 72   Information Err
1b10: 6f 72 22 29 3b 0a 20 20 20 20 40 20 4e 6f 20 73  or");.    @ No s
1b20: 75 63 68 20 6f 62 6a 65 63 74 3a 20 25 68 28 67  uch object: %h(g
1b30: 2e 61 72 67 76 5b 32 5d 29 0a 20 20 20 20 73 74  .argv[2]).    st
1b40: 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20  yle_footer();.  
1b50: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1b60: 69 73 4c 65 61 66 20 3d 20 21 64 62 5f 65 78 69  isLeaf = !db_exi
1b70: 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52  sts("SELECT 1 FR
1b80: 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 70  OM plink WHERE p
1b90: 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20  id=%d", rid);.  
1ba0: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 0a  db_prepare(&q, .
1bb0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 75 75 69       "SELECT uui
1bc0: 64 2c 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d  d, datetime(mtim
1bd0: 65 2c 20 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c  e, 'localtime'),
1be0: 20 75 73 65 72 2c 20 63 6f 6d 6d 65 6e 74 22 0a   user, comment".
1bf0: 20 20 20 20 20 22 20 20 46 52 4f 4d 20 62 6c 6f       "  FROM blo
1c00: 62 2c 20 65 76 65 6e 74 22 0a 20 20 20 20 20 22  b, event".     "
1c10: 20 57 48 45 52 45 20 62 6c 6f 62 2e 72 69 64 3d   WHERE blob.rid=
1c20: 25 64 22 0a 20 20 20 20 20 22 20 20 20 41 4e 44  %d".     "   AND
1c30: 20 65 76 65 6e 74 2e 6f 62 6a 69 64 3d 25 64 22   event.objid=%d"
1c40: 2c 0a 20 20 20 20 20 72 69 64 2c 20 72 69 64 0a  ,.     rid, rid.
1c50: 20 20 29 3b 0a 20 20 69 66 28 20 64 62 5f 73 74    );.  if( db_st
1c60: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
1c70: 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OW ){.    const 
1c80: 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62  char *zUuid = db
1c90: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
1ca0: 20 30 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   0);.    char *z
1cb0: 54 69 74 6c 65 20 3d 20 6d 70 72 69 6e 74 66 28  Title = mprintf(
1cc0: 22 43 68 65 63 6b 2d 69 6e 20 5b 25 2e 31 30 73  "Check-in [%.10s
1cd0: 5d 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20  ]", zUuid);.    
1ce0: 63 68 61 72 20 2a 7a 45 55 73 65 72 2c 20 2a 7a  char *zEUser, *z
1cf0: 45 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 63 6f  EComment;.    co
1d00: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 3b  nst char *zUser;
1d10: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1d20: 2a 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 63  *zComment;.    c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65  onst char *zDate
1d40: 3b 0a 20 20 20 20 73 74 79 6c 65 5f 68 65 61 64  ;.    style_head
1d50: 65 72 28 7a 54 69 74 6c 65 29 3b 0a 20 20 20 20  er(zTitle);.    
1d60: 6c 6f 67 69 6e 5f 61 6e 6f 6e 79 6d 6f 75 73 5f  login_anonymous_
1d70: 61 76 61 69 6c 61 62 6c 65 28 29 3b 0a 20 20 20  available();.   
1d80: 20 66 72 65 65 28 7a 54 69 74 6c 65 29 3b 0a 20   free(zTitle);. 
1d90: 20 20 20 7a 45 55 73 65 72 20 3d 20 64 62 5f 74     zEUser = db_t
1da0: 65 78 74 28 30 2c 0a 20 20 20 20 20 20 20 20 20  ext(0,.         
1db0: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
1dc0: 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 74 61 67  T value FROM tag
1dd0: 78 72 65 66 20 57 48 45 52 45 20 74 61 67 69 64  xref WHERE tagid
1de0: 3d 25 64 20 41 4e 44 20 72 69 64 3d 25 64 22 2c  =%d AND rid=%d",
1df0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e00: 20 20 20 20 20 54 41 47 5f 55 53 45 52 2c 20 72       TAG_USER, r
1e10: 69 64 29 3b 0a 20 20 20 20 7a 45 43 6f 6d 6d 65  id);.    zEComme
1e20: 6e 74 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20  nt = db_text(0, 
1e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e40: 20 20 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75      "SELECT valu
1e50: 65 20 46 52 4f 4d 20 74 61 67 78 72 65 66 20 57  e FROM tagxref W
1e60: 48 45 52 45 20 74 61 67 69 64 3d 25 64 20 41 4e  HERE tagid=%d AN
1e70: 44 20 72 69 64 3d 25 64 22 2c 0a 20 20 20 20 20  D rid=%d",.     
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 41                TA
1e90: 47 5f 43 4f 4d 4d 45 4e 54 2c 20 72 69 64 29 3b  G_COMMENT, rid);
1ea0: 0a 20 20 20 20 7a 55 73 65 72 20 3d 20 64 62 5f  .    zUser = db_
1eb0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
1ec0: 32 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 65 6e 74  2);.    zComment
1ed0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
1ee0: 74 28 26 71 2c 20 33 29 3b 0a 20 20 20 20 7a 44  t(&q, 3);.    zD
1ef0: 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ate = db_column_
1f00: 74 65 78 74 28 26 71 2c 31 29 3b 0a 20 20 20 20  text(&q,1);.    
1f10: 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 73 65  @ <div class="se
1f20: 63 74 69 6f 6e 22 3e 4f 76 65 72 76 69 65 77 3c  ction">Overview<
1f30: 2f 64 69 76 3e 0a 20 20 20 20 40 20 3c 70 3e 3c  /div>.    @ <p><
1f40: 74 61 62 6c 65 20 63 6c 61 73 73 3d 22 6c 61 62  table class="lab
1f50: 65 6c 2d 76 61 6c 75 65 22 3e 0a 20 20 20 20 40  el-value">.    @
1f60: 20 3c 74 72 3e 3c 74 68 3e 53 48 41 31 26 6e 62   <tr><th>SHA1&nb
1f70: 73 70 3b 48 61 73 68 3a 3c 2f 74 68 3e 3c 74 64  sp;Hash:</th><td
1f80: 3e 25 73 28 7a 55 75 69 64 29 0a 20 20 20 20 69  >%s(zUuid).    i
1f90: 66 28 20 67 2e 6f 6b 53 65 74 75 70 20 29 7b 0a  f( g.okSetup ){.
1fa0: 20 20 20 20 20 20 40 20 28 52 65 63 6f 72 64 20        @ (Record 
1fb0: 49 44 3a 20 25 64 28 72 69 64 29 29 0a 20 20 20  ID: %d(rid)).   
1fc0: 20 7d 0a 20 20 20 20 40 20 3c 2f 74 64 3e 3c 2f   }.    @ </td></
1fd0: 74 72 3e 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74  tr>.    @ <tr><t
1fe0: 68 3e 44 61 74 65 3a 3c 2f 74 68 3e 3c 74 64 3e  h>Date:</th><td>
1ff0: 0a 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74  .    hyperlink_t
2000: 6f 5f 64 61 74 65 28 7a 44 61 74 65 2c 20 22 3c  o_date(zDate, "<
2010: 2f 74 64 3e 3c 2f 74 72 3e 22 29 3b 0a 20 20 20  /td></tr>");.   
2020: 20 69 66 28 20 7a 45 55 73 65 72 20 29 7b 0a 20   if( zEUser ){. 
2030: 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 45       @ <tr><th>E
2040: 64 69 74 65 64 26 6e 62 73 70 3b 55 73 65 72 3a  dited&nbsp;User:
2050: 3c 2f 74 64 3e 3c 74 64 3e 0a 20 20 20 20 20 20  </td><td>.      
2060: 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73 65  hyperlink_to_use
2070: 72 28 7a 45 55 73 65 72 2c 7a 44 61 74 65 2c 22  r(zEUser,zDate,"
2080: 3c 2f 74 64 3e 3c 2f 74 72 3e 22 29 3b 0a 20 20  </td></tr>");.  
2090: 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 4f 72      @ <tr><th>Or
20a0: 69 67 69 6e 61 6c 26 6e 62 73 70 3b 55 73 65 72  iginal&nbsp;User
20b0: 3a 3c 2f 74 68 3e 3c 74 64 3e 0a 20 20 20 20 20  :</th><td>.     
20c0: 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73   hyperlink_to_us
20d0: 65 72 28 7a 55 73 65 72 2c 7a 44 61 74 65 2c 22  er(zUser,zDate,"
20e0: 3c 2f 74 64 3e 3c 2f 74 72 3e 22 29 3b 0a 20 20  </td></tr>");.  
20f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40    }else{.      @
2100: 20 3c 74 72 3e 3c 74 68 3e 55 73 65 72 3a 3c 2f   <tr><th>User:</
2110: 74 64 3e 3c 74 64 3e 0a 20 20 20 20 20 20 68 79  td><td>.      hy
2120: 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73 65 72 28  perlink_to_user(
2130: 7a 55 73 65 72 2c 7a 44 61 74 65 2c 22 3c 2f 74  zUser,zDate,"</t
2140: 64 3e 3c 2f 74 72 3e 22 29 3b 0a 20 20 20 20 7d  d></tr>");.    }
2150: 0a 20 20 20 20 69 66 28 20 7a 45 43 6f 6d 6d 65  .    if( zEComme
2160: 6e 74 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 74  nt ){.      @ <t
2170: 72 3e 3c 74 68 3e 45 64 69 74 65 64 26 6e 62 73  r><th>Edited&nbs
2180: 70 3b 43 6f 6d 6d 65 6e 74 3a 3c 2f 74 68 3e 3c  p;Comment:</th><
2190: 74 64 3e 25 77 28 7a 45 43 6f 6d 6d 65 6e 74 29  td>%w(zEComment)
21a0: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 20  </td></tr>.     
21b0: 20 40 20 3c 74 72 3e 3c 74 68 3e 4f 72 69 67 69   @ <tr><th>Origi
21c0: 6e 61 6c 26 6e 62 73 70 3b 43 6f 6d 6d 65 6e 74  nal&nbsp;Comment
21d0: 3a 3c 2f 74 68 3e 3c 74 64 3e 25 77 28 7a 43 6f  :</th><td>%w(zCo
21e0: 6d 6d 65 6e 74 29 3c 2f 74 64 3e 3c 2f 74 72 3e  mment)</td></tr>
21f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2200: 20 20 40 20 3c 74 72 3e 3c 74 68 3e 43 6f 6d 6d    @ <tr><th>Comm
2210: 65 6e 74 3a 3c 2f 74 68 3e 3c 74 64 3e 25 77 28  ent:</th><td>%w(
2220: 7a 43 6f 6d 6d 65 6e 74 29 3c 2f 74 64 3e 3c 2f  zComment)</td></
2230: 74 72 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20  tr>.    }.    @ 
2240: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 69  </td></tr>.    i
2250: 66 28 20 67 2e 6f 6b 41 64 6d 69 6e 20 29 7b 0a  f( g.okAdmin ){.
2260: 20 20 20 20 20 20 64 62 5f 70 72 65 70 61 72 65        db_prepare
2270: 28 26 71 2c 20 0a 20 20 20 20 20 20 20 20 20 22  (&q, .         "
2280: 53 45 4c 45 43 54 20 72 63 76 66 72 6f 6d 2e 69  SELECT rcvfrom.i
2290: 70 61 64 64 72 2c 20 75 73 65 72 2e 6c 6f 67 69  paddr, user.logi
22a0: 6e 2c 20 64 61 74 65 74 69 6d 65 28 72 63 76 66  n, datetime(rcvf
22b0: 72 6f 6d 2e 6d 74 69 6d 65 29 22 0a 20 20 20 20  rom.mtime)".    
22c0: 20 20 20 20 20 22 20 20 46 52 4f 4d 20 62 6c 6f       "  FROM blo
22d0: 62 20 4a 4f 49 4e 20 72 63 76 66 72 6f 6d 20 55  b JOIN rcvfrom U
22e0: 53 49 4e 47 28 72 63 76 69 64 29 20 4c 45 46 54  SING(rcvid) LEFT
22f0: 20 4a 4f 49 4e 20 75 73 65 72 20 55 53 49 4e 47   JOIN user USING
2300: 28 75 69 64 29 22 0a 20 20 20 20 20 20 20 20 20  (uid)".         
2310: 22 20 57 48 45 52 45 20 62 6c 6f 62 2e 72 69 64  " WHERE blob.rid
2320: 3d 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 72  =%d",.         r
2330: 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  id.      );.    
2340: 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 71    if( db_step(&q
2350: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
2360: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
2370: 68 61 72 20 2a 7a 49 70 41 64 64 72 20 3d 20 64  har *zIpAddr = d
2380: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
2390: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  , 0);.        co
23a0: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 20  nst char *zUser 
23b0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
23c0: 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  (&q, 1);.       
23d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
23e0: 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  te = db_column_t
23f0: 65 78 74 28 26 71 2c 20 32 29 3b 0a 20 20 20 20  ext(&q, 2);.    
2400: 20 20 20 20 69 66 28 20 7a 55 73 65 72 3d 3d 30      if( zUser==0
2410: 20 7c 7c 20 7a 55 73 65 72 5b 30 5d 3d 3d 30 20   || zUser[0]==0 
2420: 29 20 7a 55 73 65 72 20 3d 20 22 75 6e 6b 6e 6f  ) zUser = "unkno
2430: 77 6e 22 3b 0a 20 20 20 20 20 20 20 20 40 20 3c  wn";.        @ <
2440: 74 72 3e 3c 74 68 3e 52 65 63 65 69 76 65 64 26  tr><th>Received&
2450: 6e 62 73 70 3b 46 72 6f 6d 3a 3c 2f 74 68 3e 0a  nbsp;From:</th>.
2460: 20 20 20 20 20 20 20 20 40 20 3c 74 64 3e 25 68          @ <td>%h
2470: 28 7a 55 73 65 72 29 20 40 20 25 68 28 7a 49 70  (zUser) @ %h(zIp
2480: 41 64 64 72 29 20 6f 6e 20 25 73 28 7a 44 61 74  Addr) on %s(zDat
2490: 65 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20  e)</td></tr>.   
24a0: 20 20 20 7d 0a 20 20 20 20 20 20 64 62 5f 66 69     }.      db_fi
24b0: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 20 20  nalize(&q);.    
24c0: 7d 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 48 69  }.    if( g.okHi
24d0: 73 74 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 63  story ){.      c
24e0: 68 61 72 20 2a 7a 53 68 6f 72 74 55 75 69 64 20  har *zShortUuid 
24f0: 3d 20 6d 70 72 69 6e 74 66 28 22 25 2e 31 30 73  = mprintf("%.10s
2500: 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 20  ", zUuid);.     
2510: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
2520: 6f 6a 4e 61 6d 65 20 3d 20 64 62 5f 67 65 74 28  ojName = db_get(
2530: 22 70 72 6f 6a 65 63 74 2d 6e 61 6d 65 22 2c 20  "project-name", 
2540: 22 75 6e 6e 61 6d 65 64 22 29 3b 0a 20 20 20 20  "unnamed");.    
2550: 20 20 40 20 3c 74 72 3e 3c 74 68 3e 54 69 6d 65    @ <tr><th>Time
2560: 6c 69 6e 65 73 3a 3c 2f 74 68 3e 3c 74 64 3e 0a  lines:</th><td>.
2570: 20 20 20 20 20 20 40 20 20 20 20 3c 61 20 68 72        @    <a hr
2580: 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52  ef="%s(g.zBaseUR
2590: 4c 29 2f 74 69 6d 65 6c 69 6e 65 3f 70 3d 25 64  L)/timeline?p=%d
25a0: 28 72 69 64 29 22 3e 61 6e 63 65 73 74 6f 72 73  (rid)">ancestors
25b0: 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 20 20 20  </a>.      @    
25c0: 7c 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e  | <a href="%s(g.
25d0: 7a 42 61 73 65 55 52 4c 29 2f 74 69 6d 65 6c 69  zBaseURL)/timeli
25e0: 6e 65 3f 64 3d 25 64 28 72 69 64 29 22 3e 64 65  ne?d=%d(rid)">de
25f0: 73 63 65 6e 64 61 6e 74 73 3c 2f 61 3e 0a 20 20  scendants</a>.  
2600: 20 20 20 20 40 20 20 20 20 7c 20 3c 61 20 68 72      @    | <a hr
2610: 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52  ef="%s(g.zBaseUR
2620: 4c 29 2f 74 69 6d 65 6c 69 6e 65 3f 64 3d 25 64  L)/timeline?d=%d
2630: 28 72 69 64 29 26 70 3d 25 64 28 72 69 64 29 22  (rid)&p=%d(rid)"
2640: 3e 62 6f 74 68 3c 2f 61 3e 0a 20 20 20 20 20 20  >both</a>.      
2650: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22  db_prepare(&q, "
2660: 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 61  SELECT substr(ta
2670: 67 2e 74 61 67 6e 61 6d 65 2c 35 29 20 46 52 4f  g.tagname,5) FRO
2680: 4d 20 74 61 67 78 72 65 66 2c 20 74 61 67 20 22  M tagxref, tag "
2690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26a0: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 72 69        " WHERE ri
26b0: 64 3d 25 64 20 41 4e 44 20 74 61 67 74 79 70 65  d=%d AND tagtype
26c0: 3e 30 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  >0 ".           
26d0: 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e            "   AN
26e0: 44 20 74 61 67 2e 74 61 67 69 64 3d 74 61 67 78  D tag.tagid=tagx
26f0: 72 65 66 2e 74 61 67 69 64 20 22 0a 20 20 20 20  ref.tagid ".    
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 22 20 20 20 41 4e 44 20 2b 74 61 67 2e 74 61   "   AND +tag.ta
2720: 67 6e 61 6d 65 20 47 4c 4f 42 20 27 73 79 6d 2d  gname GLOB 'sym-
2730: 2a 27 22 2c 20 72 69 64 29 3b 0a 20 20 20 20 20  *'", rid);.     
2740: 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28   while( db_step(
2750: 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &q)==SQLITE_ROW 
2760: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
2770: 20 63 68 61 72 20 2a 7a 54 61 67 4e 61 6d 65 20   char *zTagName 
2780: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
2790: 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  (&q, 0);.       
27a0: 20 40 20 20 7c 20 3c 61 20 68 72 65 66 3d 22 25   @  | <a href="%
27b0: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 74 69  s(g.zBaseURL)/ti
27c0: 6d 65 6c 69 6e 65 3f 74 3d 25 54 28 7a 54 61 67  meline?t=%T(zTag
27d0: 4e 61 6d 65 29 22 3e 25 68 28 7a 54 61 67 4e 61  Name)">%h(zTagNa
27e0: 6d 65 29 3c 2f 61 3e 0a 20 20 20 20 20 20 7d 0a  me)</a>.      }.
27f0: 20 20 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a        db_finaliz
2800: 65 28 26 71 29 3b 0a 20 20 20 20 20 20 40 20 3c  e(&q);.      @ <
2810: 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 20 20  /td></tr>.      
2820: 40 20 3c 74 72 3e 3c 74 68 3e 4f 74 68 65 72 26  @ <tr><th>Other&
2830: 6e 62 73 70 3b 4c 69 6e 6b 73 3a 3c 2f 74 68 3e  nbsp;Links:</th>
2840: 0a 20 20 20 20 20 20 40 20 20 20 3c 74 64 3e 0a  .      @   <td>.
2850: 20 20 20 20 20 20 40 20 20 20 20 20 3c 61 20 68        @     <a h
2860: 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55  ref="%s(g.zBaseU
2870: 52 4c 29 2f 64 69 72 3f 63 69 3d 25 73 28 7a 53  RL)/dir?ci=%s(zS
2880: 68 6f 72 74 55 75 69 64 29 22 3e 66 69 6c 65 73  hortUuid)">files
2890: 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 20 20 20  </a>.      @    
28a0: 20 7c 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67   | <a href="%s(g
28b0: 2e 7a 42 61 73 65 55 52 4c 29 2f 7a 69 70 2f 25  .zBaseURL)/zip/%
28c0: 73 28 7a 50 72 6f 6a 4e 61 6d 65 29 2d 25 73 28  s(zProjName)-%s(
28d0: 7a 53 68 6f 72 74 55 75 69 64 29 2e 7a 69 70 3f  zShortUuid).zip?
28e0: 75 75 69 64 3d 25 73 28 7a 55 75 69 64 29 22 3e  uuid=%s(zUuid)">
28f0: 0a 20 20 20 20 20 20 40 20 20 20 20 20 20 20 20  .      @        
2900: 20 5a 49 50 20 61 72 63 68 69 76 65 3c 2f 61 3e   ZIP archive</a>
2910: 0a 20 20 20 20 20 20 40 20 20 20 20 20 7c 20 3c  .      @     | <
2920: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
2930: 73 65 55 52 4c 29 2f 61 72 74 69 66 61 63 74 2f  seURL)/artifact/
2940: 25 64 28 72 69 64 29 22 3e 6d 61 6e 69 66 65 73  %d(rid)">manifes
2950: 74 3c 2f 61 3e 0a 20 20 20 20 20 20 69 66 28 20  t</a>.      if( 
2960: 67 2e 6f 6b 57 72 69 74 65 20 29 7b 0a 20 20 20  g.okWrite ){.   
2970: 20 20 20 20 20 40 20 20 20 20 20 7c 20 3c 61 20       @     | <a 
2980: 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65  href="%s(g.zBase
2990: 55 52 4c 29 2f 63 69 5f 65 64 69 74 3f 72 3d 25  URL)/ci_edit?r=%
29a0: 64 28 72 69 64 29 22 3e 65 64 69 74 3c 2f 61 3e  d(rid)">edit</a>
29b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 40  .      }.      @
29c0: 20 20 20 3c 2f 74 64 3e 0a 20 20 20 20 20 20 40     </td>.      @
29d0: 20 3c 2f 74 72 3e 0a 20 20 20 20 20 20 66 72 65   </tr>.      fre
29e0: 65 28 7a 53 68 6f 72 74 55 75 69 64 29 3b 0a 20  e(zShortUuid);. 
29f0: 20 20 20 7d 0a 20 20 20 20 40 20 3c 2f 74 61 62     }.    @ </tab
2a00: 6c 65 3e 3c 2f 70 3e 0a 20 20 7d 65 6c 73 65 7b  le></p>.  }else{
2a10: 0a 20 20 20 20 73 74 79 6c 65 5f 68 65 61 64 65  .    style_heade
2a20: 72 28 22 43 68 65 63 6b 2d 69 6e 20 49 6e 66 6f  r("Check-in Info
2a30: 72 6d 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20 6c  rmation");.    l
2a40: 6f 67 69 6e 5f 61 6e 6f 6e 79 6d 6f 75 73 5f 61  ogin_anonymous_a
2a50: 76 61 69 6c 61 62 6c 65 28 29 3b 0a 20 20 7d 0a  vailable();.  }.
2a60: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71    db_finalize(&q
2a70: 29 3b 0a 20 20 73 68 6f 77 54 61 67 73 28 72 69  );.  showTags(ri
2a80: 64 2c 20 22 22 29 3b 0a 20 20 40 20 3c 64 69 76  d, "");.  @ <div
2a90: 20 63 6c 61 73 73 3d 22 73 65 63 74 69 6f 6e 22   class="section"
2aa0: 3e 43 68 61 6e 67 65 73 3c 2f 64 69 76 3e 0a 20  >Changes</div>. 
2ab0: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a   db_prepare(&q,.
2ac0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 70 69 64       "SELECT pid
2ad0: 2c 20 66 69 64 2c 20 6e 61 6d 65 2c 20 73 75 62  , fid, name, sub
2ae0: 73 74 72 28 61 2e 75 75 69 64 2c 31 2c 31 30 29  str(a.uuid,1,10)
2af0: 2c 20 73 75 62 73 74 72 28 62 2e 75 75 69 64 2c  , substr(b.uuid,
2b00: 31 2c 31 30 29 22 0a 20 20 20 20 20 22 20 20 46  1,10)".     "  F
2b10: 52 4f 4d 20 6d 6c 69 6e 6b 20 4a 4f 49 4e 20 66  ROM mlink JOIN f
2b20: 69 6c 65 6e 61 6d 65 20 4f 4e 20 66 69 6c 65 6e  ilename ON filen
2b30: 61 6d 65 2e 66 6e 69 64 3d 6d 6c 69 6e 6b 2e 66  ame.fnid=mlink.f
2b40: 6e 69 64 22 0a 20 20 20 20 20 22 20 20 20 20 20  nid".     "     
2b50: 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 62 6c      LEFT JOIN bl
2b60: 6f 62 20 61 20 4f 4e 20 61 2e 72 69 64 3d 70 69  ob a ON a.rid=pi
2b70: 64 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 20  d".     "       
2b80: 20 20 4c 45 46 54 20 4a 4f 49 4e 20 62 6c 6f 62    LEFT JOIN blob
2b90: 20 62 20 4f 4e 20 62 2e 72 69 64 3d 66 69 64 22   b ON b.rid=fid"
2ba0: 0a 20 20 20 20 20 22 20 57 48 45 52 45 20 6d 6c  .     " WHERE ml
2bb0: 69 6e 6b 2e 6d 69 64 3d 25 64 22 0a 20 20 20 20  ink.mid=%d".    
2bc0: 20 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65   " ORDER BY name
2bd0: 22 2c 0a 20 20 20 20 20 72 69 64 0a 20 20 29 3b  ",.     rid.  );
2be0: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
2bf0: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
2c00: 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 69 64  W ){.    int pid
2c10: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
2c20: 28 26 71 2c 30 29 3b 0a 20 20 20 20 69 6e 74 20  (&q,0);.    int 
2c30: 66 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  fid = db_column_
2c40: 69 6e 74 28 26 71 2c 31 29 3b 0a 20 20 20 20 63  int(&q,1);.    c
2c50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2c60: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
2c70: 74 28 26 71 2c 32 29 3b 0a 20 20 20 20 63 6f 6e  t(&q,2);.    con
2c80: 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20  st char *zOld = 
2c90: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
2ca0: 71 2c 33 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  q,3);.    const 
2cb0: 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 64 62 5f  char *zNew = db_
2cc0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 34  column_text(&q,4
2cd0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4f 6c 64 20  );.    if( zOld 
2ce0: 26 26 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20  && zNew ){.     
2cf0: 20 40 20 3c 70 3e 4d 6f 64 69 66 69 65 64 20 3c   @ <p>Modified <
2d00: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
2d10: 73 65 55 52 4c 29 2f 66 69 6e 66 6f 3f 6e 61 6d  seURL)/finfo?nam
2d20: 65 3d 25 54 28 7a 4e 61 6d 65 29 22 3e 25 68 28  e=%T(zName)">%h(
2d30: 7a 4e 61 6d 65 29 3c 2f 61 3e 0a 20 20 20 20 20  zName)</a>.     
2d40: 20 40 20 66 72 6f 6d 20 3c 61 20 68 72 65 66 3d   @ from <a href=
2d50: 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f  "%s(g.zBaseURL)/
2d60: 61 72 74 69 66 61 63 74 2f 25 73 28 7a 4f 6c 64  artifact/%s(zOld
2d70: 29 22 3e 5b 25 73 28 7a 4f 6c 64 29 5d 3c 2f 61  )">[%s(zOld)]</a
2d80: 3e 0a 20 20 20 20 20 20 40 20 74 6f 20 3c 61 20  >.      @ to <a 
2d90: 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65  href="%s(g.zBase
2da0: 55 52 4c 29 2f 61 72 74 69 66 61 63 74 2f 25 73  URL)/artifact/%s
2db0: 28 7a 4e 65 77 29 22 3e 5b 25 73 28 7a 4e 65 77  (zNew)">[%s(zNew
2dc0: 29 5d 3c 2f 61 3e 3c 2f 70 3e 0a 20 20 20 20 7d  )]</a></p>.    }
2dd0: 65 6c 73 65 20 69 66 28 20 7a 4f 6c 64 20 29 7b  else if( zOld ){
2de0: 0a 20 20 20 20 20 20 40 20 3c 70 3e 44 65 6c 65  .      @ <p>Dele
2df0: 74 65 64 20 3c 61 20 68 72 65 66 3d 22 25 73 28  ted <a href="%s(
2e00: 67 2e 7a 42 61 73 65 55 52 4c 29 2f 66 69 6e 66  g.zBaseURL)/finf
2e10: 6f 3f 6e 61 6d 65 3d 25 54 28 7a 4e 61 6d 65 29  o?name=%T(zName)
2e20: 22 3e 25 68 28 7a 4e 61 6d 65 29 3c 2f 61 3e 0a  ">%h(zName)</a>.
2e30: 20 20 20 20 20 20 40 20 76 65 72 73 69 6f 6e 20        @ version 
2e40: 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42  <a href="%s(g.zB
2e50: 61 73 65 55 52 4c 29 2f 61 72 74 69 66 61 63 74  aseURL)/artifact
2e60: 2f 25 73 28 7a 4f 6c 64 29 22 3e 5b 25 73 28 7a  /%s(zOld)">[%s(z
2e70: 4f 6c 64 29 5d 3c 2f 61 3e 3c 2f 70 3e 0a 20 20  Old)]</a></p>.  
2e80: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2e90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40    }else{.      @
2ea0: 20 3c 70 3e 41 64 64 65 64 20 3c 61 20 68 72 65   <p>Added <a hre
2eb0: 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c  f="%s(g.zBaseURL
2ec0: 29 2f 66 69 6e 66 6f 3f 6e 61 6d 65 3d 25 54 28  )/finfo?name=%T(
2ed0: 7a 4e 61 6d 65 29 22 3e 25 68 28 7a 4e 61 6d 65  zName)">%h(zName
2ee0: 29 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 76 65  )</a>.      @ ve
2ef0: 72 73 69 6f 6e 20 3c 61 20 68 72 65 66 3d 22 25  rsion <a href="%
2f00: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 61 72  s(g.zBaseURL)/ar
2f10: 74 69 66 61 63 74 2f 25 73 28 7a 4e 65 77 29 22  tifact/%s(zNew)"
2f20: 3e 5b 25 73 28 7a 4e 65 77 29 5d 3c 2f 61 3e 3c  >[%s(zNew)]</a><
2f30: 2f 70 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20  /p>.    }.    @ 
2f40: 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65  <blockquote><pre
2f50: 3e 0a 20 20 20 20 61 70 70 65 6e 64 5f 64 69 66  >.    append_dif
2f60: 66 28 70 69 64 2c 20 66 69 64 29 3b 0a 20 20 20  f(pid, fid);.   
2f70: 20 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b   @ </pre></block
2f80: 71 75 6f 74 65 3e 0a 20 20 7d 0a 20 20 64 62 5f  quote>.  }.  db_
2f90: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
2fa0: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
2fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45  }../*.** WEBPAGE
2fc0: 3a 20 77 69 6e 66 6f 0a 2a 2a 20 55 52 4c 3a 20  : winfo.** URL: 
2fd0: 20 2f 77 69 6e 66 6f 3f 6e 61 6d 65 3d 52 49 44   /winfo?name=RID
2fe0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 69 6e  .**.** Return in
2ff0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
3000: 61 20 77 69 6b 69 20 70 61 67 65 2e 0a 2a 2f 0a  a wiki page..*/.
3010: 76 6f 69 64 20 77 69 6e 66 6f 5f 70 61 67 65 28  void winfo_page(
3020: 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 71 3b  void){.  Stmt q;
3030: 0a 20 20 69 6e 74 20 72 69 64 3b 0a 0a 20 20 6c  .  int rid;..  l
3040: 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65  ogin_check_crede
3050: 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20  ntials();.  if( 
3060: 21 67 2e 6f 6b 52 64 57 69 6b 69 20 29 7b 20 6c  !g.okRdWiki ){ l
3070: 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72  ogin_needed(); r
3080: 65 74 75 72 6e 3b 20 7d 0a 20 20 72 69 64 20 3d  eturn; }.  rid =
3090: 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 50 44 28   name_to_rid(PD(
30a0: 22 6e 61 6d 65 22 2c 22 30 22 29 29 3b 0a 20 20  "name","0"));.  
30b0: 69 66 28 20 72 69 64 3d 3d 30 20 29 7b 0a 20 20  if( rid==0 ){.  
30c0: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22    style_header("
30d0: 57 69 6b 69 20 50 61 67 65 20 49 6e 66 6f 72 6d  Wiki Page Inform
30e0: 61 74 69 6f 6e 20 45 72 72 6f 72 22 29 3b 0a 20  ation Error");. 
30f0: 20 20 20 40 20 4e 6f 20 73 75 63 68 20 6f 62 6a     @ No such obj
3100: 65 63 74 3a 20 25 68 28 67 2e 61 72 67 76 5b 32  ect: %h(g.argv[2
3110: 5d 29 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f  ]).    style_foo
3120: 74 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72  ter();.    retur
3130: 6e 3b 0a 20 20 7d 0a 20 20 64 62 5f 70 72 65 70  n;.  }.  db_prep
3140: 61 72 65 28 26 71 2c 20 0a 20 20 20 20 20 22 53  are(&q, .     "S
3150: 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 61 67  ELECT substr(tag
3160: 6e 61 6d 65 2c 20 36 2c 20 31 30 30 30 29 2c 20  name, 6, 1000), 
3170: 75 75 69 64 2c 22 0a 20 20 20 20 20 22 20 20 20  uuid,".     "   
3180: 20 20 20 20 64 61 74 65 74 69 6d 65 28 65 76 65      datetime(eve
3190: 6e 74 2e 6d 74 69 6d 65 2c 20 27 6c 6f 63 61 6c  nt.mtime, 'local
31a0: 74 69 6d 65 27 29 2c 20 75 73 65 72 22 0a 20 20  time'), user".  
31b0: 20 20 20 22 20 20 46 52 4f 4d 20 74 61 67 78 72     "  FROM tagxr
31c0: 65 66 2c 20 74 61 67 2c 20 62 6c 6f 62 2c 20 65  ef, tag, blob, e
31d0: 76 65 6e 74 22 0a 20 20 20 20 20 22 20 57 48 45  vent".     " WHE
31e0: 52 45 20 74 61 67 78 72 65 66 2e 72 69 64 3d 25  RE tagxref.rid=%
31f0: 64 22 0a 20 20 20 20 20 22 20 20 20 41 4e 44 20  d".     "   AND 
3200: 74 61 67 2e 74 61 67 69 64 3d 74 61 67 78 72 65  tag.tagid=tagxre
3210: 66 2e 74 61 67 69 64 22 0a 20 20 20 20 20 22 20  f.tagid".     " 
3220: 20 20 41 4e 44 20 74 61 67 2e 74 61 67 6e 61 6d    AND tag.tagnam
3230: 65 20 4c 49 4b 45 20 27 77 69 6b 69 2d 25 25 27  e LIKE 'wiki-%%'
3240: 22 0a 20 20 20 20 20 22 20 20 20 41 4e 44 20 62  ".     "   AND b
3250: 6c 6f 62 2e 72 69 64 3d 25 64 22 0a 20 20 20 20  lob.rid=%d".    
3260: 20 22 20 20 20 41 4e 44 20 65 76 65 6e 74 2e 6f   "   AND event.o
3270: 62 6a 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 72  bjid=%d",.     r
3280: 69 64 2c 20 72 69 64 2c 20 72 69 64 0a 20 20 29  id, rid, rid.  )
3290: 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70 28  ;.  if( db_step(
32a0: 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &q)==SQLITE_ROW 
32b0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
32c0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f  r *zName = db_co
32d0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29  lumn_text(&q, 0)
32e0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
32f0: 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c   *zUuid = db_col
3300: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b  umn_text(&q, 1);
3310: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 69 74 6c  .    char *zTitl
3320: 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 57 69 6b  e = mprintf("Wik
3330: 69 20 50 61 67 65 20 25 73 22 2c 20 7a 4e 61 6d  i Page %s", zNam
3340: 65 29 3b 0a 20 20 20 20 73 74 79 6c 65 5f 68 65  e);.    style_he
3350: 61 64 65 72 28 7a 54 69 74 6c 65 29 3b 0a 20 20  ader(zTitle);.  
3360: 20 20 66 72 65 65 28 7a 54 69 74 6c 65 29 3b 0a    free(zTitle);.
3370: 20 20 20 20 6c 6f 67 69 6e 5f 61 6e 6f 6e 79 6d      login_anonym
3380: 6f 75 73 5f 61 76 61 69 6c 61 62 6c 65 28 29 3b  ous_available();
3390: 0a 20 20 20 20 40 20 3c 64 69 76 20 63 6c 61 73  .    @ <div clas
33a0: 73 3d 22 73 65 63 74 69 6f 6e 22 3e 4f 76 65 72  s="section">Over
33b0: 76 69 65 77 3c 2f 64 69 76 3e 0a 20 20 20 20 40  view</div>.    @
33c0: 20 3c 70 3e 3c 74 61 62 6c 65 20 63 6c 61 73 73   <p><table class
33d0: 3d 22 6c 61 62 65 6c 2d 76 61 6c 75 65 22 3e 0a  ="label-value">.
33e0: 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 56 65      @ <tr><th>Ve
33f0: 72 73 69 6f 6e 3a 3c 2f 74 68 3e 3c 74 64 3e 25  rsion:</th><td>%
3400: 73 28 7a 55 75 69 64 29 3c 2f 74 64 3e 3c 2f 74  s(zUuid)</td></t
3410: 72 3e 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 68  r>.    @ <tr><th
3420: 3e 44 61 74 65 3a 3c 2f 74 68 3e 3c 74 64 3e 25  >Date:</th><td>%
3430: 73 28 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  s(db_column_text
3440: 28 26 71 2c 20 32 29 29 3c 2f 74 64 3e 3c 2f 74  (&q, 2))</td></t
3450: 72 3e 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 53  r>.    if( g.okS
3460: 65 74 75 70 20 29 7b 0a 20 20 20 20 20 20 40 20  etup ){.      @ 
3470: 3c 74 72 3e 3c 74 68 3e 52 65 63 6f 72 64 20 49  <tr><th>Record I
3480: 44 3a 3c 2f 74 68 3e 3c 74 64 3e 25 64 28 72 69  D:</th><td>%d(ri
3490: 64 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20  d)</td></tr>.   
34a0: 20 7d 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 68   }.    @ <tr><th
34b0: 3e 4f 72 69 67 69 6e 61 6c 26 6e 62 73 70 3b 55  >Original&nbsp;U
34c0: 73 65 72 3a 3c 2f 74 68 3e 3c 74 64 3e 25 73 28  ser:</th><td>%s(
34d0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
34e0: 71 2c 20 33 29 29 3c 2f 74 64 3e 3c 2f 74 72 3e  q, 3))</td></tr>
34f0: 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 48 69 73  .    if( g.okHis
3500: 74 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 40 20  tory ){.      @ 
3510: 3c 74 72 3e 3c 74 68 3e 43 6f 6d 6d 61 6e 64 73  <tr><th>Commands
3520: 3a 3c 2f 74 68 3e 0a 20 20 20 20 20 20 40 20 20  :</th>.      @  
3530: 20 3c 74 64 3e 0a 20 20 20 20 20 20 2f 2a 20 40   <td>.      /* @
3540: 20 20 20 20 20 3c 61 20 68 72 65 66 3d 22 25 73       <a href="%s
3550: 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 77 64 69  (g.zBaseURL)/wdi
3560: 66 66 2f 25 64 28 72 69 64 29 22 3e 64 69 66 66  ff/%d(rid)">diff
3570: 3c 2f 61 3e 20 7c 20 2a 2f 0a 20 20 20 20 20 20  </a> | */.      
3580: 40 20 20 20 20 20 3c 61 20 68 72 65 66 3d 22 25  @     <a href="%
3590: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 77 68  s(g.zBaseURL)/wh
35a0: 69 73 74 6f 72 79 3f 6e 61 6d 65 3d 25 74 28 7a  istory?name=%t(z
35b0: 4e 61 6d 65 29 22 3e 68 69 73 74 6f 72 79 3c 2f  Name)">history</
35c0: 61 3e 0a 20 20 20 20 20 20 40 20 20 20 20 20 7c  a>.      @     |
35d0: 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a   <a href="%s(g.z
35e0: 42 61 73 65 55 52 4c 29 2f 61 72 74 69 66 61 63  BaseURL)/artifac
35f0: 74 2f 25 64 28 72 69 64 29 22 3e 72 61 77 2d 74  t/%d(rid)">raw-t
3600: 65 78 74 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20  ext</a>.      @ 
3610: 20 20 3c 2f 74 64 3e 0a 20 20 20 20 20 20 40 20    </td>.      @ 
3620: 3c 2f 74 72 3e 0a 20 20 20 20 7d 0a 20 20 20 20  </tr>.    }.    
3630: 40 20 3c 2f 74 61 62 6c 65 3e 3c 2f 70 3e 0a 20  @ </table></p>. 
3640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 79 6c   }else{.    styl
3650: 65 5f 68 65 61 64 65 72 28 22 57 69 6b 69 20 49  e_header("Wiki I
3660: 6e 66 6f 72 6d 61 74 69 6f 6e 22 29 3b 0a 20 20  nformation");.  
3670: 20 20 72 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20    rid = 0;.  }. 
3680: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29   db_finalize(&q)
3690: 3b 0a 20 20 73 68 6f 77 54 61 67 73 28 72 69 64  ;.  showTags(rid
36a0: 2c 20 22 77 69 6b 69 2d 2a 22 29 3b 0a 20 20 69  , "wiki-*");.  i
36b0: 66 28 20 72 69 64 20 29 7b 0a 20 20 20 20 42 6c  f( rid ){.    Bl
36c0: 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 20 20  ob content;.    
36d0: 4d 61 6e 69 66 65 73 74 20 6d 3b 0a 20 20 20 20  Manifest m;.    
36e0: 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69  memset(&m, 0, si
36f0: 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 20 20 62 6c  zeof(m));.    bl
3700: 6f 62 5f 7a 65 72 6f 28 26 6d 2e 63 6f 6e 74 65  ob_zero(&m.conte
3710: 6e 74 29 3b 0a 20 20 20 20 63 6f 6e 74 65 6e 74  nt);.    content
3720: 5f 67 65 74 28 72 69 64 2c 20 26 63 6f 6e 74 65  _get(rid, &conte
3730: 6e 74 29 3b 0a 20 20 20 20 6d 61 6e 69 66 65 73  nt);.    manifes
3740: 74 5f 70 61 72 73 65 28 26 6d 2c 20 26 63 6f 6e  t_parse(&m, &con
3750: 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 6d  tent);.    if( m
3760: 2e 74 79 70 65 3d 3d 43 46 54 59 50 45 5f 57 49  .type==CFTYPE_WI
3770: 4b 49 20 29 7b 0a 20 20 20 20 20 20 42 6c 6f 62  KI ){.      Blob
3780: 20 77 69 6b 69 3b 0a 20 20 20 20 20 20 62 6c 6f   wiki;.      blo
3790: 62 5f 69 6e 69 74 28 26 77 69 6b 69 2c 20 6d 2e  b_init(&wiki, m.
37a0: 7a 57 69 6b 69 2c 20 2d 31 29 3b 0a 20 20 20 20  zWiki, -1);.    
37b0: 20 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22    @ <div class="
37c0: 73 65 63 74 69 6f 6e 22 3e 43 6f 6e 74 65 6e 74  section">Content
37d0: 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20 77 69 6b  </div>.      wik
37e0: 69 5f 63 6f 6e 76 65 72 74 28 26 77 69 6b 69 2c  i_convert(&wiki,
37f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 6c   0, 0);.      bl
3800: 6f 62 5f 72 65 73 65 74 28 26 77 69 6b 69 29 3b  ob_reset(&wiki);
3810: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 61 6e 69 66  .    }.    manif
3820: 65 73 74 5f 63 6c 65 61 72 28 26 6d 29 3b 0a 20  est_clear(&m);. 
3830: 20 7d 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65   }.  style_foote
3840: 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45  r();.}../*.** WE
3850: 42 50 41 47 45 3a 20 66 69 6e 66 6f 0a 2a 2a 20  BPAGE: finfo.** 
3860: 55 52 4c 3a 20 2f 66 69 6e 66 6f 3f 6e 61 6d 65  URL: /finfo?name
3870: 3d 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  =FILENAME.**.** 
3880: 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65 74  Show the complet
3890: 65 20 63 68 61 6e 67 65 20 68 69 73 74 6f 72 79  e change history
38a0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 66 69   for a single fi
38b0: 6c 65 2e 20 0a 2a 2f 0a 76 6f 69 64 20 66 69 6e  le. .*/.void fin
38c0: 66 6f 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20  fo_page(void){. 
38d0: 20 53 74 6d 74 20 71 3b 0a 20 20 63 6f 6e 73 74   Stmt q;.  const
38e0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
38f0: 3b 0a 20 20 63 68 61 72 20 7a 50 72 65 76 44 61  ;.  char zPrevDa
3900: 74 65 5b 32 30 5d 3b 0a 20 20 42 6c 6f 62 20 74  te[20];.  Blob t
3910: 69 74 6c 65 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63  itle;..  login_c
3920: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
3930: 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52  ();.  if( !g.okR
3940: 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65  ead ){ login_nee
3950: 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d  ded(); return; }
3960: 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28  .  style_header(
3970: 22 46 69 6c 65 20 48 69 73 74 6f 72 79 22 29 3b  "File History");
3980: 0a 20 20 6c 6f 67 69 6e 5f 61 6e 6f 6e 79 6d 6f  .  login_anonymo
3990: 75 73 5f 61 76 61 69 6c 61 62 6c 65 28 29 3b 0a  us_available();.
39a0: 0a 20 20 7a 50 72 65 76 44 61 74 65 5b 30 5d 20  .  zPrevDate[0] 
39b0: 3d 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  = 0;.  zFilename
39c0: 20 3d 20 50 44 28 22 6e 61 6d 65 22 2c 22 22 29   = PD("name","")
39d0: 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26  ;.  db_prepare(&
39e0: 71 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20 73  q,.    "SELECT s
39f0: 75 62 73 74 72 28 62 2e 75 75 69 64 2c 31 2c 31  ubstr(b.uuid,1,1
3a00: 30 29 2c 20 64 61 74 65 74 69 6d 65 28 65 76 65  0), datetime(eve
3a10: 6e 74 2e 6d 74 69 6d 65 2c 27 6c 6f 63 61 6c 74  nt.mtime,'localt
3a20: 69 6d 65 27 29 2c 22 0a 20 20 20 20 22 20 20 20  ime'),".    "   
3a30: 20 20 20 20 63 6f 61 6c 65 73 63 65 28 65 76 65      coalesce(eve
3a40: 6e 74 2e 65 63 6f 6d 6d 65 6e 74 2c 20 65 76 65  nt.ecomment, eve
3a50: 6e 74 2e 63 6f 6d 6d 65 6e 74 29 2c 22 0a 20 20  nt.comment),".  
3a60: 20 20 22 20 20 20 20 20 20 20 63 6f 61 6c 65 73    "       coales
3a70: 63 65 28 65 76 65 6e 74 2e 65 75 73 65 72 2c 20  ce(event.euser, 
3a80: 65 76 65 6e 74 2e 75 73 65 72 29 2c 22 0a 20 20  event.user),".  
3a90: 20 20 22 20 20 20 20 20 20 20 6d 6c 69 6e 6b 2e    "       mlink.
3aa0: 70 69 64 2c 20 6d 6c 69 6e 6b 2e 66 69 64 2c 20  pid, mlink.fid, 
3ab0: 6d 6c 69 6e 6b 2e 6d 69 64 2c 20 6d 6c 69 6e 6b  mlink.mid, mlink
3ac0: 2e 66 6e 69 64 22 0a 20 20 20 20 22 20 20 46 52  .fnid".    "  FR
3ad0: 4f 4d 20 6d 6c 69 6e 6b 2c 20 62 6c 6f 62 20 62  OM mlink, blob b
3ae0: 2c 20 65 76 65 6e 74 22 0a 20 20 20 20 22 20 57  , event".    " W
3af0: 48 45 52 45 20 6d 6c 69 6e 6b 2e 66 6e 69 64 3d  HERE mlink.fnid=
3b00: 28 53 45 4c 45 43 54 20 66 6e 69 64 20 46 52 4f  (SELECT fnid FRO
3b10: 4d 20 66 69 6c 65 6e 61 6d 65 20 57 48 45 52 45  M filename WHERE
3b20: 20 6e 61 6d 65 3d 25 51 29 22 0a 20 20 20 20 22   name=%Q)".    "
3b30: 20 20 20 41 4e 44 20 62 2e 72 69 64 3d 6d 6c 69     AND b.rid=mli
3b40: 6e 6b 2e 66 69 64 22 0a 20 20 20 20 22 20 20 20  nk.fid".    "   
3b50: 41 4e 44 20 65 76 65 6e 74 2e 6f 62 6a 69 64 3d  AND event.objid=
3b60: 6d 6c 69 6e 6b 2e 6d 69 64 22 0a 20 20 20 20 22  mlink.mid".    "
3b70: 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 2e   ORDER BY event.
3b80: 6d 74 69 6d 65 20 44 45 53 43 22 2c 0a 20 20 20  mtime DESC",.   
3b90: 20 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 29 3b 0a   zFilename.  );.
3ba0: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 74 69 74    blob_zero(&tit
3bb0: 6c 65 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65  le);.  blob_appe
3bc0: 6e 64 66 28 26 74 69 74 6c 65 2c 20 22 48 69 73  ndf(&title, "His
3bd0: 74 6f 72 79 20 6f 66 20 22 29 3b 0a 20 20 68 79  tory of ");.  hy
3be0: 70 65 72 6c 69 6e 6b 65 64 5f 70 61 74 68 28 7a  perlinked_path(z
3bf0: 46 69 6c 65 6e 61 6d 65 2c 20 26 74 69 74 6c 65  Filename, &title
3c00: 29 3b 0a 20 20 40 20 3c 68 32 3e 25 62 28 26 74  );.  @ <h2>%b(&t
3c10: 69 74 6c 65 29 3c 2f 68 32 3e 0a 20 20 62 6c 6f  itle)</h2>.  blo
3c20: 62 5f 72 65 73 65 74 28 26 74 69 74 6c 65 29 3b  b_reset(&title);
3c30: 0a 20 20 40 20 3c 74 61 62 6c 65 20 63 65 6c 6c  .  @ <table cell
3c40: 73 70 61 63 69 6e 67 3d 30 20 62 6f 72 64 65 72  spacing=0 border
3c50: 3d 30 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d 30  =0 cellpadding=0
3c60: 3e 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74  >.  while( db_st
3c70: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
3c80: 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OW ){.    const 
3c90: 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62  char *zUuid = db
3ca0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
3cb0: 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   0);.    const c
3cc0: 68 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f  har *zDate = db_
3cd0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
3ce0: 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  1);.    const ch
3cf0: 61 72 20 2a 7a 43 6f 6d 20 3d 20 64 62 5f 63 6f  ar *zCom = db_co
3d00: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32 29  lumn_text(&q, 2)
3d10: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
3d20: 20 2a 7a 55 73 65 72 20 3d 20 64 62 5f 63 6f 6c   *zUser = db_col
3d30: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 33 29 3b  umn_text(&q, 3);
3d40: 0a 20 20 20 20 69 6e 74 20 66 70 69 64 20 3d 20  .    int fpid = 
3d50: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71  db_column_int(&q
3d60: 2c 20 34 29 3b 0a 20 20 20 20 69 6e 74 20 66 72  , 4);.    int fr
3d70: 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69  id = db_column_i
3d80: 6e 74 28 26 71 2c 20 35 29 3b 0a 20 20 20 20 69  nt(&q, 5);.    i
3d90: 6e 74 20 6d 69 64 20 3d 20 64 62 5f 63 6f 6c 75  nt mid = db_colu
3da0: 6d 6e 5f 69 6e 74 28 26 71 2c 20 36 29 3b 0a 20  mn_int(&q, 6);. 
3db0: 20 20 20 69 6e 74 20 66 6e 69 64 20 3d 20 64 62     int fnid = db
3dc0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20  _column_int(&q, 
3dd0: 37 29 3b 0a 20 20 20 20 63 68 61 72 20 7a 53 68  7);.    char zSh
3de0: 6f 72 74 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ort[20];.    if(
3df0: 20 6d 65 6d 63 6d 70 28 7a 44 61 74 65 2c 20 7a   memcmp(zDate, z
3e00: 50 72 65 76 44 61 74 65 2c 20 31 30 29 20 29 7b  PrevDate, 10) ){
3e10: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
3e20: 50 72 65 76 44 61 74 65 2c 20 22 25 2e 31 30 73  PrevDate, "%.10s
3e30: 22 2c 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 20  ", zDate);.     
3e40: 20 40 20 3c 74 72 3e 3c 74 64 20 63 6f 6c 73 70   @ <tr><td colsp
3e50: 61 6e 3d 33 3e 0a 20 20 20 20 20 20 40 20 20 20  an=3>.      @   
3e60: 3c 64 69 76 20 63 6c 61 73 73 3d 22 64 69 76 69  <div class="divi
3e70: 64 65 72 22 3e 25 73 28 7a 50 72 65 76 44 61 74  der">%s(zPrevDat
3e80: 65 29 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20 40  e)</div>.      @
3e90: 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20   </td></tr>.    
3ea0: 7d 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 20  }.    @ <tr><td 
3eb0: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 25 73 28  valign="top">%s(
3ec0: 26 7a 44 61 74 65 5b 31 31 5d 29 3c 2f 74 64 3e  &zDate[11])</td>
3ed0: 0a 20 20 20 20 40 20 3c 74 64 20 77 69 64 74 68  .    @ <td width
3ee0: 3d 22 32 30 22 3e 3c 2f 74 64 3e 0a 20 20 20 20  ="20"></td>.    
3ef0: 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f  @ <td valign="to
3f00: 70 22 20 61 6c 69 67 6e 3d 22 6c 65 66 74 22 3e  p" align="left">
3f10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
3f20: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 68  rintf(sizeof(zSh
3f30: 6f 72 74 29 2c 20 7a 53 68 6f 72 74 2c 20 22 25  ort), zShort, "%
3f40: 2e 31 30 73 22 2c 20 7a 55 75 69 64 29 3b 0a 20  .10s", zUuid);. 
3f50: 20 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f     if( g.okHisto
3f60: 72 79 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 61  ry ){.      @ <a
3f70: 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 54 6f 70   href="%s(g.zTop
3f80: 29 2f 61 72 74 69 66 61 63 74 2f 25 73 28 7a 55  )/artifact/%s(zU
3f90: 75 69 64 29 22 3e 5b 25 73 28 7a 53 68 6f 72 74  uid)">[%s(zShort
3fa0: 29 5d 3c 2f 61 3e 0a 20 20 20 20 7d 65 6c 73 65  )]</a>.    }else
3fb0: 7b 0a 20 20 20 20 20 20 40 20 5b 25 73 28 7a 53  {.      @ [%s(zS
3fc0: 68 6f 72 74 29 5d 0a 20 20 20 20 7d 0a 20 20 20  hort)].    }.   
3fd0: 20 40 20 25 68 28 7a 43 6f 6d 29 20 28 42 79 3a   @ %h(zCom) (By:
3fe0: 20 25 68 28 7a 55 73 65 72 29 29 0a 20 20 20 20   %h(zUser)).    
3ff0: 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20  if( g.okHistory 
4000: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 70 69  ){.      if( fpi
4010: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20 3c  d ){.        @ <
4020: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
4030: 73 65 55 52 4c 29 2f 66 64 69 66 66 3f 76 31 3d  seURL)/fdiff?v1=
4040: 25 64 28 66 70 69 64 29 26 61 6d 70 3b 76 32 3d  %d(fpid)&amp;v2=
4050: 25 64 28 66 72 69 64 29 22 3e 5b 64 69 66 66 5d  %d(frid)">[diff]
4060: 3c 2f 61 3e 0a 20 20 20 20 20 20 7d 0a 20 20 20  </a>.      }.   
4070: 20 20 20 40 20 3c 61 20 68 72 65 66 3d 22 25 73     @ <a href="%s
4080: 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 61 6e 6e  (g.zBaseURL)/ann
4090: 6f 74 61 74 65 3f 6d 69 64 3d 25 64 28 6d 69 64  otate?mid=%d(mid
40a0: 29 26 61 6d 70 3b 66 6e 69 64 3d 25 64 28 66 6e  )&amp;fnid=%d(fn
40b0: 69 64 29 22 3e 0a 20 20 20 20 20 20 40 20 5b 61  id)">.      @ [a
40c0: 6e 6e 6f 74 61 74 65 5d 3c 2f 61 3e 0a 20 20 20  nnotate]</a>.   
40d0: 20 20 20 40 20 3c 2f 74 64 3e 0a 20 20 20 20 7d     @ </td>.    }
40e0: 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69  .  }.  db_finali
40f0: 7a 65 28 26 71 29 3b 0a 20 20 40 20 3c 2f 74 61  ze(&q);.  @ </ta
4100: 62 6c 65 3e 0a 20 20 73 74 79 6c 65 5f 66 6f 6f  ble>.  style_foo
4110: 74 65 72 28 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ter();.}.../*.**
4120: 20 57 45 42 50 41 47 45 3a 20 76 64 69 66 66 0a   WEBPAGE: vdiff.
4130: 2a 2a 20 55 52 4c 3a 20 2f 76 64 69 66 66 3f 6e  ** URL: /vdiff?n
4140: 61 6d 65 3d 52 49 44 0a 2a 2a 0a 2a 2a 20 53 68  ame=RID.**.** Sh
4150: 6f 77 20 61 6c 6c 20 64 69 66 66 65 72 65 6e 63  ow all differenc
4160: 65 73 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  es for a particu
4170: 6c 61 72 20 63 68 65 63 6b 2d 69 6e 2e 0a 2a 2f  lar check-in..*/
4180: 0a 76 6f 69 64 20 76 64 69 66 66 5f 70 61 67 65  .void vdiff_page
4190: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72 69  (void){.  int ri
41a0: 64 3b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 63  d;.  Stmt q;.  c
41b0: 68 61 72 20 2a 7a 55 75 69 64 3b 0a 0a 20 20 6c  har *zUuid;..  l
41c0: 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65  ogin_check_crede
41d0: 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20  ntials();.  if( 
41e0: 21 67 2e 6f 6b 52 65 61 64 20 29 7b 20 6c 6f 67  !g.okRead ){ log
41f0: 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74  in_needed(); ret
4200: 75 72 6e 3b 20 7d 0a 20 20 6c 6f 67 69 6e 5f 61  urn; }.  login_a
4210: 6e 6f 6e 79 6d 6f 75 73 5f 61 76 61 69 6c 61 62  nonymous_availab
4220: 6c 65 28 29 3b 0a 0a 20 20 72 69 64 20 3d 20 6e  le();..  rid = n
4230: 61 6d 65 5f 74 6f 5f 72 69 64 28 50 44 28 22 6e  ame_to_rid(PD("n
4240: 61 6d 65 22 2c 22 22 29 29 3b 0a 20 20 69 66 28  ame",""));.  if(
4250: 20 72 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 66   rid==0 ){.    f
4260: 6f 73 73 69 6c 5f 72 65 64 69 72 65 63 74 5f 68  ossil_redirect_h
4270: 6f 6d 65 28 29 3b 0a 20 20 7d 0a 20 20 7a 55 75  ome();.  }.  zUu
4280: 69 64 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20  id = db_text(0, 
4290: 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f  "SELECT uuid FRO
42a0: 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64  M blob WHERE rid
42b0: 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 73 74  =%d", rid);.  st
42c0: 79 6c 65 5f 68 65 61 64 65 72 28 22 43 68 65 63  yle_header("Chec
42d0: 6b 2d 69 6e 20 5b 25 2e 31 30 73 5d 22 2c 20 7a  k-in [%.10s]", z
42e0: 55 75 69 64 29 3b 0a 20 20 64 62 5f 70 72 65 70  Uuid);.  db_prep
42f0: 61 72 65 28 26 71 2c 0a 20 20 20 20 22 53 45 4c  are(&q,.    "SEL
4300: 45 43 54 20 64 61 74 65 74 69 6d 65 28 6d 74 69  ECT datetime(mti
4310: 6d 65 29 2c 20 22 0a 20 20 20 20 22 20 20 20 20  me), ".    "    
4320: 20 20 20 63 6f 61 6c 65 73 63 65 28 65 76 65 6e     coalesce(even
4330: 74 2e 65 63 6f 6d 6d 65 6e 74 2c 65 76 65 6e 74  t.ecomment,event
4340: 2e 63 6f 6d 6d 65 6e 74 29 2c 22 0a 20 20 20 20  .comment),".    
4350: 22 20 20 20 20 20 20 20 63 6f 61 6c 65 73 63 65  "       coalesce
4360: 28 65 76 65 6e 74 2e 65 75 73 65 72 2c 65 76 65  (event.euser,eve
4370: 6e 74 2e 75 73 65 72 29 22 0a 20 20 20 20 22 20  nt.user)".    " 
4380: 20 46 52 4f 4d 20 65 76 65 6e 74 20 57 48 45 52   FROM event WHER
4390: 45 20 74 79 70 65 3d 27 63 69 27 20 41 4e 44 20  E type='ci' AND 
43a0: 6f 62 6a 69 64 3d 25 64 22 2c 0a 20 20 20 20 72  objid=%d",.    r
43b0: 69 64 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  id.  );.  while(
43c0: 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51   db_step(&q)==SQ
43d0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
43e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
43f0: 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  e = db_column_te
4400: 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 63  xt(&q, 0);.    c
4410: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72  onst char *zUser
4420: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
4430: 74 28 26 71 2c 20 32 29 3b 0a 20 20 20 20 63 6f  t(&q, 2);.    co
4440: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 65  nst char *zComme
4450: 6e 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  nt = db_column_t
4460: 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 20 20 20  ext(&q, 1);.    
4470: 40 20 3c 68 32 3e 43 68 65 63 6b 2d 69 6e 20 25  @ <h2>Check-in %
4480: 73 28 7a 55 75 69 64 29 3c 2f 68 32 3e 0a 20 20  s(zUuid)</h2>.  
4490: 20 20 40 20 3c 70 3e 4d 61 64 65 20 62 79 0a 20    @ <p>Made by. 
44a0: 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f     hyperlink_to_
44b0: 75 73 65 72 28 7a 55 73 65 72 2c 7a 44 61 74 65  user(zUser,zDate
44c0: 2c 22 20 6f 6e 22 29 3b 0a 20 20 20 20 68 79 70  ," on");.    hyp
44d0: 65 72 6c 69 6e 6b 5f 74 6f 5f 64 61 74 65 28 7a  erlink_to_date(z
44e0: 44 61 74 65 2c 20 22 3a 22 29 3b 0a 20 20 20 20  Date, ":");.    
44f0: 40 20 25 77 28 7a 43 6f 6d 6d 65 6e 74 29 2e 20  @ %w(zComment). 
4500: 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42  <a href="%s(g.zB
4510: 61 73 65 55 52 4c 29 2f 63 69 2f 25 73 28 7a 55  aseURL)/ci/%s(zU
4520: 75 69 64 29 22 3e 5b 64 65 74 61 69 6c 73 5d 3c  uid)">[details]<
4530: 2f 61 3e 3c 2f 70 3e 0a 20 20 20 20 40 20 3c 68  /a></p>.    @ <h
4540: 72 3e 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61  r>.  }.  db_fina
4550: 6c 69 7a 65 28 26 71 29 3b 0a 20 20 64 62 5f 70  lize(&q);.  db_p
4560: 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20 20  repare(&q,.     
4570: 22 53 45 4c 45 43 54 20 70 69 64 2c 20 66 69 64  "SELECT pid, fid
4580: 2c 20 6e 61 6d 65 22 0a 20 20 20 20 20 22 20 20  , name".     "  
4590: 46 52 4f 4d 20 6d 6c 69 6e 6b 2c 20 66 69 6c 65  FROM mlink, file
45a0: 6e 61 6d 65 22 0a 20 20 20 20 20 22 20 57 48 45  name".     " WHE
45b0: 52 45 20 6d 6c 69 6e 6b 2e 6d 69 64 3d 25 64 22  RE mlink.mid=%d"
45c0: 0a 20 20 20 20 20 22 20 20 20 41 4e 44 20 66 69  .     "   AND fi
45d0: 6c 65 6e 61 6d 65 2e 66 6e 69 64 3d 6d 6c 69 6e  lename.fnid=mlin
45e0: 6b 2e 66 6e 69 64 22 0a 20 20 20 20 20 22 20 4f  k.fnid".     " O
45f0: 52 44 45 52 20 42 59 20 6e 61 6d 65 22 2c 0a 20  RDER BY name",. 
4600: 20 20 20 20 72 69 64 0a 20 20 29 3b 0a 20 20 77      rid.  );.  w
4610: 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71  hile( db_step(&q
4620: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
4630: 0a 20 20 20 20 69 6e 74 20 70 69 64 20 3d 20 64  .    int pid = d
4640: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c  b_column_int(&q,
4650: 30 29 3b 0a 20 20 20 20 69 6e 74 20 66 69 64 20  0);.    int fid 
4660: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  = db_column_int(
4670: 26 71 2c 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74  &q,1);.    const
4680: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 64   char *zName = d
4690: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
46a0: 2c 32 29 3b 0a 20 20 20 20 40 20 3c 70 3e 3c 61  ,2);.    @ <p><a
46b0: 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73   href="%s(g.zBas
46c0: 65 55 52 4c 29 2f 66 69 6e 66 6f 3f 6e 61 6d 65  eURL)/finfo?name
46d0: 3d 25 54 28 7a 4e 61 6d 65 29 22 3e 25 68 28 7a  =%T(zName)">%h(z
46e0: 4e 61 6d 65 29 3c 2f 61 3e 3c 2f 70 3e 0a 20 20  Name)</a></p>.  
46f0: 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e    @ <blockquote>
4700: 3c 70 72 65 3e 0a 20 20 20 20 61 70 70 65 6e 64  <pre>.    append
4710: 5f 64 69 66 66 28 70 69 64 2c 20 66 69 64 29 3b  _diff(pid, fid);
4720: 0a 20 20 20 20 40 20 3c 2f 70 72 65 3e 3c 2f 62  .    @ </pre></b
4730: 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 7d 0a 20  lockquote>.  }. 
4740: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29   db_finalize(&q)
4750: 3b 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72  ;.  style_footer
4760: 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  ();.}../*.** Wri
4770: 74 65 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  te a description
4780: 20 6f 66 20 61 6e 20 6f 62 6a 65 63 74 20 74 6f   of an object to
4790: 20 74 68 65 20 77 77 77 20 72 65 70 6c 79 2e 0a   the www reply..
47a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 62 6a  **.** If the obj
47b0: 65 63 74 20 69 73 20 61 20 66 69 6c 65 20 74 68  ect is a file th
47c0: 65 6e 20 6d 65 6e 74 69 6f 6e 3a 0a 2a 2a 0a 2a  en mention:.**.*
47d0: 2a 20 20 20 20 20 2a 20 49 74 27 73 20 61 72 74  *     * It's art
47e0: 69 66 61 63 74 20 49 44 0a 2a 2a 20 20 20 20 20  ifact ID.**     
47f0: 2a 20 41 6c 6c 20 69 74 73 20 66 69 6c 65 6e 61  * All its filena
4800: 6d 65 73 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65  mes.**     * The
4810: 20 63 68 65 63 6b 2d 69 6e 20 69 74 20 77 61 73   check-in it was
4820: 20 70 61 72 74 20 6f 66 2c 20 77 69 74 68 20 74   part of, with t
4830: 69 6d 65 73 20 61 6e 64 20 75 73 65 72 73 0a 2a  imes and users.*
4840: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 62 6a 65  *.** If the obje
4850: 63 74 20 69 73 20 61 20 6d 61 6e 69 66 65 73 74  ct is a manifest
4860: 2c 20 74 68 65 6e 20 6d 65 6e 74 69 6f 6e 3a 0a  , then mention:.
4870: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 49 74 27 73  **.**     * It's
4880: 20 61 72 74 69 66 61 63 74 20 49 44 0a 2a 2a 20   artifact ID.** 
4890: 20 20 20 20 2a 20 64 61 74 65 20 6f 66 20 63 68      * date of ch
48a0: 65 63 6b 2d 69 6e 0a 2a 2a 20 20 20 20 20 2a 20  eck-in.**     * 
48b0: 43 6f 6d 6d 65 6e 74 20 26 20 75 73 65 72 0a 2a  Comment & user.*
48c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 62  /.static void ob
48d0: 6a 65 63 74 5f 64 65 73 63 72 69 70 74 69 6f 6e  ject_description
48e0: 28 0a 20 20 69 6e 74 20 72 69 64 2c 20 20 20 20  (.  int rid,    
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4900: 54 68 65 20 61 72 74 69 66 61 63 74 20 49 44 20  The artifact ID 
4910: 2a 2f 0a 20 20 69 6e 74 20 6c 69 6e 6b 54 6f 56  */.  int linkToV
4920: 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  iew,          /*
4930: 20 41 64 64 20 76 69 65 77 65 72 20 6c 69 6e 6b   Add viewer link
4940: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 42 6c   if true */.  Bl
4950: 6f 62 20 2a 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d  ob *pDownloadNam
4960: 65 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 77  e      /* Fill w
4970: 69 74 68 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ith an appropria
4980: 74 65 20 64 6f 77 6e 6c 6f 61 64 20 6e 61 6d 65  te download name
4990: 20 2a 2f 0a 29 7b 0a 20 20 53 74 6d 74 20 71 3b   */.){.  Stmt q;
49a0: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
49b0: 20 20 69 6e 74 20 6e 57 69 6b 69 20 3d 20 30 3b    int nWiki = 0;
49c0: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71  .  db_prepare(&q
49d0: 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20 66 69  ,.    "SELECT fi
49e0: 6c 65 6e 61 6d 65 2e 6e 61 6d 65 2c 20 64 61 74  lename.name, dat
49f0: 65 74 69 6d 65 28 65 76 65 6e 74 2e 6d 74 69 6d  etime(event.mtim
4a00: 65 29 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20  e),".    "      
4a10: 20 63 6f 61 6c 65 73 63 65 28 65 76 65 6e 74 2e   coalesce(event.
4a20: 65 63 6f 6d 6d 65 6e 74 2c 65 76 65 6e 74 2e 63  ecomment,event.c
4a30: 6f 6d 6d 65 6e 74 29 2c 22 0a 20 20 20 20 22 20  omment),".    " 
4a40: 20 20 20 20 20 20 63 6f 61 6c 65 73 63 65 28 65        coalesce(e
4a50: 76 65 6e 74 2e 65 75 73 65 72 2c 65 76 65 6e 74  vent.euser,event
4a60: 2e 75 73 65 72 29 2c 22 0a 20 20 20 20 22 20 20  .user),".    "  
4a70: 20 20 20 20 20 62 2e 75 75 69 64 22 0a 20 20 20       b.uuid".   
4a80: 20 22 20 20 46 52 4f 4d 20 6d 6c 69 6e 6b 2c 20   "  FROM mlink, 
4a90: 66 69 6c 65 6e 61 6d 65 2c 20 65 76 65 6e 74 2c  filename, event,
4aa0: 20 62 6c 6f 62 20 61 2c 20 62 6c 6f 62 20 62 22   blob a, blob b"
4ab0: 0a 20 20 20 20 22 20 57 48 45 52 45 20 66 69 6c  .    " WHERE fil
4ac0: 65 6e 61 6d 65 2e 66 6e 69 64 3d 6d 6c 69 6e 6b  ename.fnid=mlink
4ad0: 2e 66 6e 69 64 22 0a 20 20 20 20 22 20 20 20 41  .fnid".    "   A
4ae0: 4e 44 20 65 76 65 6e 74 2e 6f 62 6a 69 64 3d 6d  ND event.objid=m
4af0: 6c 69 6e 6b 2e 6d 69 64 22 0a 20 20 20 20 22 20  link.mid".    " 
4b00: 20 20 41 4e 44 20 61 2e 72 69 64 3d 6d 6c 69 6e    AND a.rid=mlin
4b10: 6b 2e 66 69 64 22 0a 20 20 20 20 22 20 20 20 41  k.fid".    "   A
4b20: 4e 44 20 62 2e 72 69 64 3d 6d 6c 69 6e 6b 2e 6d  ND b.rid=mlink.m
4b30: 69 64 22 0a 20 20 20 20 22 20 20 20 41 4e 44 20  id".    "   AND 
4b40: 6d 6c 69 6e 6b 2e 66 69 64 3d 25 64 22 2c 0a 20  mlink.fid=%d",. 
4b50: 20 20 20 72 69 64 0a 20 20 29 3b 0a 20 20 77 68     rid.  );.  wh
4b60: 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29  ile( db_step(&q)
4b70: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
4b80: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
4b90: 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d  zName = db_colum
4ba0: 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b 0a 20  n_text(&q, 0);. 
4bb0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
4bc0: 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  Date = db_column
4bd0: 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 20  _text(&q, 1);.  
4be0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
4bf0: 6f 6d 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  om = db_column_t
4c00: 65 78 74 28 26 71 2c 20 32 29 3b 0a 20 20 20 20  ext(&q, 2);.    
4c10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65  const char *zUse
4c20: 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  r = db_column_te
4c30: 78 74 28 26 71 2c 20 33 29 3b 0a 20 20 20 20 63  xt(&q, 3);.    c
4c40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 65 72 73  onst char *zVers
4c50: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
4c60: 74 28 26 71 2c 20 34 29 3b 0a 20 20 20 20 69 66  t(&q, 4);.    if
4c70: 28 20 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20  ( cnt>0 ){.     
4c80: 20 40 20 41 6c 73 6f 20 66 69 6c 65 0a 20 20 20   @ Also file.   
4c90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20   }else{.      @ 
4ca0: 46 69 6c 65 0a 20 20 20 20 7d 0a 20 20 20 20 40  File.    }.    @
4cb0: 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a   <a href="%s(g.z
4cc0: 42 61 73 65 55 52 4c 29 2f 66 69 6e 66 6f 3f 6e  BaseURL)/finfo?n
4cd0: 61 6d 65 3d 25 54 28 7a 4e 61 6d 65 29 22 3e 25  ame=%T(zName)">%
4ce0: 68 28 7a 4e 61 6d 65 29 3c 2f 61 3e 0a 20 20 20  h(zName)</a>.   
4cf0: 20 40 20 70 61 72 74 20 6f 66 20 63 68 65 63 6b   @ part of check
4d00: 2d 69 6e 0a 20 20 20 20 68 79 70 65 72 6c 69 6e  -in.    hyperlin
4d10: 6b 5f 74 6f 5f 75 75 69 64 28 7a 56 65 72 73 29  k_to_uuid(zVers)
4d20: 3b 0a 20 20 20 20 40 20 2d 20 25 77 28 7a 43 6f  ;.    @ - %w(zCo
4d30: 6d 29 20 62 79 20 0a 20 20 20 20 68 79 70 65 72  m) by .    hyper
4d40: 6c 69 6e 6b 5f 74 6f 5f 75 73 65 72 28 7a 55 73  link_to_user(zUs
4d50: 65 72 2c 7a 44 61 74 65 2c 22 20 6f 6e 22 29 3b  er,zDate," on");
4d60: 0a 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74  .    hyperlink_t
4d70: 6f 5f 64 61 74 65 28 7a 44 61 74 65 2c 22 2e 22  o_date(zDate,"."
4d80: 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  );.    cnt++;.  
4d90: 20 20 69 66 28 20 70 44 6f 77 6e 6c 6f 61 64 4e    if( pDownloadN
4da0: 61 6d 65 20 26 26 20 62 6c 6f 62 5f 73 69 7a 65  ame && blob_size
4db0: 28 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29 3d  (pDownloadName)=
4dc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62  =0 ){.      blob
4dd0: 5f 61 70 70 65 6e 64 28 70 44 6f 77 6e 6c 6f 61  _append(pDownloa
4de0: 64 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  dName, zName, -1
4df0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64  );.    }.  }.  d
4e00: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a  b_finalize(&q);.
4e10: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
4e20: 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20 73 75   .    "SELECT su
4e30: 62 73 74 72 28 74 61 67 6e 61 6d 65 2c 20 36 2c  bstr(tagname, 6,
4e40: 20 31 30 30 30 30 29 2c 20 64 61 74 65 74 69 6d   10000), datetim
4e50: 65 28 65 76 65 6e 74 2e 6d 74 69 6d 65 29 2c 22  e(event.mtime),"
4e60: 0a 20 20 20 20 22 20 20 20 20 20 20 20 63 6f 61  .    "       coa
4e70: 6c 65 73 63 65 28 65 76 65 6e 74 2e 65 75 73 65  lesce(event.euse
4e80: 72 2c 20 65 76 65 6e 74 2e 75 73 65 72 29 22 0a  r, event.user)".
4e90: 20 20 20 20 22 20 20 46 52 4f 4d 20 74 61 67 78      "  FROM tagx
4ea0: 72 65 66 2c 20 74 61 67 2c 20 65 76 65 6e 74 22  ref, tag, event"
4eb0: 0a 20 20 20 20 22 20 57 48 45 52 45 20 74 61 67  .    " WHERE tag
4ec0: 78 72 65 66 2e 72 69 64 3d 25 64 22 0a 20 20 20  xref.rid=%d".   
4ed0: 20 22 20 20 20 41 4e 44 20 74 61 67 2e 74 61 67   "   AND tag.tag
4ee0: 69 64 3d 74 61 67 78 72 65 66 2e 74 61 67 69 64  id=tagxref.tagid
4ef0: 22 20 0a 20 20 20 20 22 20 20 20 41 4e 44 20 74  " .    "   AND t
4f00: 61 67 2e 74 61 67 6e 61 6d 65 20 4c 49 4b 45 20  ag.tagname LIKE 
4f10: 27 77 69 6b 69 2d 25 25 27 22 0a 20 20 20 20 22  'wiki-%%'".    "
4f20: 20 20 20 41 4e 44 20 65 76 65 6e 74 2e 6f 62 6a     AND event.obj
4f30: 69 64 3d 74 61 67 78 72 65 66 2e 72 69 64 22 2c  id=tagxref.rid",
4f40: 0a 20 20 20 20 72 69 64 0a 20 20 29 3b 0a 20 20  .    rid.  );.  
4f50: 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26  while( db_step(&
4f60: 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  q)==SQLITE_ROW )
4f70: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
4f80: 20 2a 7a 50 61 67 65 6e 61 6d 65 20 3d 20 64 62   *zPagename = db
4f90: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
4fa0: 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   0);.    const c
4fb0: 68 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f  har *zDate = db_
4fc0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
4fd0: 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  1);.    const ch
4fe0: 61 72 20 2a 7a 55 73 65 72 20 3d 20 64 62 5f 63  ar *zUser = db_c
4ff0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32  olumn_text(&q, 2
5000: 29 3b 0a 20 20 20 20 69 66 28 20 63 6e 74 3e 30  );.    if( cnt>0
5010: 20 29 7b 0a 20 20 20 20 20 20 40 20 41 6c 73 6f   ){.      @ Also
5020: 20 77 69 6b 69 20 70 61 67 65 0a 20 20 20 20 7d   wiki page.    }
5030: 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 57 69  else{.      @ Wi
5040: 6b 69 20 70 61 67 65 0a 20 20 20 20 7d 0a 20 20  ki page.    }.  
5050: 20 20 40 20 5b 3c 61 20 68 72 65 66 3d 22 25 73    @ [<a href="%s
5060: 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 77 69 6b  (g.zBaseURL)/wik
5070: 69 3f 6e 61 6d 65 3d 25 74 28 7a 50 61 67 65 6e  i?name=%t(zPagen
5080: 61 6d 65 29 22 3e 25 68 28 7a 50 61 67 65 6e 61  ame)">%h(zPagena
5090: 6d 65 29 3c 2f 61 3e 5d 0a 20 20 20 20 40 20 62  me)</a>].    @ b
50a0: 79 0a 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f  y.    hyperlink_
50b0: 74 6f 5f 75 73 65 72 28 7a 55 73 65 72 2c 7a 44  to_user(zUser,zD
50c0: 61 74 65 2c 22 20 6f 6e 22 29 3b 0a 20 20 20 20  ate," on");.    
50d0: 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 64 61 74  hyperlink_to_dat
50e0: 65 28 7a 44 61 74 65 2c 22 2e 22 29 3b 0a 20 20  e(zDate,".");.  
50f0: 20 20 6e 57 69 6b 69 2b 2b 3b 0a 20 20 20 20 63    nWiki++;.    c
5100: 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 44  nt++;.    if( pD
5110: 6f 77 6e 6c 6f 61 64 4e 61 6d 65 20 26 26 20 62  ownloadName && b
5120: 6c 6f 62 5f 73 69 7a 65 28 70 44 6f 77 6e 6c 6f  lob_size(pDownlo
5130: 61 64 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  adName)==0 ){.  
5140: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
5150: 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 2c 20 7a  pDownloadName, z
5160: 50 61 67 65 6e 61 6d 65 2c 20 2d 31 29 3b 0a 20  Pagename, -1);. 
5170: 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 5f 66 69     }.  }.  db_fi
5180: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 69 66  nalize(&q);.  if
5190: 28 20 6e 57 69 6b 69 3d 3d 30 20 29 7b 0a 20 20  ( nWiki==0 ){.  
51a0: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
51b0: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 64  .      "SELECT d
51c0: 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 29 2c 20  atetime(mtime), 
51d0: 75 73 65 72 2c 20 63 6f 6d 6d 65 6e 74 2c 20 74  user, comment, t
51e0: 79 70 65 2c 20 75 75 69 64 22 0a 20 20 20 20 20  ype, uuid".     
51f0: 20 22 20 20 46 52 4f 4d 20 65 76 65 6e 74 2c 20   "  FROM event, 
5200: 62 6c 6f 62 22 0a 20 20 20 20 20 20 22 20 57 48  blob".      " WH
5210: 45 52 45 20 65 76 65 6e 74 2e 6f 62 6a 69 64 3d  ERE event.objid=
5220: 25 64 22 0a 20 20 20 20 20 20 22 20 20 20 41 4e  %d".      "   AN
5230: 44 20 62 6c 6f 62 2e 72 69 64 3d 25 64 22 2c 0a  D blob.rid=%d",.
5240: 20 20 20 20 20 20 72 69 64 2c 20 72 69 64 0a 20        rid, rid. 
5250: 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28     );.    while(
5260: 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51   db_step(&q)==SQ
5270: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
5280: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
5290: 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ate = db_column_
52a0: 74 65 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20  text(&q, 0);.   
52b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
52c0: 55 73 65 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  User = db_column
52d0: 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 20  _text(&q, 1);.  
52e0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
52f0: 7a 43 6f 6d 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  zCom = db_column
5300: 5f 74 65 78 74 28 26 71 2c 20 32 29 3b 0a 20 20  _text(&q, 2);.  
5310: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5320: 7a 54 79 70 65 20 3d 20 64 62 5f 63 6f 6c 75 6d  zType = db_colum
5330: 6e 5f 74 65 78 74 28 26 71 2c 20 33 29 3b 0a 20  n_text(&q, 3);. 
5340: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
5350: 2a 7a 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c 75  *zUuid = db_colu
5360: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 34 29 3b 0a  mn_text(&q, 4);.
5370: 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e 30 20        if( cnt>0 
5380: 29 7b 0a 20 20 20 20 20 20 20 20 40 20 41 6c 73  ){.        @ Als
5390: 6f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  o.      }.      
53a0: 69 66 28 20 7a 54 79 70 65 5b 30 5d 3d 3d 27 77  if( zType[0]=='w
53b0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20 57  ' ){.        @ W
53c0: 69 6b 69 20 65 64 69 74 0a 20 20 20 20 20 20 7d  iki edit.      }
53d0: 65 6c 73 65 20 69 66 28 20 7a 54 79 70 65 5b 30  else if( zType[0
53e0: 5d 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20  ]=='t' ){.      
53f0: 20 20 40 20 54 69 63 6b 65 74 20 63 68 61 6e 67    @ Ticket chang
5400: 65 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  e.      }else if
5410: 28 20 7a 54 79 70 65 5b 30 5d 3d 3d 27 63 27 20  ( zType[0]=='c' 
5420: 29 7b 0a 20 20 20 20 20 20 20 20 40 20 4d 61 6e  ){.        @ Man
5430: 69 66 65 73 74 20 6f 66 20 63 68 65 63 6b 2d 69  ifest of check-i
5440: 6e 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n.      }else{. 
5450: 20 20 20 20 20 20 20 40 20 43 6f 6e 74 72 6f 6c         @ Control
5460: 20 66 69 6c 65 20 72 65 66 65 72 65 6e 63 69 6e   file referencin
5470: 67 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  g.      }.      
5480: 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69  hyperlink_to_uui
5490: 64 28 7a 55 75 69 64 29 3b 0a 20 20 20 20 20 20  d(zUuid);.      
54a0: 40 20 2d 20 25 77 28 7a 43 6f 6d 29 20 62 79 0a  @ - %w(zCom) by.
54b0: 20 20 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f        hyperlink_
54c0: 74 6f 5f 75 73 65 72 28 7a 55 73 65 72 2c 7a 44  to_user(zUser,zD
54d0: 61 74 65 2c 22 20 6f 6e 22 29 3b 0a 20 20 20 20  ate," on");.    
54e0: 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 64    hyperlink_to_d
54f0: 61 74 65 28 7a 44 61 74 65 2c 20 22 2e 22 29 3b  ate(zDate, ".");
5500: 0a 20 20 20 20 20 20 69 66 28 20 70 44 6f 77 6e  .      if( pDown
5510: 6c 6f 61 64 4e 61 6d 65 20 26 26 20 62 6c 6f 62  loadName && blob
5520: 5f 73 69 7a 65 28 70 44 6f 77 6e 6c 6f 61 64 4e  _size(pDownloadN
5530: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
5540: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
5550: 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 2c 20 7a 55  DownloadName, zU
5560: 75 69 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  uid, -1);.      
5570: 7d 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  }.      cnt++;. 
5580: 20 20 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61     }.    db_fina
5590: 6c 69 7a 65 28 26 71 29 3b 0a 20 20 7d 0a 20 20  lize(&q);.  }.  
55a0: 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20  if( cnt==0 ){.  
55b0: 20 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20    char *zUuid = 
55c0: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
55d0: 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f  CT uuid FROM blo
55e0: 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c  b WHERE rid=%d",
55f0: 20 72 69 64 29 3b 0a 20 20 20 20 40 20 43 6f 6e   rid);.    @ Con
5600: 74 72 6f 6c 20 61 72 74 69 66 61 63 74 2e 0a 20  trol artifact.. 
5610: 20 20 20 69 66 28 20 70 44 6f 77 6e 6c 6f 61 64     if( pDownload
5620: 4e 61 6d 65 20 26 26 20 62 6c 6f 62 5f 73 69 7a  Name && blob_siz
5630: 65 28 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29  e(pDownloadName)
5640: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f  ==0 ){.      blo
5650: 62 5f 61 70 70 65 6e 64 28 70 44 6f 77 6e 6c 6f  b_append(pDownlo
5660: 61 64 4e 61 6d 65 2c 20 7a 55 75 69 64 2c 20 2d  adName, zUuid, -
5670: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  1);.    }.  }els
5680: 65 20 69 66 28 20 6c 69 6e 6b 54 6f 56 69 65 77  e if( linkToView
5690: 20 29 7b 0a 20 20 20 20 40 20 3c 61 20 68 72 65   ){.    @ <a hre
56a0: 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c  f="%s(g.zBaseURL
56b0: 29 2f 61 72 74 69 66 61 63 74 2f 25 64 28 72 69  )/artifact/%d(ri
56c0: 64 29 22 3e 5b 76 69 65 77 5d 3c 2f 61 3e 0a 20  d)">[view]</a>. 
56d0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45 42   }.}.../*.** WEB
56e0: 50 41 47 45 3a 20 66 64 69 66 66 0a 2a 2a 0a 2a  PAGE: fdiff.**.*
56f0: 2a 20 54 77 6f 20 61 72 67 75 6d 65 6e 74 73 2c  * Two arguments,
5700: 20 76 31 20 61 6e 64 20 76 32 2c 20 61 72 65 20   v1 and v2, are 
5710: 69 6e 74 65 67 65 72 73 2e 20 20 53 68 6f 77 20  integers.  Show 
5720: 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  the difference b
5730: 65 74 77 65 65 6e 0a 2a 2a 20 74 68 65 20 74 77  etween.** the tw
5740: 6f 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 76 6f  o records..*/.vo
5750: 69 64 20 64 69 66 66 5f 70 61 67 65 28 76 6f 69  id diff_page(voi
5760: 64 29 7b 0a 20 20 69 6e 74 20 76 31 20 3d 20 6e  d){.  int v1 = n
5770: 61 6d 65 5f 74 6f 5f 72 69 64 28 50 44 28 22 76  ame_to_rid(PD("v
5780: 31 22 2c 22 30 22 29 29 3b 0a 20 20 69 6e 74 20  1","0"));.  int 
5790: 76 32 20 3d 20 6e 61 6d 65 5f 74 6f 5f 72 69 64  v2 = name_to_rid
57a0: 28 50 44 28 22 76 32 22 2c 22 30 22 29 29 3b 0a  (PD("v2","0"));.
57b0: 20 20 42 6c 6f 62 20 63 31 2c 20 63 32 2c 20 64    Blob c1, c2, d
57c0: 69 66 66 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68  iff;..  login_ch
57d0: 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28  eck_credentials(
57e0: 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52 65  );.  if( !g.okRe
57f0: 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64  ad ){ login_need
5800: 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  ed(); return; }.
5810: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22    style_header("
5820: 44 69 66 66 22 29 3b 0a 20 20 40 20 3c 68 32 3e  Diff");.  @ <h2>
5830: 44 69 66 66 65 72 65 6e 63 65 73 20 46 72 6f 6d  Differences From
5840: 3a 3c 2f 68 32 3e 0a 20 20 40 20 3c 62 6c 6f 63  :</h2>.  @ <bloc
5850: 6b 71 75 6f 74 65 3e 0a 20 20 6f 62 6a 65 63 74  kquote>.  object
5860: 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 76 31 2c  _description(v1,
5870: 20 31 2c 20 30 29 3b 0a 20 20 40 20 3c 2f 62 6c   1, 0);.  @ </bl
5880: 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 40 20 3c 68  ockquote>.  @ <h
5890: 32 3e 54 6f 3a 3c 2f 68 32 3e 0a 20 20 40 20 3c  2>To:</h2>.  @ <
58a0: 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 6f 62  blockquote>.  ob
58b0: 6a 65 63 74 5f 64 65 73 63 72 69 70 74 69 6f 6e  ject_description
58c0: 28 76 32 2c 20 31 2c 20 30 29 3b 0a 20 20 40 20  (v2, 1, 0);.  @ 
58d0: 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20  </blockquote>.  
58e0: 40 20 3c 68 72 3e 0a 20 20 40 20 3c 62 6c 6f 63  @ <hr>.  @ <bloc
58f0: 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 20 20 63  kquote><pre>.  c
5900: 6f 6e 74 65 6e 74 5f 67 65 74 28 76 31 2c 20 26  ontent_get(v1, &
5910: 63 31 29 3b 0a 20 20 63 6f 6e 74 65 6e 74 5f 67  c1);.  content_g
5920: 65 74 28 76 32 2c 20 26 63 32 29 3b 0a 20 20 62  et(v2, &c2);.  b
5930: 6c 6f 62 5f 7a 65 72 6f 28 26 64 69 66 66 29 3b  lob_zero(&diff);
5940: 0a 20 20 74 65 78 74 5f 64 69 66 66 28 26 63 31  .  text_diff(&c1
5950: 2c 20 26 63 32 2c 20 26 64 69 66 66 2c 20 34 29  , &c2, &diff, 4)
5960: 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26  ;.  blob_reset(&
5970: 63 31 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65  c1);.  blob_rese
5980: 74 28 26 63 32 29 3b 0a 20 20 40 20 25 68 28 62  t(&c2);.  @ %h(b
5990: 6c 6f 62 5f 73 74 72 28 26 64 69 66 66 29 29 0a  lob_str(&diff)).
59a0: 20 20 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63    @ </pre></bloc
59b0: 6b 71 75 6f 74 65 3e 0a 20 20 62 6c 6f 62 5f 72  kquote>.  blob_r
59c0: 65 73 65 74 28 26 64 69 66 66 29 3b 0a 20 20 73  eset(&diff);.  s
59d0: 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d  tyle_footer();.}
59e0: 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a  ../*.** WEBPAGE:
59f0: 20 72 61 77 0a 2a 2a 20 55 52 4c 3a 20 2f 72 61   raw.** URL: /ra
5a00: 77 3f 6e 61 6d 65 3d 41 52 54 49 46 41 43 54 49  w?name=ARTIFACTI
5a10: 44 26 6d 3d 54 59 50 45 0a 2a 2a 20 0a 2a 2a 20  D&m=TYPE.** .** 
5a20: 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 6e 74  Return the unint
5a30: 65 72 70 72 65 74 65 64 20 63 6f 6e 74 65 6e 74  erpreted content
5a40: 20 6f 66 20 61 6e 20 61 72 74 69 66 61 63 74 2e   of an artifact.
5a50: 20 20 55 73 65 64 20 70 72 69 6d 61 72 69 6c 79    Used primarily
5a60: 0a 2a 2a 20 74 6f 20 76 69 65 77 20 61 72 74 69  .** to view arti
5a70: 66 61 63 74 73 20 74 68 61 74 20 61 72 65 20 69  facts that are i
5a80: 6d 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 72  mages..*/.void r
5a90: 61 77 61 72 74 69 66 61 63 74 5f 70 61 67 65 28  awartifact_page(
5aa0: 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72 69 64  void){.  int rid
5ab0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
5ac0: 7a 4d 69 6d 65 3b 0a 20 20 42 6c 6f 62 20 63 6f  zMime;.  Blob co
5ad0: 6e 74 65 6e 74 3b 0a 0a 20 20 72 69 64 20 3d 20  ntent;..  rid = 
5ae0: 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 50 44 28 22  name_to_rid(PD("
5af0: 6e 61 6d 65 22 2c 22 30 22 29 29 3b 0a 20 20 7a  name","0"));.  z
5b00: 4d 69 6d 65 20 3d 20 50 44 28 22 6d 22 2c 22 61  Mime = PD("m","a
5b10: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 6f 73  pplication/x-fos
5b20: 73 69 6c 2d 61 72 74 69 66 61 63 74 22 29 3b 0a  sil-artifact");.
5b30: 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72    login_check_cr
5b40: 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69  edentials();.  i
5b50: 66 28 20 21 67 2e 6f 6b 52 65 61 64 20 29 7b 20  f( !g.okRead ){ 
5b60: 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20  login_needed(); 
5b70: 72 65 74 75 72 6e 3b 20 7d 0a 20 20 69 66 28 20  return; }.  if( 
5b80: 72 69 64 3d 3d 30 20 29 7b 20 63 67 69 5f 72 65  rid==0 ){ cgi_re
5b90: 64 69 72 65 63 74 28 22 2f 68 6f 6d 65 22 29 3b  direct("/home");
5ba0: 20 7d 0a 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74   }.  content_get
5bb0: 28 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74 29 3b  (rid, &content);
5bc0: 0a 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65  .  cgi_set_conte
5bd0: 6e 74 5f 74 79 70 65 28 7a 4d 69 6d 65 29 3b 0a  nt_type(zMime);.
5be0: 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65 6e    cgi_set_conten
5bf0: 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 7d 0a 0a  t(&content);.}..
5c00: 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 61 20 68  /*.** Render a h
5c10: 65 78 20 64 75 6d 70 20 6f 66 20 61 20 66 69 6c  ex dump of a fil
5c20: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5c30: 64 20 68 65 78 64 75 6d 70 28 42 6c 6f 62 20 2a  d hexdump(Blob *
5c40: 70 42 6c 6f 62 29 7b 0a 20 20 63 6f 6e 73 74 20  pBlob){.  const 
5c50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 78  unsigned char *x
5c60: 3b 0a 20 20 69 6e 74 20 6e 2c 20 69 2c 20 6a 2c  ;.  int n, i, j,
5c70: 20 6b 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65   k;.  char zLine
5c80: 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  [100];.  static 
5c90: 63 6f 6e 73 74 20 63 68 61 72 20 7a 48 65 78 5b  const char zHex[
5ca0: 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61  ] = "0123456789a
5cb0: 62 63 64 65 66 22 3b 0a 0a 20 20 78 20 3d 20 28  bcdef";..  x = (
5cc0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
5cd0: 68 61 72 2a 29 62 6c 6f 62 5f 62 75 66 66 65 72  har*)blob_buffer
5ce0: 28 70 42 6c 6f 62 29 3b 0a 20 20 6e 20 3d 20 62  (pBlob);.  n = b
5cf0: 6c 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62 29 3b  lob_size(pBlob);
5d00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
5d10: 20 69 2b 3d 31 36 29 7b 0a 20 20 20 20 6a 20 3d   i+=16){.    j =
5d20: 20 30 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b 30 5d   0;.    zLine[0]
5d30: 20 3d 20 7a 48 65 78 5b 28 69 3e 3e 32 34 29 26   = zHex[(i>>24)&
5d40: 30 78 66 5d 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b  0xf];.    zLine[
5d50: 31 5d 20 3d 20 7a 48 65 78 5b 28 69 3e 3e 31 36  1] = zHex[(i>>16
5d60: 29 26 30 78 66 5d 3b 0a 20 20 20 20 7a 4c 69 6e  )&0xf];.    zLin
5d70: 65 5b 32 5d 20 3d 20 7a 48 65 78 5b 28 69 3e 3e  e[2] = zHex[(i>>
5d80: 38 29 26 30 78 66 5d 3b 0a 20 20 20 20 7a 4c 69  8)&0xf];.    zLi
5d90: 6e 65 5b 33 5d 20 3d 20 7a 48 65 78 5b 69 26 30  ne[3] = zHex[i&0
5da0: 78 66 5d 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b 34  xf];.    zLine[4
5db0: 5d 20 3d 20 27 3a 27 3b 0a 20 20 20 20 73 70 72  ] = ':';.    spr
5dc0: 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 30 34  intf(zLine, "%04
5dd0: 78 3a 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 6f  x: ", i);.    fo
5de0: 72 28 6a 3d 30 3b 20 6a 3c 31 36 3b 20 6a 2b 2b  r(j=0; j<16; j++
5df0: 29 7b 0a 20 20 20 20 20 20 6b 20 3d 20 35 2b 6a  ){.      k = 5+j
5e00: 2a 33 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b  *3;.      zLine[
5e10: 6b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  k] = ' ';.      
5e20: 69 66 28 20 69 2b 6a 3c 6e 20 29 7b 0a 20 20 20  if( i+j<n ){.   
5e30: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
5e40: 61 72 20 63 20 3d 20 78 5b 69 2b 6a 5d 3b 0a 20  ar c = x[i+j];. 
5e50: 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6b 2b 31         zLine[k+1
5e60: 5d 20 3d 20 7a 48 65 78 5b 63 3e 3e 34 5d 3b 0a  ] = zHex[c>>4];.
5e70: 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6b 2b          zLine[k+
5e80: 32 5d 20 3d 20 7a 48 65 78 5b 63 26 30 78 66 5d  2] = zHex[c&0xf]
5e90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5ea0: 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6b 2b 31         zLine[k+1
5eb0: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
5ec0: 20 7a 4c 69 6e 65 5b 6b 2b 32 5d 20 3d 20 27 20   zLine[k+2] = ' 
5ed0: 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
5ee0: 0a 20 20 20 20 7a 4c 69 6e 65 5b 35 33 5d 20 3d  .    zLine[53] =
5ef0: 20 27 20 27 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b   ' ';.    zLine[
5f00: 35 34 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 66  54] = ' ';.    f
5f10: 6f 72 28 6a 3d 30 3b 20 6a 3c 31 36 3b 20 6a 2b  or(j=0; j<16; j+
5f20: 2b 29 7b 0a 20 20 20 20 20 20 6b 20 3d 20 6a 2b  +){.      k = j+
5f30: 35 35 3b 0a 20 20 20 20 20 20 69 66 28 20 69 2b  55;.      if( i+
5f40: 6a 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75  j<n ){.        u
5f50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d  nsigned char c =
5f60: 20 78 5b 69 2b 6a 5d 3b 0a 20 20 20 20 20 20 20   x[i+j];.       
5f70: 20 69 66 28 20 63 3e 3d 30 78 32 30 20 26 26 20   if( c>=0x20 && 
5f80: 63 3c 3d 30 78 37 65 20 29 7b 0a 20 20 20 20 20  c<=0x7e ){.     
5f90: 20 20 20 20 20 7a 4c 69 6e 65 5b 6b 5d 20 3d 20       zLine[k] = 
5fa0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
5fb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 69 6e  {.          zLin
5fc0: 65 5b 6b 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20  e[k] = '.';.    
5fd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
5fe0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65  e{.        zLine
5ff0: 5b 6b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [k] = 0;.      }
6000: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69 6e 65  .    }.    zLine
6010: 5b 37 31 5d 20 3d 20 30 3b 0a 20 20 20 20 40 20  [71] = 0;.    @ 
6020: 25 68 28 7a 4c 69 6e 65 29 0a 20 20 7d 0a 7d 0a  %h(zLine).  }.}.
6030: 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20  ./*.** WEBPAGE: 
6040: 68 65 78 64 75 6d 70 0a 2a 2a 20 55 52 4c 3a 20  hexdump.** URL: 
6050: 2f 68 65 78 64 75 6d 70 3f 6e 61 6d 65 3d 41 52  /hexdump?name=AR
6060: 54 49 46 41 43 54 49 44 0a 2a 2a 20 0a 2a 2a 20  TIFACTID.** .** 
6070: 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65 74  Show the complet
6080: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 66  e content of a f
6090: 69 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ile identified b
60a0: 79 20 41 52 54 49 46 41 43 54 49 44 0a 2a 2a 20  y ARTIFACTID.** 
60b0: 61 73 20 70 72 65 66 6f 72 6d 61 74 74 65 64 20  as preformatted 
60c0: 74 65 78 74 2e 0a 2a 2f 0a 76 6f 69 64 20 68 65  text..*/.void he
60d0: 78 64 75 6d 70 5f 70 61 67 65 28 76 6f 69 64 29  xdump_page(void)
60e0: 7b 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20 20 42  {.  int rid;.  B
60f0: 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 42  lob content;.  B
6100: 6c 6f 62 20 64 6f 77 6e 6c 6f 61 64 4e 61 6d 65  lob downloadName
6110: 3b 0a 20 20 63 68 61 72 20 2a 7a 55 75 69 64 3b  ;.  char *zUuid;
6120: 0a 0a 20 20 72 69 64 20 3d 20 6e 61 6d 65 5f 74  ..  rid = name_t
6130: 6f 5f 72 69 64 28 50 44 28 22 6e 61 6d 65 22 2c  o_rid(PD("name",
6140: 22 30 22 29 29 3b 0a 20 20 6c 6f 67 69 6e 5f 63  "0"));.  login_c
6150: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
6160: 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52  ();.  if( !g.okR
6170: 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65  ead ){ login_nee
6180: 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d  ded(); return; }
6190: 0a 20 20 69 66 28 20 72 69 64 3d 3d 30 20 29 7b  .  if( rid==0 ){
61a0: 20 63 67 69 5f 72 65 64 69 72 65 63 74 28 22 2f   cgi_redirect("/
61b0: 68 6f 6d 65 22 29 3b 20 7d 0a 20 20 69 66 28 20  home"); }.  if( 
61c0: 67 2e 6f 6b 41 64 6d 69 6e 20 29 7b 0a 20 20 20  g.okAdmin ){.   
61d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75   const char *zUu
61e0: 69 64 20 3d 20 64 62 5f 74 65 78 74 28 22 22 2c  id = db_text("",
61f0: 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52   "SELECT uuid FR
6200: 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69  OM blob WHERE ri
6210: 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 20  d=%d", rid);.   
6220: 20 69 66 28 20 64 62 5f 65 78 69 73 74 73 28 22   if( db_exists("
6230: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 73 68  SELECT 1 FROM sh
6240: 75 6e 20 57 48 45 52 45 20 75 75 69 64 3d 27 25  un WHERE uuid='%
6250: 73 27 22 2c 20 7a 55 75 69 64 29 20 29 7b 0a 20  s'", zUuid) ){. 
6260: 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65       style_subme
6270: 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 55 6e 73 68  nu_element("Unsh
6280: 75 6e 22 2c 22 55 6e 73 68 75 6e 22 2c 20 22 25  un","Unshun", "%
6290: 73 2f 73 68 75 6e 3f 75 75 69 64 3d 25 73 26 73  s/shun?uuid=%s&s
62a0: 75 62 3d 31 22 2c 0a 20 20 20 20 20 20 20 20 20  ub=1",.         
62b0: 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 55 75 69 64     g.zTop, zUuid
62c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
62d0: 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e      style_submen
62e0: 75 5f 65 6c 65 6d 65 6e 74 28 22 53 68 75 6e 22  u_element("Shun"
62f0: 2c 22 53 68 75 6e 22 2c 20 22 25 73 2f 73 68 75  ,"Shun", "%s/shu
6300: 6e 3f 73 68 75 6e 3d 25 73 23 61 64 64 73 68 75  n?shun=%s#addshu
6310: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
6320: 67 2e 7a 54 6f 70 2c 20 7a 55 75 69 64 29 3b 0a  g.zTop, zUuid);.
6330: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 79 6c      }.  }.  styl
6340: 65 5f 68 65 61 64 65 72 28 22 48 65 78 20 41 72  e_header("Hex Ar
6350: 74 69 66 61 63 74 20 43 6f 6e 74 65 6e 74 22 29  tifact Content")
6360: 3b 0a 20 20 7a 55 75 69 64 20 3d 20 64 62 5f 74  ;.  zUuid = db_t
6370: 65 78 74 28 22 3f 22 2c 22 53 45 4c 45 43 54 20  ext("?","SELECT 
6380: 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57  uuid FROM blob W
6390: 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72 69  HERE rid=%d", ri
63a0: 64 29 3b 0a 20 20 40 20 3c 68 32 3e 41 72 74 69  d);.  @ <h2>Arti
63b0: 66 61 63 74 20 25 73 28 7a 55 75 69 64 29 3a 3c  fact %s(zUuid):<
63c0: 2f 68 32 3e 0a 20 20 40 20 3c 62 6c 6f 63 6b 71  /h2>.  @ <blockq
63d0: 75 6f 74 65 3e 0a 20 20 62 6c 6f 62 5f 7a 65 72  uote>.  blob_zer
63e0: 6f 28 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29  o(&downloadName)
63f0: 3b 0a 20 20 6f 62 6a 65 63 74 5f 64 65 73 63 72  ;.  object_descr
6400: 69 70 74 69 6f 6e 28 72 69 64 2c 20 30 2c 20 26  iption(rid, 0, &
6410: 64 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29 3b 0a 20  downloadName);. 
6420: 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65   style_submenu_e
6430: 6c 65 6d 65 6e 74 28 22 44 6f 77 6e 6c 6f 61 64  lement("Download
6440: 22 2c 20 22 44 6f 77 6e 6c 6f 61 64 22 2c 20 0a  ", "Download", .
6450: 20 20 20 20 20 20 20 20 22 25 73 2f 72 61 77 2f          "%s/raw/
6460: 25 54 3f 6e 61 6d 65 3d 25 64 22 2c 20 67 2e 7a  %T?name=%d", g.z
6470: 42 61 73 65 55 52 4c 2c 20 62 6c 6f 62 5f 73 74  BaseURL, blob_st
6480: 72 28 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29  r(&downloadName)
6490: 2c 20 72 69 64 29 3b 0a 20 20 40 20 3c 2f 62 6c  , rid);.  @ </bl
64a0: 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 40 20 3c 68  ockquote>.  @ <h
64b0: 72 3e 0a 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74  r>.  content_get
64c0: 28 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74 29 3b  (rid, &content);
64d0: 0a 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65  .  @ <blockquote
64e0: 3e 3c 70 72 65 3e 0a 20 20 68 65 78 64 75 6d 70  ><pre>.  hexdump
64f0: 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 40 20  (&content);.  @ 
6500: 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f  </pre></blockquo
6510: 74 65 3e 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74  te>.  style_foot
6520: 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  er();.}../*.** W
6530: 45 42 50 41 47 45 3a 20 61 72 74 69 66 61 63 74  EBPAGE: artifact
6540: 0a 2a 2a 20 55 52 4c 3a 20 2f 61 72 74 69 66 61  .** URL: /artifa
6550: 63 74 3f 6e 61 6d 65 3d 41 52 54 49 46 41 43 54  ct?name=ARTIFACT
6560: 49 44 0a 2a 2a 20 0a 2a 2a 20 53 68 6f 77 20 74  ID.** .** Show t
6570: 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
6580: 65 6e 74 20 6f 66 20 61 20 66 69 6c 65 20 69 64  ent of a file id
6590: 65 6e 74 69 66 69 65 64 20 62 79 20 41 52 54 49  entified by ARTI
65a0: 46 41 43 54 49 44 0a 2a 2a 20 61 73 20 70 72 65  FACTID.** as pre
65b0: 66 6f 72 6d 61 74 74 65 64 20 74 65 78 74 2e 0a  formatted text..
65c0: 2a 2f 0a 76 6f 69 64 20 61 72 74 69 66 61 63 74  */.void artifact
65d0: 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 69  _page(void){.  i
65e0: 6e 74 20 72 69 64 3b 0a 20 20 42 6c 6f 62 20 63  nt rid;.  Blob c
65f0: 6f 6e 74 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20  ontent;.  const 
6600: 63 68 61 72 20 2a 7a 4d 69 6d 65 3b 0a 20 20 42  char *zMime;.  B
6610: 6c 6f 62 20 64 6f 77 6e 6c 6f 61 64 4e 61 6d 65  lob downloadName
6620: 3b 0a 20 20 69 6e 74 20 72 65 6e 64 65 72 41 73  ;.  int renderAs
6630: 57 69 6b 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Wiki = 0;.  int 
6640: 72 65 6e 64 65 72 41 73 48 74 6d 6c 20 3d 20 30  renderAsHtml = 0
6650: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
6660: 7a 55 75 69 64 3b 0a 0a 20 20 72 69 64 20 3d 20  zUuid;..  rid = 
6670: 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 50 44 28 22  name_to_rid(PD("
6680: 6e 61 6d 65 22 2c 22 30 22 29 29 3b 0a 20 20 6c  name","0"));.  l
6690: 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65  ogin_check_crede
66a0: 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20  ntials();.  if( 
66b0: 21 67 2e 6f 6b 52 65 61 64 20 29 7b 20 6c 6f 67  !g.okRead ){ log
66c0: 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74  in_needed(); ret
66d0: 75 72 6e 3b 20 7d 0a 20 20 69 66 28 20 72 69 64  urn; }.  if( rid
66e0: 3d 3d 30 20 29 7b 20 63 67 69 5f 72 65 64 69 72  ==0 ){ cgi_redir
66f0: 65 63 74 28 22 2f 68 6f 6d 65 22 29 3b 20 7d 0a  ect("/home"); }.
6700: 20 20 69 66 28 20 67 2e 6f 6b 41 64 6d 69 6e 20    if( g.okAdmin 
6710: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
6720: 72 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f 74 65  r *zUuid = db_te
6730: 78 74 28 22 22 2c 20 22 53 45 4c 45 43 54 20 75  xt("", "SELECT u
6740: 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48  uid FROM blob WH
6750: 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72 69 64  ERE rid=%d", rid
6760: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 5f 65 78  );.    if( db_ex
6770: 69 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46  ists("SELECT 1 F
6780: 52 4f 4d 20 73 68 75 6e 20 57 48 45 52 45 20 75  ROM shun WHERE u
6790: 75 69 64 3d 27 25 73 27 22 2c 20 7a 55 75 69 64  uid='%s'", zUuid
67a0: 29 20 29 7b 0a 20 20 20 20 20 20 73 74 79 6c 65  ) ){.      style
67b0: 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74  _submenu_element
67c0: 28 22 55 6e 73 68 75 6e 22 2c 22 55 6e 73 68 75  ("Unshun","Unshu
67d0: 6e 22 2c 20 22 25 73 2f 73 68 75 6e 3f 75 75 69  n", "%s/shun?uui
67e0: 64 3d 25 73 26 73 75 62 3d 31 22 2c 0a 20 20 20  d=%s&sub=1",.   
67f0: 20 20 20 20 20 20 20 20 20 67 2e 7a 54 6f 70 2c           g.zTop,
6800: 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 7d 65 6c   zUuid);.    }el
6810: 73 65 7b 0a 20 20 20 20 20 20 73 74 79 6c 65 5f  se{.      style_
6820: 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28  submenu_element(
6830: 22 53 68 75 6e 22 2c 22 53 68 75 6e 22 2c 20 22  "Shun","Shun", "
6840: 25 73 2f 73 68 75 6e 3f 73 68 75 6e 3d 25 73 23  %s/shun?shun=%s#
6850: 61 64 64 73 68 75 6e 22 2c 0a 20 20 20 20 20 20  addshun",.      
6860: 20 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 55        g.zTop, zU
6870: 75 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  uid);.    }.  }.
6880: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22    style_header("
6890: 41 72 74 69 66 61 63 74 20 43 6f 6e 74 65 6e 74  Artifact Content
68a0: 22 29 3b 0a 20 20 7a 55 75 69 64 20 3d 20 64 62  ");.  zUuid = db
68b0: 5f 74 65 78 74 28 22 3f 22 2c 20 22 53 45 4c 45  _text("?", "SELE
68c0: 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f  CT uuid FROM blo
68d0: 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c  b WHERE rid=%d",
68e0: 20 72 69 64 29 3b 0a 20 20 40 20 3c 68 32 3e 41   rid);.  @ <h2>A
68f0: 72 74 69 66 61 63 74 20 25 73 28 7a 55 75 69 64  rtifact %s(zUuid
6900: 29 3c 2f 68 32 3e 0a 20 20 40 20 3c 62 6c 6f 63  )</h2>.  @ <bloc
6910: 6b 71 75 6f 74 65 3e 0a 20 20 62 6c 6f 62 5f 7a  kquote>.  blob_z
6920: 65 72 6f 28 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d  ero(&downloadNam
6930: 65 29 3b 0a 20 20 6f 62 6a 65 63 74 5f 64 65 73  e);.  object_des
6940: 63 72 69 70 74 69 6f 6e 28 72 69 64 2c 20 30 2c  cription(rid, 0,
6950: 20 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29 3b   &downloadName);
6960: 0a 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75  .  style_submenu
6970: 5f 65 6c 65 6d 65 6e 74 28 22 44 6f 77 6e 6c 6f  _element("Downlo
6980: 61 64 22 2c 20 22 44 6f 77 6e 6c 6f 61 64 22 2c  ad", "Download",
6990: 20 0a 20 20 20 20 20 20 20 20 20 20 22 25 73 2f   .          "%s/
69a0: 72 61 77 2f 25 54 3f 6e 61 6d 65 3d 25 64 22 2c  raw/%T?name=%d",
69b0: 20 67 2e 7a 54 6f 70 2c 20 62 6c 6f 62 5f 73 74   g.zTop, blob_st
69c0: 72 28 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29  r(&downloadName)
69d0: 2c 20 72 69 64 29 3b 0a 20 20 7a 4d 69 6d 65 20  , rid);.  zMime 
69e0: 3d 20 6d 69 6d 65 74 79 70 65 5f 66 72 6f 6d 5f  = mimetype_from_
69f0: 6e 61 6d 65 28 62 6c 6f 62 5f 73 74 72 28 26 64  name(blob_str(&d
6a00: 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29 29 3b 0a 20  ownloadName));. 
6a10: 20 69 66 28 20 7a 4d 69 6d 65 20 29 7b 0a 20 20   if( zMime ){.  
6a20: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4d 69    if( strcmp(zMi
6a30: 6d 65 2c 20 22 74 65 78 74 2f 68 74 6d 6c 22 29  me, "text/html")
6a40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
6a50: 20 50 28 22 74 78 74 22 29 20 29 7b 0a 20 20 20   P("txt") ){.   
6a60: 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65       style_subme
6a70: 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 48 74 6d 6c  nu_element("Html
6a80: 22 2c 20 22 48 74 6d 6c 22 2c 0a 20 20 20 20 20  ", "Html",.     
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6aa0: 20 20 20 20 20 20 20 20 20 22 25 73 2f 61 72 74           "%s/art
6ab0: 69 66 61 63 74 3f 6e 61 6d 65 3d 25 64 22 2c 20  ifact?name=%d", 
6ac0: 67 2e 7a 54 6f 70 2c 20 72 69 64 29 3b 0a 20 20  g.zTop, rid);.  
6ad0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6ae0: 20 20 20 72 65 6e 64 65 72 41 73 48 74 6d 6c 20     renderAsHtml 
6af0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 74 79  = 1;.        sty
6b00: 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65  le_submenu_eleme
6b10: 6e 74 28 22 54 65 78 74 22 2c 20 22 54 65 78 74  nt("Text", "Text
6b20: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b40: 20 22 25 73 2f 61 72 74 69 66 61 63 74 3f 6e 61   "%s/artifact?na
6b50: 6d 65 3d 25 64 26 74 78 74 3d 31 22 2c 20 67 2e  me=%d&txt=1", g.
6b60: 7a 54 6f 70 2c 20 72 69 64 29 3b 0a 20 20 20 20  zTop, rid);.    
6b70: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
6b80: 28 20 73 74 72 63 6d 70 28 7a 4d 69 6d 65 2c 20  ( strcmp(zMime, 
6b90: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66  "application/x-f
6ba0: 6f 73 73 69 6c 2d 77 69 6b 69 22 29 3d 3d 30 20  ossil-wiki")==0 
6bb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 28 22  ){.      if( P("
6bc0: 74 78 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20  txt") ){.       
6bd0: 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65   style_submenu_e
6be0: 6c 65 6d 65 6e 74 28 22 57 69 6b 69 22 2c 20 22  lement("Wiki", "
6bf0: 57 69 6b 69 22 2c 0a 20 20 20 20 20 20 20 20 20  Wiki",.         
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c10: 20 20 20 20 20 22 25 73 2f 61 72 74 69 66 61 63       "%s/artifac
6c20: 74 3f 6e 61 6d 65 3d 25 64 22 2c 20 67 2e 7a 54  t?name=%d", g.zT
6c30: 6f 70 2c 20 72 69 64 29 3b 0a 20 20 20 20 20 20  op, rid);.      
6c40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
6c50: 65 6e 64 65 72 41 73 57 69 6b 69 20 3d 20 31 3b  enderAsWiki = 1;
6c60: 0a 20 20 20 20 20 20 20 20 73 74 79 6c 65 5f 73  .        style_s
6c70: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
6c80: 54 65 78 74 22 2c 20 22 54 65 78 74 22 2c 0a 20  Text", "Text",. 
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73               "%s
6cb0: 2f 61 72 74 69 66 61 63 74 3f 6e 61 6d 65 3d 25  /artifact?name=%
6cc0: 64 26 74 78 74 3d 31 22 2c 20 67 2e 7a 54 6f 70  d&txt=1", g.zTop
6cd0: 2c 20 72 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a  , rid);.      }.
6ce0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 40 20 3c 2f      }.  }.  @ </
6cf0: 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 40 20  blockquote>.  @ 
6d00: 3c 68 72 3e 0a 20 20 63 6f 6e 74 65 6e 74 5f 67  <hr>.  content_g
6d10: 65 74 28 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74  et(rid, &content
6d20: 29 3b 0a 20 20 69 66 28 20 72 65 6e 64 65 72 41  );.  if( renderA
6d30: 73 57 69 6b 69 20 29 7b 0a 20 20 20 20 77 69 6b  sWiki ){.    wik
6d40: 69 5f 63 6f 6e 76 65 72 74 28 26 63 6f 6e 74 65  i_convert(&conte
6d50: 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c  nt, 0, 0);.  }el
6d60: 73 65 20 69 66 28 20 72 65 6e 64 65 72 41 73 48  se if( renderAsH
6d70: 74 6d 6c 20 29 7b 0a 20 20 20 20 40 20 3c 64 69  tml ){.    @ <di
6d80: 76 3e 0a 20 20 20 20 63 67 69 5f 61 70 70 65 6e  v>.    cgi_appen
6d90: 64 5f 63 6f 6e 74 65 6e 74 28 62 6c 6f 62 5f 62  d_content(blob_b
6da0: 75 66 66 65 72 28 26 63 6f 6e 74 65 6e 74 29 2c  uffer(&content),
6db0: 20 62 6c 6f 62 5f 73 69 7a 65 28 26 63 6f 6e 74   blob_size(&cont
6dc0: 65 6e 74 29 29 3b 0a 20 20 20 20 40 20 3c 2f 64  ent));.    @ </d
6dd0: 69 76 3e 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  iv>.  }else{.   
6de0: 20 7a 4d 69 6d 65 20 3d 20 6d 69 6d 65 74 79 70   zMime = mimetyp
6df0: 65 5f 66 72 6f 6d 5f 63 6f 6e 74 65 6e 74 28 26  e_from_content(&
6e00: 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 40 20  content);.    @ 
6e10: 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 20  <blockquote>.   
6e20: 20 69 66 28 20 7a 4d 69 6d 65 3d 3d 30 20 29 7b   if( zMime==0 ){
6e30: 0a 20 20 20 20 20 20 40 20 3c 70 72 65 3e 0a 20  .      @ <pre>. 
6e40: 20 20 20 20 20 40 20 25 68 28 62 6c 6f 62 5f 73       @ %h(blob_s
6e50: 74 72 28 26 63 6f 6e 74 65 6e 74 29 29 0a 20 20  tr(&content)).  
6e60: 20 20 20 20 40 20 3c 2f 70 72 65 3e 0a 20 20 20      @ </pre>.   
6e70: 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75     style_submenu
6e80: 5f 65 6c 65 6d 65 6e 74 28 22 48 65 78 22 2c 22  _element("Hex","
6e90: 48 65 78 22 2c 20 22 25 73 2f 68 65 78 64 75 6d  Hex", "%s/hexdum
6ea0: 70 3f 6e 61 6d 65 3d 25 64 22 2c 20 67 2e 7a 54  p?name=%d", g.zT
6eb0: 6f 70 2c 20 72 69 64 29 3b 0a 20 20 20 20 7d 65  op, rid);.    }e
6ec0: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
6ed0: 7a 4d 69 6d 65 2c 20 22 69 6d 61 67 65 2f 22 2c  zMime, "image/",
6ee0: 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   6)==0 ){.      
6ef0: 40 20 3c 69 6d 67 20 73 72 63 3d 22 25 73 28 67  @ <img src="%s(g
6f00: 2e 7a 42 61 73 65 55 52 4c 29 2f 72 61 77 3f 6e  .zBaseURL)/raw?n
6f10: 61 6d 65 3d 25 64 28 72 69 64 29 26 6d 3d 25 73  ame=%d(rid)&m=%s
6f20: 28 7a 4d 69 6d 65 29 22 3e 3c 2f 69 6d 67 3e 0a  (zMime)"></img>.
6f30: 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d        style_subm
6f40: 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 48 65 78  enu_element("Hex
6f50: 22 2c 22 48 65 78 22 2c 20 22 25 73 2f 68 65 78  ","Hex", "%s/hex
6f60: 64 75 6d 70 3f 6e 61 6d 65 3d 25 64 22 2c 20 67  dump?name=%d", g
6f70: 2e 7a 54 6f 70 2c 20 72 69 64 29 3b 0a 20 20 20  .zTop, rid);.   
6f80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20   }else{.      @ 
6f90: 3c 70 72 65 3e 0a 20 20 20 20 20 20 68 65 78 64  <pre>.      hexd
6fa0: 75 6d 70 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20  ump(&content);. 
6fb0: 20 20 20 20 20 40 20 3c 2f 70 72 65 3e 0a 20 20       @ </pre>.  
6fc0: 20 20 7d 0a 20 20 20 20 40 20 3c 2f 62 6c 6f 63    }.    @ </bloc
6fd0: 6b 71 75 6f 74 65 3e 0a 20 20 7d 0a 20 20 73 74  kquote>.  }.  st
6fe0: 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 20  yle_footer();.} 
6ff0: 20 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45   ../*.** WEBPAGE
7000: 3a 20 74 69 6e 66 6f 0a 2a 2a 20 55 52 4c 3a 20  : tinfo.** URL: 
7010: 2f 74 69 6e 66 6f 3f 6e 61 6d 65 3d 41 52 54 49  /tinfo?name=ARTI
7020: 46 41 43 54 49 44 0a 2a 2a 0a 2a 2a 20 53 68 6f  FACTID.**.** Sho
7030: 77 20 74 68 65 20 64 65 74 61 69 6c 73 20 6f 66  w the details of
7040: 20 61 20 74 69 63 6b 65 74 20 63 68 61 6e 67 65   a ticket change
7050: 20 63 6f 6e 74 72 6f 6c 20 61 72 74 69 66 61 63   control artifac
7060: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 74 69 6e 66 6f  t..*/.void tinfo
7070: 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 69  _page(void){.  i
7080: 6e 74 20 72 69 64 3b 0a 20 20 42 6c 6f 62 20 63  nt rid;.  Blob c
7090: 6f 6e 74 65 6e 74 3b 0a 20 20 63 68 61 72 20 2a  ontent;.  char *
70a0: 7a 44 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63  zDate;.  const c
70b0: 68 61 72 20 2a 7a 55 75 69 64 3b 0a 20 20 63 68  har *zUuid;.  ch
70c0: 61 72 20 7a 54 6b 74 4e 61 6d 65 5b 32 30 5d 3b  ar zTktName[20];
70d0: 0a 20 20 4d 61 6e 69 66 65 73 74 20 6d 3b 0a 0a  .  Manifest m;..
70e0: 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72    login_check_cr
70f0: 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69  edentials();.  i
7100: 66 28 20 21 67 2e 6f 6b 52 64 54 6b 74 20 29 7b  f( !g.okRdTkt ){
7110: 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b   login_needed();
7120: 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 72 69 64   return; }.  rid
7130: 20 3d 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 50   = name_to_rid(P
7140: 44 28 22 6e 61 6d 65 22 2c 22 30 22 29 29 3b 0a  D("name","0"));.
7150: 20 20 69 66 28 20 72 69 64 3d 3d 30 20 29 7b 20    if( rid==0 ){ 
7160: 66 6f 73 73 69 6c 5f 72 65 64 69 72 65 63 74 5f  fossil_redirect_
7170: 68 6f 6d 65 28 29 3b 20 7d 0a 20 20 7a 55 75 69  home(); }.  zUui
7180: 64 20 3d 20 64 62 5f 74 65 78 74 28 22 22 2c 20  d = db_text("", 
7190: 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f  "SELECT uuid FRO
71a0: 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64  M blob WHERE rid
71b0: 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 69 66  =%d", rid);.  if
71c0: 28 20 67 2e 6f 6b 41 64 6d 69 6e 20 29 7b 0a 20  ( g.okAdmin ){. 
71d0: 20 20 20 69 66 28 20 64 62 5f 65 78 69 73 74 73     if( db_exists
71e0: 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  ("SELECT 1 FROM 
71f0: 73 68 75 6e 20 57 48 45 52 45 20 75 75 69 64 3d  shun WHERE uuid=
7200: 27 25 73 27 22 2c 20 7a 55 75 69 64 29 20 29 7b  '%s'", zUuid) ){
7210: 0a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62  .      style_sub
7220: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 55 6e  menu_element("Un
7230: 73 68 75 6e 22 2c 22 55 6e 73 68 75 6e 22 2c 20  shun","Unshun", 
7240: 22 25 73 2f 73 68 75 6e 3f 75 75 69 64 3d 25 73  "%s/shun?uuid=%s
7250: 26 73 75 62 3d 31 22 2c 0a 20 20 20 20 20 20 20  &sub=1",.       
7260: 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 55 75       g.zTop, zUu
7270: 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  id);.    }else{.
7280: 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d        style_subm
7290: 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 53 68 75  enu_element("Shu
72a0: 6e 22 2c 22 53 68 75 6e 22 2c 20 22 25 73 2f 73  n","Shun", "%s/s
72b0: 68 75 6e 3f 73 68 75 6e 3d 25 73 23 61 64 64 73  hun?shun=%s#adds
72c0: 68 75 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  hun",.          
72d0: 20 20 67 2e 7a 54 6f 70 2c 20 7a 55 75 69 64 29    g.zTop, zUuid)
72e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f  ;.    }.  }.  co
72f0: 6e 74 65 6e 74 5f 67 65 74 28 72 69 64 2c 20 26  ntent_get(rid, &
7300: 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20  content);.  if( 
7310: 6d 61 6e 69 66 65 73 74 5f 70 61 72 73 65 28 26  manifest_parse(&
7320: 6d 2c 20 26 63 6f 6e 74 65 6e 74 29 3d 3d 30 20  m, &content)==0 
7330: 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 72 65  ){.    fossil_re
7340: 64 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b 0a 20  direct_home();. 
7350: 20 7d 0a 20 20 69 66 28 20 6d 2e 74 79 70 65 21   }.  if( m.type!
7360: 3d 43 46 54 59 50 45 5f 54 49 43 4b 45 54 20 29  =CFTYPE_TICKET )
7370: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 72 65 64  {.    fossil_red
7380: 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b 0a 20 20  irect_home();.  
7390: 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72  }.  style_header
73a0: 28 22 54 69 63 6b 65 74 20 43 68 61 6e 67 65 20  ("Ticket Change 
73b0: 44 65 74 61 69 6c 73 22 29 3b 0a 20 20 7a 44 61  Details");.  zDa
73c0: 74 65 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20  te = db_text(0, 
73d0: 22 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65  "SELECT datetime
73e0: 28 25 2e 31 32 66 29 22 2c 20 6d 2e 72 44 61 74  (%.12f)", m.rDat
73f0: 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 54 6b  e);.  memcpy(zTk
7400: 74 4e 61 6d 65 2c 20 6d 2e 7a 54 69 63 6b 65 74  tName, m.zTicket
7410: 55 75 69 64 2c 20 31 30 29 3b 0a 20 20 7a 54 6b  Uuid, 10);.  zTk
7420: 74 4e 61 6d 65 5b 31 30 5d 20 3d 20 30 3b 0a 20  tName[10] = 0;. 
7430: 20 40 20 3c 68 32 3e 43 68 61 6e 67 65 73 20 74   @ <h2>Changes t
7440: 6f 20 74 69 63 6b 65 74 20 3c 61 20 68 72 65 66  o ticket <a href
7450: 3d 22 25 73 28 6d 2e 7a 54 69 63 6b 65 74 55 75  ="%s(m.zTicketUu
7460: 69 64 29 22 3e 25 73 28 7a 54 6b 74 4e 61 6d 65  id)">%s(zTktName
7470: 29 3c 2f 61 3e 3c 2f 68 32 3e 0a 20 20 40 0a 20  )</a></h2>.  @. 
7480: 20 40 20 3c 70 3e 42 79 20 25 68 28 6d 2e 7a 55   @ <p>By %h(m.zU
7490: 73 65 72 29 20 6f 6e 20 25 73 28 7a 44 61 74 65  ser) on %s(zDate
74a0: 29 2e 20 20 53 65 65 20 61 6c 73 6f 3a 0a 20 20  ).  See also:.  
74b0: 40 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e  @ <a href="%s(g.
74c0: 7a 54 6f 70 29 2f 61 72 74 69 66 61 63 74 2f 25  zTop)/artifact/%
74d0: 54 28 7a 55 75 69 64 29 22 3e 61 72 74 69 66 61  T(zUuid)">artifa
74e0: 63 74 20 63 6f 6e 74 65 6e 74 3c 2f 61 3e 2c 20  ct content</a>, 
74f0: 61 6e 64 0a 20 20 40 20 3c 61 20 68 72 65 66 3d  and.  @ <a href=
7500: 22 25 73 28 67 2e 7a 54 6f 70 29 2f 74 6b 74 68  "%s(g.zTop)/tkth
7510: 69 73 74 6f 72 79 2f 25 73 28 6d 2e 7a 54 69 63  istory/%s(m.zTic
7520: 6b 65 74 55 75 69 64 29 22 3e 74 69 63 6b 65 74  ketUuid)">ticket
7530: 20 68 69 73 74 6f 72 79 3c 2f 61 3e 0a 20 20 40   history</a>.  @
7540: 20 3c 2f 70 3e 0a 20 20 40 0a 20 20 40 20 3c 6f   </p>.  @.  @ <o
7550: 6c 3e 0a 20 20 66 72 65 65 28 7a 44 61 74 65 29  l>.  free(zDate)
7560: 3b 0a 20 20 74 69 63 6b 65 74 5f 6f 75 74 70 75  ;.  ticket_outpu
7570: 74 5f 63 68 61 6e 67 65 5f 61 72 74 69 66 61 63  t_change_artifac
7580: 74 28 26 6d 29 3b 0a 20 20 6d 61 6e 69 66 65 73  t(&m);.  manifes
7590: 74 5f 63 6c 65 61 72 28 26 6d 29 3b 0a 20 20 73  t_clear(&m);.  s
75a0: 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d  tyle_footer();.}
75b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45  .../*.** WEBPAGE
75c0: 3a 20 69 6e 66 6f 0a 2a 2a 20 55 52 4c 3a 20 69  : info.** URL: i
75d0: 6e 66 6f 2f 41 52 54 49 46 41 43 54 49 44 0a 2a  nfo/ARTIFACTID.*
75e0: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
75f0: 74 20 69 73 20 61 20 61 72 74 69 66 61 63 74 20  t is a artifact 
7600: 49 44 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  ID which might b
7610: 65 20 61 20 62 61 73 65 6c 69 6e 65 20 6f 72 20  e a baseline or 
7620: 61 20 66 69 6c 65 20 6f 72 0a 2a 2a 20 61 20 74  a file or.** a t
7630: 69 63 6b 65 74 20 63 68 61 6e 67 65 73 20 6f 72  icket changes or
7640: 20 61 20 77 69 6b 69 20 65 64 69 74 6f 72 20 6f   a wiki editor o
7650: 72 20 73 6f 6d 65 74 68 69 6e 67 20 65 6c 73 65  r something else
7660: 2e 20 0a 2a 2a 0a 2a 2a 20 46 69 67 75 72 65 20  . .**.** Figure 
7670: 6f 75 74 20 77 68 61 74 20 74 68 65 20 61 72 74  out what the art
7680: 69 66 61 63 74 20 49 44 20 69 73 20 61 6e 64 20  ifact ID is and 
7690: 6a 75 6d 70 20 74 6f 20 69 74 2e 0a 2a 2f 0a 76  jump to it..*/.v
76a0: 6f 69 64 20 69 6e 66 6f 5f 70 61 67 65 28 76 6f  oid info_page(vo
76b0: 69 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  id){.  const cha
76c0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 42 6c 6f 62  r *zName;.  Blob
76d0: 20 75 75 69 64 3b 0a 20 20 69 6e 74 20 72 69 64   uuid;.  int rid
76e0: 2c 20 6e 4e 61 6d 65 3b 0a 20 20 0a 20 20 7a 4e  , nName;.  .  zN
76f0: 61 6d 65 20 3d 20 50 28 22 6e 61 6d 65 22 29 3b  ame = P("name");
7700: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
7710: 29 20 66 6f 73 73 69 6c 5f 72 65 64 69 72 65 63  ) fossil_redirec
7720: 74 5f 68 6f 6d 65 28 29 3b 0a 20 20 6e 4e 61 6d  t_home();.  nNam
7730: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  e = strlen(zName
7740: 29 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3c 34  );.  if( nName<4
7750: 20 7c 7c 20 6e 4e 61 6d 65 3e 55 55 49 44 5f 53   || nName>UUID_S
7760: 49 5a 45 20 7c 7c 20 21 76 61 6c 69 64 61 74 65  IZE || !validate
7770: 31 36 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  16(zName, nName)
7780: 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20   ){.    switch( 
7790: 73 79 6d 5f 74 61 67 5f 74 6f 5f 75 75 69 64 28  sym_tag_to_uuid(
77a0: 7a 4e 61 6d 65 2c 20 26 75 75 69 64 29 20 29 7b  zName, &uuid) ){
77b0: 0a 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 7b  .      case 1: {
77c0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 67 6f 74 20  .        /* got 
77d0: 6f 6e 65 20 55 55 49 44 2c 20 75 73 65 20 69 74  one UUID, use it
77e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   */.        zNam
77f0: 65 20 3d 20 62 6c 6f 62 5f 73 74 72 28 26 75 75  e = blob_str(&uu
7800: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  id);.        bre
7810: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
7820: 20 20 63 61 73 65 20 32 3a 20 7b 0a 20 20 20 20    case 2: {.    
7830: 20 20 20 20 2f 2a 20 67 6f 20 73 6f 6d 65 77 68      /* go somewh
7840: 65 72 65 20 74 6f 20 73 68 6f 77 20 74 68 65 20  ere to show the 
7850: 6d 75 6c 74 69 70 6c 65 20 55 55 49 44 73 20 2a  multiple UUIDs *
7860: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
7870: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
7880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
7890: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
78a0: 20 20 66 6f 73 73 69 6c 5f 72 65 64 69 72 65 63    fossil_redirec
78b0: 74 5f 68 6f 6d 65 28 29 3b 0a 20 20 20 20 20 20  t_home();.      
78c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
78d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
78e0: 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45   db_exists("SELE
78f0: 43 54 20 31 20 46 52 4f 4d 20 74 69 63 6b 65 74  CT 1 FROM ticket
7900: 20 57 48 45 52 45 20 74 6b 74 5f 75 75 69 64 20   WHERE tkt_uuid 
7910: 47 4c 4f 42 20 27 25 73 2a 27 22 2c 20 7a 4e 61  GLOB '%s*'", zNa
7920: 6d 65 29 20 29 7b 0a 20 20 20 20 74 6b 74 76 69  me) ){.    tktvi
7930: 65 77 5f 70 61 67 65 28 29 3b 0a 20 20 20 20 72  ew_page();.    r
7940: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 69 64  eturn;.  }.  rid
7950: 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45   = db_int(0, "SE
7960: 4c 45 43 54 20 72 69 64 20 46 52 4f 4d 20 62 6c  LECT rid FROM bl
7970: 6f 62 20 57 48 45 52 45 20 75 75 69 64 20 47 4c  ob WHERE uuid GL
7980: 4f 42 20 27 25 73 2a 27 22 2c 20 7a 4e 61 6d 65  OB '%s*'", zName
7990: 29 3b 0a 20 20 69 66 28 20 72 69 64 3d 3d 30 20  );.  if( rid==0 
79a0: 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f 68 65 61  ){.    style_hea
79b0: 64 65 72 28 22 42 72 6f 6b 65 6e 20 4c 69 6e 6b  der("Broken Link
79c0: 22 29 3b 0a 20 20 20 20 40 20 3c 70 3e 4e 6f 20  ");.    @ <p>No 
79d0: 73 75 63 68 20 6f 62 6a 65 63 74 3a 20 25 68 28  such object: %h(
79e0: 7a 4e 61 6d 65 29 3c 2f 70 3e 0a 20 20 20 20 73  zName)</p>.    s
79f0: 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20  tyle_footer();. 
7a00: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
7a10: 20 69 66 28 20 64 62 5f 65 78 69 73 74 73 28 22   if( db_exists("
7a20: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 6d 6c  SELECT 1 FROM ml
7a30: 69 6e 6b 20 57 48 45 52 45 20 6d 69 64 3d 25 64  ink WHERE mid=%d
7a40: 22 2c 20 72 69 64 29 20 29 7b 0a 20 20 20 20 63  ", rid) ){.    c
7a50: 69 5f 70 61 67 65 28 29 3b 0a 20 20 7d 65 6c 73  i_page();.  }els
7a60: 65 0a 20 20 69 66 28 20 64 62 5f 65 78 69 73 74  e.  if( db_exist
7a70: 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  s("SELECT 1 FROM
7a80: 20 74 61 67 78 72 65 66 20 4a 4f 49 4e 20 74 61   tagxref JOIN ta
7a90: 67 20 55 53 49 4e 47 28 74 61 67 69 64 29 22 0a  g USING(tagid)".
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ab0: 22 20 57 48 45 52 45 20 72 69 64 3d 25 64 20 41  " WHERE rid=%d A
7ac0: 4e 44 20 74 61 67 6e 61 6d 65 20 4c 49 4b 45 20  ND tagname LIKE 
7ad0: 27 77 69 6b 69 2d 25 25 27 22 2c 20 72 69 64 29  'wiki-%%'", rid)
7ae0: 20 29 7b 0a 20 20 20 20 77 69 6e 66 6f 5f 70 61   ){.    winfo_pa
7af0: 67 65 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20  ge();.  }else.  
7b00: 69 66 28 20 64 62 5f 65 78 69 73 74 73 28 22 53  if( db_exists("S
7b10: 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 74 61 67  ELECT 1 FROM tag
7b20: 78 72 65 66 20 4a 4f 49 4e 20 74 61 67 20 55 53  xref JOIN tag US
7b30: 49 4e 47 28 74 61 67 69 64 29 22 0a 20 20 20 20  ING(tagid)".    
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
7b50: 45 52 45 20 72 69 64 3d 25 64 20 41 4e 44 20 74  ERE rid=%d AND t
7b60: 61 67 6e 61 6d 65 20 4c 49 4b 45 20 27 74 6b 74  agname LIKE 'tkt
7b70: 2d 25 25 27 22 2c 20 72 69 64 29 20 29 7b 0a 20  -%%'", rid) ){. 
7b80: 20 20 20 74 69 6e 66 6f 5f 70 61 67 65 28 29 3b     tinfo_page();
7b90: 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 64  .  }else.  if( d
7ba0: 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54  b_exists("SELECT
7bb0: 20 31 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48   1 FROM plink WH
7bc0: 45 52 45 20 63 69 64 3d 25 64 22 2c 20 72 69 64  ERE cid=%d", rid
7bd0: 29 20 29 7b 0a 20 20 20 20 63 69 5f 70 61 67 65  ) ){.    ci_page
7be0: 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66  ();.  }else.  if
7bf0: 28 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c  ( db_exists("SEL
7c00: 45 43 54 20 31 20 46 52 4f 4d 20 70 6c 69 6e 6b  ECT 1 FROM plink
7c10: 20 57 48 45 52 45 20 70 69 64 3d 25 64 22 2c 20   WHERE pid=%d", 
7c20: 72 69 64 29 20 29 7b 0a 20 20 20 20 63 69 5f 70  rid) ){.    ci_p
7c30: 61 67 65 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 20  age();.  }else. 
7c40: 20 7b 0a 20 20 20 20 61 72 74 69 66 61 63 74 5f   {.    artifact_
7c50: 70 61 67 65 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  page();.  }.}../
7c60: 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 63 69  *.** WEBPAGE: ci
7c70: 5f 65 64 69 74 0a 2a 2a 20 55 52 4c 3a 20 20 63  _edit.** URL:  c
7c80: 69 5f 65 64 69 74 3f 72 3d 52 49 44 26 63 3d 4e  i_edit?r=RID&c=N
7c90: 45 57 43 4f 4d 4d 45 4e 54 26 75 3d 4e 45 57 55  EWCOMMENT&u=NEWU
7ca0: 53 45 52 0a 2a 2a 0a 2a 2a 20 50 72 65 73 65 6e  SER.**.** Presen
7cb0: 74 20 61 20 64 69 61 6c 6f 67 20 66 6f 72 20 75  t a dialog for u
7cc0: 70 64 61 74 69 6e 67 20 70 72 6f 70 65 72 74 69  pdating properti
7cd0: 65 73 20 6f 66 20 61 20 62 61 73 65 6c 69 6e 65  es of a baseline
7ce0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 54  :.**.**     *  T
7cf0: 68 65 20 63 68 65 63 6b 2d 69 6e 20 75 73 65 72  he check-in user
7d00: 0a 2a 2a 20 20 20 20 20 2a 20 20 54 68 65 20 63  .**     *  The c
7d10: 68 65 63 6b 2d 69 6e 20 63 6f 6d 6d 65 6e 74 0a  heck-in comment.
7d20: 2a 2a 20 20 20 20 20 2a 20 20 54 68 65 20 62 61  **     *  The ba
7d30: 63 6b 67 72 6f 75 6e 64 20 63 6f 6c 6f 72 2e 0a  ckground color..
7d40: 2a 2f 0a 76 6f 69 64 20 63 69 5f 65 64 69 74 5f  */.void ci_edit_
7d50: 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e  page(void){.  in
7d60: 74 20 72 69 64 3b 0a 20 20 63 6f 6e 73 74 20 63  t rid;.  const c
7d70: 68 61 72 20 2a 7a 43 6f 6d 6d 65 6e 74 3b 20 20  har *zComment;  
7d80: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7d90: 74 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  t comment on the
7da0: 20 63 68 65 63 6b 2d 69 6e 20 2a 2f 0a 20 20 63   check-in */.  c
7db0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 43  onst char *zNewC
7dc0: 6f 6d 6d 65 6e 74 3b 20 20 20 20 20 20 2f 2a 20  omment;      /* 
7dd0: 52 65 76 69 73 65 64 20 63 68 65 63 6b 2d 69 6e  Revised check-in
7de0: 20 63 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f   comment */.  co
7df0: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 3b  nst char *zUser;
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7e10: 75 72 72 65 6e 74 20 75 73 65 72 20 66 6f 72 20  urrent user for 
7e20: 74 68 65 20 63 68 65 63 6b 2d 69 6e 20 2a 2f 0a  the check-in */.
7e30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
7e40: 65 77 55 73 65 72 3b 20 20 20 20 20 20 20 20 20  ewUser;         
7e50: 2f 2a 20 52 65 76 69 73 65 64 20 75 73 65 72 20  /* Revised user 
7e60: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7e70: 2a 7a 44 61 74 65 3b 20 20 20 20 20 20 20 20 20  *zDate;         
7e80: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 64 61     /* Current da
7e90: 74 65 20 6f 66 20 74 68 65 20 63 68 65 63 6b 2d  te of the check-
7ea0: 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  in */.  const ch
7eb0: 61 72 20 2a 7a 4e 65 77 44 61 74 65 3b 20 20 20  ar *zNewDate;   
7ec0: 20 20 20 20 20 20 2f 2a 20 52 65 76 69 73 65 64        /* Revised
7ed0: 20 63 68 65 63 6b 2d 69 6e 20 64 61 74 65 20 2a   check-in date *
7ee0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
7ef0: 7a 43 6f 6c 6f 72 3b 20 20 20 20 20 20 20 0a 20  zColor;       . 
7f00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
7f10: 77 43 6f 6c 6f 72 3b 0a 20 20 63 6f 6e 73 74 20  wColor;.  const 
7f20: 63 68 61 72 20 2a 7a 4e 65 77 54 61 67 46 6c 61  char *zNewTagFla
7f30: 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  g;.  const char 
7f40: 2a 7a 4e 65 77 54 61 67 3b 0a 20 20 63 6f 6e 73  *zNewTag;.  cons
7f50: 74 20 63 68 61 72 20 2a 7a 4e 65 77 42 72 46 6c  t char *zNewBrFl
7f60: 61 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ag;.  const char
7f70: 20 2a 7a 4e 65 77 42 72 61 6e 63 68 3b 0a 20 20   *zNewBranch;.  
7f80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6c 6f  const char *zClo
7f90: 73 65 46 6c 61 67 3b 0a 20 20 69 6e 74 20 66 50  seFlag;.  int fP
7fa0: 72 6f 70 61 67 61 74 65 43 6f 6c 6f 72 3b 0a 20  ropagateColor;. 
7fb0: 20 63 68 61 72 20 2a 7a 55 75 69 64 3b 0a 20 20   char *zUuid;.  
7fc0: 42 6c 6f 62 20 63 6f 6d 6d 65 6e 74 3b 0a 20 20  Blob comment;.  
7fd0: 53 74 6d 74 20 71 3b 0a 20 20 73 74 61 74 69 63  Stmt q;.  static
7fe0: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 53 61   const struct Sa
7ff0: 6d 70 6c 65 43 6f 6c 6f 72 73 20 7b 0a 20 20 20  mpleColors {.   
8000: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
8010: 4e 61 6d 65 3b 0a 20 20 20 20 20 63 6f 6e 73 74  Name;.     const
8020: 20 63 68 61 72 20 2a 7a 43 6f 6c 6f 72 3b 0a 20   char *zColor;. 
8030: 20 7d 20 61 43 6f 6c 6f 72 5b 5d 20 3d 20 7b 0a   } aColor[] = {.
8040: 20 20 20 20 20 7b 20 22 28 6e 6f 6e 65 29 22 2c       { "(none)",
8050: 20 20 22 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22    "" },.     { "
8060: 23 66 32 64 63 64 63 22 2c 20 22 23 66 32 64 63  #f2dcdc", "#f2dc
8070: 64 63 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 23  dc" },.     { "#
8080: 66 30 66 66 63 30 22 2c 20 22 23 66 30 66 66 63  f0ffc0", "#f0ffc
8090: 30 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 23 62  0" },.     { "#b
80a0: 64 65 35 64 36 22 2c 20 22 23 62 64 65 35 64 36  de5d6", "#bde5d6
80b0: 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 23 63 30  " },.     { "#c0
80c0: 66 66 63 30 22 2c 20 22 23 63 30 66 66 63 30 22  ffc0", "#c0ffc0"
80d0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 23 63 30 66   },.     { "#c0f
80e0: 66 66 30 22 2c 20 22 23 63 30 66 66 66 30 22 20  ff0", "#c0fff0" 
80f0: 7d 2c 0a 20 20 20 20 20 7b 20 22 23 63 30 66 30  },.     { "#c0f0
8100: 66 66 22 2c 20 22 23 63 30 66 30 66 66 22 20 7d  ff", "#c0f0ff" }
8110: 2c 0a 20 20 20 20 20 7b 20 22 23 64 30 63 30 66  ,.     { "#d0c0f
8120: 66 22 2c 20 22 23 64 30 63 30 66 66 22 20 7d 2c  f", "#d0c0ff" },
8130: 0a 20 20 20 20 20 7b 20 22 23 66 66 63 30 66 66  .     { "#ffc0ff
8140: 22 2c 20 22 23 66 66 63 30 66 66 22 20 7d 2c 0a  ", "#ffc0ff" },.
8150: 20 20 20 20 20 7b 20 22 23 66 66 63 30 64 30 22       { "#ffc0d0"
8160: 2c 20 22 23 66 66 63 30 64 30 22 20 7d 2c 0a 20  , "#ffc0d0" },. 
8170: 20 20 20 20 7b 20 22 23 66 66 66 30 63 30 22 2c      { "#fff0c0",
8180: 20 22 23 66 66 66 30 63 30 22 20 7d 2c 0a 20 20   "#fff0c0" },.  
8190: 20 20 20 7b 20 22 23 63 30 63 30 63 30 22 2c 20     { "#c0c0c0", 
81a0: 22 23 63 30 63 30 63 30 22 20 7d 2c 0a 20 20 7d  "#c0c0c0" },.  }
81b0: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 6f 72 20 3d  ;.  int nColor =
81c0: 20 73 69 7a 65 6f 66 28 61 43 6f 6c 6f 72 29 2f   sizeof(aColor)/
81d0: 73 69 7a 65 6f 66 28 61 43 6f 6c 6f 72 5b 30 5d  sizeof(aColor[0]
81e0: 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 0a 20  );.  int i;.  . 
81f0: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65   login_check_cre
8200: 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66  dentials();.  if
8210: 28 20 21 67 2e 6f 6b 57 72 69 74 65 20 29 7b 20  ( !g.okWrite ){ 
8220: 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20  login_needed(); 
8230: 72 65 74 75 72 6e 3b 20 7d 0a 20 20 72 69 64 20  return; }.  rid 
8240: 3d 20 61 74 6f 69 28 50 44 28 22 72 22 2c 22 30  = atoi(PD("r","0
8250: 22 29 29 3b 0a 20 20 7a 55 75 69 64 20 3d 20 64  "));.  zUuid = d
8260: 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43  b_text(0, "SELEC
8270: 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62  T uuid FROM blob
8280: 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20   WHERE rid=%d", 
8290: 72 69 64 29 3b 0a 20 20 7a 43 6f 6d 6d 65 6e 74  rid);.  zComment
82a0: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53   = db_text(0, "S
82b0: 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28 65  ELECT coalesce(e
82c0: 63 6f 6d 6d 65 6e 74 2c 63 6f 6d 6d 65 6e 74 29  comment,comment)
82d0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
82e0: 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f            "  FRO
82f0: 4d 20 65 76 65 6e 74 20 57 48 45 52 45 20 6f 62  M event WHERE ob
8300: 6a 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20  jid=%d", rid);. 
8310: 20 69 66 28 20 7a 43 6f 6d 6d 65 6e 74 3d 3d 30   if( zComment==0
8320: 20 29 20 66 6f 73 73 69 6c 5f 72 65 64 69 72 65   ) fossil_redire
8330: 63 74 5f 68 6f 6d 65 28 29 3b 0a 20 20 69 66 28  ct_home();.  if(
8340: 20 50 28 22 63 61 6e 63 65 6c 22 29 20 29 7b 0a   P("cancel") ){.
8350: 20 20 20 20 63 67 69 5f 72 65 64 69 72 65 63 74      cgi_redirect
8360: 66 28 22 63 69 3f 6e 61 6d 65 3d 25 64 22 2c 20  f("ci?name=%d", 
8370: 72 69 64 29 3b 0a 20 20 7d 0a 20 20 7a 4e 65 77  rid);.  }.  zNew
8380: 43 6f 6d 6d 65 6e 74 20 3d 20 50 44 28 22 63 22  Comment = PD("c"
8390: 2c 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 7a 55  ,zComment);.  zU
83a0: 73 65 72 20 3d 20 64 62 5f 74 65 78 74 28 30 2c  ser = db_text(0,
83b0: 20 22 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63   "SELECT coalesc
83c0: 65 28 65 75 73 65 72 2c 75 73 65 72 29 22 0a 20  e(euser,user)". 
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83e0: 20 20 20 20 22 20 20 46 52 4f 4d 20 65 76 65 6e      "  FROM even
83f0: 74 20 57 48 45 52 45 20 6f 62 6a 69 64 3d 25 64  t WHERE objid=%d
8400: 22 2c 20 72 69 64 29 3b 0a 20 20 69 66 28 20 7a  ", rid);.  if( z
8410: 55 73 65 72 3d 3d 30 20 29 20 66 6f 73 73 69 6c  User==0 ) fossil
8420: 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d 65 28 29  _redirect_home()
8430: 3b 0a 20 20 7a 4e 65 77 55 73 65 72 20 3d 20 50  ;.  zNewUser = P
8440: 44 28 22 75 22 2c 7a 55 73 65 72 29 3b 0a 20 20  D("u",zUser);.  
8450: 7a 44 61 74 65 20 3d 20 64 62 5f 74 65 78 74 28  zDate = db_text(
8460: 30 2c 20 22 53 45 4c 45 43 54 20 64 61 74 65 74  0, "SELECT datet
8470: 69 6d 65 28 6d 74 69 6d 65 29 22 0a 20 20 20 20  ime(mtime)".    
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8490: 20 22 20 20 46 52 4f 4d 20 65 76 65 6e 74 20 57   "  FROM event W
84a0: 48 45 52 45 20 6f 62 6a 69 64 3d 25 64 22 2c 20  HERE objid=%d", 
84b0: 72 69 64 29 3b 0a 20 20 69 66 28 20 7a 44 61 74  rid);.  if( zDat
84c0: 65 3d 3d 30 20 29 20 66 6f 73 73 69 6c 5f 72 65  e==0 ) fossil_re
84d0: 64 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b 0a 20  direct_home();. 
84e0: 20 7a 4e 65 77 44 61 74 65 20 3d 20 50 44 28 22   zNewDate = PD("
84f0: 64 74 22 2c 7a 44 61 74 65 29 3b 0a 20 20 7a 43  dt",zDate);.  zC
8500: 6f 6c 6f 72 20 3d 20 64 62 5f 74 65 78 74 28 22  olor = db_text("
8510: 22 2c 20 22 53 45 4c 45 43 54 20 62 67 63 6f 6c  ", "SELECT bgcol
8520: 6f 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  or".            
8530: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46              "  F
8540: 52 4f 4d 20 65 76 65 6e 74 20 57 48 45 52 45 20  ROM event WHERE 
8550: 6f 62 6a 69 64 3d 25 64 22 2c 20 72 69 64 29 3b  objid=%d", rid);
8560: 0a 20 20 7a 4e 65 77 43 6f 6c 6f 72 20 3d 20 50  .  zNewColor = P
8570: 44 28 22 63 6c 72 22 2c 7a 43 6f 6c 6f 72 29 3b  D("clr",zColor);
8580: 0a 20 20 66 50 72 6f 70 61 67 61 74 65 43 6f 6c  .  fPropagateCol
8590: 6f 72 20 3d 20 50 28 22 70 63 6c 72 22 29 21 3d  or = P("pclr")!=
85a0: 30 3b 0a 20 20 7a 4e 65 77 54 61 67 46 6c 61 67  0;.  zNewTagFlag
85b0: 20 3d 20 50 28 22 6e 65 77 74 61 67 22 29 20 3f   = P("newtag") ?
85c0: 20 22 20 63 68 65 63 6b 65 64 22 20 3a 20 22 22   " checked" : ""
85d0: 3b 0a 20 20 7a 4e 65 77 54 61 67 20 3d 20 50 44  ;.  zNewTag = PD
85e0: 28 22 74 61 67 6e 61 6d 65 22 2c 22 22 29 3b 0a  ("tagname","");.
85f0: 20 20 7a 4e 65 77 42 72 46 6c 61 67 20 3d 20 50    zNewBrFlag = P
8600: 28 22 6e 65 77 62 72 22 29 20 3f 20 22 20 63 68  ("newbr") ? " ch
8610: 65 63 6b 65 64 22 20 3a 20 22 22 3b 0a 20 20 7a  ecked" : "";.  z
8620: 4e 65 77 42 72 61 6e 63 68 20 3d 20 50 44 28 22  NewBranch = PD("
8630: 62 72 6e 61 6d 65 22 2c 22 22 29 3b 0a 20 20 7a  brname","");.  z
8640: 43 6c 6f 73 65 46 6c 61 67 20 3d 20 50 28 22 63  CloseFlag = P("c
8650: 6c 6f 73 65 22 29 20 3f 20 22 20 63 68 65 63 6b  lose") ? " check
8660: 65 64 22 20 3a 20 22 22 3b 0a 20 20 69 66 28 20  ed" : "";.  if( 
8670: 50 28 22 61 70 70 6c 79 22 29 20 29 7b 0a 20 20  P("apply") ){.  
8680: 20 20 42 6c 6f 62 20 63 74 72 6c 3b 0a 20 20 20    Blob ctrl;.   
8690: 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20   char *zDate;.  
86a0: 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b    int nChng = 0;
86b0: 0a 0a 20 20 20 20 6c 6f 67 69 6e 5f 76 65 72 69  ..    login_veri
86c0: 66 79 5f 63 73 72 66 5f 73 65 63 72 65 74 28 29  fy_csrf_secret()
86d0: 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  ;.    blob_zero(
86e0: 26 63 74 72 6c 29 3b 0a 20 20 20 20 7a 44 61 74  &ctrl);.    zDat
86f0: 65 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22  e = db_text(0, "
8700: 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28  SELECT datetime(
8710: 27 6e 6f 77 27 29 22 29 3b 0a 20 20 20 20 7a 44  'now')");.    zD
8720: 61 74 65 5b 31 30 5d 20 3d 20 27 54 27 3b 0a 20  ate[10] = 'T';. 
8730: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
8740: 26 63 74 72 6c 2c 20 22 44 20 25 73 5c 6e 22 2c  &ctrl, "D %s\n",
8750: 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 64 62 5f   zDate);.    db_
8760: 6d 75 6c 74 69 5f 65 78 65 63 28 22 43 52 45 41  multi_exec("CREA
8770: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 6e 65  TE TEMP TABLE ne
8780: 77 74 61 67 73 28 74 61 67 20 55 4e 49 51 55 45  wtags(tag UNIQUE
8790: 2c 20 70 72 65 66 69 78 2c 20 76 61 6c 75 65 29  , prefix, value)
87a0: 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77  ");.    if( zNew
87b0: 43 6f 6c 6f 72 5b 30 5d 20 26 26 20 73 74 72 63  Color[0] && strc
87c0: 6d 70 28 7a 43 6f 6c 6f 72 2c 7a 4e 65 77 43 6f  mp(zColor,zNewCo
87d0: 6c 6f 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  lor)!=0 ){.     
87e0: 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 20 3d   char *zPrefix =
87f0: 20 22 2b 22 3b 0a 20 20 20 20 20 20 69 66 28 20   "+";.      if( 
8800: 66 50 72 6f 70 61 67 61 74 65 43 6f 6c 6f 72 20  fPropagateColor 
8810: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 72 65 66  ){.        zPref
8820: 69 78 20 3d 20 22 2a 22 3b 0a 20 20 20 20 20 20  ix = "*";.      
8830: 7d 0a 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69  }.      db_multi
8840: 5f 65 78 65 63 28 22 52 45 50 4c 41 43 45 20 49  _exec("REPLACE I
8850: 4e 54 4f 20 6e 65 77 74 61 67 73 20 56 41 4c 55  NTO newtags VALU
8860: 45 53 28 27 62 67 63 6f 6c 6f 72 27 2c 25 51 2c  ES('bgcolor',%Q,
8870: 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %Q)",.          
8880: 20 20 20 20 20 20 20 20 20 20 7a 50 72 65 66 69            zPrefi
8890: 78 2c 20 7a 4e 65 77 43 6f 6c 6f 72 29 3b 0a 20  x, zNewColor);. 
88a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 65     }.    if( zNe
88b0: 77 43 6f 6c 6f 72 5b 30 5d 3d 3d 30 20 26 26 20  wColor[0]==0 && 
88c0: 7a 43 6f 6c 6f 72 5b 30 5d 21 3d 30 20 29 7b 0a  zColor[0]!=0 ){.
88d0: 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65        db_multi_e
88e0: 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54  xec("REPLACE INT
88f0: 4f 20 6e 65 77 74 61 67 73 20 56 41 4c 55 45 53  O newtags VALUES
8900: 28 27 62 67 63 6f 6c 6f 72 27 2c 27 2d 27 2c 4e  ('bgcolor','-',N
8910: 55 4c 4c 29 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ULL)");.    }.  
8920: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6f    if( strcmp(zCo
8930: 6d 6d 65 6e 74 2c 7a 4e 65 77 43 6f 6d 6d 65 6e  mment,zNewCommen
8940: 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  t)!=0 ){.      d
8950: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 52 45  b_multi_exec("RE
8960: 50 4c 41 43 45 20 49 4e 54 4f 20 6e 65 77 74 61  PLACE INTO newta
8970: 67 73 20 56 41 4c 55 45 53 28 27 63 6f 6d 6d 65  gs VALUES('comme
8980: 6e 74 27 2c 27 2b 27 2c 25 51 29 22 2c 0a 20 20  nt','+',%Q)",.  
8990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89a0: 20 20 7a 4e 65 77 43 6f 6d 6d 65 6e 74 29 3b 0a    zNewComment);.
89b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
89c0: 72 63 6d 70 28 7a 44 61 74 65 2c 7a 4e 65 77 44  rcmp(zDate,zNewD
89d0: 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ate)!=0 ){.     
89e0: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
89f0: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6e 65 77  REPLACE INTO new
8a00: 74 61 67 73 20 56 41 4c 55 45 53 28 27 64 61 74  tags VALUES('dat
8a10: 65 27 2c 27 2b 27 2c 25 51 29 22 2c 0a 20 20 20  e','+',%Q)",.   
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 7a 4e 65 77 44 61 74 65 29 3b 0a 20 20 20 20   zNewDate);.    
8a40: 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
8a50: 28 7a 55 73 65 72 2c 7a 4e 65 77 55 73 65 72 29  (zUser,zNewUser)
8a60: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 62 5f  !=0 ){.      db_
8a70: 6d 75 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c  multi_exec("REPL
8a80: 41 43 45 20 49 4e 54 4f 20 6e 65 77 74 61 67 73  ACE INTO newtags
8a90: 20 56 41 4c 55 45 53 28 27 75 73 65 72 27 2c 27   VALUES('user','
8aa0: 2b 27 2c 25 51 29 22 2c 20 7a 4e 65 77 55 73 65  +',%Q)", zNewUse
8ab0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  r);.    }.    db
8ac0: 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20  _prepare(&q,.   
8ad0: 20 20 20 20 22 53 45 4c 45 43 54 20 74 61 67 2e      "SELECT tag.
8ae0: 74 61 67 69 64 2c 20 74 61 67 6e 61 6d 65 20 46  tagid, tagname F
8af0: 52 4f 4d 20 74 61 67 78 72 65 66 2c 20 74 61 67  ROM tagxref, tag
8b00: 22 0a 20 20 20 20 20 20 20 22 20 57 48 45 52 45  ".       " WHERE
8b10: 20 74 61 67 78 72 65 66 2e 72 69 64 3d 25 64 20   tagxref.rid=%d 
8b20: 41 4e 44 20 74 61 67 74 79 70 65 3e 30 20 41 4e  AND tagtype>0 AN
8b30: 44 20 74 61 67 78 72 65 66 2e 74 61 67 69 64 3d  D tagxref.tagid=
8b40: 74 61 67 2e 74 61 67 69 64 22 2c 0a 20 20 20 20  tag.tagid",.    
8b50: 20 20 20 72 69 64 0a 20 20 20 20 29 3b 0a 20 20     rid.    );.  
8b60: 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70    while( db_step
8b70: 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  (&q)==SQLITE_ROW
8b80: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61   ){.      int ta
8b90: 67 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  gid = db_column_
8ba0: 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20  int(&q, 0);.    
8bb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
8bc0: 61 67 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  ag = db_column_t
8bd0: 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 20 20 20  ext(&q, 1);.    
8be0: 20 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 33 30    char zLabel[30
8bf0: 5d 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ];.      sprintf
8c00: 28 7a 4c 61 62 65 6c 2c 20 22 63 25 64 22 2c 20  (zLabel, "c%d", 
8c10: 74 61 67 69 64 29 3b 0a 20 20 20 20 20 20 69 66  tagid);.      if
8c20: 28 20 50 28 7a 4c 61 62 65 6c 29 20 29 7b 0a 20  ( P(zLabel) ){. 
8c30: 20 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f         db_multi_
8c40: 65 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e  exec("REPLACE IN
8c50: 54 4f 20 6e 65 77 74 61 67 73 20 56 41 4c 55 45  TO newtags VALUE
8c60: 53 28 25 51 2c 27 2d 27 2c 4e 55 4c 4c 29 22 2c  S(%Q,'-',NULL)",
8c70: 20 7a 54 61 67 29 3b 0a 20 20 20 20 20 20 7d 0a   zTag);.      }.
8c80: 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e      }.    db_fin
8c90: 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 20 20 69  alize(&q);.    i
8ca0: 66 28 20 7a 43 6c 6f 73 65 46 6c 61 67 5b 30 5d  f( zCloseFlag[0]
8cb0: 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 6d 75 6c   ){.      db_mul
8cc0: 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43 45  ti_exec("REPLACE
8cd0: 20 49 4e 54 4f 20 6e 65 77 74 61 67 73 20 56 41   INTO newtags VA
8ce0: 4c 55 45 53 28 27 63 6c 6f 73 65 64 27 2c 27 2b  LUES('closed','+
8cf0: 27 2c 4e 55 4c 4c 29 22 29 3b 0a 20 20 20 20 7d  ',NULL)");.    }
8d00: 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 54 61 67  .    if( zNewTag
8d10: 46 6c 61 67 5b 30 5d 20 29 7b 0a 20 20 20 20 20  Flag[0] ){.     
8d20: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
8d30: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6e 65 77  REPLACE INTO new
8d40: 74 61 67 73 20 56 41 4c 55 45 53 28 27 73 79 6d  tags VALUES('sym
8d50: 2d 25 71 27 2c 27 2b 27 2c 4e 55 4c 4c 29 22 2c  -%q','+',NULL)",
8d60: 20 7a 4e 65 77 54 61 67 29 3b 0a 20 20 20 20 7d   zNewTag);.    }
8d70: 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 42 72 46  .    if( zNewBrF
8d80: 6c 61 67 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  lag[0] ){.      
8d90: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20  db_multi_exec(. 
8da0: 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45 20         "REPLACE 
8db0: 49 4e 54 4f 20 6e 65 77 74 61 67 73 20 22 0a 20  INTO newtags ". 
8dc0: 20 20 20 20 20 20 20 22 20 53 45 4c 45 43 54 20         " SELECT 
8dd0: 74 61 67 6e 61 6d 65 2c 20 27 2d 27 2c 20 4e 55  tagname, '-', NU
8de0: 4c 4c 20 46 52 4f 4d 20 74 61 67 78 72 65 66 2c  LL FROM tagxref,
8df0: 20 74 61 67 22 0a 20 20 20 20 20 20 20 20 22 20   tag".        " 
8e00: 20 57 48 45 52 45 20 74 61 67 78 72 65 66 2e 72   WHERE tagxref.r
8e10: 69 64 3d 25 64 20 41 4e 44 20 74 61 67 74 79 70  id=%d AND tagtyp
8e20: 65 3d 3d 32 22 0a 20 20 20 20 20 20 20 20 22 20  e==2".        " 
8e30: 20 20 20 41 4e 44 20 74 61 67 6e 61 6d 65 20 47     AND tagname G
8e40: 4c 4f 42 20 27 73 79 6d 2d 2a 27 22 0a 20 20 20  LOB 'sym-*'".   
8e50: 20 20 20 20 20 22 20 20 20 20 41 4e 44 20 74 61       "    AND ta
8e60: 67 2e 74 61 67 69 64 3d 74 61 67 78 72 65 66 2e  g.tagid=tagxref.
8e70: 74 61 67 69 64 22 2c 0a 20 20 20 20 20 20 20 20  tagid",.        
8e80: 72 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  rid.      );.   
8e90: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
8ea0: 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6e  ("REPLACE INTO n
8eb0: 65 77 74 61 67 73 20 56 41 4c 55 45 53 28 27 62  ewtags VALUES('b
8ec0: 72 61 6e 63 68 27 2c 27 2a 27 2c 25 51 29 22 2c  ranch','*',%Q)",
8ed0: 20 7a 4e 65 77 42 72 61 6e 63 68 29 3b 0a 20 20   zNewBranch);.  
8ee0: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
8ef0: 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  c("REPLACE INTO 
8f00: 6e 65 77 74 61 67 73 20 56 41 4c 55 45 53 28 27  newtags VALUES('
8f10: 73 79 6d 2d 25 71 27 2c 27 2a 27 2c 4e 55 4c 4c  sym-%q','*',NULL
8f20: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
8f30: 20 20 20 20 20 20 20 20 7a 4e 65 77 42 72 61 6e          zNewBran
8f40: 63 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  ch);.    }.    d
8f50: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22 53  b_prepare(&q, "S
8f60: 45 4c 45 43 54 20 74 61 67 2c 20 70 72 65 66 69  ELECT tag, prefi
8f70: 78 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20 6e 65  x, value FROM ne
8f80: 77 74 61 67 73 22 0a 20 20 20 20 20 20 20 20 20  wtags".         
8f90: 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
8fa0: 52 20 42 59 20 70 72 65 66 69 78 20 7c 7c 20 74  R BY prefix || t
8fb0: 61 67 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ag");.    while(
8fc0: 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51   db_step(&q)==SQ
8fd0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
8fe0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
8ff0: 61 67 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  ag = db_column_t
9000: 65 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20  ext(&q, 0);.    
9010: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
9020: 72 65 66 69 78 20 3d 20 64 62 5f 63 6f 6c 75 6d  refix = db_colum
9030: 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20  n_text(&q, 1);. 
9040: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
9050: 2a 7a 56 61 6c 75 65 20 3d 20 64 62 5f 63 6f 6c  *zValue = db_col
9060: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32 29 3b  umn_text(&q, 2);
9070: 0a 20 20 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a  .      nChng++;.
9080: 20 20 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65        if( zValue
9090: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62   ){.        blob
90a0: 5f 61 70 70 65 6e 64 66 28 26 63 74 72 6c 2c 20  _appendf(&ctrl, 
90b0: 22 54 20 25 73 25 46 20 25 73 20 25 46 5c 6e 22  "T %s%F %s %F\n"
90c0: 2c 20 7a 50 72 65 66 69 78 2c 20 7a 54 61 67 2c  , zPrefix, zTag,
90d0: 20 7a 55 75 69 64 2c 20 7a 56 61 6c 75 65 29 3b   zUuid, zValue);
90e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
90f0: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
9100: 64 66 28 26 63 74 72 6c 2c 20 22 54 20 25 73 25  df(&ctrl, "T %s%
9110: 46 20 25 73 5c 6e 22 2c 20 7a 50 72 65 66 69 78  F %s\n", zPrefix
9120: 2c 20 7a 54 61 67 2c 20 7a 55 75 69 64 29 3b 0a  , zTag, zUuid);.
9130: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9140: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71    db_finalize(&q
9150: 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 68 6e 67  );.    if( nChng
9160: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
9170: 6e 72 69 64 3b 0a 20 20 20 20 20 20 42 6c 6f 62  nrid;.      Blob
9180: 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 62 6c   cksum;.      bl
9190: 6f 62 5f 61 70 70 65 6e 64 66 28 26 63 74 72 6c  ob_appendf(&ctrl
91a0: 2c 20 22 55 20 25 46 5c 6e 22 2c 20 67 2e 7a 4c  , "U %F\n", g.zL
91b0: 6f 67 69 6e 29 3b 0a 20 20 20 20 20 20 6d 64 35  ogin);.      md5
91c0: 73 75 6d 5f 62 6c 6f 62 28 26 63 74 72 6c 2c 20  sum_blob(&ctrl, 
91d0: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 62  &cksum);.      b
91e0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 63 74 72  lob_appendf(&ctr
91f0: 6c 2c 20 22 5a 20 25 62 5c 6e 22 2c 20 26 63 6b  l, "Z %b\n", &ck
9200: 73 75 6d 29 3b 0a 20 20 20 20 20 20 64 62 5f 62  sum);.      db_b
9210: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
9220: 28 29 3b 0a 20 20 20 20 20 20 67 2e 6d 61 72 6b  ();.      g.mark
9230: 50 72 69 76 61 74 65 20 3d 20 63 6f 6e 74 65 6e  Private = conten
9240: 74 5f 69 73 5f 70 72 69 76 61 74 65 28 72 69 64  t_is_private(rid
9250: 29 3b 0a 20 20 20 20 20 20 6e 72 69 64 20 3d 20  );.      nrid = 
9260: 63 6f 6e 74 65 6e 74 5f 70 75 74 28 26 63 74 72  content_put(&ctr
9270: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 0, 0);.      
9280: 6d 61 6e 69 66 65 73 74 5f 63 72 6f 73 73 6c 69  manifest_crossli
9290: 6e 6b 28 6e 72 69 64 2c 20 26 63 74 72 6c 29 3b  nk(nrid, &ctrl);
92a0: 0a 20 20 20 20 20 20 64 62 5f 65 6e 64 5f 74 72  .      db_end_tr
92b0: 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20  ansaction(0);.  
92c0: 20 20 7d 0a 20 20 20 20 63 67 69 5f 72 65 64 69    }.    cgi_redi
92d0: 72 65 63 74 66 28 22 63 69 3f 6e 61 6d 65 3d 25  rectf("ci?name=%
92e0: 64 22 2c 20 72 69 64 29 3b 0a 20 20 7d 0a 20 20  d", rid);.  }.  
92f0: 62 6c 6f 62 5f 7a 65 72 6f 28 26 63 6f 6d 6d 65  blob_zero(&comme
9300: 6e 74 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65  nt);.  blob_appe
9310: 6e 64 28 26 63 6f 6d 6d 65 6e 74 2c 20 7a 4e 65  nd(&comment, zNe
9320: 77 43 6f 6d 6d 65 6e 74 2c 20 2d 31 29 3b 0a 20  wComment, -1);. 
9330: 20 7a 55 75 69 64 5b 31 30 5d 20 3d 20 30 3b 0a   zUuid[10] = 0;.
9340: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22    style_header("
9350: 45 64 69 74 20 43 68 65 63 6b 2d 69 6e 20 5b 25  Edit Check-in [%
9360: 73 5d 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 69  s]", zUuid);.  i
9370: 66 28 20 50 28 22 70 72 65 76 69 65 77 22 29 20  f( P("preview") 
9380: 29 7b 0a 20 20 20 20 42 6c 6f 62 20 73 75 66 66  ){.    Blob suff
9390: 69 78 3b 0a 20 20 20 20 69 6e 74 20 6e 54 61 67  ix;.    int nTag
93a0: 20 3d 20 30 3b 0a 20 20 20 20 40 20 3c 62 3e 50   = 0;.    @ <b>P
93b0: 72 65 76 69 65 77 3a 3c 2f 62 3e 0a 20 20 20 20  review:</b>.    
93c0: 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20  @ <blockquote>. 
93d0: 20 20 20 40 20 3c 74 61 62 6c 65 20 62 6f 72 64     @ <table bord
93e0: 65 72 3d 30 3e 0a 20 20 20 20 69 66 28 20 7a 4e  er=0>.    if( zN
93f0: 65 77 43 6f 6c 6f 72 20 26 26 20 7a 4e 65 77 43  ewColor && zNewC
9400: 6f 6c 6f 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20  olor[0] ){.     
9410: 20 40 20 3c 74 72 3e 3c 74 64 20 62 67 63 6f 6c   @ <tr><td bgcol
9420: 6f 72 3d 22 25 68 28 7a 4e 65 77 43 6f 6c 6f 72  or="%h(zNewColor
9430: 29 22 3e 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  )">.    }else{. 
9440: 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 3e 0a       @ <tr><td>.
9450: 20 20 20 20 7d 0a 20 20 20 20 77 69 6b 69 5f 63      }.    wiki_c
9460: 6f 6e 76 65 72 74 28 26 63 6f 6d 6d 65 6e 74 2c  onvert(&comment,
9470: 20 30 2c 20 57 49 4b 49 5f 49 4e 4c 49 4e 45 29   0, WIKI_INLINE)
9480: 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  ;.    blob_zero(
9490: 26 73 75 66 66 69 78 29 3b 0a 20 20 20 20 62 6c  &suffix);.    bl
94a0: 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 75 66 66  ob_appendf(&suff
94b0: 69 78 2c 20 22 28 75 73 65 72 3a 20 25 68 22 2c  ix, "(user: %h",
94c0: 20 7a 4e 65 77 55 73 65 72 29 3b 0a 20 20 20 20   zNewUser);.    
94d0: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22  db_prepare(&q, "
94e0: 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 61  SELECT substr(ta
94f0: 67 6e 61 6d 65 2c 35 29 20 46 52 4f 4d 20 74 61  gname,5) FROM ta
9500: 67 78 72 65 66 2c 20 74 61 67 22 0a 20 20 20 20  gxref, tag".    
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
9520: 20 57 48 45 52 45 20 74 61 67 6e 61 6d 65 20 47   WHERE tagname G
9530: 4c 4f 42 20 27 73 79 6d 2d 2a 27 20 41 4e 44 20  LOB 'sym-*' AND 
9540: 74 61 67 78 72 65 66 2e 72 69 64 3d 25 64 22 0a  tagxref.rid=%d".
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9560: 20 20 20 22 20 20 20 41 4e 44 20 74 61 67 74 79     "   AND tagty
9570: 70 65 3e 31 20 41 4e 44 20 74 61 67 2e 74 61 67  pe>1 AND tag.tag
9580: 69 64 3d 74 61 67 78 72 65 66 2e 74 61 67 69 64  id=tagxref.tagid
9590: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
95a0: 20 20 20 20 20 20 72 69 64 29 3b 0a 20 20 20 20        rid);.    
95b0: 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26  while( db_step(&
95c0: 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  q)==SQLITE_ROW )
95d0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
95e0: 61 72 20 2a 7a 54 61 67 20 3d 20 64 62 5f 63 6f  ar *zTag = db_co
95f0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29  lumn_text(&q, 0)
9600: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54 61 67  ;.      if( nTag
9610: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
9620: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 75 66  lob_appendf(&suf
9630: 66 69 78 2c 20 22 2c 20 74 61 67 73 3a 20 25 68  fix, ", tags: %h
9640: 22 2c 20 7a 54 61 67 29 3b 0a 20 20 20 20 20 20  ", zTag);.      
9650: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62  }else{.        b
9660: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 75 66  lob_appendf(&suf
9670: 66 69 78 2c 20 22 2c 20 25 68 22 2c 20 7a 54 61  fix, ", %h", zTa
9680: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
9690: 20 20 6e 54 61 67 2b 2b 3b 0a 20 20 20 20 7d 0a    nTag++;.    }.
96a0: 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28      db_finalize(
96b0: 26 71 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70  &q);.    blob_ap
96c0: 70 65 6e 64 66 28 26 73 75 66 66 69 78 2c 20 22  pendf(&suffix, "
96d0: 29 22 29 3b 0a 20 20 20 20 40 20 25 73 28 62 6c  )");.    @ %s(bl
96e0: 6f 62 5f 73 74 72 28 26 73 75 66 66 69 78 29 29  ob_str(&suffix))
96f0: 0a 20 20 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72  .    @ </td></tr
9700: 3e 3c 2f 74 61 62 6c 65 3e 0a 20 20 20 20 40 20  ></table>.    @ 
9710: 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20  </blockquote>.  
9720: 20 20 40 20 3c 68 72 3e 0a 20 20 20 20 62 6c 6f    @ <hr>.    blo
9730: 62 5f 72 65 73 65 74 28 26 73 75 66 66 69 78 29  b_reset(&suffix)
9740: 3b 0a 20 20 7d 0a 20 20 40 20 3c 70 3e 4d 61 6b  ;.  }.  @ <p>Mak
9750: 65 20 63 68 61 6e 67 65 73 20 74 6f 20 61 74 74  e changes to att
9760: 72 69 62 75 74 65 73 20 6f 66 20 63 68 65 63 6b  ributes of check
9770: 2d 69 6e 0a 20 20 40 20 5b 3c 61 20 68 72 65 66  -in.  @ [<a href
9780: 3d 22 63 69 3f 6e 61 6d 65 3d 25 64 28 72 69 64  ="ci?name=%d(rid
9790: 29 22 3e 25 73 28 7a 55 75 69 64 29 3c 2f 61 3e  )">%s(zUuid)</a>
97a0: 5d 3a 3c 2f 70 3e 0a 20 20 40 20 3c 66 6f 72 6d  ]:</p>.  @ <form
97b0: 20 61 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42   action="%s(g.zB
97c0: 61 73 65 55 52 4c 29 2f 63 69 5f 65 64 69 74 22  aseURL)/ci_edit"
97d0: 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22 3e 0a   method="POST">.
97e0: 20 20 6c 6f 67 69 6e 5f 69 6e 73 65 72 74 5f 63    login_insert_c
97f0: 73 72 66 5f 73 65 63 72 65 74 28 29 3b 0a 20 20  srf_secret();.  
9800: 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 68  @ <input type="h
9810: 69 64 64 65 6e 22 20 6e 61 6d 65 3d 22 72 22 20  idden" name="r" 
9820: 76 61 6c 75 65 3d 22 25 64 28 72 69 64 29 22 3e  value="%d(rid)">
9830: 0a 20 20 40 20 3c 74 61 62 6c 65 20 62 6f 72 64  .  @ <table bord
9840: 65 72 3d 22 30 22 20 63 65 6c 6c 73 70 61 63 69  er="0" cellspaci
9850: 6e 67 3d 22 31 30 22 3e 0a 0a 20 20 40 20 3c 74  ng="10">..  @ <t
9860: 72 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69 67  r><td align="rig
9870: 68 74 22 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22  ht" valign="top"
9880: 3e 3c 62 3e 55 73 65 72 3a 3c 2f 62 3e 3c 2f 74  ><b>User:</b></t
9890: 64 3e 0a 20 20 40 20 3c 74 64 20 76 61 6c 69 67  d>.  @ <td valig
98a0: 6e 3d 22 74 6f 70 22 3e 0a 20 20 40 20 20 20 3c  n="top">.  @   <
98b0: 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65 78 74  input type="text
98c0: 22 20 6e 61 6d 65 3d 22 75 22 20 73 69 7a 65 3d  " name="u" size=
98d0: 22 32 30 22 20 76 61 6c 75 65 3d 22 25 68 28 7a  "20" value="%h(z
98e0: 4e 65 77 55 73 65 72 29 22 3e 0a 20 20 40 20 3c  NewUser)">.  @ <
98f0: 2f 74 64 3e 3c 2f 74 72 3e 0a 0a 20 20 40 20 3c  /td></tr>..  @ <
9900: 74 72 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69  tr><td align="ri
9910: 67 68 74 22 20 76 61 6c 69 67 6e 3d 22 74 6f 70  ght" valign="top
9920: 22 3e 3c 62 3e 43 6f 6d 6d 65 6e 74 3a 3c 2f 62  "><b>Comment:</b
9930: 3e 3c 2f 74 64 3e 0a 20 20 40 20 3c 74 64 20 76  ></td>.  @ <td v
9940: 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 40  align="top">.  @
9950: 20 3c 74 65 78 74 61 72 65 61 20 6e 61 6d 65 3d   <textarea name=
9960: 22 63 22 20 72 6f 77 73 3d 22 31 30 22 20 63 6f  "c" rows="10" co
9970: 6c 73 3d 22 38 30 22 3e 25 68 28 7a 4e 65 77 43  ls="80">%h(zNewC
9980: 6f 6d 6d 65 6e 74 29 3c 2f 74 65 78 74 61 72 65  omment)</textare
9990: 61 3e 0a 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72  a>.  @ </td></tr
99a0: 3e 0a 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20 61  >..  @ <tr><td a
99b0: 6c 69 67 6e 3d 22 72 69 67 68 74 22 20 76 61 6c  lign="right" val
99c0: 69 67 6e 3d 22 74 6f 70 22 3e 3c 62 3e 43 68 65  ign="top"><b>Che
99d0: 63 6b 2d 69 6e 20 54 69 6d 65 3a 3c 2f 62 3e 3c  ck-in Time:</b><
99e0: 2f 74 64 3e 0a 20 20 40 20 3c 74 64 20 76 61 6c  /td>.  @ <td val
99f0: 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 40 20 20  ign="top">.  @  
9a00: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65   <input type="te
9a10: 78 74 22 20 6e 61 6d 65 3d 22 64 74 22 20 73 69  xt" name="dt" si
9a20: 7a 65 3d 22 32 30 22 20 76 61 6c 75 65 3d 22 25  ze="20" value="%
9a30: 68 28 7a 4e 65 77 44 61 74 65 29 22 3e 0a 20 20  h(zNewDate)">.  
9a40: 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 0a 20 20  @ </td></tr>..  
9a50: 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e 3d  @ <tr><td align=
9a60: 22 72 69 67 68 74 22 20 76 61 6c 69 67 6e 3d 22  "right" valign="
9a70: 74 6f 70 22 3e 3c 62 3e 42 61 63 6b 67 72 6f 75  top"><b>Backgrou
9a80: 6e 64 20 43 6f 6c 6f 72 3a 3c 2f 62 3e 3c 2f 74  nd Color:</b></t
9a90: 64 3e 0a 20 20 40 20 3c 74 64 20 76 61 6c 69 67  d>.  @ <td valig
9aa0: 6e 3d 22 74 6f 70 22 3e 0a 20 20 40 20 3c 74 61  n="top">.  @ <ta
9ab0: 62 6c 65 20 62 6f 72 64 65 72 3d 30 20 63 65 6c  ble border=0 cel
9ac0: 6c 70 61 64 64 69 6e 67 3d 30 20 63 65 6c 6c 73  lpadding=0 cells
9ad0: 70 61 63 69 6e 67 3d 31 3e 0a 20 20 40 20 3c 74  pacing=1>.  @ <t
9ae0: 72 3e 3c 74 64 20 63 6f 6c 73 70 61 6e 3d 22 36  r><td colspan="6
9af0: 22 20 61 6c 69 67 6e 3d 22 6c 65 66 74 22 3e 0a  " align="left">.
9b00: 20 20 69 66 28 20 66 50 72 6f 70 61 67 61 74 65    if( fPropagate
9b10: 43 6f 6c 6f 72 20 29 7b 0a 20 20 20 20 40 20 3c  Color ){.    @ <
9b20: 69 6e 70 75 74 20 74 79 70 65 3d 22 63 68 65 63  input type="chec
9b30: 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 70 63 6c 72  kbox" name="pclr
9b40: 22 20 63 68 65 63 6b 65 64 3e 0a 20 20 7d 65 6c  " checked>.  }el
9b50: 73 65 7b 0a 20 20 20 20 40 20 3c 69 6e 70 75 74  se{.    @ <input
9b60: 20 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22   type="checkbox"
9b70: 20 6e 61 6d 65 3d 22 70 63 6c 72 22 3e 0a 20 20   name="pclr">.  
9b80: 7d 0a 20 20 40 20 50 72 6f 70 61 67 61 74 65 20  }.  @ Propagate 
9b90: 63 6f 6c 6f 72 20 74 6f 20 64 65 73 63 65 6e 64  color to descend
9ba0: 61 6e 74 73 3c 2f 69 6e 70 75 74 3e 3c 2f 74 64  ants</input></td
9bb0: 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72 3e 0a  ></tr>.  @ <tr>.
9bc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
9bd0: 6c 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  lor; i++){.    i
9be0: 66 28 20 61 43 6f 6c 6f 72 5b 69 5d 2e 7a 43 6f  f( aColor[i].zCo
9bf0: 6c 6f 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  lor[0] ){.      
9c00: 40 20 3c 74 64 20 62 67 63 6f 6c 6f 72 3d 22 25  @ <td bgcolor="%
9c10: 68 28 61 43 6f 6c 6f 72 5b 69 5d 2e 7a 43 6f 6c  h(aColor[i].zCol
9c20: 6f 72 29 22 3e 0a 20 20 20 20 7d 65 6c 73 65 7b  or)">.    }else{
9c30: 0a 20 20 20 20 20 20 40 20 3c 74 64 3e 0a 20 20  .      @ <td>.  
9c40: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63    }.    if( strc
9c50: 6d 70 28 7a 4e 65 77 43 6f 6c 6f 72 2c 20 61 43  mp(zNewColor, aC
9c60: 6f 6c 6f 72 5b 69 5d 2e 7a 43 6f 6c 6f 72 29 3d  olor[i].zColor)=
9c70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 69  =0 ){.      @ <i
9c80: 6e 70 75 74 20 74 79 70 65 3d 22 72 61 64 69 6f  nput type="radio
9c90: 22 20 6e 61 6d 65 3d 22 63 6c 72 22 20 76 61 6c  " name="clr" val
9ca0: 75 65 3d 22 25 68 28 61 43 6f 6c 6f 72 5b 69 5d  ue="%h(aColor[i]
9cb0: 2e 7a 43 6f 6c 6f 72 29 22 20 63 68 65 63 6b 65  .zColor)" checke
9cc0: 64 3e 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d>.    }else{.  
9cd0: 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70      @ <input typ
9ce0: 65 3d 22 72 61 64 69 6f 22 20 6e 61 6d 65 3d 22  e="radio" name="
9cf0: 63 6c 72 22 20 76 61 6c 75 65 3d 22 25 68 28 61  clr" value="%h(a
9d00: 43 6f 6c 6f 72 5b 69 5d 2e 7a 43 6f 6c 6f 72 29  Color[i].zColor)
9d10: 22 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 25  ">.    }.    @ %
9d20: 68 28 61 43 6f 6c 6f 72 5b 69 5d 2e 7a 43 4e 61  h(aColor[i].zCNa
9d30: 6d 65 29 3c 2f 69 6e 70 75 74 3e 3c 2f 74 64 3e  me)</input></td>
9d40: 0a 20 20 20 20 69 66 28 20 28 69 25 36 29 3d 3d  .    if( (i%6)==
9d50: 35 20 26 26 20 69 2b 31 3c 6e 43 6f 6c 6f 72 20  5 && i+1<nColor 
9d60: 29 7b 0a 20 20 20 20 20 20 40 20 3c 2f 74 72 3e  ){.      @ </tr>
9d70: 3c 74 72 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  <tr>.    }.  }. 
9d80: 20 40 20 3c 2f 74 72 3e 0a 20 20 40 20 3c 2f 74   @ </tr>.  @ </t
9d90: 61 62 6c 65 3e 0a 20 20 40 20 3c 2f 74 64 3e 3c  able>.  @ </td><
9da0: 2f 74 72 3e 0a 0a 20 20 40 20 3c 74 72 3e 3c 74  /tr>..  @ <tr><t
9db0: 64 20 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 20  d align="right" 
9dc0: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 3c 62 3e  valign="top"><b>
9dd0: 54 61 67 73 3a 3c 2f 62 3e 3c 2f 74 64 3e 0a 20  Tags:</b></td>. 
9de0: 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74   @ <td valign="t
9df0: 6f 70 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20  op">.  @ <input 
9e00: 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20  type="checkbox" 
9e10: 6e 61 6d 65 3d 22 6e 65 77 74 61 67 22 25 73 28  name="newtag"%s(
9e20: 7a 4e 65 77 54 61 67 46 6c 61 67 29 3e 0a 20 20  zNewTagFlag)>.  
9e30: 40 20 41 64 64 20 74 68 65 20 66 6f 6c 6c 6f 77  @ Add the follow
9e40: 69 6e 67 20 6e 65 77 20 74 61 67 20 6e 61 6d 65  ing new tag name
9e50: 20 74 6f 20 74 68 69 73 20 63 68 65 63 6b 2d 69   to this check-i
9e60: 6e 3a 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79  n:.  @ <input ty
9e70: 70 65 3d 22 74 65 78 74 22 20 77 69 64 74 68 3d  pe="text" width=
9e80: 22 31 35 22 20 6e 61 6d 65 3d 22 74 61 67 6e 61  "15" name="tagna
9e90: 6d 65 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 4e  me" value="%h(zN
9ea0: 65 77 54 61 67 29 22 3e 0a 20 20 64 62 5f 70 72  ewTag)">.  db_pr
9eb0: 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20 20 22  epare(&q,.     "
9ec0: 53 45 4c 45 43 54 20 74 61 67 2e 74 61 67 69 64  SELECT tag.tagid
9ed0: 2c 20 74 61 67 6e 61 6d 65 20 46 52 4f 4d 20 74  , tagname FROM t
9ee0: 61 67 78 72 65 66 2c 20 74 61 67 22 0a 20 20 20  agxref, tag".   
9ef0: 20 20 22 20 57 48 45 52 45 20 74 61 67 78 72 65    " WHERE tagxre
9f00: 66 2e 72 69 64 3d 25 64 20 41 4e 44 20 74 61 67  f.rid=%d AND tag
9f10: 74 79 70 65 3e 30 20 41 4e 44 20 74 61 67 78 72  type>0 AND tagxr
9f20: 65 66 2e 74 61 67 69 64 3d 74 61 67 2e 74 61 67  ef.tagid=tag.tag
9f30: 69 64 22 0a 20 20 20 20 20 22 20 4f 52 44 45 52  id".     " ORDER
9f40: 20 42 59 20 43 41 53 45 20 57 48 45 4e 20 74 61   BY CASE WHEN ta
9f50: 67 6e 61 6d 65 20 47 4c 4f 42 20 27 73 79 6d 2d  gname GLOB 'sym-
9f60: 2a 27 20 54 48 45 4e 20 73 75 62 73 74 72 28 74  *' THEN substr(t
9f70: 61 67 6e 61 6d 65 2c 35 29 22 0a 20 20 20 20 20  agname,5)".     
9f80: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9f90: 45 4c 53 45 20 74 61 67 6e 61 6d 65 20 45 4e 44  ELSE tagname END
9fa0: 22 2c 0a 20 20 20 20 20 72 69 64 0a 20 20 29 3b  ",.     rid.  );
9fb0: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
9fc0: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
9fd0: 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 61 67  W ){.    int tag
9fe0: 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69  id = db_column_i
9ff0: 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 63  nt(&q, 0);.    c
a000: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 67 4e  onst char *zTagN
a010: 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ame = db_column_
a020: 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 20 20  text(&q, 1);.   
a030: 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 33 30 5d   char zLabel[30]
a040: 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c  ;.    sprintf(zL
a050: 61 62 65 6c 2c 20 22 63 25 64 22 2c 20 74 61 67  abel, "c%d", tag
a060: 69 64 29 3b 0a 20 20 20 20 69 66 28 20 50 28 7a  id);.    if( P(z
a070: 4c 61 62 65 6c 29 20 29 7b 0a 20 20 20 20 20 20  Label) ){.      
a080: 40 20 3c 62 72 3e 3c 69 6e 70 75 74 20 74 79 70  @ <br><input typ
a090: 65 3d 22 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d  e="checkbox" nam
a0a0: 65 3d 22 63 25 64 28 74 61 67 69 64 29 22 20 63  e="c%d(tagid)" c
a0b0: 68 65 63 6b 65 64 3e 0a 20 20 20 20 7d 65 6c 73  hecked>.    }els
a0c0: 65 7b 0a 20 20 20 20 20 20 40 20 3c 62 72 3e 3c  e{.      @ <br><
a0d0: 69 6e 70 75 74 20 74 79 70 65 3d 22 63 68 65 63  input type="chec
a0e0: 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 63 25 64 28  kbox" name="c%d(
a0f0: 74 61 67 69 64 29 22 3e 0a 20 20 20 20 7d 0a 20  tagid)">.    }. 
a100: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
a110: 54 61 67 4e 61 6d 65 2c 20 22 73 79 6d 2d 22 2c  TagName, "sym-",
a120: 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)==0 ){.      
a130: 40 20 43 61 6e 63 65 6c 20 74 61 67 20 3c 62 3e  @ Cancel tag <b>
a140: 25 68 28 26 7a 54 61 67 4e 61 6d 65 5b 34 5d 29  %h(&zTagName[4])
a150: 3c 2f 62 3e 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  </b>.    }else{.
a160: 20 20 20 20 20 20 40 20 43 61 6e 63 65 6c 20 73        @ Cancel s
a170: 70 65 63 69 61 6c 20 74 61 67 20 3c 62 3e 25 68  pecial tag <b>%h
a180: 28 7a 54 61 67 4e 61 6d 65 29 3c 2f 62 3e 0a 20  (zTagName)</b>. 
a190: 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 5f 66 69     }.  }.  db_fi
a1a0: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 40 20  nalize(&q);.  @ 
a1b0: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 0a 20 20 69 66  </td></tr>..  if
a1c0: 28 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c  ( db_exists("SEL
a1d0: 45 43 54 20 31 20 46 52 4f 4d 20 74 61 67 78 72  ECT 1 FROM tagxr
a1e0: 65 66 20 57 48 45 52 45 20 72 69 64 3d 25 64 20  ef WHERE rid=%d 
a1f0: 41 4e 44 20 74 61 67 69 64 3d 25 64 20 41 4e 44  AND tagid=%d AND
a200: 20 73 72 63 69 64 3e 30 22 2c 0a 20 20 20 20 20   srcid>0",.     
a210: 20 20 20 20 20 20 20 20 20 20 20 72 69 64 2c 20             rid, 
a220: 54 41 47 5f 42 52 41 4e 43 48 29 3d 3d 30 20 29  TAG_BRANCH)==0 )
a230: 7b 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 20  {.    @ <tr><td 
a240: 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 20 76 61  align="right" va
a250: 6c 69 67 6e 3d 22 74 6f 70 22 3e 3c 62 3e 42 72  lign="top"><b>Br
a260: 61 6e 63 68 69 6e 67 3a 3c 2f 62 3e 3c 2f 74 64  anching:</b></td
a270: 3e 0a 20 20 20 20 40 20 3c 74 64 20 76 61 6c 69  >.    @ <td vali
a280: 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 20 20 40 20  gn="top">.    @ 
a290: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 63 68 65  <input type="che
a2a0: 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 6e 65 77  ckbox" name="new
a2b0: 62 72 22 25 73 28 7a 4e 65 77 42 72 46 6c 61 67  br"%s(zNewBrFlag
a2c0: 29 3e 0a 20 20 20 20 40 20 4d 61 6b 65 20 74 68  )>.    @ Make th
a2d0: 69 73 20 63 68 65 63 6b 2d 69 6e 20 74 68 65 20  is check-in the 
a2e0: 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 62  start of a new b
a2f0: 72 61 6e 63 68 20 6e 61 6d 65 64 3a 0a 20 20 20  ranch named:.   
a300: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22   @ <input type="
a310: 74 65 78 74 22 20 77 69 64 74 68 3d 22 31 35 22  text" width="15"
a320: 20 6e 61 6d 65 3d 22 62 72 6e 61 6d 65 22 20 76   name="brname" v
a330: 61 6c 75 65 3d 22 25 68 28 7a 4e 65 77 42 72 61  alue="%h(zNewBra
a340: 6e 63 68 29 22 3e 0a 20 20 20 20 40 20 3c 2f 74  nch)">.    @ </t
a350: 64 3e 3c 2f 74 72 3e 0a 20 20 7d 0a 0a 20 20 69  d></tr>.  }..  i
a360: 66 28 20 69 73 5f 61 5f 6c 65 61 66 28 72 69 64  f( is_a_leaf(rid
a370: 29 0a 20 20 20 26 26 20 21 64 62 5f 65 78 69 73  ).   && !db_exis
a380: 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f  ts("SELECT 1 FRO
a390: 4d 20 74 61 67 78 72 65 66 20 22 0a 20 20 20 20  M tagxref ".    
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
a3b0: 48 45 52 45 20 74 61 67 69 64 3d 25 64 20 41 4e  HERE tagid=%d AN
a3c0: 44 20 72 69 64 3d 25 64 20 41 4e 44 20 74 61 67  D rid=%d AND tag
a3d0: 74 79 70 65 3e 30 22 2c 0a 20 20 20 20 20 20 20  type>0",.       
a3e0: 20 20 20 20 20 20 20 20 20 20 54 41 47 5f 43 4c            TAG_CL
a3f0: 4f 53 45 44 2c 20 72 69 64 29 0a 20 20 29 7b 0a  OSED, rid).  ){.
a400: 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c      @ <tr><td al
a410: 69 67 6e 3d 22 72 69 67 68 74 22 20 76 61 6c 69  ign="right" vali
a420: 67 6e 3d 22 74 6f 70 22 3e 3c 62 3e 4c 65 61 66  gn="top"><b>Leaf
a430: 20 43 6c 6f 73 75 72 65 3a 3c 2f 62 3e 3c 2f 74   Closure:</b></t
a440: 64 3e 0a 20 20 20 20 40 20 3c 74 64 20 76 61 6c  d>.    @ <td val
a450: 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 20 20 40  ign="top">.    @
a460: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 63 68   <input type="ch
a470: 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 63 6c  eckbox" name="cl
a480: 6f 73 65 22 25 73 28 7a 43 6c 6f 73 65 46 6c 61  ose"%s(zCloseFla
a490: 67 29 3e 0a 20 20 20 20 40 20 4d 61 72 6b 20 74  g)>.    @ Mark t
a4a0: 68 69 73 20 6c 65 61 66 20 61 73 20 22 63 6c 6f  his leaf as "clo
a4b0: 73 65 64 22 20 73 6f 20 74 68 61 74 20 69 74 20  sed" so that it 
a4c0: 6e 6f 20 6c 6f 6e 67 65 72 20 61 70 70 65 61 72  no longer appear
a4d0: 73 20 6f 6e 20 74 68 65 0a 20 20 20 20 40 20 22  s on the.    @ "
a4e0: 6c 65 61 76 65 73 22 20 70 61 67 65 20 61 6e 64  leaves" page and
a4f0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6c 61   is no longer la
a500: 62 65 6c 65 64 20 61 73 20 61 20 22 3c 62 3e 4c  beled as a "<b>L
a510: 65 61 66 3c 2f 62 3e 22 2e 0a 20 20 20 20 40 20  eaf</b>"..    @ 
a520: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 7d 0a 0a  </td></tr>.  }..
a530: 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20 63 6f 6c  .  @ <tr><td col
a540: 73 70 61 6e 3d 22 32 22 3e 0a 20 20 40 20 3c 69  span="2">.  @ <i
a550: 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69  nput type="submi
a560: 74 22 20 6e 61 6d 65 3d 22 70 72 65 76 69 65 77  t" name="preview
a570: 22 20 76 61 6c 75 65 3d 22 50 72 65 76 69 65 77  " value="Preview
a580: 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79  ">.  @ <input ty
a590: 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65  pe="submit" name
a5a0: 3d 22 61 70 70 6c 79 22 20 76 61 6c 75 65 3d 22  ="apply" value="
a5b0: 41 70 70 6c 79 20 43 68 61 6e 67 65 73 22 3e 0a  Apply Changes">.
a5c0: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
a5d0: 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 63  "submit" name="c
a5e0: 61 6e 63 65 6c 22 20 76 61 6c 75 65 3d 22 43 61  ancel" value="Ca
a5f0: 6e 63 65 6c 22 3e 0a 20 20 40 20 3c 2f 74 64 3e  ncel">.  @ </td>
a600: 3c 2f 74 72 3e 0a 20 20 40 20 3c 2f 74 61 62 6c  </tr>.  @ </tabl
a610: 65 3e 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20  e>.  @ </form>. 
a620: 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
a630: 0a 7d 0a                                         .}.